|
@@ -107,6 +107,7 @@ struct E1000State_st {
|
|
e1000x_txd_props props;
|
|
e1000x_txd_props props;
|
|
e1000x_txd_props tso_props;
|
|
e1000x_txd_props tso_props;
|
|
uint16_t tso_frames;
|
|
uint16_t tso_frames;
|
|
|
|
+ bool busy;
|
|
} tx;
|
|
} tx;
|
|
|
|
|
|
struct {
|
|
struct {
|
|
@@ -763,6 +764,11 @@ start_xmit(E1000State *s)
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (s->tx.busy) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ s->tx.busy = true;
|
|
|
|
+
|
|
while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
|
|
while (s->mac_reg[TDH] != s->mac_reg[TDT]) {
|
|
base = tx_desc_base(s) +
|
|
base = tx_desc_base(s) +
|
|
sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
|
|
sizeof(struct e1000_tx_desc) * s->mac_reg[TDH];
|
|
@@ -789,6 +795,7 @@ start_xmit(E1000State *s)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ s->tx.busy = false;
|
|
set_ics(s, 0, cause);
|
|
set_ics(s, 0, cause);
|
|
}
|
|
}
|
|
|
|
|