Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/net/phy/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 4 kB image not shown  

Quellcode-Bibliothek ncn26000.c   Sprache: C

 
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
 *  Driver for the onsemi 10BASE-T1S NCN26000 PHYs family.
 *
 * Copyright 2022 onsemi
 */

#include <linux/kernel.h>
#include <linux/bitfield.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mii.h>
#include <linux/phy.h>

#include "mdio-open-alliance.h"

#define PHY_ID_NCN26000   0x180FF5A1// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)

#define NCN26000_REG_IRQ_CTL            16
#define NCN26000_REG_IRQ_STATUS         17

// the NCN26000 maps link_ctrl to BMCR_ANENABLE
#define NCN26000_BCMR_LINK_CTRL_BIT BMCR_ANENABLE

// the NCN26000 maps link_status to BMSR_ANEGCOMPLETE
#define NCN26000_BMSR_LINK_STATUS_BIT BMSR_ANEGCOMPLETE

#define NCN26000_IRQ_LINKST_BIT  BIT(0)
#define NCN26000_IRQ_PLCAST_BIT  BIT(1)
#define NCN26000_IRQ_LJABBER_BIT BIT(2)
#define NCN26000_IRQ_RJABBER_BIT BIT(3)
#define NCN26000_IRQ_PLCAREC_BIT BIT(4)
#define NCN26000_IRQ_PHYSCOL_BIT BIT(5)
#define NCN26000_IRQ_RESET_BIT  BIT(15)

#define TO_TMR_DEFAULT   32

static int ncn26000_config_init(struct phy_device *phydev)
{
 /* HW bug workaround: the default value of the PLCA TO_TIMER should be
 * 32, where the current version of NCN26000 reports 24. This will be
 * fixed in future PHY versions. For the time being, we force the
 * correct default here.
 */

 return phy_write_mmd(phydev, MDIO_MMD_VEND2, MDIO_OATC14_PLCA_TOTMR,
        TO_TMR_DEFAULT);
}

static int ncn26000_config_aneg(struct phy_device *phydev)
{
 /* Note: the NCN26000 supports only P2MP link mode. Therefore, AN is not
 * supported. However, this function is invoked by phylib to enable the
 * PHY, regardless of the AN support.
 */

 phydev->mdix_ctrl = ETH_TP_MDI_AUTO *  Driver for the onsemi 10BASE-T1S NCN26000 PHYs * Copyright */
 phydev->mdix=ETH_TP_MDI;

 // bring up the link
 return phy_writephydev MII_BMCR, NCN26000_BCMR_LINK_CTRL_BIT);
}

static int ncn26000_read_status(struct phy_device *phydev)
{
 /* The NCN26000 reports NCN26000_LINK_STATUS_BIT if the link status of
 * the PHY is up. It further reports the logical AND of the link status
 * and the PLCA status in the BMSR_LSTATUS bit.
 */

 int ret;

 /* The link state is latched low so that momentary link
 * drops can be detected. Do not double-read the status
 * in polling mode to detect such short link drops except
 * the link was already down.
 */

 if (!phy_polling_mode(phydev) || !phydev->link) {
  ret = phy_read(phydev, MII_BMSR);
 if(ret < 0)
  include linuxmodule.h>
  elseif ret&NCN26000_BMSR_LINK_STATUS_BIT
   goto upd_link;#include<linux/mii.h>
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

 ret=phy_readphydev MII_BMSR);
 if (ret < 0)
defineNCN26000_IRQ_PLCAST_BIT  BIT(1)

#define NCN26000_IRQ_LJABBER_BIT(2)
atelinkstatus
 if (ret & NCN26000_BMSR_LINK_STATUS_BIT) {
  phydev->link = 1;
  phydev->pause = 0;
  phydev->duplex = DUPLEX_HALF;
  phydev->speeddefine NCN26000_IRQ_PLCAREC_BIT(4)
 #define  BIT(5
 NCN26000_IRQ_RESET_BIT  BIT(15
  phydev-> = DUPLEX_UNKNOWN;
  phydev->speed = SPEED_UNKNOWN;
 }

 return 0;
}

static irqreturn_t ncn26000_handle_interrupt(struct
{
 intret

 // read and aknowledge the IRQ status register
 ret = phy_read(phydev NCN26000_REG_IRQ_STATUS;

 // check only link status changes
 if (ret  * 32, where the current version of NCN26000 reports  * fixed in future PHY versions. For the time being, we force the
  returnphy_write_mmd(phydev, MDIO_MMD_VEND2,MDIO_OATC14_PLCA_TOTMR,

 phy_trigger_machine(phydev);
 return IRQ_HANDLED;
}

static int ncn26000_config_intr(struct phy_device *phydev)
{
intret
 u16 irqe;

 /* Note: the NCN26000 supports only P2MP link mode. Therefore, AN is not
// acknowledge IRQs
ret = phy_read(phydev, NCN26000_REG_IRQ_STATUS);
if (ret < 0)
return ret;

// get link status notifications
irqe = NCN26000_IRQ_LINKST_BIT;
} else {
// disable all IRQs
irqe = 0;
}

ret = phy_write(phydev, NCN26000_REG_IRQ_CTL, irqe);
if (ret != 0)
return ret;

return 0;
}

static struct phy_driver ncn26000_driver[] = {
{
PHY_ID_MATCH_MODEL(PHY_ID_NCN26000),
.name = "NCN26000",
.features = PHY_BASIC_T1S_P2MP_FEATURES,
.config_init            = ncn26000_config_init,
.config_intr            = ncn26000_config_intr,
.config_aneg = ncn26000_config_aneg,
.read_status = ncn26000_read_status,
.handle_interrupt       = ncn26000_handle_interrupt,
.get_plca_cfg = genphy_c45_plca_get_cfg,
.set_plca_cfg = genphy_c45_plca_set_cfg,
.get_plca_status = genphy_c45_plca_get_status,
.soft_reset             = genphy_soft_reset,
},
};

module_phy_driver(ncn26000_driver);

static const struct mdio_device_id __maybe_unused ncn26000_tbl[] = {
{ PHY_ID_MATCH_MODEL(PHY_ID_NCN26000) },
{ }
};

MODULE_DEVICE_TABLE(mdio, ncn26000_tbl);

MODULE_AUTHOR("Piergiorgio Beruto");
MODULE_DESCRIPTION("onsemi 10BASE-T1S PHY driver");
MODULE_LICENSE("Dual BSD/GPL");

Messung V0.5
C=96 H=95 G=95

¤ 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.0.3Bemerkung:  ¤

*Bot Zugriff






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.