qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] e1000: Mask out lower bits of RDBAL/TDBAL


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH] e1000: Mask out lower bits of RDBAL/TDBAL
Date: Mon, 4 Apr 2011 00:15:48 +0200
User-agent: Mutt/1.5.20 (2009-06-14)

On Sat, Mar 26, 2011 at 07:37:56PM +0100, Kevin Wolf wrote:
> Rx and Tx descriptors are 16 byte aligned, so the lower bits are
> ignored by real hardware. In fact, they always read back as zero on real
> hardware, but probably nobody relies on that.
> 
> Signed-off-by: Kevin Wolf <address@hidden>
> ---
>  hw/e1000.c |   21 ++++++++++++++++++---
>  1 files changed, 18 insertions(+), 3 deletions(-)

Thanks, applied.

> diff --git a/hw/e1000.c b/hw/e1000.c
> index 2a4d5c7..a65fc7a 100644
> --- a/hw/e1000.c
> +++ b/hw/e1000.c
> @@ -517,6 +517,14 @@ txdesc_writeback(target_phys_addr_t base, struct 
> e1000_tx_desc *dp)
>      return E1000_ICR_TXDW;
>  }
>  
> +static uint64_t tx_desc_base(E1000State *s)
> +{
> +    uint64_t bah = s->mac_reg[TDBAH];
> +    uint64_t bal = s->mac_reg[TDBAL] & ~0xf;
> +
> +    return (bah << 32) + bal;
> +}
> +
>  static void
>  start_xmit(E1000State *s)
>  {
> @@ -530,7 +538,7 @@ start_xmit(E1000State *s)
>      }
>  
>      while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
> -        base = ((uint64_t)s->mac_reg[TDBAH] << 32) + s->mac_reg[TDBAL] +
> +        base = tx_desc_base(s) +
>                 sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
>          cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
>  
> @@ -651,6 +659,14 @@ static bool e1000_has_rxbufs(E1000State *s, size_t 
> total_size)
>      return total_size <= bufs * s->rxbuf_size;
>  }
>  
> +static uint64_t rx_desc_base(E1000State *s)
> +{
> +    uint64_t bah = s->mac_reg[RDBAH];
> +    uint64_t bal = s->mac_reg[RDBAL] & ~0xf;
> +
> +    return (bah << 32) + bal;
> +}
> +
>  static ssize_t
>  e1000_receive(VLANClientState *nc, const uint8_t *buf, size_t size)
>  {
> @@ -700,8 +716,7 @@ e1000_receive(VLANClientState *nc, const uint8_t *buf, 
> size_t size)
>          if (desc_size > s->rxbuf_size) {
>              desc_size = s->rxbuf_size;
>          }
> -        base = ((uint64_t)s->mac_reg[RDBAH] << 32) + s->mac_reg[RDBAL] +
> -               sizeof(desc) * s->mac_reg[RDH];
> +        base = rx_desc_base(s) + sizeof(desc) * s->mac_reg[RDH];
>          cpu_physical_memory_read(base, (void *)&desc, sizeof(desc));
>          desc.special = vlan_special;
>          desc.status |= (vlan_status | E1000_RXD_STAT_DD);
> -- 
> 1.6.0.2
> 
> 
> 

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
address@hidden                 http://www.aurel32.net



reply via email to

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