make grade 100/100
This commit is contained in:
parent
7106151533
commit
dc0f3b33f8
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user