[haiku-commits] haiku: hrev51558 - in src: add-ons/kernel/drivers/network/rtl8139/dev/rl add-ons/kernel/drivers/network/rtl8139/pci add-ons/kernel/drivers/network/rtl81xx/dev/rl add-ons/kernel/drivers/network/rtl81xx/pci libs/compat/freebsd11_network

  • From: jerome.duval@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 18 Nov 2017 16:42:25 +0100 (CET)

hrev51558 adds 2 changesets to branch 'master'
old head: 1c53604c91c76136bd39008c9d4e427480727bbb
new head: 7472cf5784b0e6f2a8b7d279a117c638517973a6
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=7472cf5784b0+%5E1c53604c91c7

----------------------------------------------------------------------------

76ad0d68c376: freebsd11_network: adapt code based on needs of the rtl81xx R11.1 
driver.

7472cf5784b0: rtl8139/rtl81xx: Update with the 11.1 release of re and rl 
drivers.
  
  * switch compat layer.
  * tested on Qemu and RTL8168 rev 10.

                                   [ Jérôme Duval <jerome.duval@xxxxxxxxx> ]

----------------------------------------------------------------------------

26 files changed, 772 insertions(+), 456 deletions(-)
.../kernel/drivers/network/rtl8139/Jamfile       |   1 -
.../kernel/drivers/network/rtl8139/dev/Jamfile   |   1 +
.../drivers/network/rtl8139/dev/mii/Jamfile      |   6 +-
.../drivers/network/rtl8139/dev/mii/rlphy.c      |  21 +-
.../drivers/network/rtl8139/dev/rl/Jamfile       |  16 ++
.../network/rtl8139/{pci => dev/rl}/glue.c       |   2 +-
.../network/rtl8139/{pci => dev/rl}/if_rl.c      |  48 ++--
.../{rtl81xx/pci => rtl8139/dev/rl}/if_rlreg.h   |  30 +--
.../kernel/drivers/network/rtl8139/pci/Jamfile   |  16 --
.../drivers/network/rtl81xx/dev/mii/Jamfile      |   6 +-
.../drivers/network/rtl81xx/dev/mii/rgephy.c     | 211 +++++++++++------
.../drivers/network/rtl81xx/dev/mii/rgephyreg.h  |  37 +++
.../drivers/network/rtl81xx/dev/re/Jamfile       |   4 +-
.../kernel/drivers/network/rtl81xx/dev/re/glue.c |   2 +-
.../drivers/network/rtl81xx/dev/re/if_re.c       | 161 ++++++++-----
.../{rtl8139/pci => rtl81xx/dev/rl}/if_rlreg.h   |  41 ++--
src/libs/compat/freebsd11_network/bus.cpp        |  10 +
src/libs/compat/freebsd11_network/compat.c       |  16 ++
.../freebsd11_network/compat/dev/mii/mii.h       |  43 +++-
.../freebsd11_network/compat/dev/mii/miidevs     |  26 ++-
.../freebsd11_network/compat/dev/mii/miivar.h    |  54 +----
.../compat/freebsd11_network/compat/sys/bus.h    |   1 +
.../freebsd11_network/compat/sys/haiku-module.h  |  17 ++
src/libs/compat/freebsd11_network/fbsd_mii.c     | 219 +++++++++++++-----
.../compat/freebsd11_network/fbsd_mii_physubr.c  | 230 ++++++++++---------
src/libs/compat/freebsd11_network/shared.h       |   9 +

############################################################################

Commit:      76ad0d68c3766ca048c144240937319e9482e30a
URL:         http://cgit.haiku-os.org/haiku/commit/?id=76ad0d68c376
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Sat Nov 18 14:36:22 2017 UTC

freebsd11_network: adapt code based on needs of the rtl81xx R11.1 driver.

----------------------------------------------------------------------------

diff --git a/src/libs/compat/freebsd11_network/bus.cpp 
b/src/libs/compat/freebsd11_network/bus.cpp
index 290378f..cd6d600 100644
--- a/src/libs/compat/freebsd11_network/bus.cpp
+++ b/src/libs/compat/freebsd11_network/bus.cpp
@@ -522,6 +522,16 @@ bus_child_present(device_t child)
 }
 
 
+void
+bus_enumerate_hinted_children(device_t bus)
+{
+#if 0
+       UNIMPLEMENTED();
+#endif
+}
+
+
+
 //     #pragma mark - PCI functions
 
 
diff --git a/src/libs/compat/freebsd11_network/compat.c 
b/src/libs/compat/freebsd11_network/compat.c
index 3b40c9f..4ac2a67 100644
--- a/src/libs/compat/freebsd11_network/compat.c
+++ b/src/libs/compat/freebsd11_network/compat.c
@@ -99,6 +99,9 @@ resolve_method(driver_t *driver, const char *name)
                        method = driver->methods[i].method;
        }
 
+       if (method == NULL)
+               panic("resolve_method: method%s not found\n", name);
+
        return method;
 }
 
@@ -304,6 +307,19 @@ device_set_driver(device_t dev, driver_t *driver)
                        dev->methods.miibus_linkchg = (void *)mth->method;
                else if (!strcmp(mth->name, "miibus_mediainit"))
                        dev->methods.miibus_mediainit = (void *)mth->method;
+               else if (!strcmp(mth->name, "bus_child_location_str"))
+                       dev->methods.bus_child_location_str = (void 
*)mth->method;
+               else if (!strcmp(mth->name, "bus_child_pnpinfo_str"))
+                       dev->methods.bus_child_pnpinfo_str = (void 
*)mth->method;
+               else if (!strcmp(mth->name, "bus_hinted_child"))
+                       dev->methods.bus_hinted_child = (void *)mth->method;
+               else if (!strcmp(mth->name, "bus_print_child"))
+                       dev->methods.bus_print_child = (void *)mth->method;
+               else if (!strcmp(mth->name, "bus_read_ivar"))
+                       dev->methods.bus_read_ivar = (void *)mth->method;
+               else
+                       panic("device_set_driver: method %s not found\n", 
mth->name);
+
        }
 
        return 0;
diff --git a/src/libs/compat/freebsd11_network/compat/dev/mii/mii.h 
b/src/libs/compat/freebsd11_network/compat/dev/mii/mii.h
index 668fb8f..fa1ec84 100644
--- a/src/libs/compat/freebsd11_network/compat/dev/mii/mii.h
+++ b/src/libs/compat/freebsd11_network/compat/dev/mii/mii.h
@@ -1,4 +1,4 @@
-/*     $NetBSD: mii.h,v 1.9 2001/05/31 03:07:14 thorpej Exp $  */
+/*     $NetBSD: mii.h,v 1.18 2014/06/16 14:43:22 msaitoh Exp $ */
 
 /*-
  * Copyright (c) 1997 Manuel Bouyer.  All rights reserved.
@@ -87,7 +87,7 @@
 /*
  * Note that the EXTSTAT bit indicates that there is extended status
  * info available in register 15, but 802.3 section 22.2.4.3 also
- * states that that all 1000 Mb/s capable PHYs will set this bit to 1.
+ * states that all 1000 Mb/s capable PHYs will set this bit to 1.
  */
 
 #define        BMSR_MEDIAMASK  (BMSR_100T4|BMSR_100TXFDX|BMSR_100TXHDX| \
@@ -111,6 +111,7 @@
 #define ANAR_NP                0x8000  /* Next page (ro) */
 #define        ANAR_ACK        0x4000  /* link partner abilities acknowledged 
(ro) */
 #define ANAR_RF                0x2000  /* remote fault (ro) */
+               /* Annex 28B.2 */
 #define        ANAR_FC         0x0400  /* local device supports PAUSE */
 #define ANAR_T4                0x0200  /* local device supports 100bT4 */
 #define ANAR_TX_FD     0x0100  /* local device supports 100bTx FD */
@@ -123,6 +124,7 @@
 #define        ANAR_PAUSE_ASYM         (2 << 10)
 #define        ANAR_PAUSE_TOWARDS      (3 << 10)
 
+               /* Annex 28D */
 #define        ANAR_X_FD       0x0020  /* local device supports 1000BASE-X FD 
*/
 #define        ANAR_X_HD       0x0040  /* local device supports 1000BASE-X HD 
*/
 #define        ANAR_X_PAUSE_NONE       (0 << 7)
@@ -184,12 +186,47 @@
 #define        GTSR_MAN_MS_FLT 0x8000  /* master/slave config fault */
 #define        GTSR_MS_RES     0x4000  /* result: 1 = master, 0 = slave */
 #define        GTSR_LRS        0x2000  /* local rx status, 1 = ok */
-#define        GTSR_RRS        0x1000  /* remove rx status, 1 = ok */
+#define        GTSR_RRS        0x1000  /* remote rx status, 1 = ok */
 #define        GTSR_LP_1000TFDX 0x0800 /* link partner 1000baseT FDX capable */
 #define        GTSR_LP_1000THDX 0x0400 /* link partner 1000baseT HDX capable */
 #define        GTSR_LP_ASM_DIR 0x0200  /* link partner asym. pause dir. 
capable */
 #define        GTSR_IDLE_ERR   0x00ff  /* IDLE error count */
 
+#define        MII_PSECR       0x0b    /* PSE control register */
+#define        PSECR_PACTLMASK 0x000c  /* pair control mask */
+#define        PSECR_PSEENMASK 0x0003  /* PSE enable mask */
+#define        PSECR_PINOUTB   0x0008  /* PSE pinout Alternative B */
+#define        PSECR_PINOUTA   0x0004  /* PSE pinout Alternative A */
+#define        PSECR_FOPOWTST  0x0002  /* Force Power Test Mode */
+#define        PSECR_PSEEN     0x0001  /* PSE Enabled */
+#define        PSECR_PSEDIS    0x0000  /* PSE Disabled */
+
+#define        MII_PSESR       0x0c    /* PSE status register */
+#define        PSESR_PWRDENIED 0x1000  /* Power Denied */
+#define        PSESR_VALSIG    0x0800  /* Valid PD signature detected */
+#define        PSESR_INVALSIG  0x0400  /* Invalid PD signature detected */
+#define        PSESR_SHORTCIRC 0x0200  /* Short circuit condition detected */
+#define        PSESR_OVERLOAD  0x0100  /* Overload condition detected */
+#define        PSESR_MPSABSENT 0x0080  /* MPS absent condition detected */
+#define        PSESR_PDCLMASK  0x0070  /* PD Class mask */
+#define        PSESR_STATMASK  0x000e  /* PSE Status mask */
+#define        PSESR_PAIRCTABL 0x0001  /* PAIR Control Ability */
+#define        PSESR_PDCL_4            (4 << 4)        /* Class 4 */
+#define        PSESR_PDCL_3            (3 << 4)        /* Class 3 */
+#define        PSESR_PDCL_2            (2 << 4)        /* Class 2 */
+#define        PSESR_PDCL_1            (1 << 4)        /* Class 1 */
+#define        PSESR_PDCL_0            (0 << 4)        /* Class 0 */
+
+#define        MII_MMDACR      0x0d    /* MMD access control register */
+#define        MMDACR_FUNCMASK 0xc000  /* function */
+#define        MMDACR_DADDRMASK 0x001f /* device address */
+#define        MMDACR_FN_ADDRESS       (0 << 14) /* address */
+#define        MMDACR_FN_DATANPI       (1 << 14) /* data, no post increment */
+#define        MMDACR_FN_DATAPIRW      (2 << 14) /* data, post increment on 
r/w */
+#define        MMDACR_FN_DATAPIW       (3 << 14) /* data, post increment on wr 
only */
+
+#define        MII_MMDAADR     0x0e    /* MMD access address data register */
+
 #define        MII_EXTSR       0x0f    /* Extended status register */
 #define        EXTSR_1000XFDX  0x8000  /* 1000X full-duplex capable */
 #define        EXTSR_1000XHDX  0x4000  /* 1000X half-duplex capable */
diff --git a/src/libs/compat/freebsd11_network/compat/dev/mii/miidevs 
b/src/libs/compat/freebsd11_network/compat/dev/mii/miidevs
index 5d69fa1..cdb0289 100644
--- a/src/libs/compat/freebsd11_network/compat/dev/mii/miidevs
+++ b/src/libs/compat/freebsd11_network/compat/dev/mii/miidevs
@@ -53,7 +53,7 @@ oui BROADCOM                  0x001018        Broadcom 
Corporation
 oui BROADCOM2                  0x000af7        Broadcom Corporation
 oui BROADCOM3                  0x001be9        Broadcom Corporation
 oui BROADCOM4                  0x18c086        Broadcom Corporation
-oui CICADA                     0x0003F1        Cicada Semiconductor
+oui CICADA                     0x0003f1        Cicada Semiconductor
 oui DAVICOM                    0x00606e        Davicom Semiconductor
 oui ENABLESEMI                 0x0010dd        Enable Semiconductor
 oui ICPLUS                     0x0090c3        IC Plus Corp.
@@ -62,6 +62,7 @@ oui INTEL                     0x00aa00        Intel 
Corporation
 oui JMICRON                    0x00d831        JMicron Technologies
 oui LEVEL1                     0x00207b        Level 1
 oui MARVELL                    0x005043        Marvell Semiconductor
+oui MICREL                     0x0010a1        Micrel
 oui MYSON                      0x00c0b4        Myson Technology
 oui NATSEMI                    0x080017        National Semiconductor
 oui PMCSIERRA                  0x00e004        PMC-Sierra
@@ -70,8 +71,10 @@ oui RDC                              0x00d02d        RDC 
Semiconductor
 oui REALTEK                    0x00e04c        RealTek Semicondctor
 oui SEEQ                       0x00a07d        Seeq Technology
 oui SIS                                0x00e006        Silicon Integrated 
Systems
+oui SMC                                0x00800f        SMC
 oui TI                         0x080028        Texas Instruments
 oui TSC                                0x00c039        TDK Semiconductor
+oui VITESSE                    0x0001c1        Vitesse Semiconductor
 oui XAQTI                      0x00e0ae        XaQti Corp.
 
 /* Some Intel 82553's use an alternative OUI. */
@@ -134,6 +137,7 @@ model yyAMD 79c901home              0x0039 Am79C901 HomePNA 
1.0 interface
 /* Atheros Communications/Attansic PHYs */
 model xxATHEROS F1             0x0001 Atheros F1 10/100/1000 PHY
 model xxATHEROS F2             0x0002 Atheros F2 10/100 PHY
+model xxATHEROS AR8021         0x0004 Atheros AR8021 10/100/1000 PHY
 model xxATHEROS F1_7           0x0007 Atheros F1 10/100/1000 PHY
 
 /* Asix semiconductor PHYs */
@@ -150,7 +154,10 @@ model xxBROADCOM BCM4401   0x0036 BCM4401 10/100 media 
interface
 model xxBROADCOM BCM5365       0x0037 BCM5365 10/100 5-port PHY switch
 model BROADCOM BCM5400         0x0004 BCM5400 1000BASE-T media interface
 model BROADCOM BCM5401         0x0005 BCM5401 1000BASE-T media interface
