[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [Qemu-devel] [PATCH] e1000: Mask out lower bits of RDBAL/TDBAL,
Aurelien Jarno <=