From b3a6a1363579e0ff9cfd1c49600282a93acda538 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Mon, 11 Jan 2010 22:21:33 +0000 Subject: [PATCH] Preliminary support for the proper frame format for davicom devices. It still miss at least some checks about packet sizes and frame termination and probably some more error handling. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35022 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../network/usb_davicom/DavicomDevice.cpp | 101 ++++++------------ .../network/usb_davicom/DavicomDevice.h | 3 +- 2 files changed, 34 insertions(+), 70 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 7e83207859..566bc56178 100644 --- a/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp +++ b/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.cpp @@ -57,22 +57,6 @@ //TODO: set media state support -// frame header used during transfer data -struct TRXHeader { - uint16 fLength; - uint16 fInvertedLength; - - TRXHeader(uint16 length = 0){ SetLength(length); } - bool IsValid() { return (fLength ^ fInvertedLength) == 0xffff; } - uint16 Length() { return fLength; } - //TODO: low-endian convertion? - void SetLength(uint16 length) { - fLength = length; - fInvertedLength = ~fLength; - } -}; - - status_t DavicomDevice::_ReadRegister(uint8 reg, size_t size, uint8* buffer) { @@ -125,8 +109,7 @@ DavicomDevice::DavicomDevice(usb_device device, const char *description) fNotifyWriteSem(-1), fNotifyBuffer(NULL), fLinkStateChangeSem(-1), - fHasConnection(false), - fUseTRXHeader(false) + fHasConnection(false) { const usb_device_descriptor *deviceDescriptor = gUSBModule->get_device_descriptor(device); @@ -251,23 +234,20 @@ DavicomDevice::Read(uint8 *buffer, size_t *numBytes) if (fRemoved) { TRACE_ALWAYS("Error of receiving %d bytes from removed device.\n", - numBytesToRead); + numBytesToRead); return B_ERROR; } TRACE_FLOW("Request %d bytes.\n", numBytesToRead); - TRXHeader header; + uint8 header[kRXHeaderSize]; iovec rxData[] = { - { &header, sizeof(TRXHeader) }, + { &header, kRXHeaderSize }, { buffer, numBytesToRead } }; - size_t startIndex = fUseTRXHeader ? 0 : 1 ; - size_t chunkCount = fUseTRXHeader ? 2 : 1 ; - status_t result = gUSBModule->queue_bulk_v(fReadEndpoint, - &rxData[startIndex], chunkCount, _ReadCallback, this); + rxData, 1, _ReadCallback, this); if (result != B_OK) { TRACE_ALWAYS("Error of queue_bulk_v request:%#010x\n", result); return result; @@ -282,37 +262,29 @@ DavicomDevice::Read(uint8 *buffer, size_t *numBytes) if (fStatusRead != B_OK && fStatusRead != B_CANCELED && !fRemoved) { TRACE_ALWAYS("Device status error:%#010x\n", fStatusRead); - result = gUSBModule->clear_feature(fReadEndpoint, - USB_FEATURE_ENDPOINT_HALT); - if (result != B_OK) { - TRACE_ALWAYS("Error during clearing of HALT state:%#010x.\n", result); - return result; - } + return fStatusRead; } - if(fUseTRXHeader) { - if(fActualLengthRead < sizeof(TRXHeader)) { - TRACE_ALWAYS("Error: no place for TRXHeader:only %d of %d bytes.\n", - fActualLengthRead, sizeof(TRXHeader)); - return B_ERROR; //TODO: ??? - } + if(fActualLengthRead < kRXHeaderSize) { + TRACE_ALWAYS("Error: no place for TRXHeader:only %d of %d bytes.\n", + fActualLengthRead, kRXHeaderSize); + return B_ERROR; //TODO: ??? + } + + /* + * TODO :see what the first byte holds ? + if(!header.IsValid()) { + TRACE_ALWAYS("Error:TRX Header is invalid: len:%#04x; ilen:%#04x\n", + header.fLength, header.fInvertedLength); + return B_ERROR; //TODO: ??? + } + */ - if(!header.IsValid()) { - TRACE_ALWAYS("Error:TRX Header is invalid: len:%#04x; ilen:%#04x\n", - header.fLength, header.fInvertedLength); - return B_ERROR; //TODO: ??? - } - - *numBytes = header.Length(); + *numBytes = header[1] << 8 | header[2]; - if(fActualLengthRead - sizeof(TRXHeader) > header.Length()) { - TRACE_ALWAYS("MISMATCH of the frame length: hdr %d; received:%d\n", - header.Length(), fActualLengthRead - sizeof(TRXHeader)); - } - - } else { - - *numBytes = fActualLengthRead; + if(fActualLengthRead - kRXHeaderSize > *numBytes) { + TRACE_ALWAYS("MISMATCH of the frame length: hdr %d; received:%d\n", + *numBytes, fActualLengthRead - kRXHeaderSize); } TRACE_FLOW("Read %d bytes.\n", *numBytes); @@ -334,17 +306,17 @@ DavicomDevice::Write(const uint8 *buffer, size_t *numBytes) TRACE_FLOW("Write %d bytes.\n", numBytesToWrite); - TRXHeader header(numBytesToWrite); + uint8 header[kTXHeaderSize]; + header[0] = *numBytes >> 8; + header[1] = *numBytes & 0xFF; + iovec txData[] = { - { &header, sizeof(TRXHeader) }, + { &header, kTXHeaderSize }, { (uint8*)buffer, numBytesToWrite } }; - size_t startIndex = fUseTRXHeader ? 0 : 1 ; - size_t chunkCount = fUseTRXHeader ? 2 : 1 ; - status_t result = gUSBModule->queue_bulk_v(fWriteEndpoint, - &txData[startIndex], chunkCount, _WriteCallback, this); + txData, 1, _WriteCallback, this); if (result != B_OK) { TRACE_ALWAYS("Error of queue_bulk_v request:%#010x\n", result); return result; @@ -359,19 +331,10 @@ DavicomDevice::Write(const uint8 *buffer, size_t *numBytes) if (fStatusWrite != B_OK && fStatusWrite != B_CANCELED && !fRemoved) { TRACE_ALWAYS("Device status error:%#010x\n", fStatusWrite); - result = gUSBModule->clear_feature(fWriteEndpoint, - USB_FEATURE_ENDPOINT_HALT); - if (result != B_OK) { - TRACE_ALWAYS("Error during clearing of HALT state:%#010x\n", result); - return result; - } + return fStatusWrite; } - if(fUseTRXHeader) { - *numBytes = fActualLengthWrite - sizeof(TRXHeader); - } else { - *numBytes = fActualLengthWrite; - } + *numBytes = fActualLengthWrite - kTXHeaderSize;; TRACE_FLOW("Written %d bytes.\n", *numBytes); 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 a75a5c6ecf..56d0eb21c0 100644 --- a/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.h +++ b/src/add-ons/kernel/drivers/network/usb_davicom/DavicomDevice.h @@ -59,6 +59,8 @@ static void _NotifyCallback(void *cookie, int32 status, status_t _Write1Register(uint8 reg, uint8 buffer); static const int kFrameSize = 1518; +static const int kRXHeaderSize = 3; +static const int kTXHeaderSize = 2; protected: /* overrides */ @@ -101,7 +103,6 @@ static const int kNotifyBufferSize = 8; sem_id fLinkStateChangeSem; ether_address_t fMACAddress; bool fHasConnection; - bool fUseTRXHeader; uint8 fIPG[3]; };