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 *** ]