stmmac_pcs.h (4789B)
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__ */