+model BROADCOM BCM5402         0x0006 BCM5402 1000BASE-T media interface
 model BROADCOM BCM5411         0x0007 BCM5411 1000BASE-T media interface
+model BROADCOM BCM5404         0x0008 BCM5404 1000BASE-T media interface
+model BROADCOM BCM5424         0x000a BCM5424/BCM5234 1000BASE-T media 
interface
 model BROADCOM BCM5464         0x000b BCM5464 1000BASE-T media interface
 model BROADCOM BCM5461         0x000c BCM5461 1000BASE-T media interface
 model BROADCOM BCM5462         0x000d BCM5462 1000BASE-T media interface
@@ -166,12 +173,15 @@ model BROADCOM BCM54K2            0x002e BCM54K2 
1000BASE-T media interface
 model BROADCOM BCM5714         0x0034 BCM5714 1000BASE-T media interface
 model BROADCOM BCM5780         0x0035 BCM5780 1000BASE-T media interface
 model BROADCOM BCM5708C                0x0036 BCM5708C 1000BASE-T media 
interface
+model BROADCOM BCM5466         0x003b BCM5466 1000BASE-T media interface
 model BROADCOM2 BCM5325                0x0003 BCM5325 10/100 5-port PHY switch
 model BROADCOM2 BCM5906                0x0004 BCM5906 10/100baseTX media 
interface
+model BROADCOM2 BCM5478                0x0008 BCM5478 1000BASE-T media 
interface
+model BROADCOM2 BCM5488                0x0009 BCM5488 1000BASE-T media 
interface
 model BROADCOM2 BCM5481                0x000a BCM5481 1000BASE-T media 
interface
 model BROADCOM2 BCM5482                0x000b BCM5482 1000BASE-T media 
interface
 model BROADCOM2 BCM5755                0x000c BCM5755 1000BASE-T media 
interface
-model BROADCOM2 BCM5754                0x000e BCM5754/5787 1000BASE-T media 
interface
+model BROADCOM2 BCM5754                0x000e BCM5754/BCM5787 1000BASE-T media 
interface
 model BROADCOM2 BCM5708S       0x0015 BCM5708S 1000/2500baseSX PHY
 model BROADCOM2 BCM5785                0x0016 BCM5785 1000BASE-T media 
interface
 model BROADCOM2 BCM5709CAX     0x002c BCM5709CAX 10/100/1000baseT PHY
@@ -192,6 +202,7 @@ model xxBROADCOM_ALT1 BCM5906       0x0004 BCM5906 
10/100baseTX media interface
 model xxCICADA CS8201          0x0001 Cicada CS8201 10/100/1000TX PHY
 model xxCICADA CS8204          0x0004 Cicada CS8204 10/100/1000TX PHY
 model xxCICADA VSC8211         0x000b Cicada VSC8211 10/100/1000TX PHY
+model xxCICADA VSC8221         0x0015 Cicada CS8201 10/100/1000TX PHY
 model xxCICADA CS8201A         0x0020 Cicada CS8201 10/100/1000TX PHY
 model xxCICADA CS8201B         0x0021 Cicada CS8201 10/100/1000TX PHY
 model xxCICADA CS8244          0x002c Cicada CS8244 10/100/1000TX PHY
@@ -270,6 +281,10 @@ model MARVELL E1000_3              0x0003 Marvell 88E1000 
Gigabit PHY
 model MARVELL E1000_5          0x0005 Marvell 88E1000 Gigabit PHY
 model MARVELL E1111            0x000c Marvell 88E1111 Gigabit PHY
 
+/* Micrel PHYs */
+model MICREL KSZ9021           0x0021 Micrel KSZ9021 10/100/1000 PHY
+model MICREL KSZ9031           0x0022 Micrel KSZ9031 10/100/1000 PHY
+
 /* Myson Technology PHYs */
 model xxMYSON MTD972           0x0000 MTD972 10/100 media interface
 model MYSON MTD803             0x0000 MTD803 3-in-1 media interface
@@ -321,5 +336,12 @@ model TI TNETE2101         0x0003 TNETE2101 media interface
 model xxTSC 78Q2120            0x0014 78Q2120 10/100 media interface
 model xxTSC 78Q2121            0x0015 78Q2121 100BASE-TX media interface
 
+/* Vitesse Semiconductor */
+model xxVITESSE VSC8641                0x0003 Vitesse VSC8641 10/100/1000TX PHY
+
 /* XaQti Corp. PHYs */
 model xxXAQTI XMACII           0x0000 XaQti Corp. XMAC II gigabit interface
+
+/* SMC */
+model SMC LAN8710A             0x000F SMC LAN8710A 10/100 interface
+model SMC LAN8700              0x000C SMC LAN8700  10/100 interface
diff --git a/src/libs/compat/freebsd11_network/compat/dev/mii/miivar.h 
b/src/libs/compat/freebsd11_network/compat/dev/mii/miivar.h
index 47fcdb2..e3733fa 100644
--- a/src/libs/compat/freebsd11_network/compat/dev/mii/miivar.h
+++ b/src/libs/compat/freebsd11_network/compat/dev/mii/miivar.h
@@ -36,6 +36,7 @@
 #define        _DEV_MII_MIIVAR_H_
 
 #include <sys/queue.h>
+#include <net/if_var.h>        /* XXX driver API temporary */
 
 /*
  * Media Independent Interface data structure defintions
@@ -44,20 +45,13 @@
 struct mii_softc;
 
 /*
- * Callbacks from MII layer into network interface device driver.
- */
-typedef        int (*mii_readreg_t)(struct device *, int, int);
-typedef        void (*mii_writereg_t)(struct device *, int, int, int);
-typedef        void (*mii_statchg_t)(struct device *);
-
-/*
  * A network interface driver has one of these structures in its softc.
  * It is the interface from the network interface driver to the MII
  * layer.
  */
 struct mii_data {
        struct ifmedia mii_media;       /* media information */
-       struct ifnet *mii_ifp;          /* pointer back to network interface */
+       if_t mii_ifp;           /* pointer back to network interface */
 
        /*
         * For network interfaces with multiple PHYs, a list of all
@@ -72,13 +66,6 @@ struct mii_data {
         */
        u_int mii_media_status;
        u_int mii_media_active;
-
-       /*
-        * Calls from MII layer into network interface driver.
-        */
-       mii_readreg_t mii_readreg;
-       mii_writereg_t mii_writereg;
-       mii_statchg_t mii_statchg;
 };
 typedef struct mii_data mii_data_t;
 
