make grade 100/100

This commit is contained in:
ridethepig 2023-02-02 13:17:29 +00:00
parent 7106151533
commit dc0f3b33f8
2 changed files with 35 additions and 1 deletions

View File

@ -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

1
time.txt Normal file
View File

@ -0,0 +1 @@
5