summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrpaulo <rpaulo@FreeBSD.org>2012-07-15 05:49:02 +0000
committerrpaulo <rpaulo@FreeBSD.org>2012-07-15 05:49:02 +0000
commit37f77c6229be57f576c2f3abcaf02c37042a1bb3 (patch)
treefb7b97f23a7bfc508de4c06ae50bce5be93d5ea2
parent9acb87af3e0d90da720f48b185a40d64fc12e95a (diff)
downloadFreeBSD-src-37f77c6229be57f576c2f3abcaf02c37042a1bb3.zip
FreeBSD-src-37f77c6229be57f576c2f3abcaf02c37042a1bb3.tar.gz
The JP1082 device doesn't respond to the MII_BMSR command and it turns
out that it has an unusable PHY. It still works, although very slowly, without a PHY, so I implemented non-PHY support in the udav driver.
-rw-r--r--sys/dev/usb/net/if_udav.c18
-rw-r--r--sys/dev/usb/net/if_udavreg.h1
2 files changed, 16 insertions, 3 deletions
diff --git a/sys/dev/usb/net/if_udav.c b/sys/dev/usb/net/if_udav.c
index 2507846..c6f0811 100644
--- a/sys/dev/usb/net/if_udav.c
+++ b/sys/dev/usb/net/if_udav.c
@@ -169,7 +169,7 @@ MODULE_DEPEND(udav, ether, 1, 1, 1);
MODULE_DEPEND(udav, miibus, 1, 1, 1);
MODULE_VERSION(udav, 1);
-static const struct usb_ether_methods udav_ue_methods = {
+static struct usb_ether_methods udav_ue_methods = {
.ue_attach_post = udav_attach_post,
.ue_start = udav_start,
.ue_init = udav_init,
@@ -206,7 +206,8 @@ static const STRUCT_USB_HOST_ID udav_devs[] = {
{USB_VPI(USB_VENDOR_SHANTOU, USB_PRODUCT_SHANTOU_ADM8515, 0)},
/* Kontron AG USB Ethernet */
{USB_VPI(USB_VENDOR_KONTRON, USB_PRODUCT_KONTRON_DM9601, 0)},
- {USB_VPI(USB_VENDOR_KONTRON, USB_PRODUCT_KONTRON_JP1082, 0)},
+ {USB_VPI(USB_VENDOR_KONTRON, USB_PRODUCT_KONTRON_JP1082,
+ UDAV_FLAG_NO_PHY)},
};
static void
@@ -259,6 +260,16 @@ udav_attach(device_t dev)
goto detach;
}
+ /*
+ * The JP1082 has an unusable PHY and provides no link information.
+ */
+ if (sc->sc_flags & UDAV_FLAG_NO_PHY) {
+ udav_ue_methods.ue_tick = NULL;
+ udav_ue_methods.ue_mii_upd = NULL;
+ udav_ue_methods.ue_mii_sts = NULL;
+ sc->sc_flags |= UDAV_FLAG_LINK;
+ }
+
ue->ue_sc = sc;
ue->ue_dev = dev;
ue->ue_udev = uaa->device;
@@ -712,7 +723,8 @@ udav_stop(struct usb_ether *ue)
UDAV_LOCK_ASSERT(sc, MA_OWNED);
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
- sc->sc_flags &= ~UDAV_FLAG_LINK;
+ if (!(sc->sc_flags & UDAV_FLAG_NO_PHY))
+ sc->sc_flags &= ~UDAV_FLAG_LINK;
/*
* stop all the transfers, if not already stopped:
diff --git a/sys/dev/usb/net/if_udavreg.h b/sys/dev/usb/net/if_udavreg.h
index 82715e8..7c35829 100644
--- a/sys/dev/usb/net/if_udavreg.h
+++ b/sys/dev/usb/net/if_udavreg.h
@@ -159,6 +159,7 @@ struct udav_softc {
int sc_flags;
#define UDAV_FLAG_LINK 0x0001
#define UDAV_FLAG_EXT_PHY 0x0040
+#define UDAV_FLAG_NO_PHY 0x0080
};
#define UDAV_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
OpenPOWER on IntegriCloud