cregit-Linux how code gets into the kernel

Release 4.16 drivers/net/phy/realtek.c

Directory: drivers/net/phy
/*
 * drivers/net/phy/realtek.c
 *
 * Driver for Realtek PHYs
 *
 * Author: Johnson Leung <r58129@freescale.com>
 *
 * Copyright (c) 2004 Freescale Semiconductor, Inc.
 *
 * This program is free software; you can redistribute  it and/or modify it
 * under  the terms of  the GNU General  Public License as published by the
 * Free Software Foundation;  either version 2 of the  License, or (at your
 * option) any later version.
 *
 */
#include <linux/bitops.h>
#include <linux/phy.h>
#include <linux/module.h>


#define RTL821x_PHYSR				0x11

#define RTL821x_PHYSR_DUPLEX			BIT(13)

#define RTL821x_PHYSR_SPEED			GENMASK(15, 14)


#define RTL821x_INER				0x12

#define RTL8211B_INER_INIT			0x6400

#define RTL8211E_INER_LINK_STATUS		BIT(10)

#define RTL8211F_INER_LINK_STATUS		BIT(4)


#define RTL821x_INSR				0x13


#define RTL821x_PAGE_SELECT			0x1f


#define RTL8211F_INSR				0x1d


#define RTL8211F_TX_DELAY			BIT(8)


#define RTL8201F_ISR				0x1e

#define RTL8201F_IER				0x13

MODULE_DESCRIPTION("Realtek PHY driver");
MODULE_AUTHOR("Johnson Leung");
MODULE_LICENSE("GPL");


static int rtl821x_read_page(struct phy_device *phydev) { return __phy_read(phydev, RTL821x_PAGE_SELECT); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Blumenstingl1789.47%150.00%
Heiner Kallweit210.53%150.00%
Total19100.00%2100.00%


static int rtl821x_write_page(struct phy_device *phydev, int page) { return __phy_write(phydev, RTL821x_PAGE_SELECT, page); }

Contributors

PersonTokensPropCommitsCommitProp
Martin Blumenstingl2083.33%150.00%
Heiner Kallweit416.67%150.00%
Total24100.00%2100.00%


static int rtl8201_ack_interrupt(struct phy_device *phydev) { int err; err = phy_read(phydev, RTL8201F_ISR); return (err < 0) ? err : 0; }

Contributors

PersonTokensPropCommitsCommitProp
Jassi Brar34100.00%1100.00%
Total34100.00%1100.00%


static int rtl821x_ack_interrupt(struct phy_device *phydev) { int err; err = phy_read(phydev, RTL821x_INSR); return (err < 0) ? err : 0; }

Contributors

PersonTokensPropCommitsCommitProp
Johnson Leung34100.00%1100.00%
Total34100.00%1100.00%


static int rtl8211f_ack_interrupt(struct phy_device *phydev) { int err; err = phy_read_paged(phydev, 0xa43, RTL8211F_INSR); return (err < 0) ? err : 0; }

Contributors

PersonTokensPropCommitsCommitProp
Shengzhou Liu3391.67%133.33%
Martin Blumenstingl25.56%133.33%
Heiner Kallweit12.78%133.33%
Total36100.00%3100.00%


static int rtl8201_config_intr(struct phy_device *phydev) { u16 val; if (phydev->interrupts == PHY_INTERRUPT_ENABLED) val = BIT(13) | BIT(12) | BIT(11); else val = 0; return phy_write_paged(phydev, 0x7, RTL8201F_IER, val); }

Contributors

PersonTokensPropCommitsCommitProp
Jassi Brar4682.14%133.33%
Martin Blumenstingl916.07%133.33%
Heiner Kallweit11.79%133.33%
Total56100.00%3100.00%


static int rtl8211b_config_intr(struct phy_device *phydev) { int err; if (phydev->interrupts == PHY_INTERRUPT_ENABLED) err = phy_write(phydev, RTL821x_INER, RTL8211B_INER_INIT); else err = phy_write(phydev, RTL821x_INER, 0); return err; }

Contributors

PersonTokensPropCommitsCommitProp
Johnson Leung4695.83%133.33%
Martin Blumenstingl12.08%133.33%
Giuseppe Cavallaro12.08%133.33%
Total48100.00%3100.00%


static int rtl8211e_config_intr(struct phy_device *phydev) { int err; if (phydev->interrupts == PHY_INTERRUPT_ENABLED) err = phy_write(phydev, RTL821x_INER, RTL8211E_INER_LINK_STATUS); else err = phy_write(phydev, RTL821x_INER, 0); return err; }

Contributors

PersonTokensPropCommitsCommitProp
Giuseppe Cavallaro48100.00%2100.00%
Total48100.00%2100.00%


static int rtl8211f_config_intr(struct phy_device *phydev) { u16 val; if (phydev->interrupts == PHY_INTERRUPT_ENABLED) val = RTL8211F_INER_LINK_STATUS; else val = 0; return phy_write_paged(phydev, 0xa42, RTL821x_INER, val); }

Contributors

PersonTokensPropCommitsCommitProp
Shengzhou Liu2865.12%125.00%
Martin Blumenstingl920.93%125.00%
Heiner Kallweit613.95%250.00%
Total43100.00%4100.00%


static int rtl8211f_config_init(struct phy_device *phydev) { int ret; u16 val = 0; ret = genphy_config_init(phydev); if (ret < 0) return ret; /* enable TX-delay for rgmii-id and rgmii-txid, otherwise disable it */ if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) val = RTL8211F_TX_DELAY; return phy_modify_paged(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY, val); }

