diff -r e0b9c4611f0a -r b61bece1ec1c master/device.c --- a/master/device.c Mon Mar 08 07:46:36 2010 +0100 +++ b/master/device.c Mon Mar 08 08:01:26 2010 +0100 @@ -324,19 +324,31 @@ // frame statistics if (unlikely(jiffies - device->stats_jiffies >= HZ)) { unsigned int i; - unsigned int tx_rate = - (device->tx_count - device->last_tx_count) * 1000; - int loss = device->tx_count - device->rx_count; - int loss_rate = (loss - device->last_loss) * 1000; - for (i = 0; i < EC_RATE_COUNT; i++) { - unsigned int n = rate_intervals[i]; - device->tx_rates[i] = - (device->tx_rates[i] * (n - 1) + tx_rate) / n; - device->loss_rates[i] = - (device->loss_rates[i] * (n - 1) + loss_rate) / n; + if (device->link_state) { + unsigned int tx_rate = + (device->tx_count - device->last_tx_count) * 1000; + int loss = device->tx_count - device->rx_count; + int loss_rate = (loss - device->last_loss) * 1000; + for (i = 0; i < EC_RATE_COUNT; i++) { + unsigned int n = rate_intervals[i]; + device->tx_rates[i] = + (device->tx_rates[i] * (n - 1) + tx_rate) / n; + device->loss_rates[i] = + (device->loss_rates[i] * (n - 1) + loss_rate) / n; + } + device->last_tx_count = device->tx_count; + device->last_loss = loss; + } else { + // zero frame statistics + device->tx_count = 0; + device->rx_count = 0; + device->last_tx_count = 0; + device->last_loss = 0; + for (i = 0; i < EC_RATE_COUNT; i++) { + device->tx_rates[i] = 0; + device->loss_rates[i] = 0; + } } - device->last_tx_count = device->tx_count; - device->last_loss = loss; device->stats_jiffies = jiffies; }