diff -r 3ea74844c2df -r 394c89f02e48 drivers/drv_8139too.c --- a/drivers/drv_8139too.c Fri Nov 04 09:10:45 2005 +0000 +++ b/drivers/drv_8139too.c Fri Nov 04 09:38:50 2005 +0000 @@ -1829,8 +1829,12 @@ i == (int) (tp->dirty_tx % NUM_TX_DESC) ? " (queue head)" : ""); + /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ + /* Stop a shared interrupt from scavenging while we are. */ - if(dev == rtl_ecat_dev.dev) { + + if (dev == rtl_ecat_dev.dev) + { flags = rt_spin_lock_irqsave (&tp->lock); rtl8139_tx_clear (tp); rt_spin_unlock_irqrestore (&tp->lock,flags); @@ -1840,6 +1844,9 @@ rtl8139_tx_clear (tp); spin_unlock_irqrestore (&tp->lock, flags); } + + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ + /* ...and finally, reset everything */ rtl8139_hw_start (dev); @@ -1906,12 +1913,17 @@ netif_stop_queue (dev); } + if (dev == rtl_ecat_dev.dev) + { + rt_spin_unlock_irq(&tp->lock); + } + else + { + spin_unlock_irq(&tp->lock); + } + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ - if(dev == rtl_ecat_dev.dev) - rt_spin_unlock_irq(&tp->lock); - else - spin_unlock_irq(&tp->lock); DPRINTK ("%s: Queued Tx packet size %u to slot %d.\n", dev->name, len, entry); @@ -2332,12 +2344,19 @@ int ackstat, status; int link_changed = 0; /* avoid bogus "uninit" warning */ - if(dev == rtl_ecat_dev.dev) { - rt_spin_lock (&tp->lock); - (rtl_ecat_dev.intr_cnt)++; + /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ + + if (dev == rtl_ecat_dev.dev) + { + rt_spin_lock(&tp->lock); + rtl_ecat_dev.intr_cnt++; } else - spin_lock (&tp->lock); + { + spin_lock (&tp->lock); + } + + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ do { status = RTL_R16 (IntrStatus); @@ -2403,10 +2422,18 @@ RTL_W16 (IntrStatus, 0xffff); } - if(dev == rtl_ecat_dev.dev) - rt_spin_unlock (&tp->lock); + /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ + + if (dev == rtl_ecat_dev.dev) + { + rt_spin_unlock(&tp->lock); + } else - spin_unlock (&tp->lock); + { + spin_unlock(&tp->lock); + } + + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ DPRINTK ("%s: exiting interrupt, intr_status=%#4.4x.\n", dev->name, RTL_R16 (IntrStatus)); @@ -2453,7 +2480,7 @@ /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ - mdelay(1); //hm + //mdelay(1); if (dev == rtl_ecat_dev.dev) { @@ -2476,19 +2503,22 @@ tp->stats.rx_missed_errors += RTL_R32 (RxMissed); RTL_W32 (RxMissed, 0); - if (dev == rtl_ecat_dev.dev) { - rt_spin_unlock_irqrestore (&tp->lock, flags); - synchronize_irq (); - } - else { - spin_unlock_irqrestore (&tp->lock, flags); - synchronize_irq (); - } - /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ + if (dev == rtl_ecat_dev.dev) + { + rt_spin_unlock_irqrestore (&tp->lock, flags); + synchronize_irq (); + } + else + { + spin_unlock_irqrestore (&tp->lock, flags); + synchronize_irq (); + } + EC_DBG ("rtl8139: freeing irq"); - mdelay(1); //hm + + //mdelay(1); if (dev != rtl_ecat_dev.dev) { @@ -2836,20 +2866,27 @@ EC_DBG("%s: rtl8139 GETSTATS called...",dev->name); - if (dev == rtl_ecat_dev.dev) { - flags = rt_spin_lock_irqsave (&tp->lock); - tp->stats.rx_missed_errors += RTL_R32 (RxMissed); - RTL_W32 (RxMissed, 0); - rt_spin_unlock_irqrestore (&tp->lock, flags); - } - else { - if (netif_running(dev)) { - spin_lock_irqsave (&tp->lock, flags); - tp->stats.rx_missed_errors += RTL_R32 (RxMissed); - RTL_W32 (RxMissed, 0); - spin_unlock_irqrestore (&tp->lock, flags); - } - } + /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ + + if (dev == rtl_ecat_dev.dev) + { + flags = rt_spin_lock_irqsave (&tp->lock); + tp->stats.rx_missed_errors += RTL_R32 (RxMissed); + RTL_W32 (RxMissed, 0); + rt_spin_unlock_irqrestore (&tp->lock, flags); + } + else + { + if (netif_running(dev)) + { + spin_lock_irqsave (&tp->lock, flags); + tp->stats.rx_missed_errors += RTL_R32 (RxMissed); + RTL_W32 (RxMissed, 0); + spin_unlock_irqrestore (&tp->lock, flags); + } + } + + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ return &tp->stats; } @@ -2910,16 +2947,22 @@ unsigned long flags; struct rtl8139_private *tp = dev->priv; - if(dev == rtl_ecat_dev.dev) { - flags = rt_spin_lock_irqsave (&tp->lock); - __set_rx_mode(dev); - rt_spin_unlock_irqrestore (&tp->lock, flags); - } - else { - spin_lock_irqsave (&tp->lock, flags); - __set_rx_mode(dev); - spin_unlock_irqrestore (&tp->lock, flags); - } + /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ + + if (dev == rtl_ecat_dev.dev) + { + flags = rt_spin_lock_irqsave (&tp->lock); + __set_rx_mode(dev); + rt_spin_unlock_irqrestore (&tp->lock, flags); + } + else + { + spin_lock_irqsave (&tp->lock, flags); + __set_rx_mode(dev); + spin_unlock_irqrestore (&tp->lock, flags); + } + + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ } #ifdef CONFIG_PM @@ -2936,7 +2979,7 @@ if (dev == rtl_ecat_dev.dev || !netif_running (dev)) return 0; - /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ + /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ netif_device_detach (dev);