summaryrefslogtreecommitdiffstats
path: root/cpukit/libnetworking/rtems/rtems_mii_ioctl_kern.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libnetworking/rtems/rtems_mii_ioctl_kern.c')
-rw-r--r--cpukit/libnetworking/rtems/rtems_mii_ioctl_kern.c260
1 files changed, 0 insertions, 260 deletions
diff --git a/cpukit/libnetworking/rtems/rtems_mii_ioctl_kern.c b/cpukit/libnetworking/rtems/rtems_mii_ioctl_kern.c
deleted file mode 100644
index 2944f0add5..0000000000
--- a/cpukit/libnetworking/rtems/rtems_mii_ioctl_kern.c
+++ /dev/null
@@ -1,260 +0,0 @@
-#include <machine/rtems-bsd-kernel-space.h>
-
-/* Simple (default) implementation for SIOCGIFMEDIA/SIOCSIFMEDIA
- * to be used by ethernet drivers [from their ioctl].
- *
- * KERNEL PART (support for drivers)
- *
- * NOTE: This much simpler than the BSD ifmedia API
- */
-
-/*
- * Authorship
- * ----------
- * This software was created by
- * Till Straumann <strauman@slac.stanford.edu>, 2005,
- * Stanford Linear Accelerator Center, Stanford University.
- *
- * Acknowledgement of sponsorship
- * ------------------------------
- * This software was produced by
- * the Stanford Linear Accelerator Center, Stanford University,
- * under Contract DE-AC03-76SFO0515 with the Department of Energy.
- *
- * Government disclaimer of liability
- * ----------------------------------
- * Neither the United States nor the United States Department of Energy,
- * nor any of their employees, makes any warranty, express or implied, or
- * assumes any legal liability or responsibility for the accuracy,
- * completeness, or usefulness of any data, apparatus, product, or process
- * disclosed, or represents that its use would not infringe privately owned
- * rights.
- *
- * Stanford disclaimer of liability
- * --------------------------------
- * Stanford University makes no representations or warranties, express or
- * implied, nor assumes any liability for the use of this software.
- *
- * Stanford disclaimer of copyright
- * --------------------------------
- * Stanford University, owner of the copyright, hereby disclaims its
- * copyright and all other rights in this software. Hence, anyone may
- * freely use it for any purpose without restriction.
- *
- * Maintenance of notices
- * ----------------------
- * In the interest of clarity regarding the origin and status of this
- * SLAC software, this and all the preceding Stanford University notices
- * are to remain affixed to any copy or derivative of this software made
- * or distributed by the recipient and are to be affixed to any copy of
- * software made or distributed by the recipient that contains a copy or
- * derivative of this software.
- *
- * ------------------ SLAC Software Notices, Set 4 OTT.002a, 2004 FEB 03
- */
-
-/* include first to avoid 'malloc' clash with rtems_bsdnet_malloc() hack */
-
-#include <rtems.h>
-#include <rtems/rtems_bsdnet.h>
-#include <sys/param.h>
-#include <sys/mbuf.h>
-#include <sys/socket.h>
-#include <sys/sockio.h>
-#include <net/ethernet.h>
-#include <net/if.h>
-
-#ifndef __KERNEL__
-#define __KERNEL__
-#endif
-
-#include <rtems/rtems_mii_ioctl.h>
-
-#include <errno.h>
-
-
-#define DEBUG
-
-
-#ifndef MII_1000TCR
-#define MII_1000TCR MII_100T2CR
-#endif
-
-#ifndef MII_1000TSR
-#define MII_1000TSR MII_100T2SR
-#endif
-
-int
-rtems_mii_ioctl (struct rtems_mdio_info *info, void *uarg, uint32_t cmd,
- int *media)
-{
- uint32_t bmcr, bmsr, aner, bmcr2 = 0, bmsr2 = 0, anar, lpar;
- int phy = IFM_INST (*media);
- uint32_t tmp;
- int subtype = 0, options = 0;
-
- switch (cmd) {
- default:
- return EINVAL;
-
-#ifdef DEBUG
- case 0:
-#endif
- case SIOCGIFMEDIA:
- if (info->mdio_r (phy, uarg, MII_BMCR, &bmcr))
- return EINVAL;
- /* read BMSR twice to clear latched link status low */
- if (info->mdio_r (phy, uarg, MII_BMSR, &bmsr))
- return EINVAL;
- if (info->mdio_r (phy, uarg, MII_BMSR, &bmsr))
- return EINVAL;
- if (info->mdio_r (phy, uarg, MII_ANER, &aner))
- return EINVAL;
- if (info->has_gmii) {
- if (info->mdio_r (phy, uarg, MII_1000TCR, &bmcr2))
- return EINVAL;
- if (info->mdio_r (phy, uarg, MII_1000TSR, &bmsr2))
- return EINVAL;
- }
-
- /* link status */
- if (BMSR_LINK & bmsr)
- options |= IFM_LINK_OK;
-
- /* do we have autonegotiation disabled ? */
- if (!(BMCR_AUTOEN & bmcr)) {
- options |= IFM_ANEG_DIS;
-
- /* duplex is enforced */
- options |= BMCR_FDX & bmcr ? IFM_FDX : IFM_HDX;
-
- /* determine speed */
- switch (BMCR_SPEED (bmcr)) {
- case BMCR_S10:
- subtype = IFM_10_T;
- break;
- case BMCR_S100:
- subtype = IFM_100_TX;
- break;
- case BMCR_S1000:
- subtype = IFM_1000_T;
- break;
- default:
- return ENOTSUP; /* ?? */
- }
- } else if (!(BMSR_LINK & bmsr) || !(BMSR_ACOMP & bmsr)) {
- subtype = IFM_NONE;
- } else {
- /* everything ok on our side */
-
- if ( ! (ANER_LPAN & aner) ) {
- /* Link partner doesn't autonegotiate --> our settings are the
- * result of 'parallel detect' (in particular: duplex status is HALF
- * according to the standard!).
- * Let them know that something's fishy...
- */
- options |= IFM_ANEG_DIS;
- }
-
- tmp = ((bmcr2 << 2) & bmsr2) & (GTSR_LP_1000THDX | GTSR_LP_1000TFDX);
- if (tmp) {
- if (GTSR_LP_1000TFDX & tmp)
- options |= IFM_FDX;
- subtype = IFM_1000_T;
- } else {
- if (info->mdio_r (phy, uarg, MII_ANAR, &anar))
- return EINVAL;
- if (info->mdio_r (phy, uarg, MII_ANLPAR, &lpar))
- return EINVAL;
- if (ANLPAR_ACK & lpar) {
- /* this is a negotiated link; otherwise we merely detect the partner's ability */
- }
- tmp = anar & lpar;
- if (ANLPAR_TX_FD & tmp) {
- options |= IFM_FDX;
- subtype = IFM_100_TX;
- } else if (ANLPAR_T4 & tmp) {
- subtype = IFM_100_T4;
- } else if (ANLPAR_TX & tmp) {
- subtype = IFM_100_TX;
- } else if (ANLPAR_10_FD & tmp) {
- options |= IFM_FDX;
- subtype = IFM_10_T;
- } else {
- subtype = IFM_10_T;
- }
- }
- }
-
- *media = IFM_MAKEWORD (IFM_ETHER, subtype, options, phy);
-
- break;
-
-#ifdef DEBUG
- case 1:
-#endif
- case SIOCSIFMEDIA:
- if (IFM_ETHER != IFM_TYPE (*media))
- return EINVAL;
-
- if (info->mdio_r (phy, uarg, MII_BMSR, &bmsr))
- return EINVAL;
-
- tmp = (IFM_FDX & *media);
-
- switch (IFM_SUBTYPE (*media)) {
- default:
- return ENOTSUP;
-
- case IFM_AUTO:
- bmcr = BMCR_AUTOEN | BMCR_STARTNEG;
- tmp = 0;
- break;
-
- case IFM_1000_T:
- if (!info->has_gmii)
- return ENOTSUP;
-
- if (info->mdio_r (phy, uarg, MII_EXTSR, &bmsr2))
- return EINVAL;
-
- if (!(bmsr2 & (tmp ? EXTSR_1000TFDX : EXTSR_1000THDX)))
- return EOPNOTSUPP;
-
- /* NOTE: gige standard demands auto-negotiation for gige links.
- * Disabling autoneg did NOT work on the PHYs I tried
- * (BCM5421S, intel 82540).
- * I've seen drivers that simply change what they advertise
- * to the desired gig mode and re-negotiate.
- * We could do that here, too, but we don't see the point -
- * If autoneg works fine then we can as well use it.
- */
- bmcr = BMCR_S1000;
- break;
-
- case IFM_100_TX:
- if (!(bmsr & (tmp ? BMSR_100TXFDX : BMSR_100TXHDX)))
- return EOPNOTSUPP;
- bmcr = BMCR_S100;
- break;
-
- case IFM_10_T:
- if (!(bmsr & (tmp ? BMSR_10TFDX : BMSR_10THDX)))
- return EOPNOTSUPP;
- bmcr = BMCR_S10;
- break;
- }
-
- if (tmp)
- bmcr |= BMCR_FDX;
-
- if (info->mdio_w (phy, uarg, MII_BMCR, bmcr))
- return EINVAL;
-
- /* TODO: should we adapt advertised capabilites ? */
-
- break;
- }
-
- return 0;
-}