From c854a135c3e9e69e044bc50ffd0457f566fb3cf1 Mon Sep 17 00:00:00 2001 From: neil Date: Fri, 2 May 2014 13:49:04 +0000 Subject: [PATCH] - Corrected signal masks. Process now quits on shutdown, which allows the device to be reopened after being expunged. - Avoid race condition on shutdown by waiting until process has really quit. - Don't call "stop" function when already stopped. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@48979 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- workbench/devs/networks/rtl8169/rtl8169.conf | 2 +- workbench/devs/networks/rtl8169/rtl8169_init.c | 3 ++- workbench/devs/networks/rtl8169/unit.c | 13 ++++++++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/workbench/devs/networks/rtl8169/rtl8169.conf b/workbench/devs/networks/rtl8169/rtl8169.conf index d075ee6bee..605177829b 100644 --- a/workbench/devs/networks/rtl8169/rtl8169.conf +++ b/workbench/devs/networks/rtl8169/rtl8169.conf @@ -1,5 +1,5 @@ ##begin config -version 0.2 +version 0.3 basename RTL8169Dev libbase RTL8169DeviceBase libbasetype struct RTL8169Base diff --git a/workbench/devs/networks/rtl8169/rtl8169_init.c b/workbench/devs/networks/rtl8169/rtl8169_init.c index ddb10f80b0..3f63ae44ef 100644 --- a/workbench/devs/networks/rtl8169/rtl8169_init.c +++ b/workbench/devs/networks/rtl8169/rtl8169_init.c @@ -347,7 +347,8 @@ static int GM_UNIQUENAME(Close) { RTLD(bug("[rtl8169] CloseDevice(unit @ %p, unitno %d)\n", unit, unit->rtl8169u_UnitNum)) - unit->stop(unit); + if((unit->rtl8169u_flags & IFF_UP) != 0) + unit->stop(unit); opener = (APTR)req->ios2_BufferManagement; if (opener != NULL) diff --git a/workbench/devs/networks/rtl8169/unit.c b/workbench/devs/networks/rtl8169/unit.c index 41adca7ce8..3b0717cb63 100644 --- a/workbench/devs/networks/rtl8169/unit.c +++ b/workbench/devs/networks/rtl8169/unit.c @@ -848,12 +848,12 @@ AROS_UFH3(void, RTL8169_Schedular, for(;;) { ULONG recvd = Wait(sigset); - if (recvd & unit->rtl8169u_signal_0) + if (recvd & 1 << unit->rtl8169u_signal_0) { /* * Shutdown process. Driver should close everything * already and waits for our process to complete. Free - * memory allocared here and kindly return. + * memory allocated here and kindly return. */ unit->deinitialize(unit); CloseDevice((struct IORequest *) unit->rtl8169u_TimerSlowReq); @@ -1292,12 +1292,19 @@ struct RTL8169Unit *CreateUnit(struct RTL8169Base *RTL8169DeviceBase, OOP_Object */ void DeleteUnit(struct RTL8169Base *RTL8169DeviceBase, struct RTL8169Unit *Unit) { + UBYTE tmpbuff[100]; int i; + if (Unit) { if (Unit->rtl8169u_Process) { - Signal(&Unit->rtl8169u_Process->pr_Task, Unit->rtl8169u_signal_0); + /* Tell our process to quit, and wait until it does so */ + Signal(&Unit->rtl8169u_Process->pr_Task, + 1 << Unit->rtl8169u_signal_0); + sprintf((char *) tmpbuff, RTL8169_TASK_NAME, Unit->rtl8169u_name); + while (FindTask(tmpbuff) != NULL) + Delay(5); } for (i=0; i < REQUEST_QUEUE_COUNT; i++) -- 2.11.4.GIT