Author: phoudoin Date: 2010-06-15 03:29:20 +0200 (Tue, 15 Jun 2010) New Revision: 37144 Changeset: http://dev.haiku-os.org/changeset/37144/haiku Modified: haiku/trunk/src/add-ons/kernel/drivers/network/pegasus/driver.c haiku/trunk/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.cpp haiku/trunk/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp haiku/trunk/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.cpp Log: USB devices should report better than generic B_ERROR in order to help the stack to detect and handle hotplug device removal. Modified: haiku/trunk/src/add-ons/kernel/drivers/network/pegasus/driver.c =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/pegasus/driver.c 2010-06-15 00:09:51 UTC (rev 37143) +++ haiku/trunk/src/add-ons/kernel/drivers/network/pegasus/driver.c 2010-06-15 01:29:20 UTC (rev 37144) @@ -486,6 +486,9 @@ return B_BAD_VALUE; } + if (dev->aue_dying) + return B_DEVICE_NOT_FOUND; /* already unplugged */ + blockFlag = dev->nonblocking ? B_TIMEOUT : 0; // block until receive is available (if blocking is allowed) @@ -552,6 +555,9 @@ DPRINTF_ERR("EINVAL\n"); return EINVAL; } + + if (dev->aue_dying) + return B_DEVICE_NOT_FOUND; /* already unplugged */ // block until a free tx descriptor is available if ((status = acquire_sem_etc(dev->tx_sem, 1, B_TIMEOUT, ETHER_TRANSMIT_TIMEOUT)) < B_NO_ERROR) { @@ -623,7 +629,7 @@ DPRINTF_INFO("ioctl(0x%x)\n", (int)op); if (device->aue_dying) - return B_ERROR; /* already unplugged */ + return B_DEVICE_NOT_FOUND; /* already unplugged */ switch (op) { case ETHER_INIT: Modified: haiku/trunk/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.cpp 2010-06-15 00:09:51 UTC (rev 37143) +++ haiku/trunk/src/add-ons/kernel/drivers/network/usb_asix/ASIXDevice.cpp 2010-06-15 01:29:20 UTC (rev 37144) @@ -175,7 +175,7 @@ if (fRemoved) { TRACE_ALWAYS("Error of receiving %d bytes from removed device.\n", numBytesToRead); - return B_ERROR; + return B_DEVICE_NOT_FOUND; } TRACE_FLOW("Request %d bytes.\n", numBytesToRead); @@ -252,7 +252,7 @@ if (fRemoved) { TRACE_ALWAYS("Error of writing %d bytes to removed device.\n", numBytesToWrite); - return B_ERROR; + return B_DEVICE_NOT_FOUND; } TRACE_FLOW("Write %d bytes.\n", numBytesToWrite); Modified: haiku/trunk/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp 2010-06-15 00:09:51 UTC (rev 37143) +++ haiku/trunk/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp 2010-06-15 01:29:20 UTC (rev 37144) @@ -235,7 +235,7 @@ if (fRemoved) { TRACE_ALWAYS("Error of receiving %d bytes from removed device.\n", numBytesToRead); - return B_ERROR; + return B_DEVICE_NOT_FOUND; } TRACE_FLOW("Request %d bytes.\n", numBytesToRead); @@ -305,7 +305,7 @@ if (fRemoved) { TRACE_ALWAYS("Error of writing %d bytes to removed device.\n", numBytesToWrite); - return B_ERROR; + return B_DEVICE_NOT_FOUND; } if (!fHasConnection) { Modified: haiku/trunk/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.cpp 2010-06-15 00:09:51 UTC (rev 37143) +++ haiku/trunk/src/add-ons/kernel/drivers/network/usb_ecm/ECMDevice.cpp 2010-06-15 01:29:20 UTC (rev 37144) @@ -178,7 +178,7 @@ { if (fRemoved) { *numBytes = 0; - return B_ERROR; + return B_DEVICE_NOT_FOUND; } status_t result = gUSBModule->queue_bulk(fReadEndpoint, buffer, *numBytes, @@ -215,7 +215,7 @@ { if (fRemoved) { *numBytes = 0; - return B_ERROR; + return B_DEVICE_NOT_FOUND; } status_t result = gUSBModule->queue_bulk(fWriteEndpoint, (uint8 *)buffer,