Contributors

PersonTokensPropCommitsCommitProp
Shengzhou Liu3957.35%125.00%
Martin Blumenstingl2232.35%250.00%
Heiner Kallweit710.29%125.00%
Total68100.00%4100.00%

static struct phy_driver realtek_drvs[] = { { .phy_id = 0x00008201, .name = "RTL8201CP Ethernet", .phy_id_mask = 0x0000ffff, .features = PHY_BASIC_FEATURES, .flags = PHY_HAS_INTERRUPT, }, { .phy_id = 0x001cc816, .name = "RTL8201F 10/100Mbps Ethernet", .phy_id_mask = 0x001fffff, .features = PHY_BASIC_FEATURES, .flags = PHY_HAS_INTERRUPT, .ack_interrupt = &rtl8201_ack_interrupt, .config_intr = &rtl8201_config_intr, .suspend = genphy_suspend, .resume = genphy_resume, .read_page = rtl821x_read_page, .write_page = rtl821x_write_page, }, { .phy_id = 0x001cc912, .name = "RTL8211B Gigabit Ethernet", .phy_id_mask = 0x001fffff, .features = PHY_GBIT_FEATURES, .flags = PHY_HAS_INTERRUPT, .ack_interrupt = &rtl821x_ack_interrupt, .config_intr = &rtl8211b_config_intr, .read_mmd = &genphy_read_mmd_unsupported, .write_mmd = &genphy_write_mmd_unsupported, }, { .phy_id = 0x001cc914, .name = "RTL8211DN Gigabit Ethernet", .phy_id_mask = 0x001fffff, .features = PHY_GBIT_FEATURES, .flags = PHY_HAS_INTERRUPT, .ack_interrupt = rtl821x_ack_interrupt, .config_intr = rtl8211e_config_intr, .suspend = genphy_suspend, .resume = genphy_resume, }, { .phy_id = 0x001cc915, .name = "RTL8211E Gigabit Ethernet", .phy_id_mask = 0x001fffff, .features = PHY_GBIT_FEATURES, .flags = PHY_HAS_INTERRUPT, .ack_interrupt = &rtl821x_ack_interrupt, .config_intr = &rtl8211e_config_intr, .suspend = genphy_suspend, .resume = genphy_resume, }, { .phy_id = 0x001cc916, .name = "RTL8211F Gigabit Ethernet", .phy_id_mask = 0x001fffff, .features = PHY_GBIT_FEATURES, .flags = PHY_HAS_INTERRUPT, .config_init = &rtl8211f_config_init, .ack_interrupt = &rtl8211f_ack_interrupt, .config_intr = &rtl8211f_config_intr, .suspend = genphy_suspend, .resume = genphy_resume, .read_page = rtl821x_read_page, .write_page = rtl821x_write_page, }, }; module_phy_driver(realtek_drvs); static struct mdio_device_id __maybe_unused realtek_tbl[] = { { 0x001cc816, 0x001fffff }, { 0x001cc912, 0x001fffff }, { 0x001cc914, 0x001fffff }, { 0x001cc915, 0x001fffff }, { 0x001cc916, 0x001fffff }, { } }; MODULE_DEVICE_TABLE(mdio, realtek_tbl);

Overall Contributors

PersonTokensPropCommitsCommitProp
Shengzhou Liu17020.09%14.76%
Johnson Leung15818.68%14.76%
Jassi Brar14316.90%14.76%
Giuseppe Cavallaro10612.53%29.52%
Martin Blumenstingl9511.23%523.81%
Shaohui Xie536.26%14.76%
Heiner Kallweit414.85%29.52%
Jonas Jensen293.43%14.76%
David Woodhouse232.72%14.76%
Kevin Hao121.42%14.76%
Jongsung Kim80.95%14.76%
Paul Gortmaker30.35%14.76%
Johan Hovold20.24%14.76%
Kunihiko Hayashi20.24%14.76%
Uwe Kleine-König10.12%14.76%
Total846100.00%21100.00%
Directory: drivers/net/phy
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.