1/* 2 * Copyright (C) 2015 Freescale Semiconductor 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7#include <common.h> 8#include <asm/io.h> 9#include <asm/types.h> 10#include <malloc.h> 11#include <net.h> 12#include <linux/compat.h> 13#include <asm/arch/fsl_serdes.h> 14#include <fsl-mc/ldpaa_wriop.h> 15 16struct wriop_dpmac_info dpmac_info[NUM_WRIOP_PORTS]; 17 18__weak phy_interface_t wriop_dpmac_enet_if(int dpmac_id, int lane_prtc) 19{ 20 return PHY_INTERFACE_MODE_NONE; 21} 22 23void wriop_init_dpmac(int sd, int dpmac_id, int lane_prtcl) 24{ 25 phy_interface_t enet_if; 26 27 dpmac_info[dpmac_id].enabled = 0; 28 dpmac_info[dpmac_id].id = 0; 29 dpmac_info[dpmac_id].phy_addr = -1; 30 dpmac_info[dpmac_id].enet_if = PHY_INTERFACE_MODE_NONE; 31 32 enet_if = wriop_dpmac_enet_if(dpmac_id, lane_prtcl); 33 if (enet_if != PHY_INTERFACE_MODE_NONE) { 34 dpmac_info[dpmac_id].enabled = 1; 35 dpmac_info[dpmac_id].id = dpmac_id; 36 dpmac_info[dpmac_id].enet_if = enet_if; 37 } 38} 39 40/*TODO what it do */ 41static int wriop_dpmac_to_index(int dpmac_id) 42{ 43 int i; 44 45 for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) { 46 if (dpmac_info[i].id == dpmac_id) 47 return i; 48 } 49 50 return -1; 51} 52 53void wriop_disable_dpmac(int dpmac_id) 54{ 55 int i = wriop_dpmac_to_index(dpmac_id); 56 57 if (i == -1) 58 return; 59 60 dpmac_info[i].enabled = 0; 61 wriop_dpmac_disable(dpmac_id); 62} 63 64void wriop_enable_dpmac(int dpmac_id) 65{ 66 int i = wriop_dpmac_to_index(dpmac_id); 67 68 if (i == -1) 69 return; 70 71 dpmac_info[i].enabled = 1; 72 wriop_dpmac_enable(dpmac_id); 73} 74 75u8 wriop_is_enabled_dpmac(int dpmac_id) 76{ 77 int i = wriop_dpmac_to_index(dpmac_id); 78 79 if (i == -1) 80 return -1; 81 82 return dpmac_info[i].enabled; 83} 84 85 86void wriop_set_mdio(int dpmac_id, struct mii_dev *bus) 87{ 88 int i = wriop_dpmac_to_index(dpmac_id); 89 90 if (i == -1) 91 return; 92 93 dpmac_info[i].bus = bus; 94} 95 96struct mii_dev *wriop_get_mdio(int dpmac_id) 97{ 98 int i = wriop_dpmac_to_index(dpmac_id); 99 100 if (i == -1) 101 return NULL; 102 103 return dpmac_info[i].bus; 104} 105 106void wriop_set_phy_address(int dpmac_id, int address) 107{ 108 int i = wriop_dpmac_to_index(dpmac_id); 109 110 if (i == -1) 111 return; 112 113 dpmac_info[i].phy_addr = address; 114} 115 116int wriop_get_phy_address(int dpmac_id) 117{ 118 int i = wriop_dpmac_to_index(dpmac_id); 119 120 if (i == -1) 121 return -1; 122 123 return dpmac_info[i].phy_addr; 124} 125 126void wriop_set_phy_dev(int dpmac_id, struct phy_device *phydev) 127{ 128 int i = wriop_dpmac_to_index(dpmac_id); 129 130 if (i == -1) 131 return; 132 133 dpmac_info[i].phydev = phydev; 134} 135 136struct phy_device *wriop_get_phy_dev(int dpmac_id) 137{ 138 int i = wriop_dpmac_to_index(dpmac_id); 139 140 if (i == -1) 141 return NULL; 142 143 return dpmac_info[i].phydev; 144} 145 146phy_interface_t wriop_get_enet_if(int dpmac_id) 147{ 148 int i = wriop_dpmac_to_index(dpmac_id); 149 150 if (i == -1) 151 return PHY_INTERFACE_MODE_NONE; 152 153 if (dpmac_info[i].enabled) 154 return dpmac_info[i].enet_if; 155 156 return PHY_INTERFACE_MODE_NONE; 157} 158