syskonnect: sync with FreeBSD 11.1.
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
SubDir HAIKU_TOP src add-ons kernel drivers network syskonnect dev mii ;
|
SubDir HAIKU_TOP src add-ons kernel drivers network syskonnect dev mii ;
|
||||||
|
|
||||||
UseHeaders [ FDirName $(SUBDIR) .. .. ] : true ;
|
UseHeaders [ FDirName $(SUBDIR) .. .. ] : 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 ;
|
UsePrivateHeaders net system ;
|
||||||
UsePrivateKernelHeaders ;
|
UsePrivateKernelHeaders ;
|
||||||
@@ -18,6 +18,7 @@ KernelStaticLibrary syskonnect_mii.a
|
|||||||
|
|
||||||
ObjectHdrs [ FGristFiles e1000phy$(SUFOBJ) ukphy$(SUFOBJ) xmphy$(SUFOBJ) ]
|
ObjectHdrs [ FGristFiles e1000phy$(SUFOBJ) ukphy$(SUFOBJ) xmphy$(SUFOBJ) ]
|
||||||
: [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCH)) libs
|
: [ FDirName $(TARGET_COMMON_DEBUG_OBJECT_DIR_$(TARGET_PACKAGING_ARCH)) libs
|
||||||
compat freebsd_network ] ;
|
compat freebsd11_network ] ;
|
||||||
Includes [ FGristFiles e1000phy.c ukphy.c xmphy.c ] : <src!libs!compat!freebsd_network>miidevs.h ;
|
Includes [ FGristFiles e1000phy.c ukphy.c xmphy.c ]
|
||||||
|
: <src!libs!compat!freebsd11_network>miidevs.h ;
|
||||||
|
|
||||||
|
|||||||
@@ -50,8 +50,8 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/bus.h>
|
#include <sys/bus.h>
|
||||||
|
|
||||||
|
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
|
#include <net/if_var.h>
|
||||||
#include <net/if_media.h>
|
#include <net/if_media.h>
|
||||||
|
|
||||||
#include <dev/mii/mii.h>
|
#include <dev/mii/mii.h>
|
||||||
@@ -106,7 +106,9 @@ static const struct mii_phydesc e1000phys[] = {
|
|||||||
MII_PHY_DESC(xxMARVELL, E1111),
|
MII_PHY_DESC(xxMARVELL, E1111),
|
||||||
MII_PHY_DESC(xxMARVELL, E1116),
|
MII_PHY_DESC(xxMARVELL, E1116),
|
||||||
MII_PHY_DESC(xxMARVELL, E1116R),
|
MII_PHY_DESC(xxMARVELL, E1116R),
|
||||||
|
MII_PHY_DESC(xxMARVELL, E1116R_29),
|
||||||
MII_PHY_DESC(xxMARVELL, E1118),
|
MII_PHY_DESC(xxMARVELL, E1118),
|
||||||
|
MII_PHY_DESC(xxMARVELL, E1145),
|
||||||
MII_PHY_DESC(xxMARVELL, E1149R),
|
MII_PHY_DESC(xxMARVELL, E1149R),
|
||||||
MII_PHY_DESC(xxMARVELL, E3016),
|
MII_PHY_DESC(xxMARVELL, E3016),
|
||||||
MII_PHY_DESC(xxMARVELL, PHYG65G),
|
MII_PHY_DESC(xxMARVELL, PHYG65G),
|
||||||
@@ -130,14 +132,12 @@ static int
|
|||||||
e1000phy_attach(device_t dev)
|
e1000phy_attach(device_t dev)
|
||||||
{
|
{
|
||||||
struct mii_softc *sc;
|
struct mii_softc *sc;
|
||||||
struct ifnet *ifp;
|
|
||||||
|
|
||||||
sc = device_get_softc(dev);
|
sc = device_get_softc(dev);
|
||||||
|
|
||||||
mii_phy_dev_attach(dev, MIIF_NOMANPAUSE, &e1000phy_funcs, 0);
|
mii_phy_dev_attach(dev, MIIF_NOMANPAUSE, &e1000phy_funcs, 0);
|
||||||
|
|
||||||
ifp = sc->mii_pdata->mii_ifp;
|
if (mii_dev_mac_match(dev, "msk") &&
|
||||||
if (strcmp(ifp->if_dname, "msk") == 0 &&
|
|
||||||
(sc->mii_flags & MIIF_MACPRIV0) != 0)
|
(sc->mii_flags & MIIF_MACPRIV0) != 0)
|
||||||
sc->mii_flags |= MIIF_PHYPRIV0;
|
sc->mii_flags |= MIIF_PHYPRIV0;
|
||||||
|
|
||||||
@@ -167,8 +167,12 @@ e1000phy_attach(device_t dev)
|
|||||||
PHY_RESET(sc);
|
PHY_RESET(sc);
|
||||||
|
|
||||||
sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & sc->mii_capmask;
|
sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & sc->mii_capmask;
|
||||||
if (sc->mii_capabilities & BMSR_EXTSTAT)
|
if (sc->mii_capabilities & BMSR_EXTSTAT) {
|
||||||
sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR);
|
sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR);
|
||||||
|
if ((sc->mii_extcapabilities &
|
||||||
|
(EXTSR_1000TFDX | EXTSR_1000THDX)) != 0)
|
||||||
|
sc->mii_flags |= MIIF_HAVE_GTCR;
|
||||||
|
}
|
||||||
device_printf(dev, " ");
|
device_printf(dev, " ");
|
||||||
mii_phy_add_media(sc);
|
mii_phy_add_media(sc);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
@@ -208,6 +212,7 @@ e1000phy_reset(struct mii_softc *sc)
|
|||||||
case MII_MODEL_xxMARVELL_E1111:
|
case MII_MODEL_xxMARVELL_E1111:
|
||||||
case MII_MODEL_xxMARVELL_E1112:
|
case MII_MODEL_xxMARVELL_E1112:
|
||||||
case MII_MODEL_xxMARVELL_E1116:
|
case MII_MODEL_xxMARVELL_E1116:
|
||||||
|
case MII_MODEL_xxMARVELL_E1116R_29:
|
||||||
case MII_MODEL_xxMARVELL_E1118:
|
case MII_MODEL_xxMARVELL_E1118:
|
||||||
case MII_MODEL_xxMARVELL_E1149:
|
case MII_MODEL_xxMARVELL_E1149:
|
||||||
case MII_MODEL_xxMARVELL_E1149R:
|
case MII_MODEL_xxMARVELL_E1149R:
|
||||||
@@ -215,7 +220,8 @@ e1000phy_reset(struct mii_softc *sc)
|
|||||||
/* Disable energy detect mode. */
|
/* Disable energy detect mode. */
|
||||||
reg &= ~E1000_SCR_EN_DETECT_MASK;
|
reg &= ~E1000_SCR_EN_DETECT_MASK;
|
||||||
reg |= E1000_SCR_AUTO_X_MODE;
|
reg |= E1000_SCR_AUTO_X_MODE;
|
||||||
if (sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1116)
|
if (sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1116 ||
|
||||||
|
sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1116R_29)
|
||||||
reg &= ~E1000_SCR_POWER_DOWN;
|
reg &= ~E1000_SCR_POWER_DOWN;
|
||||||
reg |= E1000_SCR_ASSERT_CRS_ON_TX;
|
reg |= E1000_SCR_ASSERT_CRS_ON_TX;
|
||||||
break;
|
break;
|
||||||
@@ -243,6 +249,7 @@ e1000phy_reset(struct mii_softc *sc)
|
|||||||
PHY_WRITE(sc, E1000_SCR, reg);
|
PHY_WRITE(sc, E1000_SCR, reg);
|
||||||
|
|
||||||
if (sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1116 ||
|
if (sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1116 ||
|
||||||
|
sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1116R_29 ||
|
||||||
sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1149 ||
|
sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1149 ||
|
||||||
sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1149R) {
|
sc->mii_mpd_model == MII_MODEL_xxMARVELL_E1149R) {
|
||||||
PHY_WRITE(sc, E1000_EADR, 2);
|
PHY_WRITE(sc, E1000_EADR, 2);
|
||||||
@@ -259,6 +266,7 @@ e1000phy_reset(struct mii_softc *sc)
|
|||||||
case MII_MODEL_xxMARVELL_E1118:
|
case MII_MODEL_xxMARVELL_E1118:
|
||||||
break;
|
break;
|
||||||
case MII_MODEL_xxMARVELL_E1116:
|
case MII_MODEL_xxMARVELL_E1116:
|
||||||
|
case MII_MODEL_xxMARVELL_E1116R_29:
|
||||||
page = PHY_READ(sc, E1000_EADR);
|
page = PHY_READ(sc, E1000_EADR);
|
||||||
/* Select page 3, LED control register. */
|
/* Select page 3, LED control register. */
|
||||||
PHY_WRITE(sc, E1000_EADR, 3);
|
PHY_WRITE(sc, E1000_EADR, 3);
|
||||||
@@ -305,12 +313,6 @@ e1000phy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MII_MEDIACHG:
|
case MII_MEDIACHG:
|
||||||
/*
|
|
||||||
* If the interface is not up, don't do anything.
|
|
||||||
*/
|
|
||||||
if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
|
if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
|
||||||
e1000phy_mii_phy_auto(sc, ife->ifm_media);
|
e1000phy_mii_phy_auto(sc, ife->ifm_media);
|
||||||
break;
|
break;
|
||||||
@@ -319,8 +321,7 @@ e1000phy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
|
|||||||
speed = 0;
|
speed = 0;
|
||||||
switch (IFM_SUBTYPE(ife->ifm_media)) {
|
switch (IFM_SUBTYPE(ife->ifm_media)) {
|
||||||
case IFM_1000_T:
|
case IFM_1000_T:
|
||||||
if ((sc->mii_extcapabilities &
|
if ((sc->mii_flags & MIIF_HAVE_GTCR) == 0)
|
||||||
(EXTSR_1000TFDX | EXTSR_1000THDX)) == 0)
|
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
speed = E1000_CR_SPEED_1000;
|
speed = E1000_CR_SPEED_1000;
|
||||||
break;
|
break;
|
||||||
@@ -357,10 +358,9 @@ e1000phy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
|
|||||||
|
|
||||||
if (IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T) {
|
if (IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T) {
|
||||||
gig |= E1000_1GCR_MS_ENABLE;
|
gig |= E1000_1GCR_MS_ENABLE;
|
||||||
if ((ife->ifm_media & IFM_ETH_MASTER) != 0)
|
if ((ife->ifm_media & IFM_ETH_MASTER) != 0)
|
||||||
gig |= E1000_1GCR_MS_VALUE;
|
gig |= E1000_1GCR_MS_VALUE;
|
||||||
} else if ((sc->mii_extcapabilities &
|
} else if ((sc->mii_flags & MIIF_HAVE_GTCR) != 0)
|
||||||
(EXTSR_1000TFDX | EXTSR_1000THDX)) != 0)
|
|
||||||
gig = 0;
|
gig = 0;
|
||||||
PHY_WRITE(sc, E1000_1GCR, gig);
|
PHY_WRITE(sc, E1000_1GCR, gig);
|
||||||
PHY_WRITE(sc, E1000_AR, E1000_AR_SELECTOR_FIELD);
|
PHY_WRITE(sc, E1000_AR, E1000_AR_SELECTOR_FIELD);
|
||||||
@@ -368,12 +368,6 @@ e1000phy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
|
|||||||
done:
|
done:
|
||||||
break;
|
break;
|
||||||
case MII_TICK:
|
case MII_TICK:
|
||||||
/*
|
|
||||||
* Is the interface even up?
|
|
||||||
*/
|
|
||||||
if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only used for autonegotiation.
|
* Only used for autonegotiation.
|
||||||
*/
|
*/
|
||||||
@@ -491,9 +485,14 @@ e1000phy_mii_phy_auto(struct mii_softc *sc, int media)
|
|||||||
PHY_WRITE(sc, E1000_AR, reg | E1000_AR_SELECTOR_FIELD);
|
PHY_WRITE(sc, E1000_AR, reg | E1000_AR_SELECTOR_FIELD);
|
||||||
} else
|
} else
|
||||||
PHY_WRITE(sc, E1000_AR, E1000_FA_1000X_FD | E1000_FA_1000X);
|
PHY_WRITE(sc, E1000_AR, E1000_FA_1000X_FD | E1000_FA_1000X);
|
||||||
if ((sc->mii_extcapabilities & (EXTSR_1000TFDX | EXTSR_1000THDX)) != 0)
|
if ((sc->mii_flags & MIIF_HAVE_GTCR) != 0) {
|
||||||
PHY_WRITE(sc, E1000_1GCR,
|
reg = 0;
|
||||||
E1000_1GCR_1000T_FD | E1000_1GCR_1000T);
|
if ((sc->mii_extcapabilities & EXTSR_1000TFDX) != 0)
|
||||||
|
reg |= E1000_1GCR_1000T_FD;
|
||||||
|
if ((sc->mii_extcapabilities & EXTSR_1000THDX) != 0)
|
||||||
|
reg |= E1000_1GCR_1000T;
|
||||||
|
PHY_WRITE(sc, E1000_1GCR, reg);
|
||||||
|
}
|
||||||
PHY_WRITE(sc, E1000_CR,
|
PHY_WRITE(sc, E1000_CR,
|
||||||
E1000_CR_AUTO_NEG_ENABLE | E1000_CR_RESTART_AUTO_NEG);
|
E1000_CR_AUTO_NEG_ENABLE | E1000_CR_RESTART_AUTO_NEG);
|
||||||
|
|
||||||
|
|||||||
@@ -140,12 +140,6 @@ ukphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MII_MEDIACHG:
|
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);
|
mii_phy_setmedia(sc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -116,16 +116,15 @@ xmphy_attach(device_t dev)
|
|||||||
|
|
||||||
PHY_RESET(sc);
|
PHY_RESET(sc);
|
||||||
|
|
||||||
#define ADD(m, c) ifmedia_add(&sc->mii_pdata->mii_media, (m), (c), NULL)
|
#define ADD(m) ifmedia_add(&sc->mii_pdata->mii_media, (m), 0, NULL)
|
||||||
#define PRINT(s) printf("%s%s", sep, s); sep = ", "
|
#define PRINT(s) printf("%s%s", sep, s); sep = ", "
|
||||||
|
|
||||||
device_printf(dev, " ");
|
device_printf(dev, " ");
|
||||||
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0, sc->mii_inst),
|
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0, sc->mii_inst));
|
||||||
XMPHY_BMCR_FDX);
|
|
||||||
PRINT("1000baseSX");
|
PRINT("1000baseSX");
|
||||||
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, IFM_FDX, sc->mii_inst), 0);
|
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, IFM_FDX, sc->mii_inst));
|
||||||
PRINT("1000baseSX-FDX");
|
PRINT("1000baseSX-FDX");
|
||||||
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst), 0);
|
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst));
|
||||||
PRINT("auto");
|
PRINT("auto");
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
@@ -148,12 +147,6 @@ xmphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MII_MEDIACHG:
|
case MII_MEDIACHG:
|
||||||
/*
|
|
||||||
* If the interface is not up, don't do anything.
|
|
||||||
*/
|
|
||||||
if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
switch (IFM_SUBTYPE(ife->ifm_media)) {
|
switch (IFM_SUBTYPE(ife->ifm_media)) {
|
||||||
case IFM_AUTO:
|
case IFM_AUTO:
|
||||||
#ifdef foo
|
#ifdef foo
|
||||||
@@ -181,12 +174,6 @@ xmphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MII_TICK:
|
case MII_TICK:
|
||||||
/*
|
|
||||||
* Is the interface even up?
|
|
||||||
*/
|
|
||||||
if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only used for autonegotiation.
|
* Only used for autonegotiation.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
SubDir HAIKU_TOP src add-ons kernel drivers network syskonnect dev sk ;
|
SubDir HAIKU_TOP src add-ons kernel drivers network syskonnect dev sk ;
|
||||||
|
|
||||||
UseHeaders [ FDirName $(SUBDIR) .. .. ] : true ;
|
UseHeaders [ FDirName $(SUBDIR) .. .. ] : 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 ;
|
UsePrivateHeaders net system ;
|
||||||
UsePrivateKernelHeaders ;
|
UsePrivateKernelHeaders ;
|
||||||
@@ -11,5 +11,5 @@ SubDirCcFlags [ FDefines _KERNEL=1 FBSD_DRIVER=1 ] ;
|
|||||||
KernelAddon syskonnect :
|
KernelAddon syskonnect :
|
||||||
if_sk.c
|
if_sk.c
|
||||||
glue.c
|
glue.c
|
||||||
: libfreebsd_network.a syskonnect_mii.a
|
: syskonnect_mii.a libfreebsd11_network.a
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <net/bpf.h>
|
#include <net/bpf.h>
|
||||||
#include <net/ethernet.h>
|
#include <net/ethernet.h>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
|
#include <net/if_var.h>
|
||||||
#include <net/if_arp.h>
|
#include <net/if_arp.h>
|
||||||
#include <net/if_dl.h>
|
#include <net/if_dl.h>
|
||||||
#include <net/if_media.h>
|
#include <net/if_media.h>
|
||||||
@@ -1028,10 +1029,6 @@ sk_jumbo_newbuf(sc_if, idx)
|
|||||||
m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUM9BYTES);
|
m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUM9BYTES);
|
||||||
if (m == NULL)
|
if (m == NULL)
|
||||||
return (ENOBUFS);
|
return (ENOBUFS);
|
||||||
if ((m->m_flags & M_EXT) == 0) {
|
|
||||||
m_freem(m);
|
|
||||||
return (ENOBUFS);
|
|
||||||
}
|
|
||||||
m->m_pkthdr.len = m->m_len = MJUM9BYTES;
|
m->m_pkthdr.len = m->m_len = MJUM9BYTES;
|
||||||
/*
|
/*
|
||||||
* Adjust alignment so packet payload begins on a
|
* Adjust alignment so packet payload begins on a
|
||||||
@@ -1365,7 +1362,6 @@ sk_attach(dev)
|
|||||||
}
|
}
|
||||||
ifp->if_softc = sc_if;
|
ifp->if_softc = sc_if;
|
||||||
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
|
if_initname(ifp, device_get_name(dev), device_get_unit(dev));
|
||||||
ifp->if_mtu = ETHERMTU;
|
|
||||||
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
|
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
|
||||||
/*
|
/*
|
||||||
* SK_GENESIS has a bug in checksum offload - From linux.
|
* SK_GENESIS has a bug in checksum offload - From linux.
|
||||||
@@ -1513,7 +1509,7 @@ sk_attach(dev)
|
|||||||
* Must appear after the call to ether_ifattach() because
|
* Must appear after the call to ether_ifattach() because
|
||||||
* ether_ifattach() sets ifi_hdrlen to the default value.
|
* 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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do miibus setup.
|
* Do miibus setup.
|
||||||
@@ -1854,8 +1850,6 @@ sk_detach(dev)
|
|||||||
ether_ifdetach(ifp);
|
ether_ifdetach(ifp);
|
||||||
SK_IF_LOCK(sc_if);
|
SK_IF_LOCK(sc_if);
|
||||||
}
|
}
|
||||||
if (ifp)
|
|
||||||
if_free(ifp);
|
|
||||||
/*
|
/*
|
||||||
* We're generally called from skc_detach() which is using
|
* We're generally called from skc_detach() which is using
|
||||||
* device_delete_child() to get to here. It's already trashed
|
* device_delete_child() to get to here. It's already trashed
|
||||||
@@ -1869,6 +1863,8 @@ sk_detach(dev)
|
|||||||
sk_dma_jumbo_free(sc_if);
|
sk_dma_jumbo_free(sc_if);
|
||||||
sk_dma_free(sc_if);
|
sk_dma_free(sc_if);
|
||||||
SK_IF_UNLOCK(sc_if);
|
SK_IF_UNLOCK(sc_if);
|
||||||
|
if (ifp)
|
||||||
|
if_free(ifp);
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
@@ -2240,31 +2236,29 @@ sk_dma_free(sc_if)
|
|||||||
|
|
||||||
/* Tx ring */
|
/* Tx ring */
|
||||||
if (sc_if->sk_cdata.sk_tx_ring_tag) {
|
if (sc_if->sk_cdata.sk_tx_ring_tag) {
|
||||||
if (sc_if->sk_cdata.sk_tx_ring_map)
|
if (sc_if->sk_rdata.sk_tx_ring_paddr)
|
||||||
bus_dmamap_unload(sc_if->sk_cdata.sk_tx_ring_tag,
|
bus_dmamap_unload(sc_if->sk_cdata.sk_tx_ring_tag,
|
||||||
sc_if->sk_cdata.sk_tx_ring_map);
|
sc_if->sk_cdata.sk_tx_ring_map);
|
||||||
if (sc_if->sk_cdata.sk_tx_ring_map &&
|
if (sc_if->sk_rdata.sk_tx_ring)
|
||||||
sc_if->sk_rdata.sk_tx_ring)
|
|
||||||
bus_dmamem_free(sc_if->sk_cdata.sk_tx_ring_tag,
|
bus_dmamem_free(sc_if->sk_cdata.sk_tx_ring_tag,
|
||||||
sc_if->sk_rdata.sk_tx_ring,
|
sc_if->sk_rdata.sk_tx_ring,
|
||||||
sc_if->sk_cdata.sk_tx_ring_map);
|
sc_if->sk_cdata.sk_tx_ring_map);
|
||||||
sc_if->sk_rdata.sk_tx_ring = NULL;
|
sc_if->sk_rdata.sk_tx_ring = NULL;
|
||||||
sc_if->sk_cdata.sk_tx_ring_map = NULL;
|
sc_if->sk_rdata.sk_tx_ring_paddr = 0;
|
||||||
bus_dma_tag_destroy(sc_if->sk_cdata.sk_tx_ring_tag);
|
bus_dma_tag_destroy(sc_if->sk_cdata.sk_tx_ring_tag);
|
||||||
sc_if->sk_cdata.sk_tx_ring_tag = NULL;
|
sc_if->sk_cdata.sk_tx_ring_tag = NULL;
|
||||||
}
|
}
|
||||||
/* Rx ring */
|
/* Rx ring */
|
||||||
if (sc_if->sk_cdata.sk_rx_ring_tag) {
|
if (sc_if->sk_cdata.sk_rx_ring_tag) {
|
||||||
if (sc_if->sk_cdata.sk_rx_ring_map)
|
if (sc_if->sk_rdata.sk_rx_ring_paddr)
|
||||||
bus_dmamap_unload(sc_if->sk_cdata.sk_rx_ring_tag,
|
bus_dmamap_unload(sc_if->sk_cdata.sk_rx_ring_tag,
|
||||||
sc_if->sk_cdata.sk_rx_ring_map);
|
sc_if->sk_cdata.sk_rx_ring_map);
|
||||||
if (sc_if->sk_cdata.sk_rx_ring_map &&
|
if (sc_if->sk_rdata.sk_rx_ring)
|
||||||
sc_if->sk_rdata.sk_rx_ring)
|
|
||||||
bus_dmamem_free(sc_if->sk_cdata.sk_rx_ring_tag,
|
bus_dmamem_free(sc_if->sk_cdata.sk_rx_ring_tag,
|
||||||
sc_if->sk_rdata.sk_rx_ring,
|
sc_if->sk_rdata.sk_rx_ring,
|
||||||
sc_if->sk_cdata.sk_rx_ring_map);
|
sc_if->sk_cdata.sk_rx_ring_map);
|
||||||
sc_if->sk_rdata.sk_rx_ring = NULL;
|
sc_if->sk_rdata.sk_rx_ring = NULL;
|
||||||
sc_if->sk_cdata.sk_rx_ring_map = NULL;
|
sc_if->sk_rdata.sk_rx_ring_paddr = 0;
|
||||||
bus_dma_tag_destroy(sc_if->sk_cdata.sk_rx_ring_tag);
|
bus_dma_tag_destroy(sc_if->sk_cdata.sk_rx_ring_tag);
|
||||||
sc_if->sk_cdata.sk_rx_ring_tag = NULL;
|
sc_if->sk_cdata.sk_rx_ring_tag = NULL;
|
||||||
}
|
}
|
||||||
@@ -2315,16 +2309,15 @@ sk_dma_jumbo_free(sc_if)
|
|||||||
|
|
||||||
/* jumbo Rx ring */
|
/* jumbo Rx ring */
|
||||||
if (sc_if->sk_cdata.sk_jumbo_rx_ring_tag) {
|
if (sc_if->sk_cdata.sk_jumbo_rx_ring_tag) {
|
||||||
if (sc_if->sk_cdata.sk_jumbo_rx_ring_map)
|
if (sc_if->sk_rdata.sk_jumbo_rx_ring_paddr)
|
||||||
bus_dmamap_unload(sc_if->sk_cdata.sk_jumbo_rx_ring_tag,
|
bus_dmamap_unload(sc_if->sk_cdata.sk_jumbo_rx_ring_tag,
|
||||||
sc_if->sk_cdata.sk_jumbo_rx_ring_map);
|
sc_if->sk_cdata.sk_jumbo_rx_ring_map);
|
||||||
if (sc_if->sk_cdata.sk_jumbo_rx_ring_map &&
|
if (sc_if->sk_rdata.sk_jumbo_rx_ring)
|
||||||
sc_if->sk_rdata.sk_jumbo_rx_ring)
|
|
||||||
bus_dmamem_free(sc_if->sk_cdata.sk_jumbo_rx_ring_tag,
|
bus_dmamem_free(sc_if->sk_cdata.sk_jumbo_rx_ring_tag,
|
||||||
sc_if->sk_rdata.sk_jumbo_rx_ring,
|
sc_if->sk_rdata.sk_jumbo_rx_ring,
|
||||||
sc_if->sk_cdata.sk_jumbo_rx_ring_map);
|
sc_if->sk_cdata.sk_jumbo_rx_ring_map);
|
||||||
sc_if->sk_rdata.sk_jumbo_rx_ring = NULL;
|
sc_if->sk_rdata.sk_jumbo_rx_ring = NULL;
|
||||||
sc_if->sk_cdata.sk_jumbo_rx_ring_map = NULL;
|
sc_if->sk_rdata.sk_jumbo_rx_ring_paddr = 0;
|
||||||
bus_dma_tag_destroy(sc_if->sk_cdata.sk_jumbo_rx_ring_tag);
|
bus_dma_tag_destroy(sc_if->sk_cdata.sk_jumbo_rx_ring_tag);
|
||||||
sc_if->sk_cdata.sk_jumbo_rx_ring_tag = NULL;
|
sc_if->sk_cdata.sk_jumbo_rx_ring_tag = NULL;
|
||||||
}
|
}
|
||||||
@@ -2576,7 +2569,7 @@ sk_watchdog(arg)
|
|||||||
sk_txeof(sc_if);
|
sk_txeof(sc_if);
|
||||||
if (sc_if->sk_cdata.sk_tx_cnt != 0) {
|
if (sc_if->sk_cdata.sk_tx_cnt != 0) {
|
||||||
if_printf(sc_if->sk_ifp, "watchdog timeout\n");
|
if_printf(sc_if->sk_ifp, "watchdog timeout\n");
|
||||||
ifp->if_oerrors++;
|
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
|
||||||
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
|
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
|
||||||
sk_init_locked(sc_if);
|
sk_init_locked(sc_if);
|
||||||
}
|
}
|
||||||
@@ -2791,7 +2784,7 @@ sk_rxeof(sc_if)
|
|||||||
SK_RXBYTES(sk_ctl) < SK_MIN_FRAMELEN ||
|
SK_RXBYTES(sk_ctl) < SK_MIN_FRAMELEN ||
|
||||||
SK_RXBYTES(sk_ctl) > SK_MAX_FRAMELEN ||
|
SK_RXBYTES(sk_ctl) > SK_MAX_FRAMELEN ||
|
||||||
sk_rxvalid(sc, rxstat, SK_RXBYTES(sk_ctl)) == 0) {
|
sk_rxvalid(sc, rxstat, SK_RXBYTES(sk_ctl)) == 0) {
|
||||||
ifp->if_ierrors++;
|
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
|
||||||
sk_discard_rxbuf(sc_if, cons);
|
sk_discard_rxbuf(sc_if, cons);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2799,14 +2792,14 @@ sk_rxeof(sc_if)
|
|||||||
m = rxd->rx_m;
|
m = rxd->rx_m;
|
||||||
csum = le32toh(cur_rx->sk_csum);
|
csum = le32toh(cur_rx->sk_csum);
|
||||||
if (sk_newbuf(sc_if, cons) != 0) {
|
if (sk_newbuf(sc_if, cons) != 0) {
|
||||||
ifp->if_iqdrops++;
|
if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
|
||||||
/* reuse old buffer */
|
/* reuse old buffer */
|
||||||
sk_discard_rxbuf(sc_if, cons);
|
sk_discard_rxbuf(sc_if, cons);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
m->m_pkthdr.rcvif = ifp;
|
m->m_pkthdr.rcvif = ifp;
|
||||||
m->m_pkthdr.len = m->m_len = SK_RXBYTES(sk_ctl);
|
m->m_pkthdr.len = m->m_len = SK_RXBYTES(sk_ctl);
|
||||||
ifp->if_ipackets++;
|
if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
|
||||||
if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
|
if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
|
||||||
sk_rxcksum(ifp, m, csum);
|
sk_rxcksum(ifp, m, csum);
|
||||||
SK_IF_UNLOCK(sc_if);
|
SK_IF_UNLOCK(sc_if);
|
||||||
@@ -2859,7 +2852,7 @@ sk_jumbo_rxeof(sc_if)
|
|||||||
SK_RXBYTES(sk_ctl) < SK_MIN_FRAMELEN ||
|
SK_RXBYTES(sk_ctl) < SK_MIN_FRAMELEN ||
|
||||||
SK_RXBYTES(sk_ctl) > SK_JUMBO_FRAMELEN ||
|
SK_RXBYTES(sk_ctl) > SK_JUMBO_FRAMELEN ||
|
||||||
sk_rxvalid(sc, rxstat, SK_RXBYTES(sk_ctl)) == 0) {
|
sk_rxvalid(sc, rxstat, SK_RXBYTES(sk_ctl)) == 0) {
|
||||||
ifp->if_ierrors++;
|
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
|
||||||
sk_discard_jumbo_rxbuf(sc_if, cons);
|
sk_discard_jumbo_rxbuf(sc_if, cons);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2867,14 +2860,14 @@ sk_jumbo_rxeof(sc_if)
|
|||||||
m = jrxd->rx_m;
|
m = jrxd->rx_m;
|
||||||
csum = le32toh(cur_rx->sk_csum);
|
csum = le32toh(cur_rx->sk_csum);
|
||||||
if (sk_jumbo_newbuf(sc_if, cons) != 0) {
|
if (sk_jumbo_newbuf(sc_if, cons) != 0) {
|
||||||
ifp->if_iqdrops++;
|
if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
|
||||||
/* reuse old buffer */
|
/* reuse old buffer */
|
||||||
sk_discard_jumbo_rxbuf(sc_if, cons);
|
sk_discard_jumbo_rxbuf(sc_if, cons);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
m->m_pkthdr.rcvif = ifp;
|
m->m_pkthdr.rcvif = ifp;
|
||||||
m->m_pkthdr.len = m->m_len = SK_RXBYTES(sk_ctl);
|
m->m_pkthdr.len = m->m_len = SK_RXBYTES(sk_ctl);
|
||||||
ifp->if_ipackets++;
|
if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
|
||||||
if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
|
if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
|
||||||
sk_rxcksum(ifp, m, csum);
|
sk_rxcksum(ifp, m, csum);
|
||||||
SK_IF_UNLOCK(sc_if);
|
SK_IF_UNLOCK(sc_if);
|
||||||
@@ -2925,7 +2918,7 @@ sk_txeof(sc_if)
|
|||||||
BUS_DMASYNC_POSTWRITE);
|
BUS_DMASYNC_POSTWRITE);
|
||||||
bus_dmamap_unload(sc_if->sk_cdata.sk_tx_tag, txd->tx_dmamap);
|
bus_dmamap_unload(sc_if->sk_cdata.sk_tx_tag, txd->tx_dmamap);
|
||||||
|
|
||||||
ifp->if_opackets++;
|
if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
|
||||||
m_freem(txd->tx_m);
|
m_freem(txd->tx_m);
|
||||||
txd->tx_m = NULL;
|
txd->tx_m = NULL;
|
||||||
STAILQ_REMOVE_HEAD(&sc_if->sk_cdata.sk_txbusyq, tx_q);
|
STAILQ_REMOVE_HEAD(&sc_if->sk_cdata.sk_txbusyq, tx_q);
|
||||||
@@ -3143,7 +3136,6 @@ sk_intr(xsc)
|
|||||||
if (status == 0 || status == 0xffffffff || sc->sk_suspended)
|
if (status == 0 || status == 0xffffffff || sc->sk_suspended)
|
||||||
goto done_locked;
|
goto done_locked;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Handle receive interrupts first. */
|
/* Handle receive interrupts first. */
|
||||||
if (status & SK_ISR_RX1_EOF) {
|
if (status & SK_ISR_RX1_EOF) {
|
||||||
if (ifp0->if_mtu > SK_MAX_FRAMELEN)
|
if (ifp0->if_mtu > SK_MAX_FRAMELEN)
|
||||||
@@ -3317,7 +3309,7 @@ sk_init_xmac(sc_if)
|
|||||||
* that jumbo frames larger than 8192 bytes will be
|
* that jumbo frames larger than 8192 bytes will be
|
||||||
* truncated. Disabling all bad frame filtering causes
|
* truncated. Disabling all bad frame filtering causes
|
||||||
* the RX FIFO to operate in streaming mode, in which
|
* the RX FIFO to operate in streaming mode, in which
|
||||||
* case the XMAC will start transfering frames out of the
|
* case the XMAC will start transferring frames out of the
|
||||||
* RX FIFO as soon as the FIFO threshold is reached.
|
* RX FIFO as soon as the FIFO threshold is reached.
|
||||||
*/
|
*/
|
||||||
if (ifp->if_mtu > SK_MAX_FRAMELEN) {
|
if (ifp->if_mtu > SK_MAX_FRAMELEN) {
|
||||||
|
|||||||
@@ -165,7 +165,7 @@
|
|||||||
/* SMI Data Register (SMIDR) */
|
/* SMI Data Register (SMIDR) */
|
||||||
#define YUKON_SMIDR 0x0084
|
#define YUKON_SMIDR 0x0084
|
||||||
|
|
||||||
/* PHY Addres Register (PAR) */
|
/* PHY Address Register (PAR) */
|
||||||
#define YUKON_PAR 0x0088
|
#define YUKON_PAR 0x0088
|
||||||
|
|
||||||
#define YU_PAR_MIB_CLR 0x0020 /* MIB Counters Clear Mode */
|
#define YU_PAR_MIB_CLR 0x0020 /* MIB Counters Clear Mode */
|
||||||
|
|||||||
Reference in New Issue
Block a user