qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/2] net: Fix lan9118 TX "CMD A" handling


From: Peter Crosthwaite
Subject: Re: [Qemu-devel] [PATCH 1/2] net: Fix lan9118 TX "CMD A" handling
Date: Sat, 28 Dec 2013 11:25:53 +1000

On Sat, Dec 21, 2013 at 4:26 AM, Roy Franz <address@hidden> wrote:
> The 9118 ethernet controller supports transmission of multi-buffer packets
> with arbitrary byte alignment of the start and end bytes.  All writes to
> the packet fifo are 32 bits, so the controller discards bytes at the beginning
> and end of each buffer based on the 'Data start offset' and 'Buffer size'
> of the TX command 'A' format.
>
> This patch changes the buffer size and offset internal state variables to be
> updated on every "TX command A" write.  Previously they were only updated for
> the first segment, which resulted incorrect behavior for packets with more
> than one segment. Each segment of the packet has its own CMD A command, with
> its own buffer size and start offset.
>
> Signed-off-by: Roy Franz <address@hidden>
> ---
>  hw/net/lan9118.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/hw/net/lan9118.c b/hw/net/lan9118.c
> index 2315f99..c5d6f14 100644
> --- a/hw/net/lan9118.c
> +++ b/hw/net/lan9118.c
> @@ -727,14 +727,14 @@ static void tx_fifo_push(lan9118_state *s, uint32_t val)
>          s->txp->cmd_a = val & 0x831f37ff;
>          s->txp->fifo_used++;
>          s->txp->state = TX_B;
> +        s->txp->buffer_size = s->txp->cmd_a & 0x7ff;
> +        s->txp->offset = (s->txp->cmd_a >> 16) & 0x1f;

While you are touching this, you could change it to use the preferable
extract32 macro rather than the & >> logic.

Regards,
Peter

>          break;
>      case TX_B:
>          if (s->txp->cmd_a & 0x2000) {
>              /* First segment */
>              s->txp->cmd_b = val;
>              s->txp->fifo_used++;
> -            s->txp->buffer_size = s->txp->cmd_a & 0x7ff;
> -            s->txp->offset = (s->txp->cmd_a >> 16) & 0x1f;
>              /* End alignment does not include command words.  */
>              n = (s->txp->buffer_size + s->txp->offset + 3) >> 2;
>              switch ((n >> 24) & 3) {
> --
> 1.7.10.4
>
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]