@@ -193,27 +180,6 @@ struct mii_phydesc {
        MII_STR_ ## a ## _ ## b }
 #define MII_PHY_END    { 0, 0, NULL }
 
-/*
- * An array of these structures map MII media types to BMCR/ANAR settings.
- */
-struct mii_media {
-       u_int   mm_bmcr;                /* BMCR settings for this media */
-       u_int   mm_anar;                /* ANAR settings for this media */
-       u_int   mm_gtcr;                /* 100base-T2 or 1000base-T CR */
-};
-
-#define        MII_MEDIA_NONE          0
-#define        MII_MEDIA_10_T          1
-#define        MII_MEDIA_10_T_FDX      2
-#define        MII_MEDIA_100_T4        3
-#define        MII_MEDIA_100_TX        4
-#define        MII_MEDIA_100_TX_FDX    5
-#define        MII_MEDIA_1000_X        6
-#define        MII_MEDIA_1000_X_FDX    7
-#define        MII_MEDIA_1000_T        8
-#define        MII_MEDIA_1000_T_FDX    9
-#define        MII_NMEDIA              10
-
 #ifdef _KERNEL
 
 #ifdef __HAIKU__
@@ -270,30 +236,24 @@ MIIBUS_ACCESSOR(flags,            FLAGS,          u_int)
 extern devclass_t      miibus_devclass;
 extern driver_t                miibus_driver;
 
-int    miibus_probe(device_t);
-int    miibus_attach(device_t);
-int    miibus_detach(device_t);
-
-int    mii_attach(device_t, device_t *, struct ifnet *, ifm_change_cb_t,
+int    mii_attach(device_t, device_t *, if_t, ifm_change_cb_t,
            ifm_stat_cb_t, int, int, int, int);
-void   mii_down(struct mii_data *);
 int    mii_mediachg(struct mii_data *);
 void   mii_tick(struct mii_data *);
 void   mii_pollstat(struct mii_data *);
 void   mii_phy_add_media(struct mii_softc *);
 
-#ifdef __HAIKU__
-int            mii_media_from_bmcr(int);
-#endif
-
 int    mii_phy_auto(struct mii_softc *);
 int    mii_phy_detach(device_t dev);
-void   mii_phy_down(struct mii_softc *);
 u_int  mii_phy_flowstatus(struct mii_softc *);
 void   mii_phy_reset(struct mii_softc *);
 void   mii_phy_setmedia(struct mii_softc *sc);
 void   mii_phy_update(struct mii_softc *, int);
 int    mii_phy_tick(struct mii_softc *);
+int    mii_phy_mac_match(struct mii_softc *, const char *);
+int    mii_dev_mac_match(device_t, const char *);
+void   *mii_phy_mac_softc(struct mii_softc *);
+void   *mii_dev_mac_softc(device_t);
 
 const struct mii_phydesc * mii_phy_match(const struct mii_attach_args *ma,
     const struct mii_phydesc *mpd);
diff --git a/src/libs/compat/freebsd11_network/compat/sys/bus.h 
b/src/libs/compat/freebsd11_network/compat/sys/bus.h
index 4056a83..4ec6188 100644
--- a/src/libs/compat/freebsd11_network/compat/sys/bus.h
+++ b/src/libs/compat/freebsd11_network/compat/sys/bus.h
@@ -95,6 +95,7 @@ void bus_release_resources(device_t dev,
        const struct resource_spec *resourceSpec, struct resource **resources);
 
 int    bus_child_present(device_t child);
+void   bus_enumerate_hinted_children(device_t bus);
 
 static inline struct resource *
 bus_alloc_resource_any(device_t dev, int type, int *rid, uint32 flags)
diff --git a/src/libs/compat/freebsd11_network/compat/sys/haiku-module.h 
b/src/libs/compat/freebsd11_network/compat/sys/haiku-module.h
index 26e07bb..427e071 100644
--- a/src/libs/compat/freebsd11_network/compat/sys/haiku-module.h
+++ b/src/libs/compat/freebsd11_network/compat/sys/haiku-module.h
@@ -13,6 +13,8 @@
 #include <kernel/lock.h>
 #include <net_stack.h>
 
+#undef __unused
+#define __unused
 
 #undef ASSERT
        /* private/kernel/debug.h sets it */
@@ -28,6 +30,21 @@ typedef int device_detach_t(device_t dev);
 typedef int device_resume_t(device_t dev);
 typedef int device_suspend_t(device_t dev);
 
+typedef int bus_child_location_str_t(device_t dev __unused, device_t child,
+       char *buf, size_t buflen);
+typedef int bus_child_pnpinfo_str_t(device_t dev __unused, device_t child,
+       char *buf, size_t buflen);
+typedef void bus_hinted_child_t(device_t dev, const char *name, int unit);
+typedef int bus_print_child_t(device_t dev, device_t child);
+typedef int bus_read_ivar_t(device_t dev, device_t child __unused, int which,
+    uintptr_t *result);
+
+typedef int miibus_readreg_t(device_t dev, int phy, int reg);
+typedef int miibus_writereg_t(device_t dev, int phy, int reg, int data);
+typedef void miibus_statchg_t(device_t dev);
+typedef void miibus_linkchg_t(device_t dev);
+typedef void miibus_mediainit_t(device_t dev);
+
 struct device_method {
        const char *name;
        device_method_signature_t method;
diff --git a/src/libs/compat/freebsd11_network/fbsd_mii.c 
b/src/libs/compat/freebsd11_network/fbsd_mii.c
index f9950af..a6aa36c 100644
--- a/src/libs/compat/freebsd11_network/fbsd_mii.c
+++ b/src/libs/compat/freebsd11_network/fbsd_mii.c
@@ -53,8 +53,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/bus.h>
 
 #include <net/if.h>
+#include <net/if_var.h>
 #include <net/if_media.h>
-#include <net/route.h>
 
 #include <dev/mii/mii.h>
 #include <dev/mii/miivar.h>
@@ -63,18 +63,20 @@ MODULE_VERSION(miibus, 1);
 
 #include "miibus_if.h"
 
-static int miibus_print_child(device_t dev, device_t child);
-static int miibus_read_ivar(device_t dev, device_t child, int which,
-    uintptr_t *result);
-static int miibus_child_location_str(device_t bus, device_t child, char *buf,
-    size_t buflen);
-static int miibus_child_pnpinfo_str(device_t bus, device_t child, char *buf,
-    size_t buflen);
-static int miibus_readreg(device_t, int, int);
-static int miibus_writereg(device_t, int, int, int);
-static void miibus_statchg(device_t);
-static void miibus_linkchg(device_t);
-static void miibus_mediainit(device_t);
+static device_attach_t miibus_attach;
+static bus_child_location_str_t miibus_child_location_str;
+static bus_child_pnpinfo_str_t miibus_child_pnpinfo_str;
+static device_detach_t miibus_detach;
+static bus_hinted_child_t miibus_hinted_child;
+static bus_print_child_t miibus_print_child;
+static device_probe_t miibus_probe;
+static bus_read_ivar_t miibus_read_ivar;
+static miibus_readreg_t miibus_readreg;
+static miibus_statchg_t miibus_statchg;
+static miibus_writereg_t miibus_writereg;
+static miibus_linkchg_t miibus_linkchg;
+static miibus_mediainit_t miibus_mediainit;
+
 static unsigned char mii_bitreverse(unsigned char x);
 
 static device_method_t miibus_methods[] = {
@@ -87,9 +89,9 @@ static device_method_t miibus_methods[] = {
        /* bus interface */
        DEVMETHOD(bus_print_child,      miibus_print_child),
        DEVMETHOD(bus_read_ivar,        miibus_read_ivar),
-       DEVMETHOD(bus_driver_added,     bus_generic_driver_added),
        DEVMETHOD(bus_child_pnpinfo_str, miibus_child_pnpinfo_str),
        DEVMETHOD(bus_child_location_str, miibus_child_location_str),
+       DEVMETHOD(bus_hinted_child,     miibus_hinted_child),
 
        /* MII interface */
        DEVMETHOD(miibus_readreg,       miibus_readreg),
@@ -98,7 +100,7 @@ static device_method_t miibus_methods[] = {
        DEVMETHOD(miibus_linkchg,       miibus_linkchg),
        DEVMETHOD(miibus_mediainit,     miibus_mediainit),
 
-       { 0, 0 }
+       DEVMETHOD_END
 };
 
 devclass_t miibus_devclass;
@@ -110,13 +112,14 @@ driver_t miibus_driver = {
 };
 
 struct miibus_ivars {
-       struct ifnet    *ifp;
+       if_t            ifp;
        ifm_change_cb_t ifmedia_upd;
        ifm_stat_cb_t   ifmedia_sts;
-       int             mii_flags;
+       u_int           mii_flags;
+       u_int           mii_offset;
 };
 
-int
+static int
 miibus_probe(device_t dev)
 {
 
@@ -125,7 +128,7 @@ miibus_probe(device_t dev)
        return (BUS_PROBE_SPECIFIC);
 }
 
-int
+static int
 miibus_attach(device_t dev)
 {
        struct miibus_ivars     *ivars;
@@ -135,7 +138,6 @@ miibus_attach(device_t dev)
        int                     i, nchildren;
 
        mii = device_get_softc(dev);
-       nchildren = 0;
        if (device_get_children(dev, &children, &nchildren) == 0) {
                for (i = 0; i < nchildren; i++) {
                        ma = device_get_ivars(children[i]);
@@ -151,14 +153,14 @@ miibus_attach(device_t dev)
        ifmedia_init(&mii->mii_media, IFM_IMASK, ivars->ifmedia_upd,
            ivars->ifmedia_sts);
        mii->mii_ifp = ivars->ifp;
-       mii->mii_ifp->if_capabilities |= IFCAP_LINKSTATE;
-       mii->mii_ifp->if_capenable |= IFCAP_LINKSTATE;
+       if_setcapabilitiesbit(mii->mii_ifp, IFCAP_LINKSTATE, 0);
+       if_setcapenablebit(mii->mii_ifp, IFCAP_LINKSTATE, 0);
        LIST_INIT(&mii->mii_phys);
 
        return (bus_generic_attach(dev));
 }
 
-int
+static int
 miibus_detach(device_t dev)
 {
        struct mii_data         *mii;
@@ -207,7 +209,7 @@ miibus_read_ivar(device_t dev, device_t child __unused, int 
which,
 }
 
 static int
-miibus_child_pnpinfo_str(device_t bus __unused, device_t child, char *buf,
+miibus_child_pnpinfo_str(device_t dev __unused, device_t child, char *buf,
     size_t buflen)
 {
        struct mii_attach_args *ma;
@@ -220,7 +222,7 @@ miibus_child_pnpinfo_str(device_t bus __unused, device_t 
child, char *buf,
 }
 
 static int
-miibus_child_location_str(device_t bus __unused, device_t child, char *buf,
+miibus_child_location_str(device_t dev __unused, device_t child, char *buf,
     size_t buflen)
 {
        struct mii_attach_args *ma;
@@ -230,6 +232,60 @@ miibus_child_location_str(device_t bus __unused, device_t 
child, char *buf,
        return (0);
 }
 
+static void
+miibus_hinted_child(device_t dev, const char *name, int unit)
+{
+       struct miibus_ivars *ivars;
+       struct mii_attach_args *args, *ma;
+       device_t *children, phy;
+       int i, nchildren;
+       u_int val;
+
+       if (resource_int_value(name, unit, "phyno", &val) != 0)
+               return;
+       if (device_get_children(dev, &children, &nchildren) != 0)
+               return;
+       ma = NULL;
+       for (i = 0; i < nchildren; i++) {
+               args = device_get_ivars(children[i]);
+               if (args->mii_phyno == val) {
+                       ma = args;
+                       break;
+               }
+       }
+       free(children, M_TEMP);
+
+       /*
+        * Don't add a PHY that was automatically identified by having media
+        * in its BMSR twice, only allow to alter its attach arguments.
+        */
+       if (ma == NULL) {
+               ma = malloc(sizeof(struct mii_attach_args), M_DEVBUF,
+                   M_NOWAIT);
+               if (ma == NULL)
+                       return;
+               phy = device_add_child(dev, name, unit);
+               if (phy == NULL) {
+                       free(ma, M_DEVBUF);
+                       return;
+               }
+               ivars = device_get_ivars(dev);
+               ma->mii_phyno = val;
+               ma->mii_offset = ivars->mii_offset++;
+               ma->mii_id1 = 0;
+               ma->mii_id2 = 0;
+               ma->mii_capmask = BMSR_DEFCAPMASK;
+               device_set_ivars(phy, ma);
+       }
+
+       if (resource_int_value(name, unit, "id1", &val) == 0)
+               ma->mii_id1 = val;
+       if (resource_int_value(name, unit, "id2", &val) == 0)
+               ma->mii_id2 = val;
+       if (resource_int_value(name, unit, "capmask", &val) == 0)
+               ma->mii_capmask = val;
+}
+
 static int
 miibus_readreg(device_t dev, int phy, int reg)
 {
@@ -258,7 +314,7 @@ miibus_statchg(device_t dev)
        MIIBUS_STATCHG(parent);
 
        mii = device_get_softc(dev);
-       mii->mii_ifp->if_baudrate = ifmedia_baudrate(mii->mii_media_active);
+       if_setbaudrate(mii->mii_ifp, ifmedia_baudrate(mii->mii_media_active));
 }
 
 static void
@@ -308,14 +364,15 @@ miibus_mediainit(device_t dev)
  * the PHYs to the network interface driver parent.
  */
 int
-mii_attach(device_t dev, device_t *miibus, struct ifnet *ifp,
+mii_attach(device_t dev, device_t *miibus, if_t ifp,
     ifm_change_cb_t ifmedia_upd, ifm_stat_cb_t ifmedia_sts, int capmask,
     int phyloc, int offloc, int flags)
 {
        struct miibus_ivars *ivars;
-       struct mii_attach_args ma, *args;
+       struct mii_attach_args *args, ma;
        device_t *children, phy;
-       int bmsr, first, i, nchildren, offset, phymax, phymin, rv;
+       int bmsr, first, i, nchildren, phymax, phymin, rv;
+       uint32_t phymask;
 
        if (phyloc != MII_PHY_ANY && offloc != MII_OFFSET_ANY) {
                printf("%s: phyloc and offloc specified\n", __func__);
@@ -323,7 +380,7 @@ mii_attach(device_t dev, device_t *miibus, struct ifnet 
*ifp,
        }
 
        if (offloc != MII_OFFSET_ANY && (offloc < 0 || offloc >= MII_NPHY)) {
-               printf("%s: ivalid offloc %d\n", __func__, offloc);
+               printf("%s: invalid offloc %d\n", __func__, offloc);
                return (EINVAL);
        }
 
@@ -332,7 +389,7 @@ mii_attach(device_t dev, device_t *miibus, struct ifnet 
*ifp,
                phymax = MII_NPHY - 1;
        } else {
                if (phyloc < 0 || phyloc >= MII_NPHY) {
-                       printf("%s: ivalid phyloc %d\n", __func__, phyloc);
+                       printf("%s: invalid phyloc %d\n", __func__, phyloc);
                        return (EINVAL);
                }
                phymin = phymax = phyloc;
@@ -372,27 +429,30 @@ mii_attach(device_t dev, device_t *miibus, struct ifnet 
*ifp,
 
        ma.mii_capmask = capmask;
 
-       phy = NULL;
-       offset = 0;
+       if (resource_int_value(device_get_name(*miibus),
+           device_get_unit(*miibus), "phymask", &phymask) != 0)
+               phymask = 0xffffffff;
+
+       if (device_get_children(*miibus, &children, &nchildren) != 0) {
+               children = NULL;
+               nchildren = 0;
+       }
+       ivars->mii_offset = 0;
        for (ma.mii_phyno = phymin; ma.mii_phyno <= phymax; ma.mii_phyno++) {
                /*
                 * Make sure we haven't already configured a PHY at this
                 * address.  This allows mii_attach() to be called
                 * multiple times.
                 */
-               if (device_get_children(*miibus, &children, &nchildren) == 0) {
-                       for (i = 0; i < nchildren; i++) {
-                               args = device_get_ivars(children[i]);
-                               if (args->mii_phyno == ma.mii_phyno) {
-                                       /*
-                                        * Yes, there is already something
-                                        * configured at this address.
-                                        */
-                                       free(children, M_TEMP);
-                                       goto skip;
-                               }
+               for (i = 0; i < nchildren; i++) {
+                       args = device_get_ivars(children[i]);
+                       if (args->mii_phyno == ma.mii_phyno) {
+                               /*
+                                * Yes, there is already something
+                                * configured at this address.
+                                */
+                               goto skip;
                        }
-                       free(children, M_TEMP);
                }
 
                /*
@@ -411,18 +471,24 @@ mii_attach(device_t dev, device_t *miibus, struct ifnet 
*ifp,
                 * There is a PHY at this address.  If we were given an
                 * `offset' locator, skip this PHY if it doesn't match.
                 */
-               if (offloc != MII_OFFSET_ANY && offloc != offset)
+               if (offloc != MII_OFFSET_ANY && offloc != ivars->mii_offset)
+                       goto skip;
+
+               /*
+                * Skip this PHY if it's not included in the phymask hint.
+                */
+               if ((phymask & (1 << ma.mii_phyno)) == 0)
                        goto skip;
 
                /*
-                * Extract the IDs. Braindead PHYs will be handled by
+                * Extract the IDs.  Braindead PHYs will be handled by
                 * the `ukphy' driver, as we have no ID information to
                 * match on.
                 */
                ma.mii_id1 = MIIBUS_READREG(dev, ma.mii_phyno, MII_PHYIDR1);
                ma.mii_id2 = MIIBUS_READREG(dev, ma.mii_phyno, MII_PHYIDR2);
 
-               ma.mii_offset = offset;
+               ma.mii_offset = ivars->mii_offset;
                args = malloc(sizeof(struct mii_attach_args), M_DEVBUF,
                    M_NOWAIT);
                if (args == NULL)
@@ -435,11 +501,20 @@ mii_attach(device_t dev, device_t *miibus, struct ifnet 
*ifp,
                }
                device_set_ivars(phy, args);
  skip:
-               offset++;
+               ivars->mii_offset++;
        }
+       free(children, M_TEMP);
 
        if (first != 0) {
-               if (phy == NULL) {
+               rv = device_set_driver(*miibus, &miibus_driver);
+               if (rv != 0)
+                       goto fail;
+               bus_enumerate_hinted_children(*miibus);
+               rv = device_get_children(*miibus, &children, &nchildren);
+               if (rv != 0)
+                       goto fail;
+               free(children, M_TEMP);
+               if (nchildren == 0) {
                        rv = ENXIO;
                        goto fail;
                }
@@ -543,22 +618,10 @@ mii_pollstat(struct mii_data *mii)
        }
 }
 
-/*
- * Inform the PHYs that the interface is down.
- */
-void
-mii_down(struct mii_data *mii)
-{
-       struct mii_softc *child;
-
-       LIST_FOREACH(child, &mii->mii_phys, mii_list)
-               mii_phy_down(child);
-}
-
 static unsigned char
 mii_bitreverse(unsigned char x)
 {
-       unsigned const char const nibbletab[16] = {
+       static unsigned const char nibbletab[16] = {
                0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15
        };
 
@@ -576,3 +639,33 @@ mii_oui(u_int id1, u_int id2)
            (mii_bitreverse((h >> 8) & 0xff) << 8) |
            mii_bitreverse(h & 0xff));
 }
+
+int
+mii_phy_mac_match(struct mii_softc *mii, const char *name)
+{
+
+       return (strcmp(device_get_name(device_get_parent(mii->mii_dev)),
+           name) == 0);
+}
+
+int
+mii_dev_mac_match(device_t parent, const char *name)
+{
+
+       return (strcmp(device_get_name(device_get_parent(
+           device_get_parent(parent))), name) == 0);
+}
+
+void *
+mii_phy_mac_softc(struct mii_softc *mii)
+{
+
+       return (device_get_softc(device_get_parent(mii->mii_dev)));
+}
+
+void *
+mii_dev_mac_softc(device_t parent)
+{
+
+       return (device_get_softc(device_get_parent(device_get_parent(parent))));
+}
diff --git a/src/libs/compat/freebsd11_network/fbsd_mii_physubr.c 
b/src/libs/compat/freebsd11_network/fbsd_mii_physubr.c
index 4521248..4233159 100644
--- a/src/libs/compat/freebsd11_network/fbsd_mii_physubr.c
+++ b/src/libs/compat/freebsd11_network/fbsd_mii_physubr.c
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mii/mii_physubr.c,v 1.22.2.2 2006/07/29 
08:30:12 oleg Exp $");
+__FBSDID("$FreeBSD$");
 
 /*
  * Subroutines common to all PHYs.
@@ -54,9 +54,28 @@ __FBSDID("$FreeBSD: src/sys/dev/mii/mii_physubr.c,v 1.22.2.2 
2006/07/29 08:30:12
 #include "miibus_if.h"
 
 /*
- * Media to register setting conversion table.  Order matters.
+ *
+ * An array of structures to map MII media types to BMCR/ANAR settings.
  */
-static const struct mii_media mii_media_table[MII_NMEDIA] = {
+enum { 
+       MII_MEDIA_NONE = 0,
+       MII_MEDIA_10_T,
+       MII_MEDIA_10_T_FDX,
+       MII_MEDIA_100_T4,
+       MII_MEDIA_100_TX,
+       MII_MEDIA_100_TX_FDX,
+       MII_MEDIA_1000_X,
+       MII_MEDIA_1000_X_FDX,
+       MII_MEDIA_1000_T,
+       MII_MEDIA_1000_T_FDX,
+       MII_NMEDIA,
+};
+
+static const struct mii_media {
+       u_int   mm_bmcr;                /* BMCR settings for this media */
+       u_int   mm_anar;                /* ANAR settings for this media */
+       u_int   mm_gtcr;                /* 100base-T2 or 1000base-T CR */
+} mii_media_table[MII_NMEDIA] = {
        /* None */
        { BMCR_ISO,             ANAR_CSMA,
          0, },
@@ -104,8 +123,10 @@ mii_phy_setmedia(struct mii_softc *sc)
        struct mii_data *mii = sc->mii_pdata;
        struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmcr, anar, gtcr;
+       int index = -1;
 
-       if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
+       switch (IFM_SUBTYPE(ife->ifm_media)) {
+       case IFM_AUTO:
                /*
                 * Force renegotiation if MIIF_DOPAUSE or MIIF_FORCEANEG.
                 * The former is necessary as we might switch from flow-
@@ -115,19 +136,78 @@ mii_phy_setmedia(struct mii_softc *sc)
                    (sc->mii_flags & (MIIF_DOPAUSE | MIIF_FORCEANEG)) != 0)
                        (void)mii_phy_auto(sc);
                return;
-       }
 
-       /*
-        * Table index is stored in the media entry.
-        */
+       case IFM_NONE:
+               index = MII_MEDIA_NONE;
+               break;
+
+       case IFM_HPNA_1:
+               index = MII_MEDIA_10_T;
+               break;
+
+       case IFM_10_T:
+               switch (IFM_OPTIONS(ife->ifm_media)) {
+               case 0:
+                       index = MII_MEDIA_10_T;
+                       break;
+               case IFM_FDX:
+               case (IFM_FDX | IFM_FLOW):
+                       index = MII_MEDIA_10_T_FDX;
+                       break;
+               }
+               break;
+
+       case IFM_100_TX:
+       case IFM_100_FX:
+               switch (IFM_OPTIONS(ife->ifm_media)) {
+               case 0:
+                       index = MII_MEDIA_100_TX;
+                       break;
+               case IFM_FDX:
+               case (IFM_FDX | IFM_FLOW):
+                       index = MII_MEDIA_100_TX_FDX;
+                       break;
+               }
+               break;
 
-       KASSERT(ife->ifm_data >=0 && ife->ifm_data < MII_NMEDIA,
-           ("invalid ife->ifm_data (0x%x) in mii_phy_setmedia",
-           ife->ifm_data));
+       case IFM_100_T4:
+               index = MII_MEDIA_100_T4;
+               break;
 
-       anar = mii_media_table[ife->ifm_data].mm_anar;
-       bmcr = mii_media_table[ife->ifm_data].mm_bmcr;
-       gtcr = mii_media_table[ife->ifm_data].mm_gtcr;
+       case IFM_1000_SX:
+               switch (IFM_OPTIONS(ife->ifm_media)) {
+               case 0:
+                       index = MII_MEDIA_1000_X;
+                       break;
+               case IFM_FDX:
+               case (IFM_FDX | IFM_FLOW):
+                       index = MII_MEDIA_1000_X_FDX;
+                       break;
+               }
+               break;
+
+       case IFM_1000_T:
+               switch (IFM_OPTIONS(ife->ifm_media)) {
+               case 0:
+               case IFM_ETH_MASTER:
+                       index = MII_MEDIA_1000_T;
+                       break;
+               case IFM_FDX:
+               case (IFM_FDX | IFM_ETH_MASTER):
+               case (IFM_FDX | IFM_FLOW):
+               case (IFM_FDX | IFM_FLOW | IFM_ETH_MASTER):
+                       index = MII_MEDIA_1000_T_FDX;
+                       break;
+               }
+               break;
+       }
+
+       KASSERT(index != -1, ("%s: failed to map media word %d",
+           __func__, ife->ifm_media));
+
+       anar = mii_media_table[index].mm_anar;
+       bmcr = mii_media_table[index].mm_bmcr;
+       gtcr = mii_media_table[index].mm_gtcr;
 
        if (IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T) {
                gtcr |= GTCR_MAN_MS;
@@ -209,13 +289,8 @@ int
 mii_phy_tick(struct mii_softc *sc)
 {
        struct ifmedia_entry *ife = sc->mii_pdata->mii_media.ifm_cur;
-       struct ifnet *ifp = sc->mii_pdata->mii_ifp;
        int reg;
 
-       /* Just bail now if the interface is down. */
-       if ((ifp->if_flags & IFF_UP) == 0)
-               return (EJUSTRETURN);
-
        /*
         * If we're not doing autonegotiation, we don't need to do
         * any extra work here.  However, we need to check the link
@@ -284,12 +359,6 @@ mii_phy_reset(struct mii_softc *sc)
 }
 
 void
-mii_phy_down(struct mii_softc *sc)
-{
-
-}
-
-void
 mii_phy_update(struct mii_softc *sc, int cmd)
 {
        struct mii_data *mii = sc->mii_pdata;
@@ -306,56 +375,6 @@ mii_phy_update(struct mii_softc *sc, int cmd)
 }
 
 /*
- * Given an ifmedia word, return the corresponding ANAR value.
- */
-int
-mii_anar(int media)
-{
-       int rv;
-
-       switch (media & (IFM_TMASK|IFM_NMASK|IFM_FDX)) {
-       case IFM_ETHER|IFM_10_T:
-               rv = ANAR_10|ANAR_CSMA;
-               break;
-       case IFM_ETHER|IFM_10_T|IFM_FDX:
-               rv = ANAR_10_FD|ANAR_CSMA;
-               break;
-       case IFM_ETHER|IFM_100_TX:
-               rv = ANAR_TX|ANAR_CSMA;
-               break;
-       case IFM_ETHER|IFM_100_TX|IFM_FDX:
-               rv = ANAR_TX_FD|ANAR_CSMA;
-               break;
-       case IFM_ETHER|IFM_100_T4:
-               rv = ANAR_T4|ANAR_CSMA;
-               break;
-       default:
-               rv = 0;
-               break;
-       }
-
-       return (rv);
-}
-
-/*
- * Given a BMCR value, return the corresponding ifmedia word.
- */
-int
-mii_media_from_bmcr(int bmcr)
-{
-       int rv = IFM_ETHER;
-
-       if (bmcr & BMCR_S100)
-               rv |= IFM_100_TX;
-       else
-               rv |= IFM_10_T;
-       if (bmcr & BMCR_FDX)
-               rv |= IFM_FDX;
-
-       return (rv);
-}
-
-/*
  * Initialize generic PHY media based on BMSR, called when a PHY is
  * attached.  We expect to be set up to print a comma-separated list
  * of media names.  Does not print a newline.
@@ -367,18 +386,23 @@ mii_phy_add_media(struct mii_softc *sc)
        const char *sep = "";
        int fdx = 0;
 
+       if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0 &&
+           (sc->mii_extcapabilities & EXTSR_MEDIAMASK) == 0) {
+               printf("no media present");
+               return;
+       }
+
        /*
         * Set the autonegotiation timer for 10/100 media.  Gigabit media is
         * handled below.
         */
        sc->mii_anegticks = MII_ANEGTICKS;
 
-#define        ADD(m, c)       ifmedia_add(&mii->mii_media, (m), (c), NULL)
+#define        ADD(m)          ifmedia_add(&mii->mii_media, (m), 0, NULL)
 #define        PRINT(s)        printf("%s%s", sep, s); sep = ", "
 
        if ((sc->mii_flags & MIIF_NOISOLATE) == 0) {
-               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst),
-                   MII_MEDIA_NONE);
+               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst));
                PRINT("none");
        }
 
@@ -390,51 +414,44 @@ mii_phy_add_media(struct mii_softc *sc)
        if ((sc->mii_flags & MIIF_IS_HPNA) != 0) {
                if ((sc->mii_capabilities & BMSR_10THDX) != 0) {
                        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_HPNA_1, 0,
-                           sc->mii_inst), MII_MEDIA_10_T);
+                           sc->mii_inst));
                        PRINT("HomePNA1");
                }
                return;
        }
 
        if ((sc->mii_capabilities & BMSR_10THDX) != 0) {
-               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, sc->mii_inst),
-                   MII_MEDIA_10_T);
+               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, sc->mii_inst));
                PRINT("10baseT");
        }
        if ((sc->mii_capabilities & BMSR_10TFDX) != 0) {
-               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, sc->mii_inst),
-                   MII_MEDIA_10_T_FDX);
+               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, sc->mii_inst));
                PRINT("10baseT-FDX");
                if ((sc->mii_flags & MIIF_DOPAUSE) != 0 &&
                    (sc->mii_flags & MIIF_NOMANPAUSE) == 0) {
                        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T,
-                           IFM_FDX | IFM_FLOW, sc->mii_inst),
-                           MII_MEDIA_10_T_FDX);
+                           IFM_FDX | IFM_FLOW, sc->mii_inst));
                        PRINT("10baseT-FDX-flow");
                }
                fdx = 1;
        }
        if ((sc->mii_capabilities & BMSR_100TXHDX) != 0) {
-               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst),
-                   MII_MEDIA_100_TX);
+               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst));
                PRINT("100baseTX");
        }
        if ((sc->mii_capabilities & BMSR_100TXFDX) != 0) {
-               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, sc->mii_inst),
-                   MII_MEDIA_100_TX_FDX);
+               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, sc->mii_inst));
                PRINT("100baseTX-FDX");
                if ((sc->mii_flags & MIIF_DOPAUSE) != 0 &&
                    (sc->mii_flags & MIIF_NOMANPAUSE) == 0) {
                        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX,
-                           IFM_FDX | IFM_FLOW, sc->mii_inst),
-                           MII_MEDIA_100_TX_FDX);
+                           IFM_FDX | IFM_FLOW, sc->mii_inst));
                        PRINT("100baseTX-FDX-flow");
                }
                fdx = 1;
        }
        if ((sc->mii_capabilities & BMSR_100T4) != 0) {
-               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_T4, 0, sc->mii_inst),
-                   MII_MEDIA_100_T4);
+               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_T4, 0, sc->mii_inst));
                PRINT("100baseT4");
        }
 
