Skip to content

Commit

Permalink
net/npcm7xx_emc.c: Fix handling of receiving packets when RSDR not set
Browse files Browse the repository at this point in the history
Turning REG_MCMDR_RXON is enough to start receiving packets.

Signed-off-by: Doug Evans <[email protected]>
Message-id: [email protected]
Reviewed-by: Peter Maydell <[email protected]>
Signed-off-by: Peter Maydell <[email protected]>
  • Loading branch information
xdje42 authored and pm215 committed Mar 30, 2021
1 parent 7993b0f commit a62ee00
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 10 deletions.
4 changes: 3 additions & 1 deletion hw/net/npcm7xx_emc.c
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,9 @@ static void npcm7xx_emc_write(void *opaque, hwaddr offset,
!(value & REG_MCMDR_RXON)) {
emc->regs[REG_MGSTA] |= REG_MGSTA_RXHA;
}
if (!(value & REG_MCMDR_RXON)) {
if (value & REG_MCMDR_RXON) {
emc->rx_active = true;
} else {
emc_halt_rx(emc, 0);
}
break;
Expand Down
30 changes: 21 additions & 9 deletions tests/qtest/npcm7xx_emc-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -492,9 +492,6 @@ static void enable_tx(QTestState *qts, const EMCModule *mod,
mcmdr |= REG_MCMDR_TXON;
emc_write(qts, mod, REG_MCMDR, mcmdr);
}

/* Prod the device to send the packet. */
emc_write(qts, mod, REG_TSDR, 1);
}

static void emc_send_verify1(QTestState *qts, const EMCModule *mod, int fd,
Expand Down Expand Up @@ -558,6 +555,9 @@ static void emc_send_verify(QTestState *qts, const EMCModule *mod, int fd,
enable_tx(qts, mod, &desc[0], NUM_TX_DESCRIPTORS, desc_addr,
with_irq ? REG_MIEN_ENTXINTR : 0);

/* Prod the device to send the packet. */
emc_write(qts, mod, REG_TSDR, 1);

/*
* It's problematic to observe the interrupt for each packet.
* Instead just wait until all the packets go out.
Expand Down Expand Up @@ -643,13 +643,10 @@ static void enable_rx(QTestState *qts, const EMCModule *mod,
mcmdr |= REG_MCMDR_RXON | mcmdr_flags;
emc_write(qts, mod, REG_MCMDR, mcmdr);
}

/* Prod the device to accept a packet. */
emc_write(qts, mod, REG_RSDR, 1);
}

static void emc_recv_verify(QTestState *qts, const EMCModule *mod, int fd,
bool with_irq)
bool with_irq, bool pump_rsdr)
{
NPCM7xxEMCRxDesc desc[NUM_RX_DESCRIPTORS];
uint32_t desc_addr = DESC_ADDR;
Expand Down Expand Up @@ -679,6 +676,15 @@ static void emc_recv_verify(QTestState *qts, const EMCModule *mod, int fd,
enable_rx(qts, mod, &desc[0], NUM_RX_DESCRIPTORS, desc_addr,
with_irq ? REG_MIEN_ENRXINTR : 0, 0);

/*
* If requested, prod the device to accept a packet.
* This isn't necessary, the linux driver doesn't do this.
* Test doing/not-doing this for robustness.
*/
if (pump_rsdr) {
emc_write(qts, mod, REG_RSDR, 1);
}

/* Send test packet to device's socket. */
ret = iov_send(fd, iov, 2, 0, sizeof(len) + sizeof(test));
g_assert_cmpint(ret, == , sizeof(test) + sizeof(len));
Expand Down Expand Up @@ -826,8 +832,14 @@ static void test_rx(gconstpointer test_data)

qtest_irq_intercept_in(qts, "/machine/soc/a9mpcore/gic");

emc_recv_verify(qts, td->module, test_sockets[0], /*with_irq=*/false);
emc_recv_verify(qts, td->module, test_sockets[0], /*with_irq=*/true);
emc_recv_verify(qts, td->module, test_sockets[0], /*with_irq=*/false,
/*pump_rsdr=*/false);
emc_recv_verify(qts, td->module, test_sockets[0], /*with_irq=*/false,
/*pump_rsdr=*/true);
emc_recv_verify(qts, td->module, test_sockets[0], /*with_irq=*/true,
/*pump_rsdr=*/false);
emc_recv_verify(qts, td->module, test_sockets[0], /*with_irq=*/true,
/*pump_rsdr=*/true);
emc_test_ptle(qts, td->module, test_sockets[0]);

qtest_quit(qts);
Expand Down

0 comments on commit a62ee00

Please sign in to comment.