mipsnet: Flush queued packets when receiving is enabled
Drop .can_receive and move the semantics to mipsnet_receive, by returning 0. After 0 is returned, we must flush the queue explicitly to restart it: Call qemu_flush_queued_packets when s->busy or s->rx_count is being updated. Signed-off-by: Fam Zheng <famz@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Jason Wang <jasowang@redhat.com> Message-id: 1436955553-22791-10-git-send-email-famz@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
		
							parent
							
								
									3b7031e960
								
							
						
					
					
						commit
						1dd58ae058
					
				| 
						 | 
				
			
			@ -80,7 +80,7 @@ static ssize_t mipsnet_receive(NetClientState *nc, const uint8_t *buf, size_t si
 | 
			
		|||
 | 
			
		||||
    trace_mipsnet_receive(size);
 | 
			
		||||
    if (!mipsnet_can_receive(nc))
 | 
			
		||||
        return -1;
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    s->busy = 1;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -134,6 +134,9 @@ static uint64_t mipsnet_ioport_read(void *opaque, hwaddr addr,
 | 
			
		|||
        if (s->rx_count) {
 | 
			
		||||
            s->rx_count--;
 | 
			
		||||
            ret = s->rx_buffer[s->rx_read++];
 | 
			
		||||
            if (mipsnet_can_receive(s->nic->ncs)) {
 | 
			
		||||
                qemu_flush_queued_packets(qemu_get_queue(s->nic));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    /* Reads as zero. */
 | 
			
		||||
| 
						 | 
				
			
			@ -170,6 +173,9 @@ static void mipsnet_ioport_write(void *opaque, hwaddr addr,
 | 
			
		|||
        }
 | 
			
		||||
        s->busy = !!s->intctl;
 | 
			
		||||
        mipsnet_update_irq(s);
 | 
			
		||||
        if (mipsnet_can_receive(s->nic->ncs)) {
 | 
			
		||||
            qemu_flush_queued_packets(qemu_get_queue(s->nic));
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    case MIPSNET_TX_DATA_BUFFER:
 | 
			
		||||
        s->tx_buffer[s->tx_written++] = val;
 | 
			
		||||
| 
						 | 
				
			
			@ -214,7 +220,6 @@ static const VMStateDescription vmstate_mipsnet = {
 | 
			
		|||
static NetClientInfo net_mipsnet_info = {
 | 
			
		||||
    .type = NET_CLIENT_OPTIONS_KIND_NIC,
 | 
			
		||||
    .size = sizeof(NICState),
 | 
			
		||||
    .can_receive = mipsnet_can_receive,
 | 
			
		||||
    .receive = mipsnet_receive,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue