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 26 dpmac_info[dpmac_id].enabled = 0; 27 dpmac_info[dpmac_id].id = 0; 28 dpmac_info[dpmac_id].phy_addr = -1; 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 } 38 39 void wriop_init_dpmac_enet_if(int dpmac_id, phy_interface_t enet_if) 40 { 41 dpmac_info[dpmac_id].enabled = 1; 42 dpmac_info[dpmac_id].id = dpmac_id; 43 dpmac_info[dpmac_id].phy_addr = -1; 44 dpmac_info[dpmac_id].enet_if = enet_if; 45 } 46 47 48 /*TODO what it do */ 49 static int wriop_dpmac_to_index(int dpmac_id) 50 { 51 int i; 52 53 for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) { 54 if (dpmac_info[i].id == dpmac_id) 55 return i; 56 } 57 58 return -1; 59 } 60 61 void wriop_disable_dpmac(int dpmac_id) 62 { 63 int i = wriop_dpmac_to_index(dpmac_id); 64 65 if (i == -1) 66 return; 67 68 dpmac_info[i].enabled = 0; 69 wriop_dpmac_disable(dpmac_id); 70 } 71 72 void wriop_enable_dpmac(int dpmac_id) 73 { 74 int i = wriop_dpmac_to_index(dpmac_id); 75 76 if (i == -1) 77 return; 78 79 dpmac_info[i].enabled = 1; 80 wriop_dpmac_enable(dpmac_id); 81 } 82 83 u8 wriop_is_enabled_dpmac(int dpmac_id) 84 { 85 int i = wriop_dpmac_to_index(dpmac_id); 86 87 if (i == -1) 88 return -1; 89 90 return dpmac_info[i].enabled; 91 } 92 93 94 void wriop_set_mdio(int dpmac_id, struct mii_dev *bus) 95 { 96 int i = wriop_dpmac_to_index(dpmac_id); 97 98 if (i == -1) 99 return; 100 101 dpmac_info[i].bus = bus; 102 } 103 104 struct mii_dev *wriop_get_mdio(int dpmac_id) 105 { 106 int i = wriop_dpmac_to_index(dpmac_id); 107 108 if (i == -1) 109 return NULL; 110 111 return dpmac_info[i].bus; 112 } 113 114 void wriop_set_phy_address(int dpmac_id, int address) 115 { 116 int i = wriop_dpmac_to_index(dpmac_id); 117 118 if (i == -1) 119 return; 120 121 dpmac_info[i].phy_addr = address; 122 } 123 124 int wriop_get_phy_address(int dpmac_id) 125 { 126 int i = wriop_dpmac_to_index(dpmac_id); 127 128 if (i == -1) 129 return -1; 130 131 return dpmac_info[i].phy_addr; 132 } 133 134 void wriop_set_phy_dev(int dpmac_id, struct phy_device *phydev) 135 { 136 int i = wriop_dpmac_to_index(dpmac_id); 137 138 if (i == -1) 139 return; 140 141 dpmac_info[i].phydev = phydev; 142 } 143 144 struct phy_device *wriop_get_phy_dev(int dpmac_id) 145 { 146 int i = wriop_dpmac_to_index(dpmac_id); 147 148 if (i == -1) 149 return NULL; 150 151 return dpmac_info[i].phydev; 152 } 153 154 phy_interface_t wriop_get_enet_if(int dpmac_id) 155 { 156 int i = wriop_dpmac_to_index(dpmac_id); 157 158 if (i == -1) 159 return PHY_INTERFACE_MODE_NONE; 160 161 if (dpmac_info[i].enabled) 162 return dpmac_info[i].enet_if; 163 164 return PHY_INTERFACE_MODE_NONE; 165 } 166