[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 01/13] dp8393x: Mask EOL bit from descriptor addresses
From: |
Finn Thain |
Subject: |
[PATCH v2 01/13] dp8393x: Mask EOL bit from descriptor addresses |
Date: |
Fri, 20 Dec 2019 15:17:46 +1100 |
The LSB of descriptor address registers is used as an EOL flag.
It has to be masked when those registers are to be used as actual
addresses for copying memory around. But when the registers are
to be updated the EOL bit should not be masked.
Signed-off-by: Finn Thain <address@hidden>
---
Changed since v1:
- Added macros to name constants as requested by Philippe Mathieu-Daudé.
---
hw/net/dp8393x.c | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/hw/net/dp8393x.c b/hw/net/dp8393x.c
index 3d991af163..1957bd391e 100644
--- a/hw/net/dp8393x.c
+++ b/hw/net/dp8393x.c
@@ -145,6 +145,9 @@ do { printf("sonic ERROR: %s: " fmt, __func__ , ##
__VA_ARGS__); } while (0)
#define SONIC_ISR_PINT 0x0800
#define SONIC_ISR_LCD 0x1000
+#define SONIC_DESC_EOL 0x0001
+#define SONIC_DESC_ADDR 0xFFFE
+
#define TYPE_DP8393X "dp8393x"
#define DP8393X(obj) OBJECT_CHECK(dp8393xState, (obj), TYPE_DP8393X)
@@ -197,7 +200,8 @@ static uint32_t dp8393x_crba(dp8393xState *s)
static uint32_t dp8393x_crda(dp8393xState *s)
{
- return (s->regs[SONIC_URDA] << 16) | s->regs[SONIC_CRDA];
+ return (s->regs[SONIC_URDA] << 16) |
+ (s->regs[SONIC_CRDA] & SONIC_DESC_ADDR);
}
static uint32_t dp8393x_rbwc(dp8393xState *s)
@@ -217,7 +221,8 @@ static uint32_t dp8393x_tsa(dp8393xState *s)
static uint32_t dp8393x_ttda(dp8393xState *s)
{
- return (s->regs[SONIC_UTDA] << 16) | s->regs[SONIC_TTDA];
+ return (s->regs[SONIC_UTDA] << 16) |
+ (s->regs[SONIC_TTDA] & SONIC_DESC_ADDR);
}
static uint32_t dp8393x_wt(dp8393xState *s)
@@ -506,8 +511,8 @@ static void dp8393x_do_transmit_packets(dp8393xState *s)
sizeof(uint16_t) *
(4 + 3 * s->regs[SONIC_TFC]) * width,
MEMTXATTRS_UNSPECIFIED, (uint8_t *)s->data, size, 0);
- s->regs[SONIC_CTDA] = dp8393x_get(s, width, 0) & ~0x1;
- if (dp8393x_get(s, width, 0) & 0x1) {
+ s->regs[SONIC_CTDA] = dp8393x_get(s, width, 0);
+ if (s->regs[SONIC_CTDA] & SONIC_DESC_EOL) {
/* EOL detected */
break;
}
@@ -763,13 +768,13 @@ static ssize_t dp8393x_receive(NetClientState *nc, const
uint8_t * buf,
/* XXX: Check byte ordering */
/* Check for EOL */
- if (s->regs[SONIC_LLFA] & 0x1) {
+ if (s->regs[SONIC_LLFA] & SONIC_DESC_EOL) {
/* Are we still in resource exhaustion? */
size = sizeof(uint16_t) * 1 * width;
address = dp8393x_crda(s) + sizeof(uint16_t) * 5 * width;
address_space_rw(&s->as, address, MEMTXATTRS_UNSPECIFIED,
(uint8_t *)s->data, size, 0);
- if (dp8393x_get(s, width, 0) & 0x1) {
+ if (dp8393x_get(s, width, 0) & SONIC_DESC_EOL) {
/* Still EOL ; stop reception */
return -1;
} else {
@@ -827,7 +832,7 @@ static ssize_t dp8393x_receive(NetClientState *nc, const
uint8_t * buf,
address_space_rw(&s->as, dp8393x_crda(s) + sizeof(uint16_t) * 5 * width,
MEMTXATTRS_UNSPECIFIED, (uint8_t *)s->data, size, 0);
s->regs[SONIC_LLFA] = dp8393x_get(s, width, 0);
- if (s->regs[SONIC_LLFA] & 0x1) {
+ if (s->regs[SONIC_LLFA] & SONIC_DESC_EOL) {
/* EOL detected */
s->regs[SONIC_ISR] |= SONIC_ISR_RDE;
} else {
--
2.23.0
- [PATCH v2 04/13] dp8393x: Update LLFA and CRDA registers from rx descriptor, (continued)
- [PATCH v2 04/13] dp8393x: Update LLFA and CRDA registers from rx descriptor, Finn Thain, 2019/12/19
- [PATCH v2 05/13] dp8393x: Clear RRRA command register bit only when appropriate, Finn Thain, 2019/12/19
- [PATCH v2 08/13] dp8393x: Don't clobber packet checksum, Finn Thain, 2019/12/19
- [PATCH v2 09/13] dp8393x: Use long-word-aligned RRA pointers in 32-bit mode, Finn Thain, 2019/12/19
- [PATCH v2 03/13] dp8393x: Have dp8393x_receive() return the packet size, Finn Thain, 2019/12/19
- [PATCH v2 06/13] dp8393x: Implement packet size limit and RBAE interrupt, Finn Thain, 2019/12/19
- [PATCH v2 10/13] dp8393x: Pad frames to word or long word boundary, Finn Thain, 2019/12/19
- [PATCH v2 07/13] dp8393x: Don't stop reception upon RBE interrupt assertion, Finn Thain, 2019/12/19
- [PATCH v2 11/13] dp8393x: Clear descriptor in_use field when necessary, Finn Thain, 2019/12/19
- [PATCH v2 12/13] dp8393x: Always update RRA pointers and sequence numbers, Finn Thain, 2019/12/19
- [PATCH v2 01/13] dp8393x: Mask EOL bit from descriptor addresses,
Finn Thain <=
- [PATCH v2 13/13] dp8393x: Correctly advance RRP, Finn Thain, 2019/12/19
- Re: [PATCH v2 00/13] Fixes for DP8393X SONIC device emulation, Laurent Vivier, 2019/12/20