From 4e7bc18cbcecd2ca8f15883fbeb90cca73619e22 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Mon, 18 Jan 2010 20:12:48 +0000 Subject: [PATCH] - Fix style and bugs in the davicom driver - Also remove and add some debug output to try to spot the problem without getting flooded with too much messages git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35143 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../network/usb_davicom/DavicomDevice.cpp | 52 ++++++++++++++----- .../network/usb_davicom/DavicomDevice.h | 2 +- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp b/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp index 566bc56178..8af016fa03 100644 --- a/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp +++ b/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp @@ -42,6 +42,8 @@ #define NSR_SPEED 0x80 // 0 = 100MBps, 1 = 10MBps #define NSR_LINKST 0x40 // 1 = link up +#define NSR_TXFULL 0x10 // TX FIFO full +#define NSR_RXOV 0x08 // RX Overflow #define RCR_DIS_LONG 0x20 // Discard long packet #define RCR_DIS_CRC 0x10 // Discard CRC error packet @@ -65,7 +67,10 @@ DavicomDevice::_ReadRegister(uint8 reg, size_t size, uint8* buffer) status_t result = gUSBModule->send_request(fDevice, USB_REQTYPE_VENDOR | USB_REQTYPE_DEVICE_IN, READ_REGISTER, 0, reg, size, buffer, &actualLength); - if (size != actualLength) TRACE_ALWAYS("Size mismatch reading register ! asked %d got %d",size,actualLength); + if (size != actualLength) { + TRACE_ALWAYS("Size mismatch reading register ! asked %d got %d", + size, actualLength); + } return result; } @@ -78,7 +83,6 @@ DavicomDevice::_WriteRegister(uint8 reg, size_t size, uint8* buffer) status_t result = gUSBModule->send_request(fDevice, USB_REQTYPE_VENDOR | USB_REQTYPE_DEVICE_OUT, WRITE_REGISTER, 0, reg, size, buffer, &actualLength); - if (size != actualLength) TRACE_ALWAYS("Size mismatch reading register ! asked %d got %d",size,actualLength); return result; } @@ -119,10 +123,6 @@ DavicomDevice::DavicomDevice(usb_device device, const char *description) return; } - fIPG[0] = 0x15; - fIPG[1] = 0x0c; - fIPG[2] = 0x12; - fVendorID = deviceDescriptor->vendor_id; fProductID = deviceDescriptor->product_id; @@ -280,7 +280,11 @@ DavicomDevice::Read(uint8 *buffer, size_t *numBytes) } */ - *numBytes = header[1] << 8 | header[2]; + *numBytes = header[1] | ( header[2] << 8 ); + + if (header[0] & 0xBF ) { + TRACE_ALWAYS("RX error %d occured !\n", header[0]); + } if(fActualLengthRead - kRXHeaderSize > *numBytes) { TRACE_ALWAYS("MISMATCH of the frame length: hdr %d; received:%d\n", @@ -300,15 +304,27 @@ DavicomDevice::Write(const uint8 *buffer, size_t *numBytes) if (fRemoved) { TRACE_ALWAYS("Error of writing %d bytes to removed device.\n", - numBytesToWrite); + numBytesToWrite); + return B_ERROR; + } + + if (!fHasConnection) { + TRACE_ALWAYS("Error of writing %d bytes to device while down.\n", + numBytesToWrite); + return B_ERROR; + } + + if (fTXBufferFull) { + TRACE_ALWAYS("Error of writing %d bytes to device while TX buffer full.\n", + numBytesToWrite); return B_ERROR; } TRACE_FLOW("Write %d bytes.\n", numBytesToWrite); uint8 header[kTXHeaderSize]; - header[0] = *numBytes >> 8; - header[1] = *numBytes & 0xFF; + header[0] = *numBytes & 0xFF; + header[1] = *numBytes >> 8; iovec txData[] = { { &header, kTXHeaderSize }, @@ -316,7 +332,7 @@ DavicomDevice::Write(const uint8 *buffer, size_t *numBytes) }; status_t result = gUSBModule->queue_bulk_v(fWriteEndpoint, - txData, 1, _WriteCallback, this); + txData, 2, _WriteCallback, this); if (result != B_OK) { TRACE_ALWAYS("Error of queue_bulk_v request:%#010x\n", result); return result; @@ -752,15 +768,16 @@ DavicomDevice::OnNotify(uint32 actualLength) return B_BAD_DATA; } - // 0 = Network status - // 1:2 = TX status // 3 = RX status // 4 = Receive overflow counter // 5 = Received packet counter // 6 = Transmit packet counter // 7 = GPR + // 0 = Network status (NSR) bool linkIsUp = (fNotifyBuffer[0] & NSR_LINKST) != 0; + fTXBufferFull = (fNotifyBuffer[0] & NSR_TXFULL) != 0; + bool rxOverflow = (fNotifyBuffer[0] & NSR_RXOV) != 0; bool linkStateChange = (linkIsUp != fHasConnection); fHasConnection = linkIsUp; @@ -773,6 +790,15 @@ DavicomDevice::OnNotify(uint32 actualLength) TRACE("Link is now down"); } + if (rxOverflow) + TRACE("RX buffer overflow occured %d times\n", fNotifyBuffer[4]); + + // 1,2 = TX status + if (fNotifyBuffer[1]) + TRACE("Error %x occured on transmitting packet 1\n", fNotifyBuffer[1]); + if (fNotifyBuffer[2]) + TRACE("Error %x occured on transmitting packet 2\n", fNotifyBuffer[2]); + if (linkStateChange && fLinkStateChangeSem >= B_OK) release_sem_etc(fLinkStateChangeSem, 1, B_DO_NOT_RESCHEDULE); return B_OK; diff --git a/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.h b/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.h index 56d0eb21c0..f0631925bf 100644 --- a/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.h +++ b/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.h @@ -103,7 +103,7 @@ static const int kNotifyBufferSize = 8; sem_id fLinkStateChangeSem; ether_address_t fMACAddress; bool fHasConnection; - uint8 fIPG[3]; + bool fTXBufferFull; }; #endif //_USB_Davicom_DEVICE_H_