mirror of https://github.com/xemu-project/xemu.git
e1000e: Improve software reset
This change makes e1000e reset more things when software reset was triggered. Some registers are exempted from software reset in the datasheet and this change also implements the behavior accordingly. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
31e3f318c8
commit
86343066ba
|
@ -58,6 +58,8 @@
|
|||
static inline void
|
||||
e1000e_set_interrupt_cause(E1000ECore *core, uint32_t val);
|
||||
|
||||
static void e1000e_reset(E1000ECore *core, bool sw);
|
||||
|
||||
static inline void
|
||||
e1000e_process_ts_option(E1000ECore *core, struct e1000_tx_desc *dp)
|
||||
{
|
||||
|
@ -1882,7 +1884,7 @@ e1000e_set_ctrl(E1000ECore *core, int index, uint32_t val)
|
|||
|
||||
if (val & E1000_CTRL_RST) {
|
||||
trace_e1000e_core_ctrl_sw_reset();
|
||||
e1000x_reset_mac_addr(core->owner_nic, core->mac, core->permanent_mac);
|
||||
e1000e_reset(core, true);
|
||||
}
|
||||
|
||||
if (val & E1000_CTRL_PHY_RST) {
|
||||
|
@ -3488,8 +3490,7 @@ static const uint32_t e1000e_mac_reg_init[] = {
|
|||
[EITR...EITR + E1000E_MSIX_VEC_NUM - 1] = E1000E_MIN_XITR,
|
||||
};
|
||||
|
||||
void
|
||||
e1000e_core_reset(E1000ECore *core)
|
||||
static void e1000e_reset(E1000ECore *core, bool sw)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -3499,8 +3500,15 @@ e1000e_core_reset(E1000ECore *core)
|
|||
|
||||
memset(core->phy, 0, sizeof core->phy);
|
||||
memcpy(core->phy, e1000e_phy_reg_init, sizeof e1000e_phy_reg_init);
|
||||
memset(core->mac, 0, sizeof core->mac);
|
||||
memcpy(core->mac, e1000e_mac_reg_init, sizeof e1000e_mac_reg_init);
|
||||
|
||||
for (i = 0; i < E1000E_MAC_SIZE; i++) {
|
||||
if (sw && (i == PBA || i == PBS || i == FLA)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
core->mac[i] = i < ARRAY_SIZE(e1000e_mac_reg_init) ?
|
||||
e1000e_mac_reg_init[i] : 0;
|
||||
}
|
||||
|
||||
core->rxbuf_min_shift = 1 + E1000_RING_DESC_LEN_SHIFT;
|
||||
|
||||
|
@ -3517,6 +3525,12 @@ e1000e_core_reset(E1000ECore *core)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
e1000e_core_reset(E1000ECore *core)
|
||||
{
|
||||
e1000e_reset(core, false);
|
||||
}
|
||||
|
||||
void e1000e_core_pre_save(E1000ECore *core)
|
||||
{
|
||||
int i;
|
||||
|
|
Loading…
Reference in New Issue