Link-Down-Verhalten verbessert.

This commit is contained in:
Florian Pose 2006-03-02 13:08:07 +00:00
parent 0ffbd968a6
commit 11d861522b
3 changed files with 29 additions and 38 deletions

View File

@ -1925,18 +1925,6 @@ static void rtl8139_tx_interrupt (struct net_device *dev,
dirty_tx = tp->dirty_tx;
tx_left = tp->cur_tx - dirty_tx;
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
#if 0
if (EtherCAT_dev_is_ec(rtl_ec_dev, dev))
{
rtl_ec_dev.tx_intr_cnt++;
rdtscl(rtl_ec_dev.tx_time); // Get CPU cycles
}
#endif
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
while (tx_left > 0) {
int entry = dirty_tx % NUM_TX_DESC;
int txstatus;
@ -1967,9 +1955,7 @@ static void rtl8139_tx_interrupt (struct net_device *dev,
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
if (EtherCAT_dev_is_ec(rtl_ec_dev, dev))
{
EtherCAT_dev_state(rtl_ec_dev, EC_DEVICE_STATE_ERROR);
}
EtherCAT_dev_state(rtl_ec_dev, EC_DEVICE_STATE_ERROR);
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
@ -2156,17 +2142,6 @@ static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp,
RTL_R16 (RxBufAddr),
RTL_R16 (RxBufPtr), RTL_R8 (ChipCmd));
/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
#if 0
if (EtherCAT_dev_is_ec(rtl_ec_dev, dev))
{
rtl_ec_dev.rx_intr_cnt++;
rdtscl(rtl_ec_dev.rx_time); // Get CPU cycles
}
#endif
/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
while ((EtherCAT_dev_is_ec(rtl_ec_dev, dev) || netif_running(dev))
&& received < budget
&& (RTL_R8 (ChipCmd) & RxBufEmpty) == 0) {

View File

@ -168,9 +168,8 @@ void ec_device_send(ec_device_t *device, /**< EtherCAT-Ger
{
struct ethhdr *eth;
if (unlikely(!device->link_state)) { // Link down
if (unlikely(!device->link_state)) // Link down
return;
}
// Framegröße auf (jetzt bekannte) Länge abschneiden
skb_trim(device->tx_skb, length);

View File

@ -180,6 +180,23 @@ int ec_domain_alloc(ec_domain_t *domain, /**< Dom
return 0;
}
/*****************************************************************************/
/**
Gibt die Anzahl der antwortenden Slaves aus.
*/
void ec_domain_response_count(ec_domain_t *domain, /**< Domäne */
unsigned int count /**< Neue Anzahl */
)
{
if (count != domain->response_count) {
domain->response_count = count;
EC_INFO("Domain %08X state change - %i slaves responding.\n",
(u32) domain, count);
}
}
/******************************************************************************
*
* Echtzeitschnittstelle
@ -281,6 +298,12 @@ int EtherCAT_rt_domain_xio(ec_domain_t *domain /**< Dom
ec_cyclic_output(master);
if (unlikely(!master->device.link_state)) {
ec_domain_response_count(domain, working_counter_sum);
ec_device_call_isr(&master->device);
return -1;
}
rdtscl(start_ticks); // Sendezeit nehmen
timeout_ticks = domain->timeout_us * cpu_khz / 1000;
@ -297,10 +320,7 @@ int EtherCAT_rt_domain_xio(ec_domain_t *domain /**< Dom
master->device.state = EC_DEVICE_STATE_READY;
master->frames_lost++;
ec_cyclic_output(master);
// Falls Link down...
ec_device_call_isr(&master->device);
ec_domain_response_count(domain, working_counter_sum);
return -1;
}
@ -323,12 +343,13 @@ int EtherCAT_rt_domain_xio(ec_domain_t *domain /**< Dom
master->device.state = EC_DEVICE_STATE_READY;
master->frames_lost++;
ec_cyclic_output(master);
ec_domain_response_count(domain, working_counter_sum);
return -1;
}
}
if (unlikely(ec_frame_receive(frame) < 0)) {
EC_ERR("Receiving process data failed!\n");
ec_domain_response_count(domain, working_counter_sum);
return -1;
}
@ -340,11 +361,7 @@ int EtherCAT_rt_domain_xio(ec_domain_t *domain /**< Dom
offset += size;
}
if (working_counter_sum != domain->response_count) {
domain->response_count = working_counter_sum;
EC_INFO("Domain %08X state change - %i slaves responding.\n",
(u32) domain, working_counter_sum);
}
ec_domain_response_count(domain, working_counter_sum);
return 0;
}