Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2/*
  3 * stmmac_pcs.h: Physical Coding Sublayer Header File
  4 *
  5 * Copyright (C) 2016 STMicroelectronics (R&D) Limited
  6 * Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
  7 */
  8
  9#ifndef __STMMAC_PCS_H__
 10#define __STMMAC_PCS_H__
 11
 12#include <linux/slab.h>
 13#include <linux/io.h>
 14#include "common.h"
 15
 16/* PCS registers (AN/TBI/SGMII/RGMII) offsets */
 17#define GMAC_AN_CTRL(x)		(x)		/* AN control */
 18#define GMAC_AN_STATUS(x)	(x + 0x4)	/* AN status */
 19#define GMAC_ANE_ADV(x)		(x + 0x8)	/* ANE Advertisement */
 20#define GMAC_ANE_LPA(x)		(x + 0xc)	/* ANE link partener ability */
 21#define GMAC_ANE_EXP(x)		(x + 0x10)	/* ANE expansion */
 22#define GMAC_TBI(x)		(x + 0x14)	/* TBI extend status */
 23
 24/* AN Configuration defines */
 25#define GMAC_AN_CTRL_RAN	BIT(9)	/* Restart Auto-Negotiation */
 26#define GMAC_AN_CTRL_ANE	BIT(12)	/* Auto-Negotiation Enable */
 27#define GMAC_AN_CTRL_ELE	BIT(14)	/* External Loopback Enable */
 28#define GMAC_AN_CTRL_ECD	BIT(16)	/* Enable Comma Detect */
 29#define GMAC_AN_CTRL_LR		BIT(17)	/* Lock to Reference */
 30#define GMAC_AN_CTRL_SGMRAL	BIT(18)	/* SGMII RAL Control */
 31
 32/* AN Status defines */
 33#define GMAC_AN_STATUS_LS	BIT(2)	/* Link Status 0:down 1:up */
 34#define GMAC_AN_STATUS_ANA	BIT(3)	/* Auto-Negotiation Ability */
 35#define GMAC_AN_STATUS_ANC	BIT(5)	/* Auto-Negotiation Complete */
 36#define GMAC_AN_STATUS_ES	BIT(8)	/* Extended Status */
 37
 38/* ADV and LPA defines */
 39#define GMAC_ANE_FD		BIT(5)
 40#define GMAC_ANE_HD		BIT(6)
 41#define GMAC_ANE_PSE		GENMASK(8, 7)
 42#define GMAC_ANE_PSE_SHIFT	7
 43#define GMAC_ANE_RFE		GENMASK(13, 12)
 44#define GMAC_ANE_RFE_SHIFT	12
 45#define GMAC_ANE_ACK		BIT(14)
 46
 47/**
 48 * dwmac_pcs_isr - TBI, RTBI, or SGMII PHY ISR
 49 * @ioaddr: IO registers pointer
 50 * @reg: Base address of the AN Control Register.
 51 * @intr_status: GMAC core interrupt status
 52 * @x: pointer to log these events as stats
 53 * Description: it is the ISR for PCS events: Auto-Negotiation Completed and
 54 * Link status.
 55 */
 56static inline void dwmac_pcs_isr(void __iomem *ioaddr, u32 reg,
 57				 unsigned int intr_status,
 58				 struct stmmac_extra_stats *x)
 59{
 60	u32 val = readl(ioaddr + GMAC_AN_STATUS(reg));
 61
 62	if (intr_status & PCS_ANE_IRQ) {
 63		x->irq_pcs_ane_n++;
 64		if (val & GMAC_AN_STATUS_ANC)
 65			pr_info("stmmac_pcs: ANE process completed\n");
 66	}
 67
 68	if (intr_status & PCS_LINK_IRQ) {
 69		x->irq_pcs_link_n++;
 70		if (val & GMAC_AN_STATUS_LS)
 71			pr_info("stmmac_pcs: Link Up\n");
 72		else
 73			pr_info("stmmac_pcs: Link Down\n");
 74	}
 75}
 76
 77/**
 78 * dwmac_rane - To restart ANE
 79 * @ioaddr: IO registers pointer
 80 * @reg: Base address of the AN Control Register.
 81 * @restart: to restart ANE
 82 * Description: this is to just restart the Auto-Negotiation.
 83 */
 84static inline void dwmac_rane(void __iomem *ioaddr, u32 reg, bool restart)
 85{
 86	u32 value = readl(ioaddr + GMAC_AN_CTRL(reg));
 87
 88	if (restart)
 89		value |= GMAC_AN_CTRL_RAN;
 90
 91	writel(value, ioaddr + GMAC_AN_CTRL(reg));
 92}
 93
 94/**
 95 * dwmac_ctrl_ane - To program the AN Control Register.
 96 * @ioaddr: IO registers pointer
 97 * @reg: Base address of the AN Control Register.
 98 * @ane: to enable the auto-negotiation
 99 * @srgmi_ral: to manage MAC-2-MAC SGMII connections.
100 * @loopback: to cause the PHY to loopback tx data into rx path.
101 * Description: this is the main function to configure the AN control register
102 * and init the ANE, select loopback (usually for debugging purpose) and
103 * configure SGMII RAL.
104 */
105static inline void dwmac_ctrl_ane(void __iomem *ioaddr, u32 reg, bool ane,
106				  bool srgmi_ral, bool loopback)
107{
108	u32 value = readl(ioaddr + GMAC_AN_CTRL(reg));
109
110	/* Enable and restart the Auto-Negotiation */
111	if (ane)
112		value |= GMAC_AN_CTRL_ANE | GMAC_AN_CTRL_RAN;
113
114	/* In case of MAC-2-MAC connection, block is configured to operate
115	 * according to MAC conf register.
116	 */
117	if (srgmi_ral)
118		value |= GMAC_AN_CTRL_SGMRAL;
119
120	if (loopback)
121		value |= GMAC_AN_CTRL_ELE;
122
123	writel(value, ioaddr + GMAC_AN_CTRL(reg));
124}
125
126/**
127 * dwmac_get_adv_lp - Get ADV and LP cap
128 * @ioaddr: IO registers pointer
129 * @reg: Base address of the AN Control Register.
130 * @adv_lp: structure to store the adv,lp status
131 * Description: this is to expose the ANE advertisement and Link partner ability
132 * status to ethtool support.
133 */
134static inline void dwmac_get_adv_lp(void __iomem *ioaddr, u32 reg,
135				    struct rgmii_adv *adv_lp)
136{
137	u32 value = readl(ioaddr + GMAC_ANE_ADV(reg));
138
139	if (value & GMAC_ANE_FD)
140		adv_lp->duplex = DUPLEX_FULL;
141	if (value & GMAC_ANE_HD)
142		adv_lp->duplex |= DUPLEX_HALF;
143
144	adv_lp->pause = (value & GMAC_ANE_PSE) >> GMAC_ANE_PSE_SHIFT;
145
146	value = readl(ioaddr + GMAC_ANE_LPA(reg));
147
148	if (value & GMAC_ANE_FD)
149		adv_lp->lp_duplex = DUPLEX_FULL;
150	if (value & GMAC_ANE_HD)
151		adv_lp->lp_duplex = DUPLEX_HALF;
152
153	adv_lp->lp_pause = (value & GMAC_ANE_PSE) >> GMAC_ANE_PSE_SHIFT;
154}
155#endif /* __STMMAC_PCS_H__ */