diff options
| author | Maxim Sobolev <sobomax@FreeBSD.org> | 2005-09-26 05:29:46 +0000 |
|---|---|---|
| committer | Maxim Sobolev <sobomax@FreeBSD.org> | 2005-09-26 05:29:46 +0000 |
| commit | b4a98d309e45d02ac314917d0cb0eaf4037ca0e8 (patch) | |
| tree | 781ff1899bf0d80f23b26ae8054860980e53c6c1 /sys/dev | |
| parent | 9f8aaf685b48712cfeead72c80a64715c559ad82 (diff) | |
Notes
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/usb/if_cdce.c | 31 | ||||
| -rw-r--r-- | sys/dev/usb/if_cdcereg.h | 1 |
2 files changed, 32 insertions, 0 deletions
diff --git a/sys/dev/usb/if_cdce.c b/sys/dev/usb/if_cdce.c index c7382724941f..51b5a7cee1a0 100644 --- a/sys/dev/usb/if_cdce.c +++ b/sys/dev/usb/if_cdce.c @@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include <net/if_arp.h> #include <net/ethernet.h> #include <net/if_types.h> +#include <net/if_media.h> #include <net/bpf.h> @@ -91,6 +92,8 @@ Static void cdce_init(void *); Static void cdce_reset(struct cdce_softc *); Static void cdce_stop(struct cdce_softc *); Static void cdce_rxstart(struct ifnet *); +Static int cdce_ifmedia_upd(struct ifnet *ifp); +Static void cdce_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr); Static const struct cdce_type cdce_devs[] = { {{ USB_VENDOR_PROLIFIC, USB_PRODUCT_PROLIFIC_PL2501 }, CDCE_NO_UNION }, @@ -255,6 +258,7 @@ USB_ATTACH(cdce) mtx_init(&sc->cdce_mtx, USBDEVNAME(sc->cdce_dev), MTX_NETWORK_LOCK, MTX_DEF | MTX_RECURSE); + ifmedia_init(&sc->cdce_ifmedia, 0, cdce_ifmedia_upd, cdce_ifmedia_sts); CDCE_LOCK(sc); ue = (const usb_cdc_ethernet_descriptor_t *)usb_find_desc(dev, @@ -305,6 +309,10 @@ USB_ATTACH(cdce) sc->q.ifp = ifp; sc->q.if_rxstart = cdce_rxstart; + /* No IFM type for 11Mbps USB, so go with 10baseT */ + ifmedia_add(&sc->cdce_ifmedia, IFM_ETHER | IFM_10_T, 0, 0); + ifmedia_set(&sc->cdce_ifmedia, IFM_ETHER | IFM_10_T); + ether_ifattach(ifp, eaddr); usb_register_netisr(); @@ -329,6 +337,7 @@ USB_DETACH(cdce) ether_ifdetach(ifp); if_free(ifp); + ifmedia_removeall(&sc->cdce_ifmedia); CDCE_UNLOCK(sc); mtx_destroy(&sc->cdce_mtx); @@ -468,6 +477,7 @@ Static int cdce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) { struct cdce_softc *sc = ifp->if_softc; + struct ifreq *ifr = (struct ifreq *)data; int error = 0; if (sc->cdce_dying) @@ -485,6 +495,11 @@ cdce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) error = 0; break; + case SIOCSIFMEDIA: + case SIOCGIFMEDIA: + error = ifmedia_ioctl(ifp, ifr, &sc->cdce_ifmedia, command); + break; + default: error = ether_ioctl(ifp, command, data); break; @@ -716,3 +731,19 @@ cdce_rxstart(struct ifnet *ifp) CDCE_UNLOCK(sc); return; } + +Static int +cdce_ifmedia_upd(struct ifnet *ifp) +{ + + /* no-op, cdce has only 1 possible media type */ + return 0; +} + +Static void +cdce_ifmedia_sts(struct ifnet * const ifp, struct ifmediareq *req) +{ + + req->ifm_status = IFM_AVALID | IFM_ACTIVE; + req->ifm_active = IFM_ETHER | IFM_10_T; +} diff --git a/sys/dev/usb/if_cdcereg.h b/sys/dev/usb/if_cdcereg.h index 73433154d645..93738fae7c72 100644 --- a/sys/dev/usb/if_cdcereg.h +++ b/sys/dev/usb/if_cdcereg.h @@ -45,6 +45,7 @@ struct cdce_type { struct cdce_softc { struct ifnet *cdce_ifp; #define GET_IFP(sc) ((sc)->cdce_ifp) + struct ifmedia cdce_ifmedia; usbd_device_handle cdce_udev; usbd_interface_handle cdce_data_iface; |
