/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * MII overrides for National Semiconductor PHYs. */ #include #include #include #include #include #include "miipriv.h" static int ns83840_reset(phy_handle_t *ph) { /* first do an ordinary reset */ if (phy_reset(ph) != DDI_SUCCESS) { return (DDI_FAILURE); } /* * As per INTEL "PRO/100B Adapter Software Technical Reference * Manual", set bit 10 of MII register 23. National * Semiconductor documentation shows this as "reserved, write * to as zero". We also set the "CIM_DIS" bit, also as * requested by the PRO/100B doc, to disable the carrier * integrity monitor. (That should only ever be used by * repeaters.) * * NetBSD also sets bit 8, without any explanation, so we'll * follow suit. */ PHY_SET(ph, MII_VENDOR(7), (1<<10) | (1<<8) | (1<<5)); return (DDI_SUCCESS); } boolean_t phy_natsemi_probe(phy_handle_t *ph) { /* We could even look at revA vs revC, etc. but there is no need. */ if ((MII_PHY_MFG(ph->phy_id) != MII_OUI_NATIONAL_SEMI) && (MII_PHY_MFG(ph->phy_id) != MII_OUI_NATIONAL_SEMI_2)) { return (B_FALSE); } ph->phy_vendor = "National Semiconductor"; switch (MII_PHY_MODEL(ph->phy_id)) { case MII_MODEL_NATIONAL_SEMI_DP83840: ph->phy_model = "DP83840"; ph->phy_reset = ns83840_reset; return (B_TRUE); case MII_MODEL_NATIONAL_SEMI_DP83843: ph->phy_model = "DP83843"; return (B_TRUE); case MII_MODEL_NATIONAL_SEMI_DP83847: ph->phy_model = "DP83847"; return (B_TRUE); case MII_MODEL_NATIONAL_SEMI_DP83815: ph->phy_model = "DP83815"; return (B_TRUE); } return (B_FALSE); }