1c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas/* 2c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * AMD 10Gb Ethernet driver 3c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 4c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * This file is available to you under your choice of the following two 5c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * licenses: 6c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 7c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * License 1: GPLv2 8c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 9c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * Copyright (c) 2014 Advanced Micro Devices, Inc. 10c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 11c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * This file is free software; you may copy, redistribute and/or modify 12c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * it under the terms of the GNU General Public License as published by 13c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * the Free Software Foundation, either version 2 of the License, or (at 14c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * your option) any later version. 15c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 16c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * This file is distributed in the hope that it will be useful, but 17c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * WITHOUT ANY WARRANTY; without even the implied warranty of 18c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * General Public License for more details. 20c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 21c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * You should have received a copy of the GNU General Public License 22c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * along with this program. If not, see <http://www.gnu.org/licenses/>. 23c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 24c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * This file incorporates work covered by the following copyright and 25c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * permission notice: 26c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * The Synopsys DWC ETHER XGMAC Software Driver and documentation 27c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * (hereinafter "Software") is an unsupported proprietary work of Synopsys, 28c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * Inc. unless otherwise expressly agreed to in writing between Synopsys 29c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * and you. 30c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 31c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * The Software IS NOT an item of Licensed Software or Licensed Product 32c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * under any End User Software License Agreement or Agreement for Licensed 33c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * Product with Synopsys or any supplement thereto. Permission is hereby 34c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * granted, free of charge, to any person obtaining a copy of this software 35c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * annotated with this license and the Software, to deal in the Software 36c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * without restriction, including without limitation the rights to use, 37c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * copy, modify, merge, publish, distribute, sublicense, and/or sell copies 38c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * of the Software, and to permit persons to whom the Software is furnished 39c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * to do so, subject to the following conditions: 40c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 41c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * The above copyright notice and this permission notice shall be included 42c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * in all copies or substantial portions of the Software. 43c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 44c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" 45c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 46c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 47c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 48c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 49c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 50c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 51c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 52c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 53c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 54c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * THE POSSIBILITY OF SUCH DAMAGE. 55c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 56c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 57c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * License 2: Modified BSD 58c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 59c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * Copyright (c) 2014 Advanced Micro Devices, Inc. 60c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * All rights reserved. 61c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 62c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * Redistribution and use in source and binary forms, with or without 63c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * modification, are permitted provided that the following conditions are met: 64c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * * Redistributions of source code must retain the above copyright 65c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * notice, this list of conditions and the following disclaimer. 66c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * * Redistributions in binary form must reproduce the above copyright 67c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * notice, this list of conditions and the following disclaimer in the 68c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * documentation and/or other materials provided with the distribution. 69c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * * Neither the name of Advanced Micro Devices, Inc. nor the 70c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * names of its contributors may be used to endorse or promote products 71c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * derived from this software without specific prior written permission. 72c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 73c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 74c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 75c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 76c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY 77c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 78c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 79c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 80c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 81c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 82c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 83c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 84c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * This file incorporates work covered by the following copyright and 85c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * permission notice: 86c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * The Synopsys DWC ETHER XGMAC Software Driver and documentation 87c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * (hereinafter "Software") is an unsupported proprietary work of Synopsys, 88c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * Inc. unless otherwise expressly agreed to in writing between Synopsys 89c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * and you. 90c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 91c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * The Software IS NOT an item of Licensed Software or Licensed Product 92c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * under any End User Software License Agreement or Agreement for Licensed 93c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * Product with Synopsys or any supplement thereto. Permission is hereby 94c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * granted, free of charge, to any person obtaining a copy of this software 95c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * annotated with this license and the Software, to deal in the Software 96c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * without restriction, including without limitation the rights to use, 97c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * copy, modify, merge, publish, distribute, sublicense, and/or sell copies 98c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * of the Software, and to permit persons to whom the Software is furnished 99c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * to do so, subject to the following conditions: 100c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 101c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * The above copyright notice and this permission notice shall be included 102c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * in all copies or substantial portions of the Software. 103c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * 104c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" 105c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 106c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 107c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 108c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 109c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 110c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 111c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 112c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 113c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 114c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas * THE POSSIBILITY OF SUCH DAMAGE. 115c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas */ 116c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 117c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas#include <linux/module.h> 118c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas#include <linux/kmod.h> 119c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas#include <linux/mdio.h> 120c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas#include <linux/phy.h> 121c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas#include <linux/of.h> 122c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 123c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas#include "xgbe.h" 124c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas#include "xgbe-common.h" 125c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 126c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomasstatic int xgbe_mdio_read(struct mii_bus *mii, int prtad, int mmd_reg) 127c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas{ 128c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas struct xgbe_prv_data *pdata = mii->priv; 129c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas struct xgbe_hw_if *hw_if = &pdata->hw_if; 130c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas int mmd_data; 131c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 132c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas DBGPR_MDIO("-->xgbe_mdio_read: prtad=%#x mmd_reg=%#x\n", 133c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas prtad, mmd_reg); 134c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 135c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mmd_data = hw_if->read_mmd_regs(pdata, prtad, mmd_reg); 136c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 137c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas DBGPR_MDIO("<--xgbe_mdio_read: mmd_data=%#x\n", mmd_data); 138c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 139c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas return mmd_data; 140c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas} 141c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 142c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomasstatic int xgbe_mdio_write(struct mii_bus *mii, int prtad, int mmd_reg, 143c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas u16 mmd_val) 144c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas{ 145c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas struct xgbe_prv_data *pdata = mii->priv; 146c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas struct xgbe_hw_if *hw_if = &pdata->hw_if; 147c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas int mmd_data = mmd_val; 148c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 149c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas DBGPR_MDIO("-->xgbe_mdio_write: prtad=%#x mmd_reg=%#x mmd_data=%#x\n", 150c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas prtad, mmd_reg, mmd_data); 151c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 152c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas hw_if->write_mmd_regs(pdata, prtad, mmd_reg, mmd_data); 153c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 154c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas DBGPR_MDIO("<--xgbe_mdio_write\n"); 155c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 156c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas return 0; 157c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas} 158c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 159c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomasvoid xgbe_dump_phy_registers(struct xgbe_prv_data *pdata) 160c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas{ 161c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas struct device *dev = pdata->dev; 162c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas struct phy_device *phydev = pdata->mii->phy_map[XGBE_PRTAD]; 163c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas int i; 164c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 165c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "\n************* PHY Reg dump **********************\n"); 166c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 167c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "PCS Control Reg (%#04x) = %#04x\n", MDIO_CTRL1, 168c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1)); 169c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "PCS Status Reg (%#04x) = %#04x\n", MDIO_STAT1, 170c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1)); 171c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "Phy Id (PHYS ID 1 %#04x)= %#04x\n", MDIO_DEVID1, 172c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVID1)); 173c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "Phy Id (PHYS ID 2 %#04x)= %#04x\n", MDIO_DEVID2, 174c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVID2)); 175c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "Devices in Package (%#04x)= %#04x\n", MDIO_DEVS1, 176c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVS1)); 177c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "Devices in Package (%#04x)= %#04x\n", MDIO_DEVS2, 178c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_DEVS2)); 179c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 180c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "Auto-Neg Control Reg (%#04x) = %#04x\n", MDIO_CTRL1, 181c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_CTRL1)); 182c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "Auto-Neg Status Reg (%#04x) = %#04x\n", MDIO_STAT1, 183c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_STAT1)); 184c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "Auto-Neg Ad Reg 1 (%#04x) = %#04x\n", 185c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas MDIO_AN_ADVERTISE, 186c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE)); 187c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "Auto-Neg Ad Reg 2 (%#04x) = %#04x\n", 188c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas MDIO_AN_ADVERTISE + 1, 189c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 1)); 190c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "Auto-Neg Ad Reg 3 (%#04x) = %#04x\n", 191c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas MDIO_AN_ADVERTISE + 2, 192c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_ADVERTISE + 2)); 193c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "Auto-Neg Completion Reg (%#04x) = %#04x\n", 194c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas MDIO_AN_COMP_STAT, 195c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_AN_COMP_STAT)); 196c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 197c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "MMD Device Mask = %#x\n", 198c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas phydev->c45_ids.devices_in_package); 199c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas for (i = 0; i < ARRAY_SIZE(phydev->c45_ids.device_ids); i++) 200c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, " MMD %d: ID = %#08x\n", i, 201c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas phydev->c45_ids.device_ids[i]); 202c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 203c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_alert(dev, "\n*************************************************\n"); 204c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas} 205c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 206c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomasint xgbe_mdio_register(struct xgbe_prv_data *pdata) 207c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas{ 208c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas struct device_node *phy_node; 209c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas struct mii_bus *mii; 210c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas struct phy_device *phydev; 211c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas int ret = 0; 212c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 213c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas DBGPR("-->xgbe_mdio_register\n"); 214c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 215c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas /* Retrieve the phy-handle */ 216c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas phy_node = of_parse_phandle(pdata->dev->of_node, "phy-handle", 0); 217c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas if (!phy_node) { 218c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_err(pdata->dev, "unable to parse phy-handle\n"); 219c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas return -EINVAL; 220c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas } 221c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 222c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mii = mdiobus_alloc(); 223c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas if (mii == NULL) { 224c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_err(pdata->dev, "mdiobus_alloc failed\n"); 225c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas ret = -ENOMEM; 226c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas goto err_node_get; 227c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas } 228c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 229c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas /* Register on the MDIO bus (don't probe any PHYs) */ 230c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mii->name = XGBE_PHY_NAME; 231c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mii->read = xgbe_mdio_read; 232c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mii->write = xgbe_mdio_write; 233c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas snprintf(mii->id, sizeof(mii->id), "%s", pdata->mii_bus_id); 234c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mii->priv = pdata; 235c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mii->phy_mask = ~0; 236c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mii->parent = pdata->dev; 237c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas ret = mdiobus_register(mii); 238c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas if (ret) { 239c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_err(pdata->dev, "mdiobus_register failed\n"); 240c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas goto err_mdiobus_alloc; 241c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas } 242c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas DBGPR(" mdiobus_register succeeded for %s\n", pdata->mii_bus_id); 243c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 244c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas /* Probe the PCS using Clause 45 */ 245c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas phydev = get_phy_device(mii, XGBE_PRTAD, true); 246c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas if (IS_ERR(phydev) || !phydev || 247c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas !phydev->c45_ids.device_ids[MDIO_MMD_PCS]) { 248c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_err(pdata->dev, "get_phy_device failed\n"); 249c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas ret = phydev ? PTR_ERR(phydev) : -ENOLINK; 250c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas goto err_mdiobus_register; 251c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas } 252c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, 253c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas MDIO_ID_ARGS(phydev->c45_ids.device_ids[MDIO_MMD_PCS])); 254c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 255c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas of_node_get(phy_node); 256c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas phydev->dev.of_node = phy_node; 257c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas ret = phy_device_register(phydev); 258c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas if (ret) { 259c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_err(pdata->dev, "phy_device_register failed\n"); 260c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas of_node_put(phy_node); 261c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas goto err_phy_device; 262c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas } 263c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 264c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas /* Add a reference to the PHY driver so it can't be unloaded */ 265c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas pdata->phy_module = phydev->dev.driver ? 266c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas phydev->dev.driver->owner : NULL; 267c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas if (!try_module_get(pdata->phy_module)) { 268c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas dev_err(pdata->dev, "try_module_get failed\n"); 269c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas ret = -EIO; 270c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas goto err_phy_device; 271c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas } 272c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 273c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas pdata->mii = mii; 274c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas pdata->mdio_mmd = MDIO_MMD_PCS; 275c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 276c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas phydev->autoneg = pdata->default_autoneg; 277c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas if (phydev->autoneg == AUTONEG_DISABLE) { 278c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas phydev->speed = pdata->default_speed; 279c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas phydev->duplex = DUPLEX_FULL; 280c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 281c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas phydev->advertising &= ~ADVERTISED_Autoneg; 282c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas } 283c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 284c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas pdata->phydev = phydev; 285c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 286c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas of_node_put(phy_node); 287c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 288c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas DBGPHY_REGS(pdata); 289c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 290c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas DBGPR("<--xgbe_mdio_register\n"); 291c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 292c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas return 0; 293c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 294c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomaserr_phy_device: 295c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas phy_device_free(phydev); 296c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 297c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomaserr_mdiobus_register: 298c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mdiobus_unregister(mii); 299c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 300c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomaserr_mdiobus_alloc: 301c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mdiobus_free(mii); 302c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 303c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomaserr_node_get: 304c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas of_node_put(phy_node); 305c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 306c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas return ret; 307c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas} 308c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 309c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomasvoid xgbe_mdio_unregister(struct xgbe_prv_data *pdata) 310c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas{ 311c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas DBGPR("-->xgbe_mdio_unregister\n"); 312c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 313c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas pdata->phydev = NULL; 314c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 315c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas module_put(pdata->phy_module); 316c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas pdata->phy_module = NULL; 317c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 318c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mdiobus_unregister(pdata->mii); 319c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas pdata->mii->priv = NULL; 320c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 321c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas mdiobus_free(pdata->mii); 322c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas pdata->mii = NULL; 323c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas 324c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas DBGPR("<--xgbe_mdio_unregister\n"); 325c5aa9e3b815645e3aad08444c91ca6b237eeea01Lendacky, Thomas} 326