Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/drivers/net/ethernet/microchip/lan966x/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 3 kB image not shown  

Quelle  lan966x_phylink.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0+

#include <linux/module.h>
#include <linux/phylink.h>
#include <linux/device.h>
#include <linux/netdevice.h>
#include <linux/phy/phy.h>

#include "lan966x_main.h"

static struct phylink_pcs *lan966x_phylink_mac_select(struct phylink_config *config,
            phy_interface_t interface)
{
 struct lan966x_port *port = netdev_priv(to_net_dev(config->dev));

 return &port->phylink_pcs;
}

static void lan966x_phylink_mac_config(struct phylink_config *config,
           unsigned int mode,
           const struct phylink_link_state *state)
{
}

static int lan966x_phylink_mac_prepare(struct phylink_config *config,
           unsigned int mode,
           phy_interface_t iface)
{
 struct lan966x_port *port = netdev_priv(to_net_dev(config->dev));
 phy_interface_t serdes_mode = iface;
 int err;

 if (port->serdes) {
  err = phy_set_mode_ext(port->serdes, PHY_MODE_ETHERNET,
           serdes_mode);
  if (err) {
   netdev_err(to_net_dev(config->dev),
       "Could not set mode of SerDes\n");
   return err;
  }
 }

 return 0;
}

static void lan966x_phylink_mac_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 lan966x_port *port = netdev_priv(to_net_dev(config->dev));
 struct lan966x_port_config *port_config = &port->config;

 port_config->duplex = duplex;
 port_config->speed = speed;
 port_config->pause = 0;
 port_config->pause |= tx_pause ? MLO_PAUSE_TX : 0;
 port_config->pause |= rx_pause ? MLO_PAUSE_RX : 0;

 if (phy_interface_mode_is_rgmii(interface))
  phy_set_speed(port->serdes, speed);

 lan966x_port_config_up(port);
}

static void lan966x_phylink_mac_link_down(struct phylink_config *config,
       unsigned int mode,
       phy_interface_t interface)
{
 struct lan966x_port *port = netdev_priv(to_net_dev(config->dev));
 struct lan966x *lan966x = port->lan966x;

 lan966x_port_config_down(port);

 /* Take PCS out of reset */
 lan_rmw(DEV_CLOCK_CFG_PCS_RX_RST_SET(0) |
  DEV_CLOCK_CFG_PCS_TX_RST_SET(0),
  DEV_CLOCK_CFG_PCS_RX_RST |
  DEV_CLOCK_CFG_PCS_TX_RST,
  lan966x, DEV_CLOCK_CFG(port->chip_port));
}

static struct lan966x_port *lan966x_pcs_to_port(struct phylink_pcs *pcs)
{
 return container_of(pcs, struct lan966x_port, phylink_pcs);
}

static void lan966x_pcs_get_state(struct phylink_pcs *pcs,
      unsigned int neg_mode,
      struct phylink_link_state *state)
{
 struct lan966x_port *port = lan966x_pcs_to_port(pcs);

 lan966x_port_status_get(port, neg_mode, state);
}

static int lan966x_pcs_config(struct phylink_pcs *pcs, unsigned int neg_mode,
         phy_interface_t interface,
         const unsigned long *advertising,
         bool permit_pause_to_mac)
{
 struct lan966x_port *port = lan966x_pcs_to_port(pcs);
 struct lan966x_port_config config;
 int ret;

 config = port->config;
 config.portmode = interface;
 config.inband = neg_mode & PHYLINK_PCS_NEG_INBAND;
 config.autoneg = neg_mode == PHYLINK_PCS_NEG_INBAND_ENABLED;
 config.advertising = advertising;

 ret = lan966x_port_pcs_set(port, &config);
 if (ret)
  netdev_err(port->dev, "port PCS config failed: %d\n", ret);

 return ret;
}

static void lan966x_pcs_aneg_restart(struct phylink_pcs *pcs)
{
 /* Currently not used */
}

const struct phylink_mac_ops lan966x_phylink_mac_ops = {
 .mac_select_pcs = lan966x_phylink_mac_select,
 .mac_config = lan966x_phylink_mac_config,
 .mac_prepare = lan966x_phylink_mac_prepare,
 .mac_link_down = lan966x_phylink_mac_link_down,
 .mac_link_up = lan966x_phylink_mac_link_up,
};

const struct phylink_pcs_ops lan966x_phylink_pcs_ops = {
 .pcs_get_state = lan966x_pcs_get_state,
 .pcs_config = lan966x_pcs_config,
 .pcs_an_restart = lan966x_pcs_aneg_restart,
};

Messung V0.5
C=91 H=96 G=93

¤ Dauer der Verarbeitung: 0.0 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.