@@ -447,20 +464,19 @@ mii_phy_add_media(struct mii_softc *sc)
                        sc->mii_anegticks = MII_ANEGTICKS_GIGE;
                        sc->mii_flags |= MIIF_IS_1000X;
                        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0,
-                           sc->mii_inst), MII_MEDIA_1000_X);
+                           sc->mii_inst));
                        PRINT("1000baseSX");
                }
                if ((sc->mii_extcapabilities & EXTSR_1000XFDX) != 0) {
                        sc->mii_anegticks = MII_ANEGTICKS_GIGE;
                        sc->mii_flags |= MIIF_IS_1000X;
                        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, IFM_FDX,
-                           sc->mii_inst), MII_MEDIA_1000_X_FDX);
+                           sc->mii_inst));
                        PRINT("1000baseSX-FDX");
                        if ((sc->mii_flags & MIIF_DOPAUSE) != 0 &&
                            (sc->mii_flags & MIIF_NOMANPAUSE) == 0) {
                                ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX,
-                                   IFM_FDX | IFM_FLOW, sc->mii_inst),
-                                   MII_MEDIA_1000_X_FDX);
+                                   IFM_FDX | IFM_FLOW, sc->mii_inst));
                                PRINT("1000baseSX-FDX-flow");
                        }
                        fdx = 1;
@@ -476,31 +492,29 @@ mii_phy_add_media(struct mii_softc *sc)
                        sc->mii_anegticks = MII_ANEGTICKS_GIGE;
                        sc->mii_flags |= MIIF_HAVE_GTCR;
                        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, 0,
-                           sc->mii_inst), MII_MEDIA_1000_T);
+                           sc->mii_inst));
                        PRINT("1000baseT");
                        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T,
-                           IFM_ETH_MASTER, sc->mii_inst), MII_MEDIA_1000_T);
+                           IFM_ETH_MASTER, sc->mii_inst));
                        PRINT("1000baseT-master");
                }
                if ((sc->mii_extcapabilities & EXTSR_1000TFDX) != 0) {
                        sc->mii_anegticks = MII_ANEGTICKS_GIGE;
                        sc->mii_flags |= MIIF_HAVE_GTCR;
                        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, IFM_FDX,
-                           sc->mii_inst), MII_MEDIA_1000_T_FDX);
+                           sc->mii_inst));
                        PRINT("1000baseT-FDX");
                        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T,
-                           IFM_FDX | IFM_ETH_MASTER, sc->mii_inst),
-                           MII_MEDIA_1000_T_FDX);
+                           IFM_FDX | IFM_ETH_MASTER, sc->mii_inst));
                        PRINT("1000baseT-FDX-master");
                        if ((sc->mii_flags & MIIF_DOPAUSE) != 0 &&
                            (sc->mii_flags & MIIF_NOMANPAUSE) == 0) {
                                ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T,
-                                   IFM_FDX | IFM_FLOW, sc->mii_inst),
-                                   MII_MEDIA_1000_T_FDX);
+                                   IFM_FDX | IFM_FLOW, sc->mii_inst));
                                PRINT("1000baseT-FDX-flow");
                                ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T,
                                    IFM_FDX | IFM_FLOW | IFM_ETH_MASTER,
-                                   sc->mii_inst), MII_MEDIA_1000_T_FDX);
+                                   sc->mii_inst));
                                PRINT("1000baseT-FDX-flow-master");
                        }
                        fdx = 1;
@@ -509,12 +523,11 @@ mii_phy_add_media(struct mii_softc *sc)
 
        if ((sc->mii_capabilities & BMSR_ANEG) != 0) {
                /* intentionally invalid index */
-               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst),
-                   MII_NMEDIA);
+               ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst));
                PRINT("auto");
                if (fdx != 0 && (sc->mii_flags & MIIF_DOPAUSE) != 0) {
                        ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, IFM_FLOW,
-                           sc->mii_inst), MII_NMEDIA);
+                           sc->mii_inst));
                        PRINT("auto-flow");
                }
        }
@@ -528,7 +541,6 @@ mii_phy_detach(device_t dev)
        struct mii_softc *sc;
 
        sc = device_get_softc(dev);
-       mii_phy_down(sc);
        sc->mii_dev = NULL;
        LIST_REMOVE(sc, mii_list);
        return (0);
diff --git a/src/libs/compat/freebsd11_network/shared.h 
b/src/libs/compat/freebsd11_network/shared.h
index 51cbba8..a21de1c 100644
--- a/src/libs/compat/freebsd11_network/shared.h
+++ b/src/libs/compat/freebsd11_network/shared.h
@@ -43,6 +43,15 @@ struct device {
                void (*miibus_statchg)(device_t);
                void (*miibus_linkchg)(device_t);
                void (*miibus_mediainit)(device_t);
+
+               int (*bus_child_location_str)(device_t dev __unused, device_t 
child,
+                       char *buf, size_t buflen);
+               int (*bus_child_pnpinfo_str)(device_t dev __unused, device_t 
child,
+                       char *buf, size_t buflen);
+               void (*bus_hinted_child)(device_t dev, const char *name, int 
unit);
+               int (*bus_print_child)(device_t dev, device_t child);
+               int (*bus_read_ivar)(device_t dev, device_t child __unused, int 
which,
+                   uintptr_t *result);
        } methods;
 
        struct list_link link;

############################################################################

Revision:    hrev51558
Commit:      7472cf5784b0e6f2a8b7d279a117c638517973a6
URL:         http://cgit.haiku-os.org/haiku/commit/?id=7472cf5784b0
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Sat Nov 18 14:40:06 2017 UTC

rtl8139/rtl81xx: Update with the 11.1 release of re and rl drivers.

* switch compat layer.
* tested on Qemu and RTL8168 rev 10.

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/drivers/network/rtl8139/Jamfile 
b/src/add-ons/kernel/drivers/network/rtl8139/Jamfile
index c6b6b99..4e91dc9 100644
--- a/src/add-ons/kernel/drivers/network/rtl8139/Jamfile
+++ b/src/add-ons/kernel/drivers/network/rtl8139/Jamfile
@@ -1,4 +1,3 @@
 SubDir HAIKU_TOP src add-ons kernel drivers network rtl8139 ;
 
 HaikuSubInclude dev ;
-HaikuSubInclude pci ;
diff --git a/src/add-ons/kernel/drivers/network/rtl8139/dev/Jamfile 
b/src/add-ons/kernel/drivers/network/rtl8139/dev/Jamfile
index e8abe00..3656dc3 100644
--- a/src/add-ons/kernel/drivers/network/rtl8139/dev/Jamfile
+++ b/src/add-ons/kernel/drivers/network/rtl8139/dev/Jamfile
@@ -1,3 +1,4 @@
 SubDir HAIKU_TOP src add-ons kernel drivers network rtl8139 dev ;
 
 HaikuSubInclude mii ;
