322 struct sk_buff *skb = device->tx_skb[device->tx_ring_index]; |
322 struct sk_buff *skb = device->tx_skb[device->tx_ring_index]; |
323 |
323 |
324 // frame statistics |
324 // frame statistics |
325 if (unlikely(jiffies - device->stats_jiffies >= HZ)) { |
325 if (unlikely(jiffies - device->stats_jiffies >= HZ)) { |
326 unsigned int i; |
326 unsigned int i; |
327 unsigned int tx_rate = |
327 if (device->link_state) { |
328 (device->tx_count - device->last_tx_count) * 1000; |
328 unsigned int tx_rate = |
329 int loss = device->tx_count - device->rx_count; |
329 (device->tx_count - device->last_tx_count) * 1000; |
330 int loss_rate = (loss - device->last_loss) * 1000; |
330 int loss = device->tx_count - device->rx_count; |
331 for (i = 0; i < EC_RATE_COUNT; i++) { |
331 int loss_rate = (loss - device->last_loss) * 1000; |
332 unsigned int n = rate_intervals[i]; |
332 for (i = 0; i < EC_RATE_COUNT; i++) { |
333 device->tx_rates[i] = |
333 unsigned int n = rate_intervals[i]; |
334 (device->tx_rates[i] * (n - 1) + tx_rate) / n; |
334 device->tx_rates[i] = |
335 device->loss_rates[i] = |
335 (device->tx_rates[i] * (n - 1) + tx_rate) / n; |
336 (device->loss_rates[i] * (n - 1) + loss_rate) / n; |
336 device->loss_rates[i] = |
|
337 (device->loss_rates[i] * (n - 1) + loss_rate) / n; |
|
338 } |
|
339 device->last_tx_count = device->tx_count; |
|
340 device->last_loss = loss; |
|
341 } else { |
|
342 // zero frame statistics |
|
343 device->tx_count = 0; |
|
344 device->rx_count = 0; |
|
345 device->last_tx_count = 0; |
|
346 device->last_loss = 0; |
|
347 for (i = 0; i < EC_RATE_COUNT; i++) { |
|
348 device->tx_rates[i] = 0; |
|
349 device->loss_rates[i] = 0; |
|
350 } |
337 } |
351 } |
338 device->last_tx_count = device->tx_count; |
|
339 device->last_loss = loss; |
|
340 device->stats_jiffies = jiffies; |
352 device->stats_jiffies = jiffies; |
341 } |
353 } |
342 |
354 |
343 if (unlikely(!device->link_state)) // Link down |
355 if (unlikely(!device->link_state)) // Link down |
344 return; |
356 return; |