On 03/03/20(Tue) 11:37, Martin Pieuchot wrote: > Currently em_hw_init() uses some hardcorded values to configure TX > rings. Diff below convert it to use the value of the first queue. > This is currently a no-op. It makes the code consistent with the > rest of the driver and reduce the size of upcoming diffs. > > Note that even if a single queue is currently used two of them are > setup. Document this has an historical behavior and keep it like it > is, there's not much need to introduce regression here :)
Updated diff that includes a chunk I missed in previous spotted by jmatthew@. ok? Index: dev/pci/if_em.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_em.c,v retrieving revision 1.346 diff -u -p -r1.346 if_em.c --- dev/pci/if_em.c 3 Mar 2020 10:43:29 -0000 1.346 +++ dev/pci/if_em.c 4 Mar 2020 17:08:18 -0000 @@ -1883,7 +1883,7 @@ em_hardware_init(struct em_softc *sc) em_disable_aspm(sc); - if ((ret_val = em_init_hw(&sc->hw)) != 0) { + if ((ret_val = em_init_hw(sc)) != 0) { if (ret_val == E1000_DEFER_INIT) { INIT_DEBUGOUT("\nHardware Initialization Deferred "); return (EAGAIN); Index: dev/pci/if_em_hw.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_em_hw.c,v retrieving revision 1.106 diff -u -p -r1.106 if_em_hw.c --- dev/pci/if_em_hw.c 4 Feb 2020 10:59:23 -0000 1.106 +++ dev/pci/if_em_hw.c 4 Mar 2020 17:09:31 -0000 @@ -56,6 +56,7 @@ #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> +#include <dev/pci/if_em.h> #include <dev/pci/if_em_hw.h> #include <dev/pci/if_em_soc.h> @@ -92,7 +93,7 @@ static int32_t em_init_lcd_from_nvm_conf static int32_t em_init_lcd_from_nvm(struct em_hw *); static int32_t em_phy_no_cable_workaround(struct em_hw *); static void em_init_rx_addrs(struct em_hw *); -static void em_initialize_hardware_bits(struct em_hw *); +static void em_initialize_hardware_bits(struct em_softc *); static void em_toggle_lanphypc_pch_lpt(struct em_hw *); static int em_disable_ulp_lpt_lp(struct em_hw *hw, bool force); static boolean_t em_is_onboard_nvm_eeprom(struct em_hw *); @@ -712,6 +713,7 @@ em_set_mac_type(struct em_hw *hw) return E1000_SUCCESS; } + /***************************************************************************** * Set media type and TBI compatibility. * @@ -1115,8 +1117,11 @@ em_reset_hw(struct em_hw *hw) * *****************************************************************************/ STATIC void -em_initialize_hardware_bits(struct em_hw *hw) +em_initialize_hardware_bits(struct em_softc *sc) { + struct em_hw *hw = &sc->hw; + struct em_queue *que = sc->queues; /* Use only first queue. */ + DEBUGFUNC("em_initialize_hardware_bits"); if ((hw->mac_type >= em_82571) && (!hw->initialize_hw_bits_disable)) { @@ -1124,18 +1129,24 @@ em_initialize_hardware_bits(struct em_hw uint32_t reg_ctrl, reg_ctrl_ext; uint32_t reg_tarc0, reg_tarc1; uint32_t reg_tctl; - uint32_t reg_txdctl, reg_txdctl1; + uint32_t reg_txdctl; reg_tarc0 = E1000_READ_REG(hw, TARC0); reg_tarc0 &= ~0x78000000; /* Clear bits 30, 29, 28, and * 27 */ - reg_txdctl = E1000_READ_REG(hw, TXDCTL(0)); + reg_txdctl = E1000_READ_REG(hw, TXDCTL(que->me)); reg_txdctl |= E1000_TXDCTL_COUNT_DESC; /* Set bit 22 */ - E1000_WRITE_REG(hw, TXDCTL(0), reg_txdctl); + E1000_WRITE_REG(hw, TXDCTL(que->me), reg_txdctl); - reg_txdctl1 = E1000_READ_REG(hw, TXDCTL(1)); - reg_txdctl1 |= E1000_TXDCTL_COUNT_DESC; /* Set bit 22 */ - E1000_WRITE_REG(hw, TXDCTL(1), reg_txdctl1); + /* + * Old code always initialized queue 1, + * even when unused, keep behaviour + */ + if (sc->num_queues == 1) { + reg_txdctl = E1000_READ_REG(hw, TXDCTL(1)); + reg_txdctl |= E1000_TXDCTL_COUNT_DESC; + E1000_WRITE_REG(hw, TXDCTL(1), reg_txdctl); + } switch (hw->mac_type) { case em_82571: @@ -1430,8 +1441,10 @@ out: * the transmit and receive units disabled and uninitialized. *****************************************************************************/ int32_t -em_init_hw(struct em_hw *hw) +em_init_hw(struct em_softc *sc) { + struct em_hw *hw = &sc->hw; + struct em_queue *que = sc->queues; /* Use only first queue. */ uint32_t ctrl; uint32_t i; int32_t ret_val; @@ -1513,7 +1526,7 @@ em_init_hw(struct em_hw *hw) /* Magic delay that improves problems with i219LM on HP Elitebook */ msec_delay(1); /* Must be called after em_set_media_type because media_type is used */ - em_initialize_hardware_bits(hw); + em_initialize_hardware_bits(sc); /* Disabling VLAN filtering. */ DEBUGOUT("Initializing the IEEE VLAN\n"); @@ -1626,10 +1639,10 @@ em_init_hw(struct em_hw *hw) /* Set the transmit descriptor write-back policy */ if (hw->mac_type > em_82544) { - ctrl = E1000_READ_REG(hw, TXDCTL(0)); + ctrl = E1000_READ_REG(hw, TXDCTL(que->me)); ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | E1000_TXDCTL_FULL_TX_DESC_WB; - E1000_WRITE_REG(hw, TXDCTL(0), ctrl); + E1000_WRITE_REG(hw, TXDCTL(que->me), ctrl); } if ((hw->mac_type == em_82573) || (hw->mac_type == em_82574)) { em_enable_tx_pkt_filtering(hw); @@ -1674,10 +1687,16 @@ em_init_hw(struct em_hw *hw) case em_pch_lpt: case em_pch_spt: case em_pch_cnp: - ctrl = E1000_READ_REG(hw, TXDCTL(1)); - ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | - E1000_TXDCTL_FULL_TX_DESC_WB; - E1000_WRITE_REG(hw, TXDCTL(1), ctrl); + /* + * Old code always initialized queue 1, + * even when unused, keep behaviour + */ + if (sc->num_queues == 1) { + ctrl = E1000_READ_REG(hw, TXDCTL(1)); + ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) | + E1000_TXDCTL_FULL_TX_DESC_WB; + E1000_WRITE_REG(hw, TXDCTL(1), ctrl); + } break; } Index: dev/pci/if_em_hw.h =================================================================== RCS file: /cvs/src/sys/dev/pci/if_em_hw.h,v retrieving revision 1.80 diff -u -p -r1.80 if_em_hw.h --- dev/pci/if_em_hw.h 4 Feb 2020 10:59:23 -0000 1.80 +++ dev/pci/if_em_hw.h 4 Mar 2020 17:08:18 -0000 @@ -336,9 +336,11 @@ typedef enum { /* Function prototypes */ /* Initialization */ +struct em_softc; int32_t em_reset_hw(struct em_hw *hw); -int32_t em_init_hw(struct em_hw *hw); +int32_t em_init_hw(struct em_softc *sc); int32_t em_set_mac_type(struct em_hw *hw); +int em_max_queues(struct em_hw *hw); void em_set_media_type(struct em_hw *hw); /* Link Configuration */