Commit 8ea6c5de authored by Jialin Li's avatar Jialin Li
Browse files

more correct head/tail ptr implementation

parent ac9eb141
...@@ -19,7 +19,9 @@ static void eth_send(void *data, size_t len); ...@@ -19,7 +19,9 @@ static void eth_send(void *data, size_t len);
namespace corundum { namespace corundum {
DescRing::DescRing() DescRing::DescRing()
: active(false) : _dmaAddr(0), _sizeLog(0), _size(0), _sizeMask(0),
_index(0), _headPtr(0), _tailPtr(0), _currTail(0),
active(false)
{ {
} }
...@@ -46,13 +48,13 @@ DescRing::index() ...@@ -46,13 +48,13 @@ DescRing::index()
return this->_index; return this->_index;
} }
unsigned ptr_t
DescRing::headPtr() DescRing::headPtr()
{ {
return this->_headPtr; return this->_headPtr;
} }
unsigned ptr_t
DescRing::tailPtr() DescRing::tailPtr()
{ {
return this->_tailPtr; return this->_tailPtr;
...@@ -94,13 +96,13 @@ DescRing::setIndex(unsigned index) ...@@ -94,13 +96,13 @@ DescRing::setIndex(unsigned index)
} }
void void
DescRing::setHeadPtr(unsigned ptr) DescRing::setHeadPtr(ptr_t ptr)
{ {
this->_headPtr = ptr; this->_headPtr = ptr;
} }
void void
DescRing::setTailPtr(unsigned ptr) DescRing::setTailPtr(ptr_t ptr)
{ {
this->_tailPtr = ptr; this->_tailPtr = ptr;
} }
...@@ -126,11 +128,11 @@ TxRing::~TxRing() ...@@ -126,11 +128,11 @@ TxRing::~TxRing()
} }
void void
TxRing::setHeadPtr(unsigned ptr) TxRing::setHeadPtr(ptr_t ptr)
{ {
DescRing::setHeadPtr(ptr); DescRing::setHeadPtr(ptr);
if (!empty()) { while (this->_currTail != this->_headPtr) {
unsigned index = (this->_headPtr - 1) & this->_sizeMask; unsigned index = this->_currTail & this->_sizeMask;
addr_t dma_addr = this->_dmaAddr + index * DESC_SIZE; addr_t dma_addr = this->_dmaAddr + index * DESC_SIZE;
/* Issue DMA read */ /* Issue DMA read */
DMAOp *op = new DMAOp; DMAOp *op = new DMAOp;
...@@ -138,9 +140,10 @@ TxRing::setHeadPtr(unsigned ptr) ...@@ -138,9 +140,10 @@ TxRing::setHeadPtr(unsigned ptr)
op->dma_addr = dma_addr; op->dma_addr = dma_addr;
op->len = DESC_SIZE; op->len = DESC_SIZE;
op->ring = this; op->ring = this;
op->tag = this->_headPtr; op->tag = this->_currTail;
op->write = false; op->write = false;
issue_dma_op(op); issue_dma_op(op);
this->_currTail++;
} }
} }
...@@ -161,7 +164,8 @@ TxRing::dmaDone(DMAOp *op) ...@@ -161,7 +164,8 @@ TxRing::dmaDone(DMAOp *op)
case DMA_TYPE_MEM: case DMA_TYPE_MEM:
eth_send(op->data, op->len); eth_send(op->data, op->len);
// TODO: assume in order transmission // TODO: assume in order transmission
this->_tailPtr = (unsigned)op->tag; assert(this->_tailPtr == op->tag);
this->_tailPtr++;
delete op; delete op;
break; break;
default: default:
...@@ -307,7 +311,6 @@ Port::queueDisable() ...@@ -307,7 +311,6 @@ Port::queueDisable()
this->_queueEnable = false; this->_queueEnable = false;
} }
void queueDisable();
Corundum::Corundum() Corundum::Corundum()
{ {
this->port.setId(0); this->port.setId(0);
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
typedef uint32_t reg_t; typedef uint32_t reg_t;
typedef uint64_t addr_t; typedef uint64_t addr_t;
typedef uint16_t ptr_t;
#define REG_FW_ID 0x0000 #define REG_FW_ID 0x0000
#define REG_FW_VER 0x0004 #define REG_FW_VER 0x0004
...@@ -94,7 +95,6 @@ namespace corundum { ...@@ -94,7 +95,6 @@ namespace corundum {
#define DESC_SIZE 16 #define DESC_SIZE 16
#define MAX_DMA_LEN 2048 #define MAX_DMA_LEN 2048
#define HW_PTR_MASK 0xFFFF
class DescRing; class DescRing;
...@@ -127,15 +127,15 @@ public: ...@@ -127,15 +127,15 @@ public:
addr_t dmaAddr(); addr_t dmaAddr();
size_t sizeLog(); size_t sizeLog();
unsigned index(); unsigned index();
unsigned headPtr(); ptr_t headPtr();
unsigned tailPtr(); ptr_t tailPtr();
void setDMALower(uint32_t addr); void setDMALower(uint32_t addr);
void setDMAUpper(uint32_t addr); void setDMAUpper(uint32_t addr);
void setSizeLog(size_t size_log); void setSizeLog(size_t size_log);
void setIndex(unsigned index); void setIndex(unsigned index);
virtual void setHeadPtr(unsigned ptr); virtual void setHeadPtr(ptr_t ptr);
void setTailPtr(unsigned ptr); void setTailPtr(ptr_t ptr);
virtual void dmaDone(DMAOp *op); virtual void dmaDone(DMAOp *op);
...@@ -147,8 +147,9 @@ protected: ...@@ -147,8 +147,9 @@ protected:
size_t _size; size_t _size;
size_t _sizeMask; size_t _sizeMask;
unsigned _index; unsigned _index;
unsigned _headPtr; ptr_t _headPtr;
unsigned _tailPtr; ptr_t _tailPtr;
ptr_t _currTail;
bool active; bool active;
}; };
...@@ -157,7 +158,7 @@ public: ...@@ -157,7 +158,7 @@ public:
TxRing(); TxRing();
~TxRing(); ~TxRing();
virtual void setHeadPtr(unsigned ptr) override; virtual void setHeadPtr(ptr_t ptr) override;
virtual void dmaDone(DMAOp *op) override; virtual void dmaDone(DMAOp *op) override;
}; };
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment