From dc0ac78b34d44db3ea2e4c9e1ccc67f3e7f7124e Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Tue, 5 Feb 2013 13:53:23 +0000 Subject: [PATCH] usb_drv: prevent recursive signal dispatch Fixes #649. --- dde_linux/src/drivers/usb/nic/component.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/dde_linux/src/drivers/usb/nic/component.h b/dde_linux/src/drivers/usb/nic/component.h index b2afcf5b4..2fa5898ce 100644 --- a/dde_linux/src/drivers/usb/nic/component.h +++ b/dde_linux/src/drivers/usb/nic/component.h @@ -178,12 +178,13 @@ namespace Nic { if (!_tx_sink->ready_to_ack()) { _wait_event(_tx_sink->ready_to_ack()); } + /* acknowledge to client */ _tx_sink->acknowledge_packet(packet); - /* check if we received any signals (don't block) */ - if ((tx_cnt % 20) == 0) - Service_handler::s()->check_signal(false); + /* it's cooperative scheduling - be nice */ + if (tx_cnt == 20) + break; } /* sumbit last skb */ @@ -197,6 +198,9 @@ namespace Nic { /* release acknowledged packets */ _rx_ack(false); + + if (_tx_sink->packet_avail()) + Signal_transmitter(_tx.sigh_packet_avail()).submit(); } void _rx_ack(bool block = true)