From dc0f3b33f8a4e76aa5acd220d8d68c5c25919d09 Mon Sep 17 00:00:00 2001 From: ridethepig Date: Thu, 2 Feb 2023 13:17:29 +0000 Subject: [PATCH] make grade 100/100 --- kernel/e1000.c | 35 ++++++++++++++++++++++++++++++++++- time.txt | 1 + 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 time.txt diff --git a/kernel/e1000.c b/kernel/e1000.c index 70a2adf..e71c96c 100644 --- a/kernel/e1000.c +++ b/kernel/e1000.c @@ -102,7 +102,23 @@ e1000_transmit(struct mbuf *m) // the TX descriptor ring so that the e1000 sends it. Stash // a pointer so that it can be freed after sending. // - + + acquire(&e1000_lock); + int tdt = regs[E1000_TDT]; + if (!(tx_ring[tdt].status & E1000_TXD_STAT_DD)) { + release(&e1000_lock); + return -1; + } + if (tx_mbufs[tdt]) { + mbuffree(tx_mbufs[tdt]); + tx_mbufs[tdt] = 0; + } + tx_mbufs[tdt] = m; + tx_ring[tdt].addr = (uint64)m->head; + tx_ring[tdt].length = m->len; + tx_ring[tdt].cmd = E1000_TXD_CMD_RS | E1000_TXD_CMD_EOP; + regs[E1000_TDT] = (tdt + 1) % TX_RING_SIZE; + release(&e1000_lock); return 0; } @@ -115,6 +131,23 @@ e1000_recv(void) // Check for packets that have arrived from the e1000 // Create and deliver an mbuf for each packet (using net_rx()). // + acquire(&e1000_lock); + int rdt = regs[E1000_RDT]; + rdt = (rdt + 1) % RX_RING_SIZE; + while (rx_ring[rdt].status & E1000_RXD_STAT_DD) + { + if (!holding(&e1000_lock)) acquire(&e1000_lock); + rx_mbufs[rdt]->len = rx_ring[rdt].length; + struct mbuf* m = rx_mbufs[rdt]; + rx_mbufs[rdt] = mbufalloc(0); + if (!rx_mbufs[rdt]) panic("e1000 recv"); + rx_ring[rdt].addr = (uint64)rx_mbufs[rdt]->head; + rx_ring[rdt].status = 0; + regs[E1000_RDT] = rdt; + rdt = (rdt + 1) % RX_RING_SIZE; + release(&e1000_lock); + net_rx(m); + } } void diff --git a/time.txt b/time.txt new file mode 100644 index 0000000..7813681 --- /dev/null +++ b/time.txt @@ -0,0 +1 @@ +5 \ No newline at end of file