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