+HaikuSubInclude rl ;
diff --git a/src/add-ons/kernel/drivers/network/rtl8139/dev/mii/Jamfile 
b/src/add-ons/kernel/drivers/network/rtl8139/dev/mii/Jamfile
index d5cca5f..e31574f 100644
--- a/src/add-ons/kernel/drivers/network/rtl8139/dev/mii/Jamfile
+++ b/src/add-ons/kernel/drivers/network/rtl8139/dev/mii/Jamfile
@@ -1,7 +1,7 @@
 SubDir HAIKU_TOP src add-ons kernel drivers network rtl8139 dev mii ;
 
 UseHeaders [ FDirName $(SUBDIR) .. .. ] : true ;
-UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ]
+UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd11_network compat ]
        : true ;
 
 UsePrivateHeaders net system ;
@@ -15,5 +15,5 @@ KernelStaticLibrary rtl8139_mii.a :
 
 ObjectHdrs [ FGristFiles rlphy$(SUFOBJ) ]
        : [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCH)) 
libs
-               compat freebsd_network ] ;
-Includes [ FGristFiles rlphy.c ] : <src!libs!compat!freebsd_network>miidevs.h ;
+               compat freebsd11_network ] ;
+Includes [ FGristFiles rlphy.c ] : 
<src!libs!compat!freebsd11_network>miidevs.h ;
diff --git a/src/add-ons/kernel/drivers/network/rtl8139/dev/mii/rlphy.c 
b/src/add-ons/kernel/drivers/network/rtl8139/dev/mii/rlphy.c
index 582000c..2afd3e0 100644
--- a/src/add-ons/kernel/drivers/network/rtl8139/dev/mii/rlphy.c
+++ b/src/add-ons/kernel/drivers/network/rtl8139/dev/mii/rlphy.c
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/module.h>
 #include <sys/socket.h>
 #include <sys/bus.h>
+#include <sys/taskqueue.h>     /* XXXGL: if_rlreg.h contamination */
 
 #include <net/if.h>
 #include <net/if_arp.h>
@@ -53,7 +54,7 @@ __FBSDID("$FreeBSD$");
 #include "miidevs.h"
 
 #include <machine/bus.h>
-#include <pci/if_rlreg.h>
+#include <dev/rl/if_rlreg.h>
 
 #include "miibus_if.h"
 
@@ -107,7 +108,6 @@ static const struct mii_phy_funcs rlphy_funcs = {
 static int
 rlphy_probe(device_t dev)
 {
-       const char *nic;
        int rv;
 
        rv = mii_phy_dev_probe(dev, rlphys, BUS_PROBE_DEFAULT);
@@ -117,10 +117,9 @@ rlphy_probe(device_t dev)
 #else
        if (rv <= 0)
                return (rv);
-#endif         
+#endif
 
-       nic = device_get_name(device_get_parent(device_get_parent(dev)));
-       if (strcmp(nic, "rl") == 0 || strcmp(nic, "re") == 0)
+       if (mii_dev_mac_match(dev, "rl") || mii_dev_mac_match(dev, "re"))
                return (mii_phy_dev_probe(dev, rlintphys, BUS_PROBE_DEFAULT));
        return (ENXIO);
 }
@@ -146,23 +145,11 @@ rlphy_service(struct mii_softc *sc, struct mii_data *mii, 
int cmd)
                break;
 
        case MII_MEDIACHG:
-               /*
-                * If the interface is not up, don't do anything.
-                */
-               if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
-                       break;
-
                mii_phy_setmedia(sc);
                break;
 
        case MII_TICK:
                /*
-                * Is the interface even up?
-                */
-               if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
-                       return (0);
-
-               /*
                 * The RealTek PHY's autonegotiation doesn't need to be
                 * kicked; it continues in the background.
                 */
diff --git a/src/add-ons/kernel/drivers/network/rtl8139/dev/rl/Jamfile 
b/src/add-ons/kernel/drivers/network/rtl8139/dev/rl/Jamfile
new file mode 100644
index 0000000..afda7a0
--- /dev/null
+++ b/src/add-ons/kernel/drivers/network/rtl8139/dev/rl/Jamfile
@@ -0,0 +1,16 @@
+SubDir HAIKU_TOP src add-ons kernel drivers network rtl8139 dev rl ;
+
+UseHeaders [ FDirName $(SUBDIR) .. .. ] : true ;
+UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd11_network compat ] 
: true ;
+
+UsePrivateHeaders net system ;
+UsePrivateKernelHeaders ;
+
+SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] ;
+
+KernelAddon rtl8139 :
+       if_rl.c
+       glue.c
+       : rtl8139_mii.a libfreebsd11_network.a
+       ;
+
diff --git a/src/add-ons/kernel/drivers/network/rtl8139/pci/glue.c 
b/src/add-ons/kernel/drivers/network/rtl8139/dev/rl/glue.c
similarity index 96%
rename from src/add-ons/kernel/drivers/network/rtl8139/pci/glue.c
rename to src/add-ons/kernel/drivers/network/rtl8139/dev/rl/glue.c
index 97cc47e..53f4dba 100644
--- a/src/add-ons/kernel/drivers/network/rtl8139/pci/glue.c
+++ b/src/add-ons/kernel/drivers/network/rtl8139/dev/rl/glue.c
@@ -5,7 +5,7 @@
 
 #include <machine/bus.h>
 
-#include <pci/if_rlreg.h>
+#include <dev/rl/if_rlreg.h>
 
 HAIKU_FBSD_DRIVER_GLUE(rtl8139, rl, pci);
 HAIKU_FBSD_MII_DRIVER(rlphy);
diff --git a/src/add-ons/kernel/drivers/network/rtl8139/pci/if_rl.c 
b/src/add-ons/kernel/drivers/network/rtl8139/dev/rl/if_rl.c
similarity index 98%
rename from src/add-ons/kernel/drivers/network/rtl8139/pci/if_rl.c
rename to src/add-ons/kernel/drivers/network/rtl8139/dev/rl/if_rl.c
index 8cd6a91..356da24 100644
--- a/src/add-ons/kernel/drivers/network/rtl8139/pci/if_rl.c
+++ b/src/add-ons/kernel/drivers/network/rtl8139/dev/rl/if_rl.c
@@ -99,6 +99,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/sysctl.h>
 
 #include <net/if.h>
+#include <net/if_var.h>
 #include <net/if_arp.h>
 #include <net/ethernet.h>
 #include <net/if_dl.h>
@@ -126,12 +127,12 @@ MODULE_DEPEND(rl, miibus, 1, 1, 1);
 /* "device miibus" required.  See GENERIC if you get errors here. */
 #include "miibus_if.h"
 
-#include <pci/if_rlreg.h>
+#include <dev/rl/if_rlreg.h>
 
 /*
  * Various supported device vendors/types and their names.
  */
