Lines Matching +full:interface +full:- +full:node
1 // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
7 #include "dpaa2-eth.h"
8 #include "dpaa2-mac.h"
34 return -EINVAL; in phy_mode()
48 fwnode = dev_fwnode(dev->parent); in dpaa2_mac_get_node()
59 err = -EINVAL; in dpaa2_mac_get_node()
94 phy_interface_t interface) in dpaa2_mac_phy_mode_mismatch() argument
96 switch (interface) { in dpaa2_mac_phy_mode_mismatch()
97 /* We can switch between SGMII and 1000BASE-X at runtime with in dpaa2_mac_phy_mode_mismatch()
98 * pcs-lynx in dpaa2_mac_phy_mode_mismatch()
102 if (mac->pcs && in dpaa2_mac_phy_mode_mismatch()
103 (mac->if_mode == PHY_INTERFACE_MODE_SGMII || in dpaa2_mac_phy_mode_mismatch()
104 mac->if_mode == PHY_INTERFACE_MODE_1000BASEX)) in dpaa2_mac_phy_mode_mismatch()
106 return interface != mac->if_mode; in dpaa2_mac_phy_mode_mismatch()
115 return (interface != mac->if_mode); in dpaa2_mac_phy_mode_mismatch()
128 if (state->interface != PHY_INTERFACE_MODE_NA && in dpaa2_mac_validate()
129 dpaa2_mac_phy_mode_mismatch(mac, state->interface)) { in dpaa2_mac_validate()
138 switch (state->interface) { in dpaa2_mac_validate()
143 if (state->interface == PHY_INTERFACE_MODE_10GBASER) in dpaa2_mac_validate()
157 if (state->interface == PHY_INTERFACE_MODE_1000BASEX) in dpaa2_mac_validate()
167 linkmode_and(state->advertising, state->advertising, mask); in dpaa2_mac_validate()
179 struct dpmac_link_state *dpmac_state = &mac->state; in dpaa2_mac_config()
182 if (state->an_enabled) in dpaa2_mac_config()
183 dpmac_state->options |= DPMAC_LINK_OPT_AUTONEG; in dpaa2_mac_config()
185 dpmac_state->options &= ~DPMAC_LINK_OPT_AUTONEG; in dpaa2_mac_config()
187 err = dpmac_set_link_state(mac->mc_io, 0, in dpaa2_mac_config()
188 mac->mc_dev->mc_handle, dpmac_state); in dpaa2_mac_config()
190 netdev_err(mac->net_dev, "%s: dpmac_set_link_state() = %d\n", in dpaa2_mac_config()
196 unsigned int mode, phy_interface_t interface, in dpaa2_mac_link_up() argument
201 struct dpmac_link_state *dpmac_state = &mac->state; in dpaa2_mac_link_up()
204 dpmac_state->up = 1; in dpaa2_mac_link_up()
206 dpmac_state->rate = speed; in dpaa2_mac_link_up()
209 dpmac_state->options |= DPMAC_LINK_OPT_HALF_DUPLEX; in dpaa2_mac_link_up()
211 dpmac_state->options &= ~DPMAC_LINK_OPT_HALF_DUPLEX; in dpaa2_mac_link_up()
214 dpmac_state->options |= DPMAC_LINK_OPT_PAUSE; in dpaa2_mac_link_up()
216 dpmac_state->options &= ~DPMAC_LINK_OPT_PAUSE; in dpaa2_mac_link_up()
219 dpmac_state->options |= DPMAC_LINK_OPT_ASYM_PAUSE; in dpaa2_mac_link_up()
221 dpmac_state->options &= ~DPMAC_LINK_OPT_ASYM_PAUSE; in dpaa2_mac_link_up()
223 err = dpmac_set_link_state(mac->mc_io, 0, in dpaa2_mac_link_up()
224 mac->mc_dev->mc_handle, dpmac_state); in dpaa2_mac_link_up()
226 netdev_err(mac->net_dev, "%s: dpmac_set_link_state() = %d\n", in dpaa2_mac_link_up()
232 phy_interface_t interface) in dpaa2_mac_link_down() argument
235 struct dpmac_link_state *dpmac_state = &mac->state; in dpaa2_mac_link_down()
238 dpmac_state->up = 0; in dpaa2_mac_link_down()
239 err = dpmac_set_link_state(mac->mc_io, 0, in dpaa2_mac_link_down()
240 mac->mc_dev->mc_handle, dpmac_state); in dpaa2_mac_link_down()
242 netdev_err(mac->net_dev, "dpmac_set_link_state() = %d\n", err); in dpaa2_mac_link_down()
257 struct fwnode_handle *node; in dpaa2_pcs_create() local
259 node = fwnode_find_reference(dpmac_node, "pcs-handle", 0); in dpaa2_pcs_create()
260 if (IS_ERR(node)) { in dpaa2_pcs_create()
262 netdev_warn(mac->net_dev, "pcs-handle node not found\n"); in dpaa2_pcs_create()
266 if (!fwnode_device_is_available(node)) { in dpaa2_pcs_create()
267 netdev_err(mac->net_dev, "pcs-handle node not available\n"); in dpaa2_pcs_create()
268 fwnode_handle_put(node); in dpaa2_pcs_create()
269 return -ENODEV; in dpaa2_pcs_create()
272 mdiodev = fwnode_mdio_find_device(node); in dpaa2_pcs_create()
273 fwnode_handle_put(node); in dpaa2_pcs_create()
275 return -EPROBE_DEFER; in dpaa2_pcs_create()
277 mac->pcs = lynx_pcs_create(mdiodev); in dpaa2_pcs_create()
278 if (!mac->pcs) { in dpaa2_pcs_create()
279 netdev_err(mac->net_dev, "lynx_pcs_create() failed\n"); in dpaa2_pcs_create()
280 put_device(&mdiodev->dev); in dpaa2_pcs_create()
281 return -ENOMEM; in dpaa2_pcs_create()
289 struct lynx_pcs *pcs = mac->pcs; in dpaa2_pcs_destroy()
292 struct device *dev = &pcs->mdio->dev; in dpaa2_pcs_destroy()
295 mac->pcs = NULL; in dpaa2_pcs_destroy()
301 struct net_device *net_dev = mac->net_dev; in dpaa2_mac_connect()
306 mac->if_link_type = mac->attr.link_type; in dpaa2_mac_connect()
308 dpmac_node = mac->fw_node; in dpaa2_mac_connect()
310 netdev_err(net_dev, "No dpmac@%d node found.\n", mac->attr.id); in dpaa2_mac_connect()
311 return -ENODEV; in dpaa2_mac_connect()
314 err = dpaa2_mac_get_if_mode(dpmac_node, mac->attr); in dpaa2_mac_connect()
316 return -EINVAL; in dpaa2_mac_connect()
317 mac->if_mode = err; in dpaa2_mac_connect()
320 * error out if the interface mode requests them and there is no PHY in dpaa2_mac_connect()
324 (mac->if_mode == PHY_INTERFACE_MODE_RGMII_ID || in dpaa2_mac_connect()
325 mac->if_mode == PHY_INTERFACE_MODE_RGMII_RXID || in dpaa2_mac_connect()
326 mac->if_mode == PHY_INTERFACE_MODE_RGMII_TXID)) { in dpaa2_mac_connect()
328 return -EINVAL; in dpaa2_mac_connect()
331 if ((mac->attr.link_type == DPMAC_LINK_TYPE_PHY && in dpaa2_mac_connect()
332 mac->attr.eth_if != DPMAC_ETH_IF_RGMII) || in dpaa2_mac_connect()
333 mac->attr.link_type == DPMAC_LINK_TYPE_BACKPLANE) { in dpaa2_mac_connect()
334 err = dpaa2_pcs_create(mac, dpmac_node, mac->attr.id); in dpaa2_mac_connect()
339 mac->phylink_config.dev = &net_dev->dev; in dpaa2_mac_connect()
340 mac->phylink_config.type = PHYLINK_NETDEV; in dpaa2_mac_connect()
342 phylink = phylink_create(&mac->phylink_config, in dpaa2_mac_connect()
343 dpmac_node, mac->if_mode, in dpaa2_mac_connect()
349 mac->phylink = phylink; in dpaa2_mac_connect()
351 if (mac->pcs) in dpaa2_mac_connect()
352 phylink_set_pcs(mac->phylink, &mac->pcs->pcs); in dpaa2_mac_connect()
354 err = phylink_fwnode_phy_connect(mac->phylink, dpmac_node, 0); in dpaa2_mac_connect()
363 phylink_destroy(mac->phylink); in dpaa2_mac_connect()
372 if (!mac->phylink) in dpaa2_mac_disconnect()
375 phylink_disconnect_phy(mac->phylink); in dpaa2_mac_disconnect()
376 phylink_destroy(mac->phylink); in dpaa2_mac_disconnect()
382 struct fsl_mc_device *dpmac_dev = mac->mc_dev; in dpaa2_mac_open()
383 struct net_device *net_dev = mac->net_dev; in dpaa2_mac_open()
386 err = dpmac_open(mac->mc_io, 0, dpmac_dev->obj_desc.id, in dpaa2_mac_open()
387 &dpmac_dev->mc_handle); in dpaa2_mac_open()
388 if (err || !dpmac_dev->mc_handle) { in dpaa2_mac_open()
390 return -ENODEV; in dpaa2_mac_open()
393 err = dpmac_get_attributes(mac->mc_io, 0, dpmac_dev->mc_handle, in dpaa2_mac_open()
394 &mac->attr); in dpaa2_mac_open()
400 /* Find the device node representing the MAC device and link the device in dpaa2_mac_open()
403 mac->fw_node = dpaa2_mac_get_node(&mac->mc_dev->dev, mac->attr.id); in dpaa2_mac_open()
404 net_dev->dev.of_node = to_of_node(mac->fw_node); in dpaa2_mac_open()
409 dpmac_close(mac->mc_io, 0, dpmac_dev->mc_handle); in dpaa2_mac_open()
415 struct fsl_mc_device *dpmac_dev = mac->mc_dev; in dpaa2_mac_close()
417 dpmac_close(mac->mc_io, 0, dpmac_dev->mc_handle); in dpaa2_mac_close()
418 if (mac->fw_node) in dpaa2_mac_close()
419 fwnode_handle_put(mac->fw_node); in dpaa2_mac_close()
427 [DPMAC_CNT_ING_UCAST_FRAME] = "[mac] rx u-cast",
428 [DPMAC_CNT_ING_BCAST_FRAME] = "[mac] rx b-cast",
429 [DPMAC_CNT_ING_MCAST_FRAME] = "[mac] rx m-cast",
431 [DPMAC_CNT_ING_FRAME_127] = "[mac] rx 65-127 bytes",
432 [DPMAC_CNT_ING_FRAME_255] = "[mac] rx 128-255 bytes",
433 [DPMAC_CNT_ING_FRAME_511] = "[mac] rx 256-511 bytes",
434 [DPMAC_CNT_ING_FRAME_1023] = "[mac] rx 512-1023 bytes",
435 [DPMAC_CNT_ING_FRAME_1518] = "[mac] rx 1024-1518 bytes",
436 [DPMAC_CNT_ING_FRAME_1519_MAX] = "[mac] rx 1519-max bytes",
444 [DPMAC_CNT_EGR_UCAST_FRAME] = "[mac] tx u-cast",
445 [DPMAC_CNT_EGR_MCAST_FRAME] = "[mac] tx m-cast",
446 [DPMAC_CNT_EGR_BCAST_FRAME] = "[mac] tx b-cast",
449 [DPMAC_CNT_EGR_VALID_PAUSE_FRAME] = "[mac] tx b-pause",
473 struct fsl_mc_device *dpmac_dev = mac->mc_dev; in dpaa2_mac_get_ethtool_stats()
478 err = dpmac_get_counter(mac->mc_io, 0, dpmac_dev->mc_handle, in dpaa2_mac_get_ethtool_stats()
481 netdev_err_once(mac->net_dev, in dpaa2_mac_get_ethtool_stats()