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 16 struct 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 23 void 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 */ 41 static 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 53 void 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 64 void 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 75 u8 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 86 void 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 96 struct 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 106 void 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 116 int 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 126 void 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 136 struct 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 146 phy_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