77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0+
 | |
| /* Copyright (c) Tehuti Networks Ltd. */
 | |
| 
 | |
| #include <linux/netdevice.h>
 | |
| #include <linux/pci.h>
 | |
| #include <linux/phylink.h>
 | |
| 
 | |
| #include "tn40.h"
 | |
| 
 | |
| static struct tn40_priv *tn40_config_to_priv(struct phylink_config *config)
 | |
| {
 | |
| 	return container_of(config, struct tn40_priv, phylink_config);
 | |
| }
 | |
| 
 | |
| static void tn40_link_up(struct phylink_config *config, struct phy_device *phy,
 | |
| 			 unsigned int mode, phy_interface_t interface,
 | |
| 			 int speed, int duplex, bool tx_pause, bool rx_pause)
 | |
| {
 | |
| 	struct tn40_priv *priv = tn40_config_to_priv(config);
 | |
| 
 | |
| 	tn40_set_link_speed(priv, speed);
 | |
| 	netif_wake_queue(priv->ndev);
 | |
| }
 | |
| 
 | |
| static void tn40_link_down(struct phylink_config *config, unsigned int mode,
 | |
| 			   phy_interface_t interface)
 | |
| {
 | |
| 	struct tn40_priv *priv = tn40_config_to_priv(config);
 | |
| 
 | |
| 	netif_stop_queue(priv->ndev);
 | |
| 	tn40_set_link_speed(priv, 0);
 | |
| }
 | |
| 
 | |
| static void tn40_mac_config(struct phylink_config *config, unsigned int mode,
 | |
| 			    const struct phylink_link_state *state)
 | |
| {
 | |
| }
 | |
| 
 | |
| static const struct phylink_mac_ops tn40_mac_ops = {
 | |
| 	.mac_config = tn40_mac_config,
 | |
| 	.mac_link_up = tn40_link_up,
 | |
| 	.mac_link_down = tn40_link_down,
 | |
| };
 | |
| 
 | |
| int tn40_phy_register(struct tn40_priv *priv)
 | |
| {
 | |
| 	struct phylink_config *config;
 | |
| 	struct phy_device *phydev;
 | |
| 	struct phylink *phylink;
 | |
| 
 | |
| 	phydev = phy_find_first(priv->mdio);
 | |
| 	if (!phydev) {
 | |
| 		dev_err(&priv->pdev->dev, "PHY isn't found\n");
 | |
| 		return -ENODEV;
 | |
| 	}
 | |
| 
 | |
| 	config = &priv->phylink_config;
 | |
| 	config->dev = &priv->ndev->dev;
 | |
| 	config->type = PHYLINK_NETDEV;
 | |
| 	config->mac_capabilities = MAC_10000FD;
 | |
| 	__set_bit(PHY_INTERFACE_MODE_XAUI, config->supported_interfaces);
 | |
| 
 | |
| 	phylink = phylink_create(config, NULL, PHY_INTERFACE_MODE_XAUI,
 | |
| 				 &tn40_mac_ops);
 | |
| 	if (IS_ERR(phylink))
 | |
| 		return PTR_ERR(phylink);
 | |
| 
 | |
| 	priv->phydev = phydev;
 | |
| 	priv->phylink = phylink;
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| void tn40_phy_unregister(struct tn40_priv *priv)
 | |
| {
 | |
| 	phylink_destroy(priv->phylink);
 | |
| }
 |