[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL V2 13/44] e1000e: Improve software reset
From: |
Jason Wang |
Subject: |
[PULL V2 13/44] e1000e: Improve software reset |
Date: |
Fri, 10 Mar 2023 17:34:55 +0800 |
From: Akihiko Odaki <akihiko.odaki@daynix.com>
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>
---
hw/net/e1000e_core.c | 24 +++++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-)
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
index 37aec6a..b867066 100644
--- a/hw/net/e1000e_core.c
+++ b/hw/net/e1000e_core.c
@@ -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;
--
2.7.4
- [PULL V2 03/44] fsl_etsec: Use hw/net/mii.h, (continued)
- [PULL V2 03/44] fsl_etsec: Use hw/net/mii.h, Jason Wang, 2023/03/10
- [PULL V2 05/44] e1000: Mask registers when writing, Jason Wang, 2023/03/10
- [PULL V2 04/44] e1000: Use hw/net/mii.h, Jason Wang, 2023/03/10
- [PULL V2 07/44] e1000e: Mask registers when writing, Jason Wang, 2023/03/10
- [PULL V2 06/44] e1000e: Introduce E1000E_LOW_BITS_SET_FUNC, Jason Wang, 2023/03/10
- [PULL V2 08/44] e1000: Use more constant definitions, Jason Wang, 2023/03/10
- [PULL V2 09/44] e1000e: Use more constant definitions, Jason Wang, 2023/03/10
- [PULL V2 10/44] e1000: Use memcpy to intialize registers, Jason Wang, 2023/03/10
- [PULL V2 11/44] e1000e: Use memcpy to intialize registers, Jason Wang, 2023/03/10
- [PULL V2 12/44] e1000e: Remove pending interrupt flags, Jason Wang, 2023/03/10
- [PULL V2 13/44] e1000e: Improve software reset,
Jason Wang <=
- [PULL V2 14/44] e1000: Configure ResettableClass, Jason Wang, 2023/03/10
- [PULL V2 15/44] e1000e: Configure ResettableClass, Jason Wang, 2023/03/10
- [PULL V2 17/44] e1000e: Set MII_ANER_NWAY, Jason Wang, 2023/03/10
- [PULL V2 16/44] e1000e: Introduce e1000_rx_desc_union, Jason Wang, 2023/03/10
- [PULL V2 18/44] e1000e: Remove extra pointer indirection, Jason Wang, 2023/03/10
- [PULL V2 20/44] e1000x: Alter the signature of e1000x_is_vlan_packet, Jason Wang, 2023/03/10
- [PULL V2 19/44] net: Check L4 header size, Jason Wang, 2023/03/10
- [PULL V2 21/44] net: Strip virtio-net header when dumping, Jason Wang, 2023/03/10
- [PULL V2 22/44] hw/net/net_tx_pkt: Automatically determine if virtio-net header is used, Jason Wang, 2023/03/10
- [PULL V2 23/44] hw/net/net_rx_pkt: Remove net_rx_pkt_has_virt_hdr, Jason Wang, 2023/03/10