-static const struct rl_type const rl_devs[] = {
+static const struct rl_type rl_devs[] = {
        { RT_VENDORID, RT_DEVICEID_8129, RL_8129,
                "RealTek 8129 10/100BaseTX" },
        { RT_VENDORID, RT_DEVICEID_8139, RL_8139,
@@ -148,6 +149,8 @@ static const struct rl_type const rl_devs[] = {
                "Delta Electronics 8139 10/100BaseTX" },
        { ADDTRON_VENDORID, ADDTRON_DEVICEID_8139, RL_8139,
                "Addtron Technology 8139 10/100BaseTX" },
+       { DLINK_VENDORID, DLINK_DEVICEID_520TX_REVC1, RL_8139,
+               "D-Link DFE-520TX (rev. C1) 10/100BaseTX" },
        { DLINK_VENDORID, DLINK_DEVICEID_530TXPLUS, RL_8139,
                "D-Link DFE-530TX+ 10/100BaseTX" },
        { DLINK_VENDORID, DLINK_DEVICEID_690TXD, RL_8139,
@@ -595,7 +598,7 @@ rl_probe(device_t dev)
                }
        }
        t = rl_devs;
-       for (i = 0; i < sizeof(rl_devs) / sizeof(rl_devs[0]); i++, t++) {
+       for (i = 0; i < nitems(rl_devs); i++, t++) {
                if (vendor == t->rl_vid && devid == t->rl_did) {
                        device_set_desc(dev, t->rl_name);
                        return (BUS_PROBE_DEFAULT);
@@ -1015,17 +1018,16 @@ rl_dma_free(struct rl_softc *sc)
 
        /* Rx memory block. */
        if (sc->rl_cdata.rl_rx_tag != NULL) {
-               if (sc->rl_cdata.rl_rx_dmamap != NULL)
+               if (sc->rl_cdata.rl_rx_buf_paddr != 0)
                        bus_dmamap_unload(sc->rl_cdata.rl_rx_tag,
                            sc->rl_cdata.rl_rx_dmamap);
-               if (sc->rl_cdata.rl_rx_dmamap != NULL &&
-                   sc->rl_cdata.rl_rx_buf_ptr != NULL)
+               if (sc->rl_cdata.rl_rx_buf_ptr != NULL)
                        bus_dmamem_free(sc->rl_cdata.rl_rx_tag,
                            sc->rl_cdata.rl_rx_buf_ptr,
                            sc->rl_cdata.rl_rx_dmamap);
                sc->rl_cdata.rl_rx_buf_ptr = NULL;
                sc->rl_cdata.rl_rx_buf = NULL;
-               sc->rl_cdata.rl_rx_dmamap = NULL;
+               sc->rl_cdata.rl_rx_buf_paddr = 0;
                bus_dma_tag_destroy(sc->rl_cdata.rl_rx_tag);
                sc->rl_cdata.rl_tx_tag = NULL;
        }
@@ -1164,7 +1166,7 @@ rl_rxeof(struct rl_softc *sc)
                if (!(rxstat & RL_RXSTAT_RXOK) ||
                    total_len < ETHER_MIN_LEN ||
                    total_len > ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN) {
-                       ifp->if_ierrors++;
+                       if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
                        ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
                        rl_init_locked(sc);
                        return (rx_npkts);
@@ -1213,11 +1215,11 @@ rl_rxeof(struct rl_softc *sc)
                CSR_WRITE_2(sc, RL_CURRXADDR, cur_rx - 16);
 
                if (m == NULL) {
-                       ifp->if_iqdrops++;
+                       if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
                        continue;
                }
 
-               ifp->if_ipackets++;
+               if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
                RL_UNLOCK(sc);
                (*ifp->if_input)(ifp, m);
                RL_LOCK(sc);
@@ -1252,7 +1254,7 @@ rl_txeof(struct rl_softc *sc)
                    RL_TXSTAT_TX_UNDERRUN|RL_TXSTAT_TXABRT)))
                        break;
 
-               ifp->if_collisions += (txstat & RL_TXSTAT_COLLCNT) >> 24;
+               if_inc_counter(ifp, IFCOUNTER_COLLISIONS, (txstat & 
RL_TXSTAT_COLLCNT) >> 24);
 
                bus_dmamap_sync(sc->rl_cdata.rl_tx_tag, RL_LAST_DMAMAP(sc),
                    BUS_DMASYNC_POSTWRITE);
@@ -1268,10 +1270,10 @@ rl_txeof(struct rl_softc *sc)
                    (sc->rl_txthresh < 2016))
                        sc->rl_txthresh += 32;
                if (txstat & RL_TXSTAT_TX_OK)
-                       ifp->if_opackets++;
+                       if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
                else {
                        int                     oldthresh;
-                       ifp->if_oerrors++;
+                       if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
                        if ((txstat & RL_TXSTAT_TXABRT) ||
                            (txstat & RL_TXSTAT_OUTOFWIN))
                                CSR_WRITE_4(sc, RL_TXCFG, RL_TXCFG_CONFIG);
@@ -1565,7 +1567,7 @@ rl_encap(struct rl_softc *sc, struct mbuf **m_head)
         */
        if (m->m_next != NULL || (mtod(m, uintptr_t) & 3) != 0 ||
            (padlen > 0 && M_TRAILINGSPACE(m) < padlen)) {
-               m = m_defrag(*m_head, M_DONTWAIT);
+               m = m_defrag(*m_head, M_NOWAIT);
                if (m == NULL) {
                        m_freem(*m_head);
                        *m_head = NULL;
@@ -1895,7 +1897,7 @@ rl_watchdog(struct rl_softc *sc)
                return;
 
        device_printf(sc->rl_dev, "watchdog timeout\n");
-       sc->rl_ifp->if_oerrors++;
+       if_inc_counter(sc->rl_ifp, IFCOUNTER_OERRORS, 1);
 
        rl_txeof(sc);
        rl_rxeof(sc);
@@ -1936,15 +1938,13 @@ rl_stop(struct rl_softc *sc)
         */
        for (i = 0; i < RL_TX_LIST_CNT; i++) {
                if (sc->rl_cdata.rl_tx_chain[i] != NULL) {
-                       if (sc->rl_cdata.rl_tx_chain[i] != NULL) {
-                               bus_dmamap_sync(sc->rl_cdata.rl_tx_tag,
-                                   sc->rl_cdata.rl_tx_dmamap[i],
-                                   BUS_DMASYNC_POSTWRITE);
-                               bus_dmamap_unload(sc->rl_cdata.rl_tx_tag,
-                                   sc->rl_cdata.rl_tx_dmamap[i]);
-                               m_freem(sc->rl_cdata.rl_tx_chain[i]);
-                               sc->rl_cdata.rl_tx_chain[i] = NULL;
-                       }
+                       bus_dmamap_sync(sc->rl_cdata.rl_tx_tag,
+                           sc->rl_cdata.rl_tx_dmamap[i],
+                           BUS_DMASYNC_POSTWRITE);
+                       bus_dmamap_unload(sc->rl_cdata.rl_tx_tag,
+                           sc->rl_cdata.rl_tx_dmamap[i]);
+                       m_freem(sc->rl_cdata.rl_tx_chain[i]);
+                       sc->rl_cdata.rl_tx_chain[i] = NULL;
                        CSR_WRITE_4(sc, RL_TXADDR0 + (i * sizeof(uint32_t)),
                            0x0000000);
                }
diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/pci/if_rlreg.h 
b/src/add-ons/kernel/drivers/network/rtl8139/dev/rl/if_rlreg.h
similarity index 98%
rename from src/add-ons/kernel/drivers/network/rtl81xx/pci/if_rlreg.h
rename to src/add-ons/kernel/drivers/network/rtl8139/dev/rl/if_rlreg.h
index 13a111a..2fa44ef 100644
--- a/src/add-ons/kernel/drivers/network/rtl81xx/pci/if_rlreg.h
+++ b/src/add-ons/kernel/drivers/network/rtl8139/dev/rl/if_rlreg.h
@@ -145,6 +145,7 @@
 #define        RL_PMCH                 0x006F  /* 8 bits */
 #define        RL_MAXRXPKTLEN          0x00DA  /* 16 bits, chip multiplies by 
8 */
 #define        RL_INTRMOD              0x00E2  /* 16 bits */
+#define        RL_MISC                 0x00F0
 
 /*
  * TX config register bits
@@ -163,7 +164,6 @@
 #define        RL_LOOPTEST_ON_CPLUS    0x00060000
 
 /* Known revision codes. */
-
 #define        RL_HWREV_8169           0x00000000
 #define        RL_HWREV_8169S          0x00800000
 #define        RL_HWREV_8110S          0x04000000
@@ -195,6 +195,7 @@
 #define        RL_HWREV_8168G          0x4C000000
 #define        RL_HWREV_8168EP         0x50000000
 #define        RL_HWREV_8168GU         0x50800000
+#define        RL_HWREV_8168H          0x54000000
 #define        RL_HWREV_8411B          0x5C800000
 #define        RL_HWREV_8139           0x60000000
 #define        RL_HWREV_8139A          0x70000000
@@ -287,8 +288,10 @@
 #define        RL_RXCFG_RX_RUNT        0x00000010
 #define        RL_RXCFG_RX_ERRPKT      0x00000020
 #define        RL_RXCFG_WRAP           0x00000080
+#define        RL_RXCFG_EARLYOFFV2     0x00000800
 #define        RL_RXCFG_MAXDMA         0x00000700
 #define        RL_RXCFG_BUFSZ          0x00001800
+#define        RL_RXCFG_EARLYOFF       0x00003800
 #define        RL_RXCFG_FIFOTHRESH     0x0000E000
 #define        RL_RXCFG_EARLYTHRESH    0x07000000
 
@@ -329,8 +332,8 @@
 #define        RL_RXSTAT_INDIV         0x00004000
 #define        RL_RXSTAT_MULTI         0x00008000
 #define        RL_RXSTAT_LENMASK       0xFFFF0000
+#define        RL_RXSTAT_UNFINISHED    0x0000FFF0      /* DMA still in 
progress */
 
-#define        RL_RXSTAT_UNFINISHED    0xFFF0          /* DMA still in 
progress */
 /*
  * Command register.
  */
@@ -361,6 +364,7 @@
 #define        RL_PARA7C               0x7C
 #define        RL_PARA7C_DEF           0xcb38de43
 #define        RL_PARA7C_RETUNE        0xfb38de03
+
 /*
  * EEPROM control register
  */
@@ -473,11 +477,9 @@
  */
 
 /* RL_DUMPSTATS_LO register */
-
 #define        RL_DUMPSTATS_START      0x00000008
 
 /* Transmit start register */
-
 #define        RL_TXSTART_SWI          0x01    /* generate TX interrupt */
 #define        RL_TXSTART_START        0x40    /* start normal queue transmit 
*/
 #define        RL_TXSTART_HPRIO_START  0x80    /* start hi prio queue transmit 
*/
@@ -496,7 +498,6 @@
 #define        RL_BUSWIDTH_64BITS      0x08
 
 /* C+ mode command register */
-
 #define        RL_CPLUSCMD_TXENB       0x0001  /* enable C+ transmit mode */
 #define        RL_CPLUSCMD_RXENB       0x0002  /* enable C+ receive mode */
 #define        RL_CPLUSCMD_PCI_MRW     0x0008  /* enable PCI multi-read/write 
*/
@@ -514,7 +515,6 @@
 #define        RL_CPLUSCMD_BIST_ENB    0x8000  /* 8168C/CP */
 
 /* C+ early transmit threshold */
-
 #define        RL_EARLYTXTHRESH_CNT    0x003F  /* byte count times 8 */
 
 /* Timer interrupt register */
@@ -528,7 +528,6 @@
 /*
  * Gigabit PHY access register (8169 only)
  */
-
 #define        RL_PHYAR_PHYDATA        0x0000FFFF
 #define        RL_PHYAR_PHYREG         0x001F0000
 #define        RL_PHYAR_BUSY           0x80000000
@@ -559,7 +558,6 @@
  * For reception, there's just one large buffer where the chip stores
  * all received packets.
  */
-
 #define        RL_RX_BUF_SZ            RL_RXBUF_64
 #define        RL_RXBUFLEN             (1 << ((RL_RX_BUF_SZ >> 11) + 13))
 #define        RL_TX_LIST_CNT          4
@@ -642,11 +640,10 @@ struct rl_hwrev {
 
 /*
  * RX/TX descriptor definition. When large send mode is enabled, the
- * lower 11 bits of the TX rl_cmd word are used to hold the MSS, and
+ * lower 11 bits of the TX rl_cmdstat word are used to hold the MSS, and
  * the checksum offload bits are disabled. The structure layout is
  * the same for RX and TX descriptors
  */
-
 struct rl_desc {
        uint32_t                rl_cmdstat;
        uint32_t                rl_vlanctl;
@@ -679,19 +676,17 @@ struct rl_desc {
  * Error bits are valid only on the last descriptor of a frame
  * (i.e. RL_TDESC_CMD_EOF == 1)
  */
-
 #define        RL_TDESC_STAT_COLCNT    0x000F0000      /* collision count */
 #define        RL_TDESC_STAT_EXCESSCOL 0x00100000      /* excessive collisions 
*/
 #define        RL_TDESC_STAT_LINKFAIL  0x00200000      /* link faulure */
 #define        RL_TDESC_STAT_OWINCOL   0x00400000      /* out-of-window 
collision */
 #define        RL_TDESC_STAT_TXERRSUM  0x00800000      /* transmit error 
summary */
-#define        RL_TDESC_STAT_UNDERRUN  0x02000000      /* TX underrun occured 
*/
+#define        RL_TDESC_STAT_UNDERRUN  0x02000000      /* TX underrun occurred 
*/
 #define        RL_TDESC_STAT_OWN       0x80000000
 
 /*
  * RX descriptor cmd/vlan definitions
  */
-
 #define        RL_RDESC_CMD_EOR        0x40000000
 #define        RL_RDESC_CMD_OWN        0x80000000
 #define        RL_RDESC_CMD_BUFLEN     0x00001FFF
@@ -782,7 +777,7 @@ struct rl_stats {
 #define        RL_TX_DESC_CNT          RL_8169_TX_DESC_CNT
 #define        RL_RX_DESC_CNT          RL_8169_RX_DESC_CNT
 #define        RL_RX_JUMBO_DESC_CNT    RL_RX_DESC_CNT
-#define        RL_NTXSEGS              32
+#define        RL_NTXSEGS              35
 
 #define        RL_RING_ALIGN           256
 #define        RL_DUMP_ALIGN           64
@@ -935,6 +930,8 @@ struct rl_softc {
 #define        RL_FLAG_WAIT_TXPOLL     0x00004000
 #define        RL_FLAG_CMDSTOP_WAIT_TXQ        0x00008000
 #define        RL_FLAG_WOL_MANLINK     0x00010000
+#define        RL_FLAG_EARLYOFF        0x00020000
+#define        RL_FLAG_8168G_PLUS      0x00040000
 #define        RL_FLAG_PCIE            0x40000000
 #define        RL_FLAG_LINK            0x80000000
 };
@@ -1161,3 +1158,8 @@ struct rl_softc {
 /* US Robotics 997902 device ID */
 
 #define        USR_DEVICEID_997902     0x0116
+
+/* 
+ * NCube vendor ID
+ */
+#define        NCUBE_VENDORID          0x10FF
diff --git a/src/add-ons/kernel/drivers/network/rtl8139/pci/Jamfile 
b/src/add-ons/kernel/drivers/network/rtl8139/pci/Jamfile
deleted file mode 100644
index a02c639..0000000
--- a/src/add-ons/kernel/drivers/network/rtl8139/pci/Jamfile
+++ /dev/null
@@ -1,16 +0,0 @@
-SubDir HAIKU_TOP src add-ons kernel drivers network rtl8139 pci ;
-
-UseHeaders [ FDirName $(SUBDIR) .. ] : true ;
-UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ] : 
true ;
-
-UsePrivateHeaders net system ;
-UsePrivateKernelHeaders ;
-
-SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] ;
-
-KernelAddon rtl8139 :
-       if_rl.c
-       glue.c
-       : libfreebsd_network.a rtl8139_mii.a
-       ;
-
diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/Jamfile 
b/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/Jamfile
index 831c716..1051b13 100644
--- a/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/Jamfile
+++ b/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/Jamfile
@@ -1,7 +1,7 @@
 SubDir HAIKU_TOP src add-ons kernel drivers network rtl81xx dev mii ;
 
 UseHeaders [ FDirName $(SUBDIR) $(DOTDOT) $(DOTDOT) ] : true ;
-UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ]
+UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd11_network compat ]
        : true ;
 
 UsePrivateHeaders net system ;
@@ -19,6 +19,6 @@ SEARCH on [ FGristFiles rlphy.c ] = [ FDirName $(HAIKU_TOP) 
src add-ons kernel
 
 ObjectHdrs [ FGristFiles rgephy$(SUFOBJ) rlphy$(SUFOBJ) ]
        : [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCH)) 
libs
-               compat freebsd_network ] ;
+               compat freebsd11_network ] ;
 Includes [ FGristFiles rgephy.c rlphy.c ]
-       : <src!libs!compat!freebsd_network>miidevs.h ;
+       : <src!libs!compat!freebsd11_network>miidevs.h ;
diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/rgephy.c 
b/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/rgephy.c
index 8345f1f..bb60fa9 100644
--- a/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/rgephy.c
+++ b/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/rgephy.c
@@ -42,9 +42,11 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/module.h>
 #include <sys/socket.h>
+#include <sys/taskqueue.h>
 #include <sys/bus.h>
 
 #include <net/if.h>
+#include <net/if_var.h>
 #include <net/if_arp.h>
 #include <net/if_media.h>
 
@@ -57,7 +59,7 @@ __FBSDID("$FreeBSD$");
 #include "miibus_if.h"
 
 #include <machine/bus.h>
-#include <pci/if_rlreg.h>
+#include <dev/rl/if_rlreg.h>
 
 static int rgephy_probe(device_t);
 static int rgephy_attach(device_t);
@@ -85,8 +87,10 @@ static int   rgephy_service(struct mii_softc *, struct 
mii_data *, int);
 static void    rgephy_status(struct mii_softc *);
 static int     rgephy_mii_phy_auto(struct mii_softc *, int);
 static void    rgephy_reset(struct mii_softc *);
+static int     rgephy_linkup(struct mii_softc *);
 static void    rgephy_loop(struct mii_softc *);
 static void    rgephy_load_dspcode(struct mii_softc *);
+static void    rgephy_disable_eee(struct mii_softc *);
 
 static const struct mii_phydesc rgephys[] = {
        MII_PHY_DESC(REALTEK, RTL8169S),
@@ -111,13 +115,11 @@ static int
 rgephy_attach(device_t dev)
 {
        struct mii_softc *sc;
-       struct mii_attach_args *ma;
        u_int flags;
 
        sc = device_get_softc(dev);
-       ma = device_get_ivars(dev);
        flags = 0;
-       if (strcmp(ma->mii_data->mii_ifp->if_dname, "re") == 0)
+       if (mii_dev_mac_match(dev, "re"))
                flags |= MIIF_PHYPRIV0;
        mii_phy_dev_attach(dev, flags, &rgephy_funcs, 0);
 
@@ -147,19 +149,13 @@ static int
 rgephy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
        struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
-       int reg, speed, gig, anar;
+       int speed, gig, anar;
 
        switch (cmd) {
        case MII_POLLSTAT:
                break;
 
        case MII_MEDIACHG:
-               /*
-                * If the interface is not up, don't do anything.
-                */
-               if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
-                       break;
-
                PHY_RESET(sc);  /* XXX hardware bug work-around */
 
                anar = PHY_READ(sc, RGEPHY_MII_ANAR);
@@ -232,12 +228,6 @@ setit:
 
        case MII_TICK:
                /*
-                * Is the interface even up?
-                */
-               if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
-                       return (0);
-
-               /*
                 * Only used for autonegotiation.
                 */
                if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) {
@@ -249,20 +239,9 @@ setit:
                 * Check to see if we have link.  If we do, we don't
                 * need to restart the autonegotiation process.
                 */
-               if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 &&
-                   sc->mii_mpd_rev >= 2) {
-                       /* RTL8211B(L) */
-                       reg = PHY_READ(sc, RGEPHY_MII_SSR);
-                       if (reg & RGEPHY_SSR_LINK) {
-                               sc->mii_ticks = 0;
-                               break;
-                       }
-               } else {
-                       reg = PHY_READ(sc, RL_GMEDIASTAT);
-                       if (reg & RL_GMEDIASTAT_LINK) {
-                               sc->mii_ticks = 0;
-                               break;
-                       }
+               if (rgephy_linkup(sc) != 0) {
+                       sc->mii_ticks = 0;
+                       break;
                }
 
                /* Announce link loss right after it happens. */
@@ -295,6 +274,33 @@ setit:
        return (0);
 }
 
+static int
+rgephy_linkup(struct mii_softc *sc)
+{
+       int linkup;
+       uint16_t reg;
+
+       linkup = 0;
+       if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 &&
+           sc->mii_mpd_rev >= RGEPHY_8211B) {
+               if (sc->mii_mpd_rev == RGEPHY_8211F) {
+                       reg = PHY_READ(sc, RGEPHY_F_MII_SSR);
+                       if (reg & RGEPHY_F_SSR_LINK)
+                               linkup++;
+               } else {
+                       reg = PHY_READ(sc, RGEPHY_MII_SSR);
+                       if (reg & RGEPHY_SSR_LINK)
+                               linkup++;
+               }
+       } else {
+               reg = PHY_READ(sc, RL_GMEDIASTAT);
+               if (reg & RL_GMEDIASTAT_LINK)
+                       linkup++;
+       }
+
+       return (linkup);
+}
+
 static void
 rgephy_status(struct mii_softc *sc)
 {
@@ -305,18 +311,10 @@ rgephy_status(struct mii_softc *sc)
        mii->mii_media_status = IFM_AVALID;
        mii->mii_media_active = IFM_ETHER;
 
-       if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 && sc->mii_mpd_rev >= 2) {
-               ssr = PHY_READ(sc, RGEPHY_MII_SSR);
-               if (ssr & RGEPHY_SSR_LINK)
-                       mii->mii_media_status |= IFM_ACTIVE;
-       } else {
-               bmsr = PHY_READ(sc, RL_GMEDIASTAT);
-               if (bmsr & RL_GMEDIASTAT_LINK)
-                       mii->mii_media_status |= IFM_ACTIVE;
-       }
+       if (rgephy_linkup(sc) != 0)
+               mii->mii_media_status |= IFM_ACTIVE;
 
        bmsr = PHY_READ(sc, RGEPHY_MII_BMSR);
-
        bmcr = PHY_READ(sc, RGEPHY_MII_BMCR);
        if (bmcr & RGEPHY_BMCR_ISO) {
                mii->mii_media_active |= IFM_NONE;
@@ -335,26 +333,50 @@ rgephy_status(struct mii_softc *sc)
                }
        }
 
-       if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 && sc->mii_mpd_rev >= 2) {
-               ssr = PHY_READ(sc, RGEPHY_MII_SSR);
-               switch (ssr & RGEPHY_SSR_SPD_MASK) {
-               case RGEPHY_SSR_S1000:
-                       mii->mii_media_active |= IFM_1000_T;
-                       break;
-               case RGEPHY_SSR_S100:
-                       mii->mii_media_active |= IFM_100_TX;
-                       break;
-               case RGEPHY_SSR_S10:
-                       mii->mii_media_active |= IFM_10_T;
-                       break;
-               default:
-                       mii->mii_media_active |= IFM_NONE;
-                       break;
+       if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 &&
+           sc->mii_mpd_rev >= RGEPHY_8211B) {
+               if (sc->mii_mpd_rev == RGEPHY_8211F) {
+                       ssr = PHY_READ(sc, RGEPHY_F_MII_SSR);
+                       switch (ssr & RGEPHY_F_SSR_SPD_MASK) {
+                       case RGEPHY_F_SSR_S1000:
+                               mii->mii_media_active |= IFM_1000_T;
+                               break;
+                       case RGEPHY_F_SSR_S100:
+                               mii->mii_media_active |= IFM_100_TX;
+                               break;
+                       case RGEPHY_F_SSR_S10:
+                               mii->mii_media_active |= IFM_10_T;
+                               break;
+                       default:
+                               mii->mii_media_active |= IFM_NONE;
+                               break;
+                       }
+                       if (ssr & RGEPHY_F_SSR_FDX)
+                               mii->mii_media_active |= IFM_FDX;
+                       else
+                               mii->mii_media_active |= IFM_HDX;
+
+               } else {
+                       ssr = PHY_READ(sc, RGEPHY_MII_SSR);
+                       switch (ssr & RGEPHY_SSR_SPD_MASK) {
+                       case RGEPHY_SSR_S1000:
+                               mii->mii_media_active |= IFM_1000_T;
+                               break;
+                       case RGEPHY_SSR_S100:
+                               mii->mii_media_active |= IFM_100_TX;
+                               break;
+                       case RGEPHY_SSR_S10:
+                               mii->mii_media_active |= IFM_10_T;
+                               break;
+                       default:
+                               mii->mii_media_active |= IFM_NONE;
+                               break;
+                       }
+                       if (ssr & RGEPHY_SSR_FDX)
+                               mii->mii_media_active |= IFM_FDX;
+                       else
+                               mii->mii_media_active |= IFM_HDX;
                }
-               if (ssr & RGEPHY_SSR_FDX)
-                       mii->mii_media_active |= IFM_FDX;
-               else
-                       mii->mii_media_active |= IFM_HDX;
        } else {
                bmsr = PHY_READ(sc, RL_GMEDIASTAT);
                if (bmsr & RL_GMEDIASTAT_1000MBPS)
@@ -408,7 +430,7 @@ rgephy_loop(struct mii_softc *sc)
        int i;
 
        if (sc->mii_mpd_model != MII_MODEL_REALTEK_RTL8251 &&
-           sc->mii_mpd_rev < 2) {
+           sc->mii_mpd_rev < RGEPHY_8211B) {
                PHY_WRITE(sc, RGEPHY_MII_BMCR, RGEPHY_BMCR_PDOWN);
                DELAY(1000);
        }
@@ -442,7 +464,7 @@ rgephy_load_dspcode(struct mii_softc *sc)
        int val;
 
        if (sc->mii_mpd_model == MII_MODEL_REALTEK_RTL8251 ||
-           sc->mii_mpd_rev >= 2)
+           sc->mii_mpd_rev >= RGEPHY_8211B)
                return;
 
        PHY_WRITE(sc, 31, 0x0001);
@@ -493,25 +515,62 @@ rgephy_reset(struct mii_softc *sc)
 {
        uint16_t pcr, ssr;
 
-       if ((sc->mii_flags & MIIF_PHYPRIV0) == 0 && sc->mii_mpd_rev == 3) {
-               /* RTL8211C(L) */
-               ssr = PHY_READ(sc, RGEPHY_MII_SSR);
-               if ((ssr & RGEPHY_SSR_ALDPS) != 0) {
-                       ssr &= ~RGEPHY_SSR_ALDPS;
-                       PHY_WRITE(sc, RGEPHY_MII_SSR, ssr);
+       switch (sc->mii_mpd_rev) {
+       case RGEPHY_8211F:
+               pcr = PHY_READ(sc, RGEPHY_F_MII_PCR1);
+               pcr &= ~(RGEPHY_F_PCR1_MDI_MM | RGEPHY_F_PCR1_ALDPS_EN);
+               PHY_WRITE(sc, RGEPHY_F_MII_PCR1, pcr);
+               rgephy_disable_eee(sc);
+               break;
+       case RGEPHY_8211C:
+               if ((sc->mii_flags & MIIF_PHYPRIV0) == 0) {
+                       /* RTL8211C(L) */
+                       ssr = PHY_READ(sc, RGEPHY_MII_SSR);
+                       if ((ssr & RGEPHY_SSR_ALDPS) != 0) {
+                               ssr &= ~RGEPHY_SSR_ALDPS;
+                               PHY_WRITE(sc, RGEPHY_MII_SSR, ssr);
+                       }
                }
-       }
-
-       if (sc->mii_mpd_rev >= 2) {
-               pcr = PHY_READ(sc, RGEPHY_MII_PCR);
-               if ((pcr & RGEPHY_PCR_MDIX_AUTO) == 0) {
-                       pcr &= ~RGEPHY_PCR_MDI_MASK;
-                       pcr |= RGEPHY_PCR_MDIX_AUTO;
-                       PHY_WRITE(sc, RGEPHY_MII_PCR, pcr);
+               /* FALLTHROUGH */
+       default:
+               if (sc->mii_mpd_rev >= RGEPHY_8211B) {
+                       pcr = PHY_READ(sc, RGEPHY_MII_PCR);
+                       if ((pcr & RGEPHY_PCR_MDIX_AUTO) == 0) {
+                               pcr &= ~RGEPHY_PCR_MDI_MASK;
+                               pcr |= RGEPHY_PCR_MDIX_AUTO;
+                               PHY_WRITE(sc, RGEPHY_MII_PCR, pcr);
+                       }
                }
+               break;
        }
 
        mii_phy_reset(sc);
        DELAY(1000);
        rgephy_load_dspcode(sc);
 }
+
+static void
+rgephy_disable_eee(struct mii_softc *sc)
+{
+       uint16_t anar;
+
+       PHY_WRITE(sc, RGEPHY_F_EPAGSR, 0x0000);
+       PHY_WRITE(sc, MII_MMDACR, MMDACR_FN_ADDRESS |
+           (MMDACR_DADDRMASK & RGEPHY_F_MMD_DEV_7));
+       PHY_WRITE(sc, MII_MMDAADR, RGEPHY_F_MMD_EEEAR);
+       PHY_WRITE(sc, MII_MMDACR, MMDACR_FN_DATANPI |
+           (MMDACR_DADDRMASK & RGEPHY_F_MMD_DEV_7));
+       PHY_WRITE(sc, MII_MMDAADR, 0x0000);
+       PHY_WRITE(sc, MII_MMDACR, 0x0000);
+       /*
+        * XXX
+        * Restart auto-negotiation to take changes effect.
+        * This may result in link establishment.
+        */
+       anar = BMSR_MEDIA_TO_ANAR(sc->mii_capabilities) | ANAR_CSMA;
+       PHY_WRITE(sc, RGEPHY_MII_ANAR, anar);
+       PHY_WRITE(sc, RGEPHY_MII_1000CTL, RGEPHY_1000CTL_AHD |
+           RGEPHY_1000CTL_AFD);
+       PHY_WRITE(sc, RGEPHY_MII_BMCR, RGEPHY_BMCR_RESET |
+           RGEPHY_BMCR_AUTOEN | RGEPHY_BMCR_STARTNEG);
+}
diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/rgephyreg.h 
b/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/rgephyreg.h
index fb02ae6..7c24a1f 100644
--- a/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/rgephyreg.h
+++ b/src/add-ons/kernel/drivers/network/rtl81xx/dev/mii/rgephyreg.h
@@ -35,6 +35,10 @@
 #ifndef _DEV_MII_RGEPHYREG_H_
 #define        _DEV_MII_RGEPHYREG_H_
 
+#define        RGEPHY_8211B            2
+#define        RGEPHY_8211C            3
+#define        RGEPHY_8211F            6
+
 /*
  * RealTek 8169S/8110S gigE PHY registers
  */
@@ -162,4 +166,37 @@
 #define        RGEPHY_SSR_ALDPS        0x0008  /* RTL8211C(L) only */
 #define        RGEPHY_SSR_JABBER       0x0001  /* Jabber */
 
+/* RTL8211F */
+#define        RGEPHY_F_MII_PCR1       0x18    /* PHY Specific control 
register 1 */
+#define        RGEPHY_F_PCR1_MDI_MM    0x0200  /* MDI / MDIX Manual Mode */
+#define        RGEPHY_F_PCR1_MDI_MODE  0x0100  /* MDI Mode (0=MDIX,1=MDI) */
+#define        RGEPHY_F_PCR1_ALDPS_EN  0x0004  /* Link Down Power Saving 
Enable */
+
+/* RTL8211F */
+#define        RGEPHY_F_MII_SSR        0x1A    /* PHY Specific status register 
*/
+#define        RGEPHY_F_SSR_S1000      0x0020  /* 1000Mbps */
+#define        RGEPHY_F_SSR_S100       0x0010  /* 100Mbps */
+#define        RGEPHY_F_SSR_S10        0x0000  /* 10Mbps */
+#define        RGEPHY_F_SSR_SPD_MASK   0x0030
+#define        RGEPHY_F_SSR_FDX        0x0008  /* full duplex */
+#define        RGEPHY_F_SSR_LINK       0x0004  /* link up */
+#define        RGEPHY_F_SSR_MDI        0x0002  /* MDI/MDIX */
+#define        RGEPHY_F_SSR_JABBER     0x0001  /* Jabber */
+
+/* RTL8211F */
+#define        RGEPHY_F_EPAGSR         0x1F    /* Extension page select 
register */
+
+/* RTL8211F */
+#define        RGEPHY_F_MMD_DEV_7      0x07
+
+/* RTL8211F MMD device 7 */
+#define        RGEPHY_F_MMD_EEEAR      0x3C    /* EEE advertisement */
+#define        EEEAR_1000T             0x0004  /* adv. 1000baseT EEE */
+#define        EEEAR_100TX             0x0002  /* adv. 100baseTX EEE */
+
+/* RTL8211F MMD device 7 */
+#define        RGEPHY_F_MMD_EEELPAR    0x3D    /* EEE link partner abilities */
+#define        EEELPAR_1000T           0x0004  /* link partner 1000baseT EEE 
capable */
+#define        EEELPAR_100TX           0x0002  /* link partner 100baseTX EEE 
capable */
+
 #endif /* _DEV_RGEPHY_MIIREG_H_ */
diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/Jamfile 
b/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/Jamfile
index 37e6592..a946fd7 100644
--- a/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/Jamfile
+++ b/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/Jamfile
@@ -1,7 +1,7 @@
 SubDir HAIKU_TOP src add-ons kernel drivers network rtl81xx dev re ;
 
 UseHeaders [ FDirName $(SUBDIR) $(DOTDOT) $(DOTDOT) ] : true ;
-UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd_network compat ] : 
true ;
+UseHeaders [ FDirName $(HAIKU_TOP) src libs compat freebsd11_network compat ] 
: true ;
 
 UsePrivateHeaders net system ;
 UsePrivateKernelHeaders ;
@@ -11,5 +11,5 @@ SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] ;
 KernelAddon rtl81xx :
        if_re.c
        glue.c
-       : libfreebsd_network.a rtl81xx_mii.a
+       : rtl81xx_mii.a libfreebsd11_network.a
 ;
diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/glue.c 
b/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/glue.c
index 33f1797..db52139 100644
--- a/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/glue.c
+++ b/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/glue.c
@@ -11,7 +11,7 @@
 
 #include <machine/bus.h>
 
-#include <pci/if_rlreg.h>
+#include <dev/rl/if_rlreg.h>
 
 
 extern driver_t *DRIVER_MODULE_NAME(rgephy, miibus);
diff --git a/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/if_re.c 
b/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/if_re.c
index 99a5438..071b55b 100644
--- a/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/if_re.c
+++ b/src/add-ons/kernel/drivers/network/rtl81xx/dev/re/if_re.c
@@ -127,6 +127,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/taskqueue.h>
 
 #include <net/if.h>
+#include <net/if_var.h>
 #include <net/if_arp.h>
 #include <net/ethernet.h>
 #include <net/if_dl.h>
@@ -147,7 +148,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
-#include <pci/if_rlreg.h>
+#include <dev/rl/if_rlreg.h>
 
 MODULE_DEPEND(re, pci, 1, 1, 1);
 MODULE_DEPEND(re, ether, 1, 1, 1);
@@ -182,6 +183,8 @@ static const struct rl_type re_devs[] = {
            "RealTek 810xE PCIe 10/100baseTX" },
        { RT_VENDORID, RT_DEVICEID_8168, 0,
            "RealTek 8168/8111 B/C/CP/D/DP/E/F/G PCIe Gigabit Ethernet" },
+       { NCUBE_VENDORID, RT_DEVICEID_8168, 0,
+           "TP-Link TG-3468 v2 (RTL8168) Gigabit Ethernet" },
        { RT_VENDORID, RT_DEVICEID_8169, 0,
            "RealTek 8169/8169S/8169SB(L)/8110S/8110SB(L) Gigabit Ethernet" },
        { RT_VENDORID, RT_DEVICEID_8169SC, 0,
@@ -237,6 +240,7 @@ static const struct rl_hwrev re_hwrevs[] = {
        { RL_HWREV_8168F, RL_8169, "8168F/8111F", RL_JUMBO_MTU_9K},
        { RL_HWREV_8168G, RL_8169, "8168G/8111G", RL_JUMBO_MTU_9K},
        { RL_HWREV_8168GU, RL_8169, "8168GU/8111GU", RL_JUMBO_MTU_9K},
+       { RL_HWREV_8168H, RL_8169, "8168H/8111H", RL_JUMBO_MTU_9K},
        { RL_HWREV_8411, RL_8169, "8411", RL_JUMBO_MTU_9K},
        { RL_HWREV_8411B, RL_8169, "8411B", RL_JUMBO_MTU_9K},
        { 0, 0, NULL, 0 }
@@ -303,6 +307,7 @@ static void re_set_linkspeed        (struct rl_softc *);
 
 #ifdef DEV_NETMAP      /* see ixgbe.c for details */
 #include <dev/netmap/if_re_netmap.h>
+MODULE_DEPEND(re, netmap, 1, 1, 1);
 #endif /* !DEV_NETMAP */
 
 #ifdef RE_DIAG
@@ -633,9 +638,8 @@ re_miibus_statchg(device_t dev)
                }
        }
        /*
-        * RealTek controllers does not provide any interface to
-        * Tx/Rx MACs for resolved speed, duplex and flow-control
-        * parameters.
+        * RealTek controllers do not provide any interface to the RX/TX
+        * MACs for resolved speed, duplex and flow-control parameters.
         */
 }
 
@@ -655,6 +659,10 @@ re_set_rxmode(struct rl_softc *sc)
        ifp = sc->rl_ifp;
 
        rxfilt = RL_RXCFG_CONFIG | RL_RXCFG_RX_INDIV | RL_RXCFG_RX_BROAD;
+       if ((sc->rl_flags & RL_FLAG_EARLYOFF) != 0)
+               rxfilt |= RL_RXCFG_EARLYOFF;
+       else if ((sc->rl_flags & RL_FLAG_8168G_PLUS) != 0)
+               rxfilt |= RL_RXCFG_EARLYOFFV2;
 
        if (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) {
                if (ifp->if_flags & IFF_PROMISC)
@@ -698,6 +706,12 @@ re_set_rxmode(struct rl_softc *sc)
                rxfilt |= RL_RXCFG_RX_MULTI;
        }
 
+       if  (sc->rl_hwrev->rl_rev == RL_HWREV_8168F) {
+               /* Disable multicast filtering due to silicon bug. */
+               hashes[0] = 0xffffffff;
+               hashes[1] = 0xffffffff;
+       }
+
 done:
        CSR_WRITE_4(sc, RL_MAR0, hashes[0]);
        CSR_WRITE_4(sc, RL_MAR4, hashes[1]);
@@ -941,7 +955,7 @@ re_probe(device_t dev)
        }
 
        t = re_devs;
-       for (i = 0; i < sizeof(re_devs) / sizeof(re_devs[0]); i++, t++) {
+       for (i = 0; i < nitems(re_devs); i++, t++) {
                if (vendor == t->rl_vid && devid == t->rl_did) {
                        device_set_desc(dev, t->rl_name);
                        return (BUS_PROBE_DEFAULT);
@@ -1194,11 +1208,10 @@ re_attach(device_t dev)
        struct rl_softc         *sc;
        struct ifnet            *ifp;
        const struct rl_hwrev   *hw_rev;
+       int                     capmask, error = 0, hwrev, i, msic, msixc,
+                               phy, reg, rid;
        u_int32_t               cap, ctl;
-       int                     hwrev;
        u_int16_t               devid, re_did = 0;
-       int                     error = 0, i, phy, rid;
-       int                     msic, msixc, reg;
        uint8_t                 cfg;
 
        sc = device_get_softc(dev);
@@ -1264,7 +1277,7 @@ re_attach(device_t dev)
                msic = 0;
        /* Prefer MSI-X to MSI. */
        if (msixc > 0) {
-               msixc = 1;
+               msixc = RL_MSI_MESSAGES;
                rid = PCIR_BAR(4);
                sc->rl_res_pba = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
                    &rid, RF_ACTIVE);
@@ -1274,7 +1287,7 @@ re_attach(device_t dev)
                }
                if (sc->rl_res_pba != NULL &&
                    pci_alloc_msix(dev, &msixc) == 0) {
-                       if (msixc == 1) {
+                       if (msixc == RL_MSI_MESSAGES) {
                                device_printf(dev, "Using %d MSI-X message\n",
                                    msixc);
                                sc->rl_flags |= RL_FLAG_MSIX;
@@ -1291,7 +1304,7 @@ re_attach(device_t dev)
        }
        /* Prefer MSI to INTx. */
        if (msixc == 0 && msic > 0) {
-               msic = 1;
+               msic = RL_MSI_MESSAGES;
                if (pci_alloc_msi(dev, &msic) == 0) {
                        if (msic == RL_MSI_MESSAGES) {
                                device_printf(dev, "Using %d MSI message\n",
@@ -1462,26 +1475,36 @@ re_attach(device_t dev)
                    RL_FLAG_WOL_MANLINK;
                break;
        case RL_HWREV_8168E_VL:
-       case RL_HWREV_8168EP:
        case RL_HWREV_8168F:
-       case RL_HWREV_8168G:
+               sc->rl_flags |= RL_FLAG_EARLYOFF;
+               /* FALLTHROUGH */
        case RL_HWREV_8411:
-       case RL_HWREV_8411B:
                sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR |
                    RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP |
                    RL_FLAG_AUTOPAD | RL_FLAG_JUMBOV2 |
                    RL_FLAG_CMDSTOP_WAIT_TXQ | RL_FLAG_WOL_MANLINK;
                break;
+       case RL_HWREV_8168EP:
+       case RL_HWREV_8168G:
+       case RL_HWREV_8411B:
+               sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR |
+                   RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP |
+                   RL_FLAG_AUTOPAD | RL_FLAG_JUMBOV2 |
+                   RL_FLAG_CMDSTOP_WAIT_TXQ | RL_FLAG_WOL_MANLINK |
+                   RL_FLAG_8168G_PLUS;
+               break;
        case RL_HWREV_8168GU:
+       case RL_HWREV_8168H:
                if (pci_get_device(dev) == RT_DEVICEID_8101E) {
-                       /* RTL8106EUS */
+                       /* RTL8106E(US), RTL8107E */
                        sc->rl_flags |= RL_FLAG_FASTETHER;
                } else
                        sc->rl_flags |= RL_FLAG_JUMBOV2 | RL_FLAG_WOL_MANLINK;
 
                sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR |
                    RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP |
-                   RL_FLAG_AUTOPAD | RL_FLAG_CMDSTOP_WAIT_TXQ;
+                   RL_FLAG_AUTOPAD | RL_FLAG_CMDSTOP_WAIT_TXQ |
+                   RL_FLAG_8168G_PLUS;
                break;
        case RL_HWREV_8169_8110SB:
        case RL_HWREV_8169_8110SBL:
@@ -1605,16 +1628,18 @@ re_attach(device_t dev)
        ifp->if_start = re_start;
        /*
         * RTL8168/8111C generates wrong IP checksummed frame if the
-        * packet has IP options so disable TX IP checksum offloading.
+        * packet has IP options so disable TX checksum offloading.
         */
        if (sc->rl_hwrev->rl_rev == RL_HWREV_8168C ||
            sc->rl_hwrev->rl_rev == RL_HWREV_8168C_SPIN2 ||
-           sc->rl_hwrev->rl_rev == RL_HWREV_8168CP)
-               ifp->if_hwassist = CSUM_TCP | CSUM_UDP;
-       else
+           sc->rl_hwrev->rl_rev == RL_HWREV_8168CP) {
+               ifp->if_hwassist = 0;
+               ifp->if_capabilities = IFCAP_RXCSUM | IFCAP_TSO4;
+       } else {
                ifp->if_hwassist = CSUM_IP | CSUM_TCP | CSUM_UDP;
+               ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_TSO4;
+       }
        ifp->if_hwassist |= CSUM_TSO;
-       ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_TSO4;
        ifp->if_capenable = ifp->if_capabilities;
        ifp->if_init = re_init;
        IFQ_SET_MAXLEN(&ifp->if_snd, RL_IFQ_MAXLEN);
@@ -1629,8 +1654,11 @@ re_attach(device_t dev)
        phy = RE_PHYAD_INTERNAL;
        if (sc->rl_type == RL_8169)
                phy = 1;
+       capmask = BMSR_DEFCAPMASK;
+       if ((sc->rl_flags & RL_FLAG_FASTETHER) != 0)
+                capmask &= ~BMSR_EXTSTAT;
        error = mii_attach(dev, &sc->rl_miibus, ifp, re_ifmedia_upd,
-           re_ifmedia_sts, BMSR_DEFCAPMASK, phy, MII_OFFSET_ANY, MIIF_DOPAUSE);
+           re_ifmedia_sts, capmask, phy, MII_OFFSET_ANY, MIIF_DOPAUSE);
        if (error != 0) {
                device_printf(dev, "attaching PHYs failed\n");
                goto fail;
@@ -1665,18 +1693,18 @@ re_attach(device_t dev)
         * Must appear after the call to ether_ifattach() because
         * ether_ifattach() sets ifi_hdrlen to the default value.
         */
-       ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
+       ifp->if_hdrlen = sizeof(struct ether_vlan_header);
 
 #ifdef DEV_NETMAP
        re_netmap_attach(sc);
 #endif /* DEV_NETMAP */
+
 #ifdef RE_DIAG
        /*
         * Perform hardware diagnostic on the original RTL8169.
         * Some 32-bit cards were incorrectly wired and would
         * malfunction if plugged into a 64-bit slot.
         */
-
        if (hwrev == RL_HWREV_8169) {
                error = re_diag(sc);
                if (error) {
@@ -1708,7 +1736,6 @@ re_attach(device_t dev)
        }
 
 fail:
-
        if (error)
                re_detach(dev);
 
@@ -1802,10 +1829,10 @@ re_detach(device_t dev)
        /* Unload and free the RX DMA ring memory and map */
 
        if (sc->rl_ldata.rl_rx_list_tag) {
-               if (sc->rl_ldata.rl_rx_list_map)
+               if (sc->rl_ldata.rl_rx_list_addr)
                        bus_dmamap_unload(sc->rl_ldata.rl_rx_list_tag,
                            sc->rl_ldata.rl_rx_list_map);
-               if (sc->rl_ldata.rl_rx_list_map && sc->rl_ldata.rl_rx_list)
+               if (sc->rl_ldata.rl_rx_list)
                        bus_dmamem_free(sc->rl_ldata.rl_rx_list_tag,
                            sc->rl_ldata.rl_rx_list,
                            sc->rl_ldata.rl_rx_list_map);
@@ -1815,10 +1842,10 @@ re_detach(device_t dev)
        /* Unload and free the TX DMA ring memory and map */
 
        if (sc->rl_ldata.rl_tx_list_tag) {
-               if (sc->rl_ldata.rl_tx_list_map)
+               if (sc->rl_ldata.rl_tx_list_addr)
                        bus_dmamap_unload(sc->rl_ldata.rl_tx_list_tag,
                            sc->rl_ldata.rl_tx_list_map);
-               if (sc->rl_ldata.rl_tx_list_map && sc->rl_ldata.rl_tx_list)
+               if (sc->rl_ldata.rl_tx_list)
                        bus_dmamem_free(sc->rl_ldata.rl_tx_list_tag,
                            sc->rl_ldata.rl_tx_list,
                            sc->rl_ldata.rl_tx_list_map);
@@ -1860,10 +1887,10 @@ re_detach(device_t dev)
        /* Unload and free the stats buffer and map */
 
        if (sc->rl_ldata.rl_stag) {
-               if (sc->rl_ldata.rl_smap)
+               if (sc->rl_ldata.rl_stats_addr)
                        bus_dmamap_unload(sc->rl_ldata.rl_stag,
                            sc->rl_ldata.rl_smap);
-               if (sc->rl_ldata.rl_smap && sc->rl_ldata.rl_stats)
+               if (sc->rl_ldata.rl_stats)
                        bus_dmamem_free(sc->rl_ldata.rl_stag,
                            sc->rl_ldata.rl_stats, sc->rl_ldata.rl_smap);
                bus_dma_tag_destroy(sc->rl_ldata.rl_stag);
@@ -2133,8 +2160,7 @@ re_rxeof(struct rl_softc *sc, int *rx_npktsp)
 
        ifp = sc->rl_ifp;
 #ifdef DEV_NETMAP
-       if (netmap_rx_irq(ifp, 0 | (NETMAP_LOCKED_ENTER|NETMAP_LOCKED_EXIT),
-           &rx_npkts))
+       if (netmap_rx_irq(ifp, 0, &rx_npkts))
                return 0;
 #endif /* DEV_NETMAP */
        if (ifp->if_mtu > RL_MTU && (sc->rl_flags & RL_FLAG_JUMBOV2) != 0)
@@ -2226,7 +2252,7 @@ re_rxeof(struct rl_softc *sc, int *rx_npktsp)
                            (rxstat & RL_RDESC_STAT_ERRS) == 
RL_RDESC_STAT_GIANT)
                                rxerr = 0;
                        if (rxerr != 0) {
-                               ifp->if_ierrors++;
+                               if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
                                /*
                                 * If this is part of a multi-fragment packet,
                                 * discard all the pieces.
@@ -2249,7 +2275,7 @@ re_rxeof(struct rl_softc *sc, int *rx_npktsp)
                else
                        rxerr = re_newbuf(sc, i);
                if (rxerr != 0) {
-                       ifp->if_iqdrops++;
+                       if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
                        if (sc->rl_head != NULL) {
                                m_freem(sc->rl_head);
                                sc->rl_head = sc->rl_tail = NULL;
@@ -2291,7 +2317,7 @@ re_rxeof(struct rl_softc *sc, int *rx_npktsp)
 #ifdef RE_FIXUP_RX
                re_fixup_rx(m);
 #endif
-               ifp->if_ipackets++;
+               if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
                m->m_pkthdr.rcvif = ifp;
 
                /* Do RX checksumming if enabled */
@@ -2379,7 +2405,7 @@ re_txeof(struct rl_softc *sc)
 
        ifp = sc->rl_ifp;
 #ifdef DEV_NETMAP
-       if (netmap_tx_irq(ifp, 0 | (NETMAP_LOCKED_ENTER|NETMAP_LOCKED_EXIT)))
+       if (netmap_tx_irq(ifp, 0))
                return;
 #endif /* DEV_NETMAP */
        /* Invalidate the TX descriptor list */
@@ -2410,11 +2436,11 @@ re_txeof(struct rl_softc *sc)
                        txd->tx_m = NULL;
                        if (txstat & (RL_TDESC_STAT_EXCESSCOL|
                            RL_TDESC_STAT_COLCNT))
-                               ifp->if_collisions++;
+                               if_inc_counter(ifp, IFCOUNTER_COLLISIONS, 1);
                        if (txstat & RL_TDESC_STAT_TXERRSUM)
-                               ifp->if_oerrors++;
+                               if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
                        else
-                               ifp->if_opackets++;
+                               if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
                }
                sc->rl_ldata.rl_tx_free++;
                ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
@@ -2529,7 +2555,7 @@ re_intr(void *arg)
                 return (FILTER_STRAY);
        CSR_WRITE_2(sc, RL_IMR, 0);
 
-       taskqueue_enqueue_fast(taskqueue_fast, &sc->rl_inttask);
+       taskqueue_enqueue(taskqueue_fast, &sc->rl_inttask);
 
        return (FILTER_HANDLED);
 }
@@ -2597,7 +2623,7 @@ re_int_task(void *arg, int npending)
        RL_UNLOCK(sc);
 
         if ((CSR_READ_2(sc, RL_ISR) & RL_INTRS_CPLUS) || rval) {
-               taskqueue_enqueue_fast(taskqueue_fast, &sc->rl_inttask);
+               taskqueue_enqueue(taskqueue_fast, &sc->rl_inttask);
                return;
        }
 
@@ -2915,6 +2941,7 @@ re_start_locked(struct ifnet *ifp)
                return;

[ *** diff truncated: 313 lines dropped *** ]



Other related posts:

  • » [haiku-commits] haiku: hrev51558 - in src: add-ons/kernel/drivers/network/rtl8139/dev/rl add-ons/kernel/drivers/network/rtl8139/pci add-ons/kernel/drivers/network/rtl81xx/dev/rl add-ons/kernel/drivers/network/rtl81xx/pci libs/compat/freebsd11_network - jerome . duval