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