summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorwpaul <wpaul@FreeBSD.org>1999-10-14 21:49:17 +0000
committerwpaul <wpaul@FreeBSD.org>1999-10-14 21:49:17 +0000
commitd5a9edd818f17b4797550d261b5baf8e03dcdd05 (patch)
tree92b650ab13ed04391bcefe5525935badf7532a39 /sys
parent37ab4f7a31956a5d39e3eb1f74da3865b7d0fd3e (diff)
downloadFreeBSD-src-d5a9edd818f17b4797550d261b5baf8e03dcdd05.zip
FreeBSD-src-d5a9edd818f17b4797550d261b5baf8e03dcdd05.tar.gz
Make some small tweaks:
- When setting/clearing promisc mode, just update the filter, don't reset the whole interface. - Call xl_init() in xl_ifmedia_upd() when setting miibus media modes. This fixes a problem with the 3c905B-COMBO where switching from 10base5/AUI or 10base2/BNC to a 10/100 mode doesn't always work right. - Attempt to reset the interface in xl_init() so that we know we're getting the receive and transmit rings reset properly.
Diffstat (limited to 'sys')
-rw-r--r--sys/pci/if_xl.c30
-rw-r--r--sys/pci/if_xlreg.h1
2 files changed, 27 insertions, 4 deletions
diff --git a/sys/pci/if_xl.c b/sys/pci/if_xl.c
index 8b1e06a..e594a9a 100644
--- a/sys/pci/if_xl.c
+++ b/sys/pci/if_xl.c
@@ -585,6 +585,8 @@ static void xl_miibus_statchg(dev)
sc = device_get_softc(dev);
mii = device_get_softc(sc->xl_miibus);
+ xl_setcfg(sc);
+
/* Set ASIC's duplex mode to match the PHY. */
XL_SEL_WIN(3);
if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX)
@@ -2389,7 +2391,9 @@ static void xl_init(xsc)
*/
xl_stop(sc);
+ xl_reset(sc);
xl_wait(sc);
+ DELAY(1000);
if (sc->xl_miibus != NULL)
mii = device_get_softc(sc->xl_miibus);
@@ -2587,6 +2591,7 @@ static int xl_ifmedia_upd(ifp)
switch(IFM_SUBTYPE(ifm->ifm_media)) {
case IFM_100_FX:
+ case IFM_10_FL:
case IFM_10_2:
case IFM_10_5:
xl_setmode(sc, ifm->ifm_media);
@@ -2598,9 +2603,7 @@ static int xl_ifmedia_upd(ifp)
if (sc->xl_media & XL_MEDIAOPT_MII || sc->xl_media & XL_MEDIAOPT_BTX
|| sc->xl_media & XL_MEDIAOPT_BT4) {
- xl_setcfg(sc);
- if (mii != NULL)
- mii_mediachg(mii);
+ xl_init(sc);
} else {
xl_setmode(sc, ifm->ifm_media);
}
@@ -2684,6 +2687,7 @@ static int xl_ioctl(ifp, command, data)
struct ifreq *ifr = (struct ifreq *) data;
int s, error = 0;
struct mii_data *mii = NULL;
+ u_int8_t rxfilt;
s = splimp();
@@ -2694,12 +2698,30 @@ static int xl_ioctl(ifp, command, data)
error = ether_ioctl(ifp, command, data);
break;
case SIOCSIFFLAGS:
+ XL_SEL_WIN(5);
+ rxfilt = CSR_READ_1(sc, XL_W5_RX_FILTER);
if (ifp->if_flags & IFF_UP) {
- xl_init(sc);
+ if (ifp->if_flags & IFF_RUNNING &&
+ ifp->if_flags & IFF_PROMISC &&
+ !(sc->xl_if_flags & IFF_PROMISC)) {
+ rxfilt |= XL_RXFILTER_ALLFRAMES;
+ CSR_WRITE_2(sc, XL_COMMAND,
+ XL_CMD_RX_SET_FILT|rxfilt);
+ XL_SEL_WIN(7);
+ } else if (ifp->if_flags & IFF_RUNNING &&
+ !(ifp->if_flags & IFF_PROMISC) &&
+ sc->xl_if_flags & IFF_PROMISC) {
+ rxfilt &= ~XL_RXFILTER_ALLFRAMES;
+ CSR_WRITE_2(sc, XL_COMMAND,
+ XL_CMD_RX_SET_FILT|rxfilt);
+ XL_SEL_WIN(7);
+ } else
+ xl_init(sc);
} else {
if (ifp->if_flags & IFF_RUNNING)
xl_stop(sc);
}
+ sc->xl_if_flags = ifp->if_flags;
error = 0;
break;
case SIOCADDMULTI:
diff --git a/sys/pci/if_xlreg.h b/sys/pci/if_xlreg.h
index c504ccc..69948d2 100644
--- a/sys/pci/if_xlreg.h
+++ b/sys/pci/if_xlreg.h
@@ -565,6 +565,7 @@ struct xl_softc {
u_int16_t xl_caps;
u_int8_t xl_stats_no_timeout;
u_int16_t xl_tx_thresh;
+ int xl_if_flags;
struct xl_list_data *xl_ldata;
struct xl_chain_data xl_cdata;
struct callout_handle xl_stat_ch;
OpenPOWER on IntegriCloud