On Thu, Jan 30, 2020 at 09:15:35AM +0100, Martin Pieuchot wrote:
> On 21/01/20(Tue) 12:31, Martin Pieuchot wrote:
> > On 20/01/20(Mon) 16:42, Martin Pieuchot wrote:
> > > Diff below is a refactoring of the actual em(4) code and defines that
> > > will allows me to present a shorter diff to interrupt multiple CPUs and
> > > make use of multiple queues.
> > >
> > > It contains the following items:
> > >
> > > - Abstract the allocation/freeing of TX/RX ring into em_dma_malloc().
> > > This will ease the introduction of multiple rings.
> > >
> > > - Split the 82576 variant out of 82575. The distinction is necessary
> > > when it comes to setting multiple queues.
> > >
I see in the diff where this is being done, but is the multi-queue part not
in this diff? Just looks like you separated things, and left it at that?
> > > - Change multiple TX/RX related macro to take an index argument
> > > corresponding to a ring. Currently only the index 0 and 1 are used.
> > >
> > > - Gather and print more stats counters
> > >
> > > - Switch to using a function, like FreeBSD, to translate 82542
> > > registers and get rid of a set of defines.
> > >
> > > It has been tested one the models below, I'd like to be sure there isn't
> > > any fallout with this part before continuing the effort.
> >
> > New diff that works with 82576, previous breakage reported by Hrvoje
> > Popovski. So far the following models have been tested, I'm looking for
> > more tests :o)
>
> So far this has been tested on the following, I'm confident enough and
> would like to move forward, ok?
>
> em2 at pci0 dev 4 function 0 "Intel 82540EM" rev 0x02: apic 9 int 14
> em1 at pci3 dev 1 function 0 "Intel 82545GM" rev 0x04: apic 4 int 0
> em0 at pci3 dev 1 function 0 "Intel 82546GB" rev 0x03: apic 3 int 0
> em3 at pci2 dev 0 function 0 "Intel 82571EB" rev 0x06: apic 0 int 16
> em0 at pci1 dev 0 function 0 "Intel 82572EI" rev 0x06: apic 0 int 16
> em2 at pci5 dev 0 function 0 "Intel 82573E" rev 0x03: msi
> em3 at pci6 dev 0 function 0 "Intel 82573L" rev 0x00: msi
> em0 at pci3 dev 0 function 0 "Intel 82574L" rev 0x00: msi
> em0 at pci0 dev 2 function 0 "Intel 82575GB" rev 0x02: msi
> em0 at pci1 dev 0 function 0 "Intel 82576" rev 0x01: msi
> em0 at pci0 dev 25 function 0 "Intel 82577LM" rev 0x06: msi
> em0 at pci0 dev 25 function 0 "Intel 82579LM" rev 0x04: msi
> em0 at pci1 dev 0 function 0 "Intel 82583V" rev 0x00: msi
> em0 at pci1 dev 0 function 0 "Intel I210" rev 0x03: msi
> em0 at pci1 dev 0 function 0 "Intel I211" rev 0x03: msi
> em0 at pci0 dev 25 function 0 "Intel I217-LM" rev 0x04: msi
> em0 at pci0 dev 25 function 0 "Intel I218-V" rev 0x03: msi
> em0 at pci0 dev 25 function 0 Intel I218-LM rev 0x04: msi
You can add this to the "works as intended" list (t490):
em0 at pci0 dev 31 function 6 "Intel I219-LM" rev 0x30: msi
Diff reads ok to me. So ok mlarkin@ if you are still looking for oks and didn't
commit it already.
-ml
> em0 at pci0 dev 31 function 6 "Intel I219-V" rev 0x21: msi
> em0 at pci7 dev 0 function 0 "Intel I350" rev 0x01: msi
>
>
> Index: pci/if_em.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_em.c,v
> retrieving revision 1.343
> diff -u -p -r1.343 if_em.c
> --- pci/if_em.c 20 Jan 2020 23:45:02 -0000 1.343
> +++ pci/if_em.c 21 Jan 2020 11:27:14 -0000
> @@ -260,6 +260,7 @@ void em_disable_aspm(struct em_softc *);
> void em_txeof(struct em_softc *);
> int em_allocate_receive_structures(struct em_softc *);
> int em_allocate_transmit_structures(struct em_softc *);
> +int em_allocate_desc_rings(struct em_softc *);
> int em_rxfill(struct em_softc *);
> void em_rxrefill(void *);
> int em_rxeof(struct em_softc *);
> @@ -344,11 +345,6 @@ em_defer_attach(struct device *self)
>
> em_free_pci_resources(sc);
>
> - sc->sc_rx_desc_ring = NULL;
> - em_dma_free(sc, &sc->sc_rx_dma);
> - sc->sc_tx_desc_ring = NULL;
> - em_dma_free(sc, &sc->sc_tx_dma);
> -
> return;
> }
>
> @@ -464,6 +460,7 @@ em_attach(struct device *parent, struct
> case em_82572:
> case em_82574:
> case em_82575:
> + case em_82576:
> case em_82580:
> case em_i210:
> case em_i350:
> @@ -494,23 +491,11 @@ em_attach(struct device *parent, struct
> sc->hw.min_frame_size =
> ETHER_MIN_LEN + ETHER_CRC_LEN;
>
> - /* Allocate Transmit Descriptor ring */
> - if (em_dma_malloc(sc, sc->sc_tx_slots * sizeof(struct em_tx_desc),
> - &sc->sc_tx_dma) != 0) {
> - printf("%s: Unable to allocate tx_desc memory\n",
> - DEVNAME(sc));
> - goto err_tx_desc;
> - }
> - sc->sc_tx_desc_ring = (struct em_tx_desc *)sc->sc_tx_dma.dma_vaddr;
> -
> - /* Allocate Receive Descriptor ring */
> - if (em_dma_malloc(sc, sc->sc_rx_slots * sizeof(struct em_rx_desc),
> - &sc->sc_rx_dma) != 0) {
> - printf("%s: Unable to allocate rx_desc memory\n",
> - DEVNAME(sc));
> - goto err_rx_desc;
> + if (em_allocate_desc_rings(sc) != 0) {
> + printf("%s: Unable to allocate descriptor ring memory\n",
> + DEVNAME(sc));
> + goto err_pci;
> }
> - sc->sc_rx_desc_ring = (struct em_rx_desc *)sc->sc_rx_dma.dma_vaddr;
>
> /* Initialize the hardware */
> if ((defer = em_hardware_init(sc))) {
> @@ -519,11 +504,12 @@ em_attach(struct device *parent, struct
> else {
> printf("%s: Unable to initialize the hardware\n",
> DEVNAME(sc));
> - goto err_hw_init;
> + goto err_pci;
> }
> }
>
> if (sc->hw.mac_type == em_80003es2lan || sc->hw.mac_type == em_82575 ||
> + sc->hw.mac_type == em_82576 ||
> sc->hw.mac_type == em_82580 || sc->hw.mac_type == em_i210 ||
> sc->hw.mac_type == em_i350) {
> uint32_t reg = EM_READ_REG(&sc->hw, E1000_STATUS);
> @@ -552,7 +538,7 @@ em_attach(struct device *parent, struct
> if (em_read_mac_addr(&sc->hw) < 0) {
> printf("%s: EEPROM read error while reading mac address\n",
> DEVNAME(sc));
> - goto err_mac_addr;
> + goto err_pci;
> }
>
> bcopy(sc->hw.mac_addr, sc->sc_ac.ac_enaddr, ETHER_ADDR_LEN);
> @@ -593,14 +579,6 @@ em_attach(struct device *parent, struct
> INIT_DEBUGOUT("em_attach: end");
> return;
>
> -err_mac_addr:
> -err_hw_init:
> - sc->sc_rx_desc_ring = NULL;
> - em_dma_free(sc, &sc->sc_rx_dma);
> -err_rx_desc:
> - sc->sc_tx_desc_ring = NULL;
> - em_dma_free(sc, &sc->sc_tx_dma);
> -err_tx_desc:
> err_pci:
> em_free_pci_resources(sc);
> }
> @@ -678,7 +656,7 @@ em_start(struct ifqueue *ifq)
> if (sc->link_duplex == HALF_DUPLEX)
> em_82547_move_tail_locked(sc);
> else {
> - E1000_WRITE_REG(&sc->hw, TDT,
> + E1000_WRITE_REG(&sc->hw, TDT(0),
> sc->sc_tx_desc_head);
> em_82547_update_fifo_head(sc, len);
> }
> @@ -697,7 +675,7 @@ em_start(struct ifqueue *ifq)
> * available to transmit.
> */
> if (post)
> - E1000_WRITE_REG(&sc->hw, TDT, sc->sc_tx_desc_head);
> + E1000_WRITE_REG(&sc->hw, TDT(0), sc->sc_tx_desc_head);
> }
> }
>
> @@ -801,7 +779,7 @@ em_watchdog(struct ifnet *ifp)
> printf("%s: watchdog: head %u tail %u TDH %u TDT %u\n",
> DEVNAME(sc),
> sc->sc_tx_desc_head, sc->sc_tx_desc_tail,
> - E1000_READ_REG(&sc->hw, TDH), E1000_READ_REG(&sc->hw, TDT));
> + E1000_READ_REG(&sc->hw, TDH(0)), E1000_READ_REG(&sc->hw, TDT(0)));
>
> em_init(sc);
>
> @@ -857,6 +835,7 @@ em_init(void *arg)
> case em_82571:
> case em_82572: /* Total Packet Buffer on these is 48k */
> case em_82575:
> + case em_82576:
> case em_82580:
> case em_80003es2lan:
> case em_i350:
> @@ -1185,6 +1164,7 @@ em_encap(struct em_softc *sc, struct mbu
> }
>
> if (sc->hw.mac_type >= em_82543 && sc->hw.mac_type != em_82575 &&
> + sc->hw.mac_type != em_82576 &&
> sc->hw.mac_type != em_82580 && sc->hw.mac_type != em_i210 &&
> sc->hw.mac_type != em_i350) {
> used += em_transmit_checksum_setup(sc, m, head,
> @@ -1289,7 +1269,7 @@ em_82547_move_tail_locked(struct em_soft
> uint16_t length = 0;
> boolean_t eop = 0;
>
> - hw_tdt = E1000_READ_REG(&sc->hw, TDT);
> + hw_tdt = E1000_READ_REG(&sc->hw, TDT(0));
> sw_tdt = sc->sc_tx_desc_head;
>
> while (hw_tdt != sw_tdt) {
> @@ -1305,7 +1285,7 @@ em_82547_move_tail_locked(struct em_soft
> timeout_add(&sc->tx_fifo_timer_handle, 1);
> break;
> }
> - E1000_WRITE_REG(&sc->hw, TDT, hw_tdt);
> + E1000_WRITE_REG(&sc->hw, TDT(0), hw_tdt);
> em_82547_update_fifo_head(sc, length);
> length = 0;
> }
> @@ -1360,8 +1340,8 @@ em_82547_tx_fifo_reset(struct em_softc *
> {
> uint32_t tctl;
>
> - if ((E1000_READ_REG(&sc->hw, TDT) ==
> - E1000_READ_REG(&sc->hw, TDH)) &&
> + if ((E1000_READ_REG(&sc->hw, TDT(0)) ==
> + E1000_READ_REG(&sc->hw, TDH(0))) &&
> (E1000_READ_REG(&sc->hw, TDFT) ==
> E1000_READ_REG(&sc->hw, TDFH)) &&
> (E1000_READ_REG(&sc->hw, TDFTS) ==
> @@ -1494,6 +1474,7 @@ em_update_link_status(struct em_softc *s
> ((sc->hw.mac_type == em_82571) ||
> (sc->hw.mac_type == em_82572) ||
> (sc->hw.mac_type == em_82575) ||
> + (sc->hw.mac_type == em_82576) ||
> (sc->hw.mac_type == em_82580))) {
> int tarc0;
>
> @@ -1774,6 +1755,15 @@ em_free_pci_resources(struct em_softc *s
> bus_space_unmap(sc->osdep.mem_bus_space_tag,
> sc->osdep.mem_bus_space_handle,
> sc->osdep.em_memsize);
> sc->osdep.em_membase = 0;
> +
> + if (sc->sc_rx_desc_ring != NULL) {
> + sc->sc_rx_desc_ring = NULL;
> + em_dma_free(sc, &sc->sc_rx_dma);
> + }
> + if (sc->sc_tx_desc_ring != NULL) {
> + sc->sc_tx_desc_ring = NULL;
> + em_dma_free(sc, &sc->sc_tx_dma);
> + }
> }
>
> /*********************************************************************
> @@ -1826,6 +1816,7 @@ em_hardware_init(struct em_softc *sc)
> (sc->hw.mac_type == em_82571 ||
> sc->hw.mac_type == em_82572 ||
> sc->hw.mac_type == em_82575 ||
> + sc->hw.mac_type == em_82576 ||
> sc->hw.mac_type == em_82580 ||
> sc->hw.mac_type == em_i210 ||
> sc->hw.mac_type == em_i350 )) {
> @@ -1911,11 +1902,13 @@ em_setup_interface(struct em_softc *sc)
>
> #if NVLAN > 0
> if (sc->hw.mac_type != em_82575 && sc->hw.mac_type != em_82580 &&
> + sc->hw.mac_type != em_82576 &&
> sc->hw.mac_type != em_i210 && sc->hw.mac_type != em_i350)
> ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
> #endif
>
> if (sc->hw.mac_type >= em_82543 && sc->hw.mac_type != em_82575 &&
> + sc->hw.mac_type != em_82576 &&
> sc->hw.mac_type != em_82580 && sc->hw.mac_type != em_i210 &&
> sc->hw.mac_type != em_i350)
> ifp->if_capabilities |= IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
> @@ -1971,15 +1964,6 @@ em_detach(struct device *self, int flags
>
> em_free_pci_resources(sc);
>
> - if (sc->sc_rx_desc_ring != NULL) {
> - sc->sc_rx_desc_ring = NULL;
> - em_dma_free(sc, &sc->sc_rx_dma);
> - }
> - if (sc->sc_tx_desc_ring != NULL) {
> - sc->sc_tx_desc_ring = NULL;
> - em_dma_free(sc, &sc->sc_tx_dma);
> - }
> -
> ether_ifdetach(ifp);
> if_detach(ifp);
>
> @@ -2201,19 +2185,19 @@ em_initialize_transmit_unit(struct em_so
>
> /* Setup the Base and Length of the Tx Descriptor Ring */
> bus_addr = sc->sc_tx_dma.dma_map->dm_segs[0].ds_addr;
> - E1000_WRITE_REG(&sc->hw, TDLEN,
> + E1000_WRITE_REG(&sc->hw, TDLEN(0),
> sc->sc_tx_slots *
> sizeof(struct em_tx_desc));
> - E1000_WRITE_REG(&sc->hw, TDBAH, (u_int32_t)(bus_addr >> 32));
> - E1000_WRITE_REG(&sc->hw, TDBAL, (u_int32_t)bus_addr);
> + E1000_WRITE_REG(&sc->hw, TDBAH(0), (u_int32_t)(bus_addr >> 32));
> + E1000_WRITE_REG(&sc->hw, TDBAL(0), (u_int32_t)bus_addr);
>
> /* Setup the HW Tx Head and Tail descriptor pointers */
> - E1000_WRITE_REG(&sc->hw, TDT, 0);
> - E1000_WRITE_REG(&sc->hw, TDH, 0);
> + E1000_WRITE_REG(&sc->hw, TDT(0), 0);
> + E1000_WRITE_REG(&sc->hw, TDH(0), 0);
>
> HW_DEBUGOUT2("Base = %x, Length = %x\n",
> - E1000_READ_REG(&sc->hw, TDBAL),
> - E1000_READ_REG(&sc->hw, TDLEN));
> + E1000_READ_REG(&sc->hw, TDBAL(0)),
> + E1000_READ_REG(&sc->hw, TDLEN(0)));
>
> /* Set the default values for the Tx Inter Packet Gap timer */
> switch (sc->hw.mac_type) {
> @@ -2247,11 +2231,12 @@ em_initialize_transmit_unit(struct em_so
> sc->sc_txd_cmd = E1000_TXD_CMD_IFCS;
>
> if (sc->hw.mac_type == em_82575 || sc->hw.mac_type == em_82580 ||
> + sc->hw.mac_type == em_82576 ||
> sc->hw.mac_type == em_i210 || sc->hw.mac_type == em_i350) {
> /* 82575/6 need to enable the TX queue and lack the IDE bit */
> - reg_tctl = E1000_READ_REG(&sc->hw, TXDCTL);
> + reg_tctl = E1000_READ_REG(&sc->hw, TXDCTL(0));
> reg_tctl |= E1000_TXDCTL_QUEUE_ENABLE;
> - E1000_WRITE_REG(&sc->hw, TXDCTL, reg_tctl);
> + E1000_WRITE_REG(&sc->hw, TXDCTL(0), reg_tctl);
> } else if (sc->tx_int_delay > 0)
> sc->sc_txd_cmd |= E1000_TXD_CMD_IDE;
>
> @@ -2614,10 +2599,10 @@ em_initialize_receive_unit(struct em_sof
>
> /* Setup the Base and Length of the Rx Descriptor Ring */
> bus_addr = sc->sc_rx_dma.dma_map->dm_segs[0].ds_addr;
> - E1000_WRITE_REG(&sc->hw, RDLEN,
> + E1000_WRITE_REG(&sc->hw, RDLEN(0),
> sc->sc_rx_slots * sizeof(*sc->sc_rx_desc_ring));
> - E1000_WRITE_REG(&sc->hw, RDBAH, (u_int32_t)(bus_addr >> 32));
> - E1000_WRITE_REG(&sc->hw, RDBAL, (u_int32_t)bus_addr);
> + E1000_WRITE_REG(&sc->hw, RDBAH(0), (u_int32_t)(bus_addr >> 32));
> + E1000_WRITE_REG(&sc->hw, RDBAL(0), (u_int32_t)bus_addr);
>
> /* Setup the Receive Control Register */
> reg_rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_LBM_NO |
> @@ -2669,20 +2654,21 @@ em_initialize_receive_unit(struct em_sof
> E1000_WRITE_REG(&sc->hw, RDTR, 0x20);
>
> if (sc->hw.mac_type == em_82575 || sc->hw.mac_type == em_82580 ||
> + sc->hw.mac_type == em_82576 ||
> sc->hw.mac_type == em_i210 || sc->hw.mac_type == em_i350) {
> /* 82575/6 need to enable the RX queue */
> uint32_t reg;
> - reg = E1000_READ_REG(&sc->hw, RXDCTL);
> + reg = E1000_READ_REG(&sc->hw, RXDCTL(0));
> reg |= E1000_RXDCTL_QUEUE_ENABLE;
> - E1000_WRITE_REG(&sc->hw, RXDCTL, reg);
> + E1000_WRITE_REG(&sc->hw, RXDCTL(0), reg);
> }
>
> /* Enable Receives */
> E1000_WRITE_REG(&sc->hw, RCTL, reg_rctl);
>
> /* Setup the HW Rx Head and Tail Descriptor Pointers */
> - E1000_WRITE_REG(&sc->hw, RDH, 0);
> - E1000_WRITE_REG(&sc->hw, RDT, sc->sc_rx_desc_head);
> + E1000_WRITE_REG(&sc->hw, RDH(0), 0);
> + E1000_WRITE_REG(&sc->hw, RDT(0), sc->sc_rx_desc_head);
> }
>
> /*********************************************************************
> @@ -2770,7 +2756,7 @@ em_rxrefill(void *arg)
> struct em_softc *sc = arg;
>
> if (em_rxfill(sc))
> - E1000_WRITE_REG(&sc->hw, RDT, sc->sc_rx_desc_head);
> + E1000_WRITE_REG(&sc->hw, RDT(0), sc->sc_rx_desc_head);
> else if (if_rxr_inuse(&sc->sc_rx_ring) == 0)
> timeout_add(&sc->rx_refill, 1);
> }
> @@ -3188,7 +3174,7 @@ em_flush_tx_ring(struct em_softc *sc)
> tctl = EM_READ_REG(&sc->hw, E1000_TCTL);
> EM_WRITE_REG(&sc->hw, E1000_TCTL, tctl | E1000_TCTL_EN);
>
> - KASSERT(EM_READ_REG(&sc->hw, E1000_TDT) == sc->sc_tx_desc_head);
> + KASSERT(EM_READ_REG(&sc->hw, E1000_TDT(0)) == sc->sc_tx_desc_head);
>
> txd = &sc->sc_tx_desc_ring[sc->sc_tx_desc_head];
> txd->buffer_addr = sc->sc_tx_dma.dma_map->dm_segs[0].ds_addr;
> @@ -3202,7 +3188,7 @@ em_flush_tx_ring(struct em_softc *sc)
> if (++sc->sc_tx_desc_head == sc->sc_tx_slots)
> sc->sc_tx_desc_head = 0;
>
> - EM_WRITE_REG(&sc->hw, E1000_TDT, sc->sc_tx_desc_head);
> + EM_WRITE_REG(&sc->hw, E1000_TDT(0), sc->sc_tx_desc_head);
> bus_space_barrier(sc->osdep.mem_bus_space_tag,
> sc->osdep.mem_bus_space_handle,
> 0, 0, BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE);
> usec_delay(250);
> @@ -3223,7 +3209,7 @@ em_flush_rx_ring(struct em_softc *sc)
> E1000_WRITE_FLUSH(&sc->hw);
> usec_delay(150);
>
> - rxdctl = EM_READ_REG(&sc->hw, E1000_RXDCTL);
> + rxdctl = EM_READ_REG(&sc->hw, E1000_RXDCTL(0));
> /* zero the lower 14 bits (prefetch and host thresholds) */
> rxdctl &= 0xffffc000;
> /*
> @@ -3231,7 +3217,7 @@ em_flush_rx_ring(struct em_softc *sc)
> * and make sure the granularity is "descriptors" and not "cache lines"
> */
> rxdctl |= (0x1F | (1 << 8) | E1000_RXDCTL_THRESH_UNIT_DESC);
> - EM_WRITE_REG(&sc->hw, E1000_RXDCTL, rxdctl);
> + EM_WRITE_REG(&sc->hw, E1000_RXDCTL(0), rxdctl);
>
> /* momentarily enable the RX ring for the changes to take effect */
> EM_WRITE_REG(&sc->hw, E1000_RCTL, rctl | E1000_RCTL_EN);
> @@ -3263,7 +3249,7 @@ em_flush_desc_rings(struct em_softc *sc)
> EM_WRITE_REG(&sc->hw, E1000_FEXTNVM11, fextnvm11);
>
> /* do nothing if we're not in faulty state, or if the queue is empty */
> - tdlen = EM_READ_REG(&sc->hw, E1000_TDLEN);
> + tdlen = EM_READ_REG(&sc->hw, E1000_TDLEN(0));
> hang_state = pci_conf_read(pa->pa_pc, pa->pa_tag,
> PCICFG_DESC_RING_STATUS);
> if (!(hang_state & FLUSH_DESC_REQUIRED) || !tdlen)
> return;
> @@ -3359,6 +3345,15 @@ em_update_stats_counters(struct em_softc
> sc->stats.ptc1522 += E1000_READ_REG(&sc->hw, PTC1522);
> sc->stats.mptc += E1000_READ_REG(&sc->hw, MPTC);
> sc->stats.bptc += E1000_READ_REG(&sc->hw, BPTC);
> + sc->stats.sdpc += E1000_READ_REG(&sc->hw, SDPC);
> + sc->stats.mngpdc += E1000_READ_REG(&sc->hw, MGTPDC);
> + sc->stats.mngprc += E1000_READ_REG(&sc->hw, MGTPRC);
> + sc->stats.mngptc += E1000_READ_REG(&sc->hw, MGTPTC);
> + sc->stats.b2ospc += E1000_READ_REG(&sc->hw, B2OSPC);
> + sc->stats.o2bgptc += E1000_READ_REG(&sc->hw, O2BGPTC);
> + sc->stats.b2ogprc += E1000_READ_REG(&sc->hw, B2OGPRC);
> + sc->stats.o2bspc += E1000_READ_REG(&sc->hw, O2BSPC);
> + sc->stats.rpthc += E1000_READ_REG(&sc->hw, RPTHC);
>
> if (sc->hw.mac_type >= em_82543) {
> sc->stats.tncrs +=
> @@ -3445,6 +3440,50 @@ em_print_hw_stats(struct em_softc *sc)
> (long long)sc->stats.gprc);
> printf("%s: Good Packets Xmtd = %lld\n", unit,
> (long long)sc->stats.gptc);
> + printf("%s: Switch Drop Packet Count = %lld\n", unit,
> + (long long)sc->stats.sdpc);
> + printf("%s: Management Packets Dropped Count = %lld\n", unit,
> + (long long)sc->stats.mngptc);
> + printf("%s: Management Packets Received Count = %lld\n", unit,
> + (long long)sc->stats.mngprc);
> + printf("%s: Management Packets Transmitted Count = %lld\n", unit,
> + (long long)sc->stats.mngptc);
> + printf("%s: OS2BMC Packets Sent by MC Count = %lld\n", unit,
> + (long long)sc->stats.b2ospc);
> + printf("%s: OS2BMC Packets Received by MC Count = %lld\n", unit,
> + (long long)sc->stats.o2bgptc);
> + printf("%s: OS2BMC Packets Received by Host Count = %lld\n", unit,
> + (long long)sc->stats.b2ogprc);
> + printf("%s: OS2BMC Packets Transmitted by Host Count = %lld\n", unit,
> + (long long)sc->stats.o2bspc);
> + printf("%s: Multicast Packets Received Count = %lld\n", unit,
> + (long long)sc->stats.mprc);
> + printf("%s: Rx Packets to Host Count = %lld\n", unit,
> + (long long)sc->stats.rpthc);
> }
> #endif
> #endif /* !SMALL_KERNEL */
> +
> +int
> +em_allocate_desc_rings(struct em_softc *sc)
> +{
> + /* Allocate Transmit Descriptor ring */
> + if (em_dma_malloc(sc, sc->sc_tx_slots * sizeof(struct em_tx_desc),
> + &sc->sc_tx_dma) != 0) {
> + printf("%s: Unable to allocate tx_desc memory\n",
> + DEVNAME(sc));
> + return (ENOMEM);
> + }
> + sc->sc_tx_desc_ring = (struct em_tx_desc *)sc->sc_tx_dma.dma_vaddr;
> +
> + /* Allocate Receive Descriptor ring */
> + if (em_dma_malloc(sc, sc->sc_rx_slots * sizeof(struct em_rx_desc),
> + &sc->sc_rx_dma) != 0) {
> + printf("%s: Unable to allocate rx_desc memory\n",
> + DEVNAME(sc));
> + return (ENOMEM);
> + }
> + sc->sc_rx_desc_ring = (struct em_rx_desc *)sc->sc_rx_dma.dma_vaddr;
> +
> + return (0);
> +}
> Index: pci/if_em_hw.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_em_hw.c,v
> retrieving revision 1.105
> diff -u -p -r1.105 if_em_hw.c
> --- pci/if_em_hw.c 20 Jan 2020 23:45:02 -0000 1.105
> +++ pci/if_em_hw.c 21 Jan 2020 10:28:22 -0000
> @@ -511,6 +511,9 @@ em_set_mac_type(struct em_hw *hw)
> case E1000_DEV_ID_82575EB_PF:
> case E1000_DEV_ID_82575GB_QP:
> case E1000_DEV_ID_82575GB_QP_PM:
> + hw->mac_type = em_82575;
> + hw->initialize_hw_bits_disable = 1;
> + break;
> case E1000_DEV_ID_82576:
> case E1000_DEV_ID_82576_FIBER:
> case E1000_DEV_ID_82576_SERDES:
> @@ -519,7 +522,7 @@ em_set_mac_type(struct em_hw *hw)
> case E1000_DEV_ID_82576_NS:
> case E1000_DEV_ID_82576_NS_SERDES:
> case E1000_DEV_ID_82576_SERDES_QUAD:
> - hw->mac_type = em_82575;
> + hw->mac_type = em_82576;
> hw->initialize_hw_bits_disable = 1;
> break;
> case E1000_DEV_ID_82580_COPPER:
> @@ -685,6 +688,7 @@ em_set_mac_type(struct em_hw *hw)
> break;
> case em_80003es2lan:
> case em_82575:
> + case em_82576:
> case em_82580:
> case em_i210:
> case em_i350:
> @@ -725,6 +729,7 @@ em_set_media_type(struct em_hw *hw)
> }
>
> if (hw->mac_type == em_82575 || hw->mac_type == em_82580 ||
> + hw->mac_type == em_82576 ||
> hw->mac_type == em_i210 || hw->mac_type == em_i350) {
> hw->media_type = em_media_type_copper;
>
> @@ -835,6 +840,7 @@ em_reset_hw(struct em_hw *hw)
>
> /* Set the completion timeout for 82575 chips */
> if (hw->mac_type == em_82575 || hw->mac_type == em_82580 ||
> + hw->mac_type == em_82576 ||
> hw->mac_type == em_i210 || hw->mac_type == em_i350) {
> ret_val = em_set_pciex_completion_timeout(hw);
> if (ret_val) {
> @@ -1123,13 +1129,13 @@ em_initialize_hardware_bits(struct em_hw
> reg_tarc0 &= ~0x78000000; /* Clear bits 30, 29, 28, and
> * 27 */
>
> - reg_txdctl = E1000_READ_REG(hw, TXDCTL);
> + reg_txdctl = E1000_READ_REG(hw, TXDCTL(0));
> reg_txdctl |= E1000_TXDCTL_COUNT_DESC; /* Set bit 22 */
> - E1000_WRITE_REG(hw, TXDCTL, reg_txdctl);
> + E1000_WRITE_REG(hw, TXDCTL(0), reg_txdctl);
>
> - reg_txdctl1 = E1000_READ_REG(hw, TXDCTL1);
> + reg_txdctl1 = E1000_READ_REG(hw, TXDCTL(1));
> reg_txdctl1 |= E1000_TXDCTL_COUNT_DESC; /* Set bit 22 */
> - E1000_WRITE_REG(hw, TXDCTL1, reg_txdctl1);
> + E1000_WRITE_REG(hw, TXDCTL(1), reg_txdctl1);
>
> switch (hw->mac_type) {
> case em_82571:
> @@ -1620,10 +1626,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);
> + ctrl = E1000_READ_REG(hw, TXDCTL(0));
> ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) |
> E1000_TXDCTL_FULL_TX_DESC_WB;
> - E1000_WRITE_REG(hw, TXDCTL, ctrl);
> + E1000_WRITE_REG(hw, TXDCTL(0), ctrl);
> }
> if ((hw->mac_type == em_82573) || (hw->mac_type == em_82574)) {
> em_enable_tx_pkt_filtering(hw);
> @@ -1656,6 +1662,7 @@ em_init_hw(struct em_hw *hw)
> case em_82571:
> case em_82572:
> case em_82575:
> + case em_82576:
> case em_82580:
> case em_i210:
> case em_i350:
> @@ -1667,10 +1674,10 @@ em_init_hw(struct em_hw *hw)
> case em_pch_lpt:
> case em_pch_spt:
> case em_pch_cnp:
> - ctrl = E1000_READ_REG(hw, TXDCTL1);
> + ctrl = E1000_READ_REG(hw, TXDCTL(1));
> ctrl = (ctrl & ~E1000_TXDCTL_WTHRESH) |
> E1000_TXDCTL_FULL_TX_DESC_WB;
> - E1000_WRITE_REG(hw, TXDCTL1, ctrl);
> + E1000_WRITE_REG(hw, TXDCTL(1), ctrl);
> break;
> }
>
> @@ -4958,7 +4965,8 @@ em_read_phy_reg(struct em_hw *hw, uint32
> hw->mac_type == em_pch_cnp)
> return (em_access_phy_reg_hv(hw, reg_addr, phy_data, TRUE));
>
> - if (((hw->mac_type == em_80003es2lan) || (hw->mac_type == em_82575)) &&
> + if (((hw->mac_type == em_80003es2lan) || (hw->mac_type == em_82575) ||
> + (hw->mac_type == em_82576)) &&
> (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) {
> swfw = E1000_SWFW_PHY1_SM;
> } else {
> @@ -5658,6 +5666,7 @@ em_match_gig_phy(struct em_hw *hw)
> match = TRUE;
> break;
> case em_82575:
> + case em_82576:
> if (hw->phy_id == M88E1000_E_PHY_ID)
> match = TRUE;
> if (hw->phy_id == IGP01E1000_I_PHY_ID)
> @@ -5959,6 +5968,7 @@ em_init_eeprom_params(struct em_hw *hw)
> case em_82573:
> case em_82574:
> case em_82575:
> + case em_82576:
> case em_82580:
> case em_i210:
> case em_i350:
> @@ -7307,6 +7317,7 @@ em_read_mac_addr(struct em_hw *hw)
> case em_82546_rev_3:
> case em_82571:
> case em_82575:
> + case em_82576:
> case em_80003es2lan:
> if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)
> hw->perm_mac_addr[5] ^= 0x01;
> @@ -8105,6 +8116,7 @@ em_get_bus_info(struct em_hw *hw)
> case em_82573:
> case em_82574:
> case em_82575:
> + case em_82576:
> case em_82580:
> case em_80003es2lan:
> case em_i210:
> @@ -9309,6 +9321,7 @@ em_get_auto_rd_done(struct em_hw *hw)
> case em_82573:
> case em_82574:
> case em_82575:
> + case em_82576:
> case em_82580:
> case em_80003es2lan:
> case em_i210:
> @@ -9369,6 +9382,7 @@ em_get_phy_cfg_done(struct em_hw *hw)
> break;
> case em_80003es2lan:
> case em_82575:
> + case em_82576:
> case em_82580:
> case em_i350:
> switch (hw->bus_func) {
> @@ -11584,3 +11598,91 @@ out:
> return ret_val;
> }
>
> +uint32_t
> +em_translate_82542_register(uint32_t reg)
> +{
> + /*
> + * Some of the 82542 registers are located at different
> + * offsets than they are in newer adapters.
> + * Despite the difference in location, the registers
> + * function in the same manner.
> + */
> + switch (reg) {
> + case E1000_RA:
> + reg = 0x00040;
> + break;
> + case E1000_RDTR:
> + reg = 0x00108;
> + break;
> + case E1000_RDBAL(0):
> + reg = 0x00110;
> + break;
> + case E1000_RDBAH(0):
> + reg = 0x00114;
> + break;
> + case E1000_RDLEN(0):
> + reg = 0x00118;
> + break;
> + case E1000_RDH(0):
> + reg = 0x00120;
> + break;
> + case E1000_RDT(0):
> + reg = 0x00128;
> + break;
> + case E1000_RDBAL(1):
> + reg = 0x00138;
> + break;
> + case E1000_RDBAH(1):
> + reg = 0x0013C;
> + break;
> + case E1000_RDLEN(1):
> + reg = 0x00140;
> + break;
> + case E1000_RDH(1):
> + reg = 0x00148;
> + break;
> + case E1000_RDT(1):
> + reg = 0x00150;
> + break;
> + case E1000_FCRTH:
> + reg = 0x00160;
> + break;
> + case E1000_FCRTL:
> + reg = 0x00168;
> + break;
> + case E1000_MTA:
> + reg = 0x00200;
> + break;
> + case E1000_TDBAL(0):
> + reg = 0x00420;
> + break;
> + case E1000_TDBAH(0):
> + reg = 0x00424;
> + break;
> + case E1000_TDLEN(0):
> + reg = 0x00428;
> + break;
> + case E1000_TDH(0):
> + reg = 0x00430;
> + break;
> + case E1000_TDT(0):
> + reg = 0x00438;
> + break;
> + case E1000_TIDV:
> + reg = 0x00440;
> + break;
> + case E1000_VFTA:
> + reg = 0x00600;
> + break;
> + case E1000_TDFH:
> + reg = 0x08010;
> + break;
> + case E1000_TDFT:
> + reg = 0x08018;
> + break;
> + default:
> + break;
> + }
> +
> + return (reg);
> +}
> Index: pci/if_em_hw.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_em_hw.h,v
> retrieving revision 1.79
> diff -u -p -r1.79 if_em_hw.h
> --- pci/if_em_hw.h 20 Jan 2020 23:45:02 -0000 1.79
> +++ pci/if_em_hw.h 21 Jan 2020 10:28:22 -0000
> @@ -70,6 +70,7 @@ typedef enum {
> em_82573,
> em_82574,
> em_82575,
> + em_82576,
> em_82580,
> em_i350,
> em_i210,
> @@ -447,6 +448,7 @@ int32_t em_read_pcie_cap_reg(struct em_h
> /* Port I/O is only supported on 82544 and newer */
> int32_t em_disable_pciex_master(struct em_hw *hw);
> int32_t em_check_phy_reset_block(struct em_hw *hw);
> +uint32_t em_translate_82542_register(uint32_t);
>
> #ifndef E1000_READ_REG_IO
> #define E1000_READ_REG_IO(a, reg) \
> @@ -1043,12 +1045,20 @@ struct em_ffvt_entry {
> #define E1000_IMC 0x000D8 /* Interrupt Mask Clear - WO */
> #define E1000_IAM 0x000E0 /* Interrupt Acknowledge Auto Mask */
> #define E1000_RCTL 0x00100 /* RX Control - RW */
> +#define E1000_GPIE 0x01514 /* General Purpose Interrupt Enable - RW */
> +#define E1000_EICS 0x01520 /* Ext. Interrupt Cause Set - W0 */
> +#define E1000_EIMS 0x01524 /* Ext. Interrupt Mask Set/Read - RW */
> +#define E1000_EIMC 0x01528 /* Ext. Interrupt Mask Clear - WO */
> +#define E1000_EIAC 0x0152C /* Ext. Interrupt Auto Clear - RW */
> +#define E1000_EIAM 0x01530 /* Ext. Interrupt Ack Auto Clear Mask - RW */
> +#define E1000_EICR 0x01580 /* Ext. Interrupt Cause Read - R/clr */
> +#define E1000_EITR(_n) (0x01680 + (0x4 * (_n)))
> +#define E1000_IVAR0 0x01700 /* Interrupt Vector Allocation (array) - RW
> */
> +#define E1000_IVAR_MISC 0x01740 /* IVAR for "other" causes - RW */
> #define E1000_RDTR1 0x02820 /* RX Delay Timer (1) - RW */
> #define E1000_RDBAL1 0x02900 /* RX Descriptor Base Address Low (1) - RW */
> #define E1000_RDBAH1 0x02904 /* RX Descriptor Base Address High (1) - RW
> */
> #define E1000_RDLEN1 0x02908 /* RX Descriptor Length (1) - RW */
> -#define E1000_RDH1 0x02910 /* RX Descriptor Head (1) - RW */
> -#define E1000_RDT1 0x02918 /* RX Descriptor Tail (1) - RW */
> #define E1000_FCTTV 0x00170 /* Flow Control Transmit Timer Value - RW */
> #define E1000_TXCW 0x00178 /* TX Configuration Word - RW */
> #define E1000_RXCW 0x00180 /* RX Configuration Word - RO */
> @@ -1079,20 +1089,31 @@ struct em_ffvt_entry {
> #define E1000_FCRTL 0x02160 /* Flow Control Receive Threshold Low - RW */
> #define E1000_FCRTH 0x02168 /* Flow Control Receive Threshold High - RW
> */
> #define E1000_PSRCTL 0x02170 /* Packet Split Receive Control - RW */
> -#define E1000_RDBAL 0x02800 /* RX Descriptor Base Address Low - RW */
> -#define E1000_RDBAH 0x02804 /* RX Descriptor Base Address High - RW */
> -#define E1000_RDLEN 0x02808 /* RX Descriptor Length - RW */
> -#define E1000_RDH 0x02810 /* RX Descriptor Head - RW */
> -#define E1000_RDT 0x02818 /* RX Descriptor Tail - RW */
> +/* RX Descriptor Base Address Low - RW */
> +#define E1000_RDBAL(_n) ((_n) < 4 ? (0x02800 + ((_n) * 0x100)) :
> \
> + (0x0C000 + ((_n) * 0x40)))
> +/* RX Descriptor Base Address High - RW */
> +#define E1000_RDBAH(_n) ((_n) < 4 ? (0x02804 + ((_n) * 0x100)) :
> \
> + (0x0C004 + ((_n) * 0x40)))
> +/* RX Descriptor Length - RW */
> +#define E1000_RDLEN(_n) ((_n) < 4 ? (0x02808 + ((_n) * 0x100)) :
> \
> + (0x0C008 + ((_n) * 0x40)))
> +/* Split and Replication Receive CTRL - RW */
> +#define E1000_SRRCTL(_n) ((_n) < 4 ? (0x0280C + ((_n) * 0x100)) : \
> + (0x0C00C + ((_n) * 0x40)))
> +/* RX Descriptor Head - RW */
> +#define E1000_RDH(_n) ((_n) < 4 ? (0x02810 + ((_n) * 0x100)) :
> \
> + (0x0C010 + ((_n) * 0x40)))
> +/* RX Descriptor Tail - RW */
> +#define E1000_RDT(_n) ((_n) < 4 ? (0x02818 + ((_n) * 0x100)) :
> \
> + (0x0C018 + ((_n) * 0x40)))
> #define E1000_RDTR 0x02820 /* RX Delay Timer - RW */
> #define E1000_RDBAL0 E1000_RDBAL /* RX Desc Base Address Low (0) - RW */
> #define E1000_RDBAH0 E1000_RDBAH /* RX Desc Base Address High (0) - RW */
> #define E1000_RDLEN0 E1000_RDLEN /* RX Desc Length (0) - RW */
> -#define E1000_RDH0 E1000_RDH /* RX Desc Head (0) - RW */
> -#define E1000_RDT0 E1000_RDT /* RX Desc Tail (0) - RW */
> #define E1000_RDTR0 E1000_RDTR /* RX Delay Timer (0) - RW */
> -#define E1000_RXDCTL 0x02828 /* RX Descriptor Control queue 0 - RW */
> -#define E1000_RXDCTL1 0x02928 /* RX Descriptor Control queue 1 - RW */
> +#define E1000_RXDCTL(_n) ((_n) < 4 ? (0x02828 + ((_n) * 0x100)) : \
> + (0x0C028 + ((_n) * 0x40)))
> #define E1000_RADV 0x0282C /* RX Interrupt Absolute Delay Timer - RW */
> #define E1000_RSRPD 0x02C00 /* RX Small Packet Detect - RW */
> #define E1000_RAID 0x02C08 /* Receive Ack Interrupt Delay - RW */
> @@ -1103,13 +1124,24 @@ struct em_ffvt_entry {
> #define E1000_TDFHS 0x03420 /* TX Data FIFO Head Saved - RW */
> #define E1000_TDFTS 0x03428 /* TX Data FIFO Tail Saved - RW */
> #define E1000_TDFPC 0x03430 /* TX Data FIFO Packet Count - RW */
> -#define E1000_TDBAL 0x03800 /* TX Descriptor Base Address Low - RW */
> -#define E1000_TDBAH 0x03804 /* TX Descriptor Base Address High - RW */
> -#define E1000_TDLEN 0x03808 /* TX Descriptor Length - RW */
> -#define E1000_TDH 0x03810 /* TX Descriptor Head - RW */
> -#define E1000_TDT 0x03818 /* TX Descriptor Tail - RW */
> +/* TX Descriptor Base Address Low - RW */
> +#define E1000_TDBAL(_n) ((_n) < 4 ? (0x03800 + ((_n) * 0x100)) :
> \
> + (0x0E000 + ((_n) * 0x40)))
> +/* TX Descriptor Base Address High - RW */
> +#define E1000_TDBAH(_n) ((_n) < 4 ? (0x03804 + ((_n) * 0x100)) :
> \
> + (0x0E004 + ((_n) * 0x40)))
> +/* TX Descriptor Length - RW */
> +#define E1000_TDLEN(_n) ((_n) < 4 ? (0x03808 + ((_n) * 0x100)) :
> \
> + (0x0E008 + ((_n) * 0x40)))
> +/* TX Descriptor Head - RW */
> +#define E1000_TDH(_n) ((_n) < 4 ? (0x03810 + ((_n) * 0x100)) :
> \
> + (0x0E010 + ((_n) * 0x40)))
> +/* TX Descriptor Tail - RW */
> +#define E1000_TDT(_n) ((_n) < 4 ? (0x03818 + ((_n) * 0x100)) :
> \
> + (0x0E018 + ((_n) * 0x40)))
> #define E1000_TIDV 0x03820 /* TX Interrupt Delay Value - RW */
> -#define E1000_TXDCTL 0x03828 /* TX Descriptor Control - RW */
> +#define E1000_TXDCTL(_n) ((_n) < 4 ? (0x03828 + ((_n) * 0x100)) : \
> + (0x0E028 + ((_n) * 0x40)))
> #define E1000_TADV 0x0382C /* TX Interrupt Absolute Delay Val - RW */
> #define E1000_TSPMT 0x03830 /* TCP Segmentation PAD & Min Threshold - RW
> */
> #define E1000_TARC0 0x03840 /* TX Arbitration Count (0) */
> @@ -1118,7 +1150,6 @@ struct em_ffvt_entry {
> #define E1000_TDLEN1 0x03908 /* TX Desc Length (1) - RW */
> #define E1000_TDH1 0x03910 /* TX Desc Head (1) - RW */
> #define E1000_TDT1 0x03918 /* TX Desc Tail (1) - RW */
> -#define E1000_TXDCTL1 0x03928 /* TX Descriptor Control (1) - RW */
> #define E1000_TARC1 0x03940 /* TX Arbitration Count (1) */
> #define E1000_CRCERRS 0x04000 /* CRC Error Count - R/clr */
> #define E1000_ALGNERRC 0x04004 /* Alignment Error Count - R/clr */
> @@ -1179,6 +1210,7 @@ struct em_ffvt_entry {
> #define E1000_TSCTC 0x040F8 /* TCP Segmentation Context TX - R/clr */
> #define E1000_TSCTFC 0x040FC /* TCP Segmentation Context TX Fail - R/clr
> */
> #define E1000_IAC 0x04100 /* Interrupt Assertion Count */
> +#define E1000_RPTHC 0x04104 /* CONFLICT Rx Packets to Host Count */
> #define E1000_ICRXPTC 0x04104 /* Interrupt Cause Rx Packet Timer Expire
> Count */
> #define E1000_ICRXATC 0x04108 /* Interrupt Cause Rx Absolute Timer Expire
> Count */
> #define E1000_ICTXPTC 0x0410C /* Interrupt Cause Tx Packet Timer Expire
> Count */
> @@ -1187,6 +1219,7 @@ struct em_ffvt_entry {
> #define E1000_ICTXQMTC 0x0411C /* Interrupt Cause Tx Queue Minimum
> Threshold Count */
> #define E1000_ICRXDMTC 0x04120 /* Interrupt Cause Rx Descriptor Minimum
> Threshold Count */
> #define E1000_ICRXOC 0x04124 /* Interrupt Cause Receiver Overrun Count */
> +#define E1000_SDPC 0x041A4 /* Switch Drop Packet Count */
> #define E1000_PCS_CFG0 0x04200 /* PCS Configuration 0 - RW */
> #define E1000_PCS_LCTL 0x04208 /* PCS Link Control - RW */
> #define E1000_PCS_LSTAT 0x0420C /* PCS Link Status - RO */
> @@ -1231,11 +1264,34 @@ struct em_ffvt_entry {
> /* RSS registers */
> #define E1000_CPUVEC 0x02C10 /* CPU Vector Register - RW */
> #define E1000_MRQC 0x05818 /* Multiple Receive Control - RW */
> -#define E1000_RETA 0x05C00 /* Redirection Table - RW Array */
> -#define E1000_RSSRK 0x05C80 /* RSS Random Key - RW Array */
> +#define E1000_RETA(_i) (0x05C00 + ((_i) * 4))/* Redirection Table - RW
> Array */
> +#define E1000_RSSRK(_i) (0x05C80 + ((_i) * 4))/* RSS Random Key - RW
> Array */
> #define E1000_RSSIM 0x05864 /* RSS Interrupt Mask */
> #define E1000_RSSIR 0x05868 /* RSS Interrupt Request */
>
> +/* BMC2OS Registers */
> +#define E1000_B2OSPC 0x8FE0
> +#define E1000_B2OGPRC 0x4158
> +#define E1000_O2BGPTC 0x8FE4
> +#define E1000_O2BSPC 0x415C
> +
> +/* Per Queue Packets Count */
> +#define E1000_PQGPRC(_i) (0x010010 + ((_i) * 0x100))
> +#define E1000_PQGPTC(_i) (0x010014 + ((_i) * 0x100))
> +
> +/* Phy Power Management (i210 8.27.2 pag 542) */
> +#define E1000_PHPM 0x0E14
> +#define E1000_PHPM_SPD_EN (1 << 0)
> +#define E1000_PHPM_D0LPLU (1 << 1)
> +#define E1000_PHPM_LPLU (1 << 2)
> +#define E1000_PHPM_DIS_1000_ND0 (1 << 3)
> +#define E1000_PHPM_LINK_ED (1 << 4)
> +#define E1000_PHPM_GOLINK_DISC (1 << 5)
> +#define E1000_PHPM_DIS_1000 (1 << 6)
> +#define E1000_PHPM_SPD_B2B_EN (1 << 7)
> +#define E1000_PHPM_RST_COMPL (1 << 8)
> +#define E1000_PHPM_DIS_100_ND0 (1 << 9)
> +
> /* Energy Efficient Ethernet "EEE" registers */
> #define E1000_IPCNFG 0x0E38 /* Internal PHY Configuration */
> #define E1000_LTRC 0x01A0 /* Latency Tolerance Reporting Control */
> @@ -1244,236 +1300,6 @@ struct em_ffvt_entry {
> #define E1000_TLPIC 0x4148 /* EEE Tx LPI Count - TLPIC */
> #define E1000_RLPIC 0x414C /* EEE Rx LPI Count - RLPIC */
>
> -/* Register Set (82542)
> - *
> - * Some of the 82542 registers are located at different offsets than they are
> - * in more current versions of the 8254x. Despite the difference in location,
> - * the registers function in the same manner.
> - */
> -#define E1000_82542_CTRL E1000_CTRL
> -#define E1000_82542_CTRL_DUP E1000_CTRL_DUP
> -#define E1000_82542_STATUS E1000_STATUS
> -#define E1000_82542_EECD E1000_EECD
> -#define E1000_82542_EERD E1000_EERD
> -#define E1000_82542_CTRL_EXT E1000_CTRL_EXT
> -#define E1000_82542_FLA E1000_FLA
> -#define E1000_82542_MDIC E1000_MDIC
> -#define E1000_82542_SCTL E1000_SCTL
> -#define E1000_82542_FEXTNVM E1000_FEXTNVM
> -#define E1000_82542_FEXTNVM3 E1000_FEXTNVM3
> -#define E1000_82542_FEXTNVM4 E1000_FEXTNVM4
> -#define E1000_82542_FEXTNVM6 E1000_FEXTNVM6
> -#define E1000_82542_FEXTNVM7 E1000_FEXTNVM7
> -#define E1000_82542_FCAL E1000_FCAL
> -#define E1000_82542_FCAH E1000_FCAH
> -#define E1000_82542_FCT E1000_FCT
> -#define E1000_82542_CONNSW E1000_CONNSW
> -#define E1000_82542_VET E1000_VET
> -#define E1000_82542_RA 0x00040
> -#define E1000_82542_ICR E1000_ICR
> -#define E1000_82542_ITR E1000_ITR
> -#define E1000_82542_ICS E1000_ICS
> -#define E1000_82542_IMS E1000_IMS
> -#define E1000_82542_IMC E1000_IMC
> -#define E1000_82542_RCTL E1000_RCTL
> -#define E1000_82542_RDTR 0x00108
> -#define E1000_82542_RDBAL 0x00110
> -#define E1000_82542_RDBAH 0x00114
> -#define E1000_82542_RDLEN 0x00118
> -#define E1000_82542_RDH 0x00120
> -#define E1000_82542_RDT 0x00128
> -#define E1000_82542_RDTR0 E1000_82542_RDTR
> -#define E1000_82542_RDBAL0 E1000_82542_RDBAL
> -#define E1000_82542_RDBAH0 E1000_82542_RDBAH
> -#define E1000_82542_RDLEN0 E1000_82542_RDLEN
> -#define E1000_82542_RDH0 E1000_82542_RDH
> -#define E1000_82542_RDT0 E1000_82542_RDT
> -#define E1000_82542_SRRCTL(_n) (0x280C + ((_n) << 8)) /* Split and
> Replication
> - * RX Control - RW */
> -#define E1000_82542_DCA_RXCTRL(_n) (0x02814 + ((_n) << 8))
> -#define E1000_82542_RDBAH3 0x02B04 /* RX Desc Base High Queue 3 - RW */
> -#define E1000_82542_RDBAL3 0x02B00 /* RX Desc Low Queue 3 - RW */
> -#define E1000_82542_RDLEN3 0x02B08 /* RX Desc Length Queue 3 - RW */
> -#define E1000_82542_RDH3 0x02B10 /* RX Desc Head Queue 3 - RW */
> -#define E1000_82542_RDT3 0x02B18 /* RX Desc Tail Queue 3 - RW */
> -#define E1000_82542_RDBAL2 0x02A00 /* RX Desc Base Low Queue 2 - RW */
> -#define E1000_82542_RDBAH2 0x02A04 /* RX Desc Base High Queue 2 - RW */
> -#define E1000_82542_RDLEN2 0x02A08 /* RX Desc Length Queue 2 - RW */
> -#define E1000_82542_RDH2 0x02A10 /* RX Desc Head Queue 2 - RW */
> -#define E1000_82542_RDT2 0x02A18 /* RX Desc Tail Queue 2 - RW */
> -#define E1000_82542_RDTR1 0x00130
> -#define E1000_82542_RDBAL1 0x00138
> -#define E1000_82542_RDBAH1 0x0013C
> -#define E1000_82542_RDLEN1 0x00140
> -#define E1000_82542_RDH1 0x00148
> -#define E1000_82542_RDT1 0x00150
> -#define E1000_82542_FCRTH 0x00160
> -#define E1000_82542_FCRTL 0x00168
> -#define E1000_82542_FCTTV E1000_FCTTV
> -#define E1000_82542_TXCW E1000_TXCW
> -#define E1000_82542_RXCW E1000_RXCW
> -#define E1000_82542_MTA 0x00200
> -#define E1000_82542_TCTL E1000_TCTL
> -#define E1000_82542_TCTL_EXT E1000_TCTL_EXT
> -#define E1000_82542_TIPG E1000_TIPG
> -#define E1000_82542_TDBAL 0x00420
> -#define E1000_82542_TDBAH 0x00424
> -#define E1000_82542_TDLEN 0x00428
> -#define E1000_82542_TDH 0x00430
> -#define E1000_82542_TDT 0x00438
> -#define E1000_82542_TIDV 0x00440
> -#define E1000_82542_TBT E1000_TBT
> -#define E1000_82542_AIT E1000_AIT
> -#define E1000_82542_VFTA 0x00600
> -#define E1000_82542_LEDCTL E1000_LEDCTL
> -#define E1000_82542_PBA E1000_PBA
> -#define E1000_82542_PBS E1000_PBS
> -#define E1000_82542_EEMNGCTL E1000_EEMNGCTL
> -#define E1000_82542_EEARBC E1000_EEARBC
> -#define E1000_82542_FLASHT E1000_FLASHT
> -#define E1000_82542_EEWR E1000_EEWR
> -#define E1000_82542_FLSWCTL E1000_FLSWCTL
> -#define E1000_82542_FLSWDATA E1000_FLSWDATA
> -#define E1000_82542_FLSWCNT E1000_FLSWCNT
> -#define E1000_82542_FLOP E1000_FLOP
> -#define E1000_82542_EXTCNF_CTRL E1000_EXTCNF_CTRL
> -#define E1000_82542_EXTCNF_SIZE E1000_EXTCNF_SIZE
> -#define E1000_82542_PHY_CTRL E1000_PHY_CTRL
> -#define E1000_82542_ERT E1000_ERT
> -#define E1000_82542_RXDCTL E1000_RXDCTL
> -#define E1000_82542_RXDCTL1 E1000_RXDCTL1
> -#define E1000_82542_RADV E1000_RADV
> -#define E1000_82542_RSRPD E1000_RSRPD
> -#define E1000_82542_TXDMAC E1000_TXDMAC
> -#define E1000_82542_KABGTXD E1000_KABGTXD
> -#define E1000_82542_TDFHS E1000_TDFHS
> -#define E1000_82542_TDFTS E1000_TDFTS
> -#define E1000_82542_TDFPC E1000_TDFPC
> -#define E1000_82542_TXDCTL E1000_TXDCTL
> -#define E1000_82542_TADV E1000_TADV
> -#define E1000_82542_TSPMT E1000_TSPMT
> -#define E1000_82542_CRCERRS E1000_CRCERRS
> -#define E1000_82542_ALGNERRC E1000_ALGNERRC
> -#define E1000_82542_SYMERRS E1000_SYMERRS
> -#define E1000_82542_RXERRC E1000_RXERRC
> -#define E1000_82542_MPC E1000_MPC
> -#define E1000_82542_SCC E1000_SCC
> -#define E1000_82542_ECOL E1000_ECOL
> -#define E1000_82542_MCC E1000_MCC
> -#define E1000_82542_LATECOL E1000_LATECOL
> -#define E1000_82542_COLC E1000_COLC
> -#define E1000_82542_DC E1000_DC
> -#define E1000_82542_TNCRS E1000_TNCRS
> -#define E1000_82542_SEC E1000_SEC
> -#define E1000_82542_CEXTERR E1000_CEXTERR
> -#define E1000_82542_RLEC E1000_RLEC
> -#define E1000_82542_XONRXC E1000_XONRXC
> -#define E1000_82542_XONTXC E1000_XONTXC
> -#define E1000_82542_XOFFRXC E1000_XOFFRXC
> -#define E1000_82542_XOFFTXC E1000_XOFFTXC
> -#define E1000_82542_FCRUC E1000_FCRUC
> -#define E1000_82542_PRC64 E1000_PRC64
> -#define E1000_82542_PRC127 E1000_PRC127
> -#define E1000_82542_PRC255 E1000_PRC255
> -#define E1000_82542_PRC511 E1000_PRC511
> -#define E1000_82542_PRC1023 E1000_PRC1023
> -#define E1000_82542_PRC1522 E1000_PRC1522
> -#define E1000_82542_GPRC E1000_GPRC
> -#define E1000_82542_BPRC E1000_BPRC
> -#define E1000_82542_MPRC E1000_MPRC
> -#define E1000_82542_GPTC E1000_GPTC
> -#define E1000_82542_GORCL E1000_GORCL
> -#define E1000_82542_GORCH E1000_GORCH
> -#define E1000_82542_GOTCL E1000_GOTCL
> -#define E1000_82542_GOTCH E1000_GOTCH
> -#define E1000_82542_RNBC E1000_RNBC
> -#define E1000_82542_RUC E1000_RUC
> -#define E1000_82542_RFC E1000_RFC
> -#define E1000_82542_ROC E1000_ROC
> -#define E1000_82542_RJC E1000_RJC
> -#define E1000_82542_MGTPRC E1000_MGTPRC
> -#define E1000_82542_MGTPDC E1000_MGTPDC
> -#define E1000_82542_MGTPTC E1000_MGTPTC
> -#define E1000_82542_TORL E1000_TORL
> -#define E1000_82542_TORH E1000_TORH
> -#define E1000_82542_TOTL E1000_TOTL
> -#define E1000_82542_TOTH E1000_TOTH
> -#define E1000_82542_TPR E1000_TPR
> -#define E1000_82542_TPT E1000_TPT
> -#define E1000_82542_PTC64 E1000_PTC64
> -#define E1000_82542_PTC127 E1000_PTC127
> -#define E1000_82542_PTC255 E1000_PTC255
> -#define E1000_82542_PTC511 E1000_PTC511
> -#define E1000_82542_PTC1023 E1000_PTC1023
> -#define E1000_82542_PTC1522 E1000_PTC1522
> -#define E1000_82542_MPTC E1000_MPTC
> -#define E1000_82542_BPTC E1000_BPTC
> -#define E1000_82542_TSCTC E1000_TSCTC
> -#define E1000_82542_TSCTFC E1000_TSCTFC
> -#define E1000_82542_RXCSUM E1000_RXCSUM
> -#define E1000_82542_WUC E1000_WUC
> -#define E1000_82542_WUFC E1000_WUFC
> -#define E1000_82542_WUS E1000_WUS
> -#define E1000_82542_MANC E1000_MANC
> -#define E1000_82542_IPAV E1000_IPAV
> -#define E1000_82542_IP4AT E1000_IP4AT
> -#define E1000_82542_IP6AT E1000_IP6AT
> -#define E1000_82542_WUPL E1000_WUPL
> -#define E1000_82542_WUPM E1000_WUPM
> -#define E1000_82542_FFLT E1000_FFLT
> -#define E1000_82542_FCRTV_PCH E1000_FCRTV_PCH
> -#define E1000_82542_TDFH 0x08010
> -#define E1000_82542_TDFT 0x08018
> -#define E1000_82542_FFMT E1000_FFMT
> -#define E1000_82542_FFVT E1000_FFVT
> -#define E1000_82542_CRC_OFFSET E1000_CRC_OFFSET
> -#define E1000_82542_HOST_IF E1000_HOST_IF
> -#define E1000_82542_IAM E1000_IAM
> -#define E1000_82542_EEMNGCTL E1000_EEMNGCTL
> -#define E1000_82542_PSRCTL E1000_PSRCTL
> -#define E1000_82542_RAID E1000_RAID
> -#define E1000_82542_TARC0 E1000_TARC0
> -#define E1000_82542_TDBAL1 E1000_TDBAL1
> -#define E1000_82542_TDBAH1 E1000_TDBAH1
> -#define E1000_82542_TDLEN1 E1000_TDLEN1
> -#define E1000_82542_TDH1 E1000_TDH1
> -#define E1000_82542_TDT1 E1000_TDT1
> -#define E1000_82542_TXDCTL1 E1000_TXDCTL1
> -#define E1000_82542_TARC1 E1000_TARC1
> -#define E1000_82542_RFCTL E1000_RFCTL
> -#define E1000_82542_GCR E1000_GCR
> -#define E1000_82542_GSCL_1 E1000_GSCL_1
> -#define E1000_82542_GSCL_2 E1000_GSCL_2
> -#define E1000_82542_GSCL_3 E1000_GSCL_3
> -#define E1000_82542_GSCL_4 E1000_GSCL_4
> -#define E1000_82542_FACTPS E1000_FACTPS
> -#define E1000_82542_SWSM E1000_SWSM
> -#define E1000_82542_H2ME E1000_H2ME
> -#define E1000_82542_FWSM E1000_FWSM
> -#define E1000_82542_FFLT_DBG E1000_FFLT_DBG
> -#define E1000_82542_IAC E1000_IAC
> -#define E1000_82542_ICRXPTC E1000_ICRXPTC
> -#define E1000_82542_ICRXATC E1000_ICRXATC
> -#define E1000_82542_ICTXPTC E1000_ICTXPTC
> -#define E1000_82542_ICTXATC E1000_ICTXATC
> -#define E1000_82542_ICTXQEC E1000_ICTXQEC
> -#define E1000_82542_ICTXQMTC E1000_ICTXQMTC
> -#define E1000_82542_ICRXDMTC E1000_ICRXDMTC
> -#define E1000_82542_ICRXOC E1000_ICRXOC
> -#define E1000_82542_HICR E1000_HICR
> -#define E1000_82542_PCS_CFG0 E1000_PCS_CFG0
> -#define E1000_82542_PCS_LCTL E1000_PCS_LCTL
> -#define E1000_82542_PCS_LSTAT E1000_PCS_LSTAT
> -
> -#define E1000_82542_CPUVEC E1000_CPUVEC
> -#define E1000_82542_MRQC E1000_MRQC
> -#define E1000_82542_RETA E1000_RETA
> -#define E1000_82542_RSSRK E1000_RSSRK
> -#define E1000_82542_RSSIM E1000_RSSIM
> -#define E1000_82542_RSSIR E1000_RSSIR
> -#define E1000_82542_KUMCTRLSTA E1000_KUMCTRLSTA
> -#define E1000_82542_SW_FW_SYNC E1000_SW_FW_SYNC
> -
> #define E1000_FEXTNVM3_PHY_CFG_COUNTER_MASK 0x0C000000
> #define E1000_FEXTNVM3_PHY_CFG_COUNTER_50MSEC 0x08000000
>
> @@ -1553,6 +1379,15 @@ struct em_hw_stats {
> uint64_t ictxqmtc;
> uint64_t icrxdmtc;
> uint64_t icrxoc;
> + uint64_t sdpc;
> + uint64_t mngpdc;
> + uint64_t mngptc;
> + uint64_t mngprc;
> + uint64_t b2ospc;
> + uint64_t o2bgptc;
> + uint64_t b2ogprc;
> + uint64_t o2bspc;
> + uint64_t rpthc;
> };
>
> /* Structure containing variables used by the shared code (em_hw.c) */
> @@ -2273,6 +2108,10 @@ struct em_hw {
> #define E1000_WUC_PME_STATUS 0x00000004 /* PME Status */
> #define E1000_WUC_APMPME 0x00000008 /* Assert PME on APM Wakeup */
> #define E1000_WUC_SPM 0x80000000 /* Enable SPM */
> +/* Flexible Host Filter Table */
> +#define E1000_FHFT(_n) (0x09000 + ((_n) * 0x100))
> +/* Ext Flexible Host Filter Table */
> +#define E1000_FHFT_EXT(_n) (0x09A00 + ((_n) * 0x100))
>
> /* Wake Up Filter Control */
> #define E1000_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */
> @@ -2491,6 +2330,42 @@ struct em_host_command_info {
> #define E1000_FACTPS_LAN_FUNC_SEL 0x40000000
> #define E1000_FACTPS_PM_STATE_CHANGED 0x80000000
>
> +/* IVAR0 bit definitions */
> +#define E1000_IVAR_VALID 0x80
> +
> +/* GPIE bit definitions */
> +#define E1000_GPIE_NSICR 0x00000001
> +#define E1000_GPIE_MSIX_MODE 0x00000010
> +#define E1000_GPIE_EIAME 0x40000000
> +#define E1000_GPIE_PBA 0x80000000
> +
> +/* MRQC bit definitions */
> +#define E1000_MRQC_ENABLE_RSS_4Q 0x00000002
> +#define E1000_MRQC_ENABLE_VMDQ 0x00000003
> +#define E1000_MRQC_ENABLE_VMDQ_RSS_2Q 0x00000005
> +#define E1000_MRQC_RSS_FIELD_IPV4_UDP 0x00400000
> +#define E1000_MRQC_RSS_FIELD_IPV6_UDP 0x00800000
> +#define E1000_MRQC_RSS_FIELD_IPV6_UDP_EX 0x01000000
> +#define E1000_MRQC_ENABLE_RSS_8Q 0x00000002
> +
> +/* SRRCTL bit definitions */
> +#define E1000_SRRCTL_BSIZEPKT_SHIFT 10 /* Shift _right_ */
> +#define E1000_SRRCTL_BSIZEHDRSIZE_MASK 0x00000F00
> +#define E1000_SRRCTL_BSIZEHDRSIZE_SHIFT 2 /* Shift _left_ */
> +#define E1000_SRRCTL_DESCTYPE_LEGACY 0x00000000
> +#define E1000_SRRCTL_DESCTYPE_ADV_ONEBUF 0x02000000
> +#define E1000_SRRCTL_DESCTYPE_HDR_SPLIT 0x04000000
> +#define E1000_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS 0x0A000000
> +#define E1000_SRRCTL_DESCTYPE_HDR_REPLICATION 0x06000000
> +#define E1000_SRRCTL_DESCTYPE_HDR_REPLICATION_LARGE_PKT 0x08000000
> +#define E1000_SRRCTL_DESCTYPE_MASK 0x0E000000
> +#define E1000_SRRCTL_TIMESTAMP 0x40000000
> +#define E1000_SRRCTL_DROP_EN 0x80000000
> +
> +/* WUFC bit definitions */
> +#define E1000_WUFC_FLX(_n) (1 << (16 + _n))
> +#define E1000_WUFC_FLEX_HQ (1 << 14)
> +
> /* PCI-Ex Config Space */
> #define PCI_EX_LINK_STATUS 0x12
> #define PCI_EX_LINK_WIDTH_MASK 0x3F0
> @@ -3481,6 +3356,7 @@ struct em_host_command_info {
> #define GG82563_E_PHY_ID 0x01410CA0
> #define BME1000_E_PHY_ID 0x01410CB0
> #define BME1000_E_PHY_ID_R2 0x01410CB1
> +#define I347AT4_E_PHY_ID 0x01410DC0
> #define M88E1543_E_PHY_ID 0x01410EA0
> #define I82577_E_PHY_ID 0x01540050
> #define I82578_E_PHY_ID 0x004DD040
> Index: pci/if_em_osdep.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_em_osdep.h,v
> retrieving revision 1.13
> diff -u -p -r1.13 if_em_osdep.h
> --- pci/if_em_osdep.h 18 Feb 2016 14:24:39 -0000 1.13
> +++ pci/if_em_osdep.h 17 Jan 2020 13:33:59 -0000
> @@ -96,20 +96,21 @@ struct em_osdep
> offset, value)
>
> /* Convert a register name to its offset in the adapter's memory space */
> -#define E1000_REG_OFFSET(hw, reg) \
> - ((hw)->mac_type >= em_82543 ? E1000_##reg : E1000_82542_##reg)
> +#define E1000_REG_TR(hw, reg)
> \
> + ((hw)->mac_type >= em_82543 ? \
> + reg : em_translate_82542_register(reg))
>
> /* Register READ/WRITE macros */
>
> #define E1000_READ_REG(hw, reg) \
> bus_space_read_4(((struct em_osdep *)(hw)->back)->mem_bus_space_tag, \
> ((struct em_osdep *)(hw)->back)->mem_bus_space_handle,
> \
> - ((hw)->mac_type >= em_82543 ? E1000_##reg :
> E1000_82542_##reg))
> + E1000_REG_TR(hw, E1000_##reg))
>
> #define E1000_WRITE_REG(hw, reg, value) \
> bus_space_write_4(((struct em_osdep *)(hw)->back)->mem_bus_space_tag, \
> ((struct em_osdep
> *)(hw)->back)->mem_bus_space_handle, \
> - ((hw)->mac_type >= em_82543 ? E1000_##reg :
> E1000_82542_##reg), \
> + E1000_REG_TR(hw, E1000_##reg), \
> value)
>
> #define EM_READ_REG(hw, reg) \
> @@ -122,18 +123,26 @@ struct em_osdep
> ((struct em_osdep
> *)(hw)->back)->mem_bus_space_handle, \
> reg, value)
>
> +#define EM_READ_REG_ARRAY(hw, reg, index) \
> + bus_space_read_4(((struct em_osdep *)(hw)->back)->mem_bus_space_tag, \
> + ((struct em_osdep *)(hw)->back)->mem_bus_space_handle, \
> + reg + ((index) << 2))
> +
> +#define EM_WRITE_REG_ARRAY(hw, reg, index, value) \
> + bus_space_write_4(((struct em_osdep *)(hw)->back)->mem_bus_space_tag, \
> + ((struct em_osdep *)(hw)->back)->mem_bus_space_handle, \
> + reg + ((index) << 2), value)
>
> #define E1000_READ_REG_ARRAY(hw, reg, index) \
> bus_space_read_4(((struct em_osdep *)(hw)->back)->mem_bus_space_tag, \
> ((struct em_osdep *)(hw)->back)->mem_bus_space_handle,
> \
> - ((hw)->mac_type >= em_82543 ? E1000_##reg :
> E1000_82542_##reg) \
> - + ((index) << 2))
> + E1000_REG_TR(hw, E1000_##reg) + ((index) << 2))
>
> #define E1000_WRITE_REG_ARRAY(hw, reg, index, value) \
> bus_space_write_4(((struct em_osdep *)(hw)->back)->mem_bus_space_tag, \
> ((struct em_osdep
> *)(hw)->back)->mem_bus_space_handle, \
> - ((hw)->mac_type >= em_82543 ? E1000_##reg :
> E1000_82542_##reg) \
> - + ((index) << 2), value)
> + E1000_REG_TR(hw, E1000_##reg) + ((index) << 2), \
> + value)
>
> #define E1000_READ_REG_ARRAY_DWORD E1000_READ_REG_ARRAY
> #define E1000_WRITE_REG_ARRAY_DWORD E1000_WRITE_REG_ARRAY
> @@ -141,14 +150,14 @@ struct em_osdep
> #define E1000_WRITE_REG_ARRAY_BYTE(hw, reg, index, value) \
> bus_space_write_1(((struct em_osdep *)(hw)->back)->mem_bus_space_tag, \
> ((struct em_osdep
> *)(hw)->back)->mem_bus_space_handle, \
> - ((hw)->mac_type >= em_82543 ? E1000_##reg :
> E1000_82542_##reg \
> - + index), value)
> + E1000_REG_TR(hw, E1000_##reg) + index, \
> + value)
>
> #define E1000_WRITE_REG_ARRAY_WORD(hw, reg, index, value) \
> bus_space_write_2(((struct em_osdep *)(hw)->back)->mem_bus_space_tag, \
> ((struct em_osdep
> *)(hw)->back)->mem_bus_space_handle, \
> - ((hw)->mac_type >= em_82543 ? E1000_##reg :
> E1000_82542_##reg \
> - + (index << 1)), value)
> + E1000_REG_TR(hw, E1000_##reg) + (index << 1), \
> + value)
>
> #define E1000_READ_ICH_FLASH_REG(hw, reg) \
> bus_space_read_4(((struct em_osdep *)(hw)->back)->flash_bus_space_tag, \
>