|
@@ -697,14 +697,14 @@ static void axienet_eth_rx_notify(void *opaque)
|
|
axienet_eth_rx_notify, s)) {
|
|
axienet_eth_rx_notify, s)) {
|
|
size_t ret = stream_push(s->tx_control_dev,
|
|
size_t ret = stream_push(s->tx_control_dev,
|
|
(void *)s->rxapp + CONTROL_PAYLOAD_SIZE
|
|
(void *)s->rxapp + CONTROL_PAYLOAD_SIZE
|
|
- - s->rxappsize, s->rxappsize);
|
|
|
|
|
|
+ - s->rxappsize, s->rxappsize, true);
|
|
s->rxappsize -= ret;
|
|
s->rxappsize -= ret;
|
|
}
|
|
}
|
|
|
|
|
|
while (s->rxsize && stream_can_push(s->tx_data_dev,
|
|
while (s->rxsize && stream_can_push(s->tx_data_dev,
|
|
axienet_eth_rx_notify, s)) {
|
|
axienet_eth_rx_notify, s)) {
|
|
size_t ret = stream_push(s->tx_data_dev, (void *)s->rxmem + s->rxpos,
|
|
size_t ret = stream_push(s->tx_data_dev, (void *)s->rxmem + s->rxpos,
|
|
- s->rxsize);
|
|
|
|
|
|
+ s->rxsize, true);
|
|
s->rxsize -= ret;
|
|
s->rxsize -= ret;
|
|
s->rxpos += ret;
|
|
s->rxpos += ret;
|
|
if (!s->rxsize) {
|
|
if (!s->rxsize) {
|
|
@@ -874,12 +874,14 @@ static ssize_t eth_rx(NetClientState *nc, const uint8_t *buf, size_t size)
|
|
}
|
|
}
|
|
|
|
|
|
static size_t
|
|
static size_t
|
|
-xilinx_axienet_control_stream_push(StreamSlave *obj, uint8_t *buf, size_t len)
|
|
|
|
|
|
+xilinx_axienet_control_stream_push(StreamSlave *obj, uint8_t *buf, size_t len,
|
|
|
|
+ bool eop)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
XilinxAXIEnetStreamSlave *cs = XILINX_AXI_ENET_CONTROL_STREAM(obj);
|
|
XilinxAXIEnetStreamSlave *cs = XILINX_AXI_ENET_CONTROL_STREAM(obj);
|
|
XilinxAXIEnet *s = cs->enet;
|
|
XilinxAXIEnet *s = cs->enet;
|
|
|
|
|
|
|
|
+ assert(eop);
|
|
if (len != CONTROL_PAYLOAD_SIZE) {
|
|
if (len != CONTROL_PAYLOAD_SIZE) {
|
|
hw_error("AXI Enet requires %d byte control stream payload\n",
|
|
hw_error("AXI Enet requires %d byte control stream payload\n",
|
|
(int)CONTROL_PAYLOAD_SIZE);
|
|
(int)CONTROL_PAYLOAD_SIZE);
|
|
@@ -894,11 +896,15 @@ xilinx_axienet_control_stream_push(StreamSlave *obj, uint8_t *buf, size_t len)
|
|
}
|
|
}
|
|
|
|
|
|
static size_t
|
|
static size_t
|
|
-xilinx_axienet_data_stream_push(StreamSlave *obj, uint8_t *buf, size_t size)
|
|
|
|
|
|
+xilinx_axienet_data_stream_push(StreamSlave *obj, uint8_t *buf, size_t size,
|
|
|
|
+ bool eop)
|
|
{
|
|
{
|
|
XilinxAXIEnetStreamSlave *ds = XILINX_AXI_ENET_DATA_STREAM(obj);
|
|
XilinxAXIEnetStreamSlave *ds = XILINX_AXI_ENET_DATA_STREAM(obj);
|
|
XilinxAXIEnet *s = ds->enet;
|
|
XilinxAXIEnet *s = ds->enet;
|
|
|
|
|
|
|
|
+ /* We don't support fragmented packets yet. */
|
|
|
|
+ assert(eop);
|
|
|
|
+
|
|
/* TX enable ? */
|
|
/* TX enable ? */
|
|
if (!(s->tc & TC_TX)) {
|
|
if (!(s->tc & TC_TX)) {
|
|
return size;
|
|
return size;
|