1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Freescale Layerscape MC I/O wrapper 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2015 Freescale Semiconductor, Inc. 5*4882a593Smuzhiyun * Author: Prabhakar Kushwaha <prabhakar@freescale.com> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __FSL_DPMAC_H 11*4882a593Smuzhiyun #define __FSL_DPMAC_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* DPMAC Version */ 14*4882a593Smuzhiyun #define DPMAC_VER_MAJOR 3 15*4882a593Smuzhiyun #define DPMAC_VER_MINOR 2 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* Command IDs */ 18*4882a593Smuzhiyun #define DPMAC_CMDID_CLOSE 0x800 19*4882a593Smuzhiyun #define DPMAC_CMDID_OPEN 0x80c 20*4882a593Smuzhiyun #define DPMAC_CMDID_CREATE 0x90c 21*4882a593Smuzhiyun #define DPMAC_CMDID_DESTROY 0x900 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define DPMAC_CMDID_GET_ATTR 0x004 24*4882a593Smuzhiyun #define DPMAC_CMDID_RESET 0x005 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define DPMAC_CMDID_MDIO_READ 0x0c0 27*4882a593Smuzhiyun #define DPMAC_CMDID_MDIO_WRITE 0x0c1 28*4882a593Smuzhiyun #define DPMAC_CMDID_GET_LINK_CFG 0x0c2 29*4882a593Smuzhiyun #define DPMAC_CMDID_SET_LINK_STATE 0x0c3 30*4882a593Smuzhiyun #define DPMAC_CMDID_GET_COUNTER 0x0c4 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* cmd, param, offset, width, type, arg_name */ 33*4882a593Smuzhiyun #define DPMAC_CMD_CREATE(cmd, cfg) \ 34*4882a593Smuzhiyun MC_CMD_OP(cmd, 0, 0, 32, int, cfg->mac_id) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* cmd, param, offset, width, type, arg_name */ 37*4882a593Smuzhiyun #define DPMAC_CMD_OPEN(cmd, dpmac_id) \ 38*4882a593Smuzhiyun MC_CMD_OP(cmd, 0, 0, 32, int, dpmac_id) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* cmd, param, offset, width, type, arg_name */ 41*4882a593Smuzhiyun #define DPMAC_RSP_GET_ATTRIBUTES(cmd, attr) \ 42*4882a593Smuzhiyun do { \ 43*4882a593Smuzhiyun MC_RSP_OP(cmd, 0, 0, 32, int, attr->phy_id);\ 44*4882a593Smuzhiyun MC_RSP_OP(cmd, 0, 32, 32, int, attr->id);\ 45*4882a593Smuzhiyun MC_RSP_OP(cmd, 1, 0, 16, uint16_t, attr->version.major);\ 46*4882a593Smuzhiyun MC_RSP_OP(cmd, 1, 16, 16, uint16_t, attr->version.minor);\ 47*4882a593Smuzhiyun MC_RSP_OP(cmd, 1, 32, 8, enum dpmac_link_type, attr->link_type);\ 48*4882a593Smuzhiyun MC_RSP_OP(cmd, 1, 40, 8, enum dpmac_eth_if, attr->eth_if);\ 49*4882a593Smuzhiyun MC_RSP_OP(cmd, 2, 0, 32, uint32_t, attr->max_rate);\ 50*4882a593Smuzhiyun } while (0) 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* cmd, param, offset, width, type, arg_name */ 53*4882a593Smuzhiyun #define DPMAC_CMD_MDIO_READ(cmd, cfg) \ 54*4882a593Smuzhiyun do { \ 55*4882a593Smuzhiyun MC_CMD_OP(cmd, 0, 0, 8, uint8_t, cfg->phy_addr); \ 56*4882a593Smuzhiyun MC_CMD_OP(cmd, 0, 8, 8, uint8_t, cfg->reg); \ 57*4882a593Smuzhiyun } while (0) 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* cmd, param, offset, width, type, arg_name */ 60*4882a593Smuzhiyun #define DPMAC_RSP_MDIO_READ(cmd, data) \ 61*4882a593Smuzhiyun MC_RSP_OP(cmd, 0, 16, 16, uint16_t, data) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* cmd, param, offset, width, type, arg_name */ 64*4882a593Smuzhiyun #define DPMAC_CMD_MDIO_WRITE(cmd, cfg) \ 65*4882a593Smuzhiyun do { \ 66*4882a593Smuzhiyun MC_CMD_OP(cmd, 0, 0, 8, uint8_t, cfg->phy_addr); \ 67*4882a593Smuzhiyun MC_CMD_OP(cmd, 0, 8, 8, uint8_t, cfg->reg); \ 68*4882a593Smuzhiyun MC_CMD_OP(cmd, 0, 16, 16, uint16_t, cfg->data); \ 69*4882a593Smuzhiyun } while (0) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /* cmd, param, offset, width, type, arg_name */ 72*4882a593Smuzhiyun #define DPMAC_RSP_GET_LINK_CFG(cmd, cfg) \ 73*4882a593Smuzhiyun do { \ 74*4882a593Smuzhiyun MC_RSP_OP(cmd, 0, 0, 64, uint64_t, cfg->options); \ 75*4882a593Smuzhiyun MC_RSP_OP(cmd, 1, 0, 32, uint32_t, cfg->rate); \ 76*4882a593Smuzhiyun } while (0) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /* cmd, param, offset, width, type, arg_name */ 79*4882a593Smuzhiyun #define DPMAC_CMD_SET_LINK_STATE(cmd, cfg) \ 80*4882a593Smuzhiyun do { \ 81*4882a593Smuzhiyun MC_CMD_OP(cmd, 0, 0, 64, uint64_t, cfg->options); \ 82*4882a593Smuzhiyun MC_CMD_OP(cmd, 1, 0, 32, uint32_t, cfg->rate); \ 83*4882a593Smuzhiyun MC_CMD_OP(cmd, 2, 0, 1, int, cfg->up); \ 84*4882a593Smuzhiyun } while (0) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* cmd, param, offset, width, type, arg_name */ 87*4882a593Smuzhiyun #define DPMAC_CMD_GET_COUNTER(cmd, type) \ 88*4882a593Smuzhiyun MC_CMD_OP(cmd, 0, 0, 8, enum dpmac_counter, type) 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* cmd, param, offset, width, type, arg_name */ 91*4882a593Smuzhiyun #define DPMAC_RSP_GET_COUNTER(cmd, counter) \ 92*4882a593Smuzhiyun MC_RSP_OP(cmd, 1, 0, 64, uint64_t, counter) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* Data Path MAC API 95*4882a593Smuzhiyun * Contains initialization APIs and runtime control APIs for DPMAC 96*4882a593Smuzhiyun */ 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun struct fsl_mc_io; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /** 101*4882a593Smuzhiyun * dpmac_open() - Open a control session for the specified object. 102*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object 103*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 104*4882a593Smuzhiyun * @dpmac_id: DPMAC unique ID 105*4882a593Smuzhiyun * @token: Returned token; use in subsequent API calls 106*4882a593Smuzhiyun * 107*4882a593Smuzhiyun * This function can be used to open a control session for an 108*4882a593Smuzhiyun * already created object; an object may have been declared in 109*4882a593Smuzhiyun * the DPL or by calling the dpmac_create function. 110*4882a593Smuzhiyun * This function returns a unique authentication token, 111*4882a593Smuzhiyun * associated with the specific object ID and the specific MC 112*4882a593Smuzhiyun * portal; this token must be used in all subsequent commands for 113*4882a593Smuzhiyun * this specific object 114*4882a593Smuzhiyun * 115*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise. 116*4882a593Smuzhiyun */ 117*4882a593Smuzhiyun int dpmac_open(struct fsl_mc_io *mc_io, 118*4882a593Smuzhiyun uint32_t cmd_flags, 119*4882a593Smuzhiyun int dpmac_id, 120*4882a593Smuzhiyun uint16_t *token); 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /** 123*4882a593Smuzhiyun * dpmac_close() - Close the control session of the object 124*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object 125*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 126*4882a593Smuzhiyun * @token: Token of DPMAC object 127*4882a593Smuzhiyun * 128*4882a593Smuzhiyun * After this function is called, no further operations are 129*4882a593Smuzhiyun * allowed on the object without opening a new control session. 130*4882a593Smuzhiyun * 131*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise. 132*4882a593Smuzhiyun */ 133*4882a593Smuzhiyun int dpmac_close(struct fsl_mc_io *mc_io, 134*4882a593Smuzhiyun uint32_t cmd_flags, 135*4882a593Smuzhiyun uint16_t token); 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /** 138*4882a593Smuzhiyun * enum dpmac_link_type - DPMAC link type 139*4882a593Smuzhiyun * @DPMAC_LINK_TYPE_NONE: No link 140*4882a593Smuzhiyun * @DPMAC_LINK_TYPE_FIXED: Link is fixed type 141*4882a593Smuzhiyun * @DPMAC_LINK_TYPE_PHY: Link by PHY ID 142*4882a593Smuzhiyun * @DPMAC_LINK_TYPE_BACKPLANE: Backplane link type 143*4882a593Smuzhiyun */ 144*4882a593Smuzhiyun enum dpmac_link_type { 145*4882a593Smuzhiyun DPMAC_LINK_TYPE_NONE, 146*4882a593Smuzhiyun DPMAC_LINK_TYPE_FIXED, 147*4882a593Smuzhiyun DPMAC_LINK_TYPE_PHY, 148*4882a593Smuzhiyun DPMAC_LINK_TYPE_BACKPLANE 149*4882a593Smuzhiyun }; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun /** 152*4882a593Smuzhiyun * enum dpmac_eth_if - DPMAC Ethrnet interface 153*4882a593Smuzhiyun * @DPMAC_ETH_IF_MII: MII interface 154*4882a593Smuzhiyun * @DPMAC_ETH_IF_RMII: RMII interface 155*4882a593Smuzhiyun * @DPMAC_ETH_IF_SMII: SMII interface 156*4882a593Smuzhiyun * @DPMAC_ETH_IF_GMII: GMII interface 157*4882a593Smuzhiyun * @DPMAC_ETH_IF_RGMII: RGMII interface 158*4882a593Smuzhiyun * @DPMAC_ETH_IF_SGMII: SGMII interface 159*4882a593Smuzhiyun * @DPMAC_ETH_IF_QSGMII: QSGMII interface 160*4882a593Smuzhiyun * @DPMAC_ETH_IF_XAUI: XAUI interface 161*4882a593Smuzhiyun * @DPMAC_ETH_IF_XFI: XFI interface 162*4882a593Smuzhiyun */ 163*4882a593Smuzhiyun enum dpmac_eth_if { 164*4882a593Smuzhiyun DPMAC_ETH_IF_MII, 165*4882a593Smuzhiyun DPMAC_ETH_IF_RMII, 166*4882a593Smuzhiyun DPMAC_ETH_IF_SMII, 167*4882a593Smuzhiyun DPMAC_ETH_IF_GMII, 168*4882a593Smuzhiyun DPMAC_ETH_IF_RGMII, 169*4882a593Smuzhiyun DPMAC_ETH_IF_SGMII, 170*4882a593Smuzhiyun DPMAC_ETH_IF_QSGMII, 171*4882a593Smuzhiyun DPMAC_ETH_IF_XAUI, 172*4882a593Smuzhiyun DPMAC_ETH_IF_XFI 173*4882a593Smuzhiyun }; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /** 176*4882a593Smuzhiyun * struct dpmac_cfg - Structure representing DPMAC configuration 177*4882a593Smuzhiyun * @mac_id: Represents the Hardware MAC ID; in case of multiple WRIOP, 178*4882a593Smuzhiyun * the MAC IDs are continuous. 179*4882a593Smuzhiyun * For example: 2 WRIOPs, 16 MACs in each: 180*4882a593Smuzhiyun * MAC IDs for the 1st WRIOP: 1-16, 181*4882a593Smuzhiyun * MAC IDs for the 2nd WRIOP: 17-32. 182*4882a593Smuzhiyun */ 183*4882a593Smuzhiyun struct dpmac_cfg { 184*4882a593Smuzhiyun int mac_id; 185*4882a593Smuzhiyun }; 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /** 188*4882a593Smuzhiyun * dpmac_create() - Create the DPMAC object. 189*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object 190*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 191*4882a593Smuzhiyun * @cfg: Configuration structure 192*4882a593Smuzhiyun * @token: Returned token; use in subsequent API calls 193*4882a593Smuzhiyun * 194*4882a593Smuzhiyun * Create the DPMAC object, allocate required resources and 195*4882a593Smuzhiyun * perform required initialization. 196*4882a593Smuzhiyun * 197*4882a593Smuzhiyun * The object can be created either by declaring it in the 198*4882a593Smuzhiyun * DPL file, or by calling this function. 199*4882a593Smuzhiyun * This function returns a unique authentication token, 200*4882a593Smuzhiyun * associated with the specific object ID and the specific MC 201*4882a593Smuzhiyun * portal; this token must be used in all subsequent calls to 202*4882a593Smuzhiyun * this specific object. For objects that are created using the 203*4882a593Smuzhiyun * DPL file, call dpmac_open function to get an authentication 204*4882a593Smuzhiyun * token first. 205*4882a593Smuzhiyun * 206*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise. 207*4882a593Smuzhiyun */ 208*4882a593Smuzhiyun int dpmac_create(struct fsl_mc_io *mc_io, 209*4882a593Smuzhiyun uint32_t cmd_flags, 210*4882a593Smuzhiyun const struct dpmac_cfg *cfg, 211*4882a593Smuzhiyun uint16_t *token); 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /** 214*4882a593Smuzhiyun * dpmac_destroy() - Destroy the DPMAC object and release all its resources. 215*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object 216*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 217*4882a593Smuzhiyun * @token: Token of DPMAC object 218*4882a593Smuzhiyun * 219*4882a593Smuzhiyun * Return: '0' on Success; error code otherwise. 220*4882a593Smuzhiyun */ 221*4882a593Smuzhiyun int dpmac_destroy(struct fsl_mc_io *mc_io, 222*4882a593Smuzhiyun uint32_t cmd_flags, 223*4882a593Smuzhiyun uint16_t token); 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun /* DPMAC IRQ Index and Events */ 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun /* IRQ index */ 228*4882a593Smuzhiyun #define DPMAC_IRQ_INDEX 0 229*4882a593Smuzhiyun /* IRQ event - indicates a change in link state */ 230*4882a593Smuzhiyun #define DPMAC_IRQ_EVENT_LINK_CFG_REQ 0x00000001 231*4882a593Smuzhiyun /* irq event - Indicates that the link state changed */ 232*4882a593Smuzhiyun #define DPMAC_IRQ_EVENT_LINK_CHANGED 0x00000002 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun /** 235*4882a593Smuzhiyun * struct dpmac_attr - Structure representing DPMAC attributes 236*4882a593Smuzhiyun * @id: DPMAC object ID 237*4882a593Smuzhiyun * @phy_id: PHY ID 238*4882a593Smuzhiyun * @link_type: link type 239*4882a593Smuzhiyun * @eth_if: Ethernet interface 240*4882a593Smuzhiyun * @max_rate: Maximum supported rate - in Mbps 241*4882a593Smuzhiyun * @version: DPMAC version 242*4882a593Smuzhiyun */ 243*4882a593Smuzhiyun struct dpmac_attr { 244*4882a593Smuzhiyun int id; 245*4882a593Smuzhiyun int phy_id; 246*4882a593Smuzhiyun enum dpmac_link_type link_type; 247*4882a593Smuzhiyun enum dpmac_eth_if eth_if; 248*4882a593Smuzhiyun uint32_t max_rate; 249*4882a593Smuzhiyun /** 250*4882a593Smuzhiyun * struct version - Structure representing DPMAC version 251*4882a593Smuzhiyun * @major: DPMAC major version 252*4882a593Smuzhiyun * @minor: DPMAC minor version 253*4882a593Smuzhiyun */ 254*4882a593Smuzhiyun struct { 255*4882a593Smuzhiyun uint16_t major; 256*4882a593Smuzhiyun uint16_t minor; 257*4882a593Smuzhiyun } version; 258*4882a593Smuzhiyun }; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /** 261*4882a593Smuzhiyun * dpmac_get_attributes - Retrieve DPMAC attributes. 262*4882a593Smuzhiyun * 263*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object 264*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 265*4882a593Smuzhiyun * @token: Token of DPMAC object 266*4882a593Smuzhiyun * @attr: Returned object's attributes 267*4882a593Smuzhiyun * 268*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise. 269*4882a593Smuzhiyun */ 270*4882a593Smuzhiyun int dpmac_get_attributes(struct fsl_mc_io *mc_io, 271*4882a593Smuzhiyun uint32_t cmd_flags, 272*4882a593Smuzhiyun uint16_t token, 273*4882a593Smuzhiyun struct dpmac_attr *attr); 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun /** 276*4882a593Smuzhiyun * struct dpmac_mdio_cfg - DPMAC MDIO read/write parameters 277*4882a593Smuzhiyun * @phy_addr: MDIO device address 278*4882a593Smuzhiyun * @reg: Address of the register within the Clause 45 PHY device from which data 279*4882a593Smuzhiyun * is to be read 280*4882a593Smuzhiyun * @data: Data read/write from/to MDIO 281*4882a593Smuzhiyun */ 282*4882a593Smuzhiyun struct dpmac_mdio_cfg { 283*4882a593Smuzhiyun uint8_t phy_addr; 284*4882a593Smuzhiyun uint8_t reg; 285*4882a593Smuzhiyun uint16_t data; 286*4882a593Smuzhiyun }; 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun /** 289*4882a593Smuzhiyun * dpmac_mdio_read() - Perform MDIO read transaction 290*4882a593Smuzhiyun * @mc_io: Pointer to opaque I/O object 291*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 292*4882a593Smuzhiyun * @token: Token of DPMAC object 293*4882a593Smuzhiyun * @cfg: Structure with MDIO transaction parameters 294*4882a593Smuzhiyun * 295*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise. 296*4882a593Smuzhiyun */ 297*4882a593Smuzhiyun int dpmac_mdio_read(struct fsl_mc_io *mc_io, 298*4882a593Smuzhiyun uint32_t cmd_flags, 299*4882a593Smuzhiyun uint16_t token, 300*4882a593Smuzhiyun struct dpmac_mdio_cfg *cfg); 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun /** 303*4882a593Smuzhiyun * dpmac_mdio_write() - Perform MDIO write transaction 304*4882a593Smuzhiyun * @mc_io: Pointer to opaque I/O object 305*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 306*4882a593Smuzhiyun * @token: Token of DPMAC object 307*4882a593Smuzhiyun * @cfg: Structure with MDIO transaction parameters 308*4882a593Smuzhiyun * 309*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise. 310*4882a593Smuzhiyun */ 311*4882a593Smuzhiyun int dpmac_mdio_write(struct fsl_mc_io *mc_io, 312*4882a593Smuzhiyun uint32_t cmd_flags, 313*4882a593Smuzhiyun uint16_t token, 314*4882a593Smuzhiyun struct dpmac_mdio_cfg *cfg); 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun /* DPMAC link configuration/state options */ 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun /* Enable auto-negotiation */ 319*4882a593Smuzhiyun #define DPMAC_LINK_OPT_AUTONEG 0x0000000000000001ULL 320*4882a593Smuzhiyun /* Enable half-duplex mode */ 321*4882a593Smuzhiyun #define DPMAC_LINK_OPT_HALF_DUPLEX 0x0000000000000002ULL 322*4882a593Smuzhiyun /* Enable pause frames */ 323*4882a593Smuzhiyun #define DPMAC_LINK_OPT_PAUSE 0x0000000000000004ULL 324*4882a593Smuzhiyun /* Enable a-symmetric pause frames */ 325*4882a593Smuzhiyun #define DPMAC_LINK_OPT_ASYM_PAUSE 0x0000000000000008ULL 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun /** 328*4882a593Smuzhiyun * struct dpmac_link_cfg - Structure representing DPMAC link configuration 329*4882a593Smuzhiyun * @rate: Link's rate - in Mbps 330*4882a593Smuzhiyun * @options: Enable/Disable DPMAC link cfg features (bitmap) 331*4882a593Smuzhiyun */ 332*4882a593Smuzhiyun struct dpmac_link_cfg { 333*4882a593Smuzhiyun uint32_t rate; 334*4882a593Smuzhiyun uint64_t options; 335*4882a593Smuzhiyun }; 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun /** 338*4882a593Smuzhiyun * dpmac_get_link_cfg() - Get Ethernet link configuration 339*4882a593Smuzhiyun * @mc_io: Pointer to opaque I/O object 340*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 341*4882a593Smuzhiyun * @token: Token of DPMAC object 342*4882a593Smuzhiyun * @cfg: Returned structure with the link configuration 343*4882a593Smuzhiyun * 344*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise. 345*4882a593Smuzhiyun */ 346*4882a593Smuzhiyun int dpmac_get_link_cfg(struct fsl_mc_io *mc_io, 347*4882a593Smuzhiyun uint32_t cmd_flags, 348*4882a593Smuzhiyun uint16_t token, 349*4882a593Smuzhiyun struct dpmac_link_cfg *cfg); 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun /** 352*4882a593Smuzhiyun * struct dpmac_link_state - DPMAC link configuration request 353*4882a593Smuzhiyun * @rate: Rate in Mbps 354*4882a593Smuzhiyun * @options: Enable/Disable DPMAC link cfg features (bitmap) 355*4882a593Smuzhiyun * @up: Link state 356*4882a593Smuzhiyun */ 357*4882a593Smuzhiyun struct dpmac_link_state { 358*4882a593Smuzhiyun uint32_t rate; 359*4882a593Smuzhiyun uint64_t options; 360*4882a593Smuzhiyun int up; 361*4882a593Smuzhiyun }; 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun /** 364*4882a593Smuzhiyun * dpmac_set_link_state() - Set the Ethernet link status 365*4882a593Smuzhiyun * @mc_io: Pointer to opaque I/O object 366*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 367*4882a593Smuzhiyun * @token: Token of DPMAC object 368*4882a593Smuzhiyun * @link_state: Link state configuration 369*4882a593Smuzhiyun * 370*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise. 371*4882a593Smuzhiyun */ 372*4882a593Smuzhiyun int dpmac_set_link_state(struct fsl_mc_io *mc_io, 373*4882a593Smuzhiyun uint32_t cmd_flags, 374*4882a593Smuzhiyun uint16_t token, 375*4882a593Smuzhiyun struct dpmac_link_state *link_state); 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun /** 378*4882a593Smuzhiyun * enum dpni_counter - DPNI counter types 379*4882a593Smuzhiyun * @DPMAC_CNT_ING_FRAME_64: counts 64-octet frame, good or bad. 380*4882a593Smuzhiyun * @DPMAC_CNT_ING_FRAME_127: counts 65- to 127-octet frame, good or bad. 381*4882a593Smuzhiyun * @DPMAC_CNT_ING_FRAME_255: counts 128- to 255-octet frame, good or bad. 382*4882a593Smuzhiyun * @DPMAC_CNT_ING_FRAME_511: counts 256- to 511-octet frame, good or bad. 383*4882a593Smuzhiyun * @DPMAC_CNT_ING_FRAME_1023: counts 512- to 1023-octet frame, good or bad. 384*4882a593Smuzhiyun * @DPMAC_CNT_ING_FRAME_1518: counts 1024- to 1518-octet frame, good or bad. 385*4882a593Smuzhiyun * @DPMAC_CNT_ING_FRAME_1519_MAX: counts 1519-octet frame and larger 386*4882a593Smuzhiyun * (up to max frame length specified), 387*4882a593Smuzhiyun * good or bad. 388*4882a593Smuzhiyun * @DPMAC_CNT_ING_FRAG: counts packet which is shorter than 64 octets received 389*4882a593Smuzhiyun * with a wrong CRC 390*4882a593Smuzhiyun * @DPMAC_CNT_ING_JABBER: counts packet longer than the maximum frame length 391*4882a593Smuzhiyun * specified, with a bad frame check sequence. 392*4882a593Smuzhiyun * @DPMAC_CNT_ING_FRAME_DISCARD: counts dropped packet due to internal errors. 393*4882a593Smuzhiyun * Occurs when a receive FIFO overflows. 394*4882a593Smuzhiyun * Includes also packets truncated as a result of 395*4882a593Smuzhiyun * the receive FIFO overflow. 396*4882a593Smuzhiyun * @DPMAC_CNT_ING_ALIGN_ERR: counts frame with an alignment error 397*4882a593Smuzhiyun * (optional used for wrong SFD) 398*4882a593Smuzhiyun * @DPMAC_CNT_EGR_UNDERSIZED: counts packet transmitted that was less than 64 399*4882a593Smuzhiyun * octets long with a good CRC. 400*4882a593Smuzhiyun * @DPMAC_CNT_ING_OVERSIZED: counts packet longer than the maximum frame length 401*4882a593Smuzhiyun * specified, with a good frame check sequence. 402*4882a593Smuzhiyun * @DPMAC_CNT_ING_VALID_PAUSE_FRAME: counts valid pause frame (regular and PFC). 403*4882a593Smuzhiyun * @DPMAC_CNT_EGR_VALID_PAUSE_FRAME: counts valid pause frame transmitted 404*4882a593Smuzhiyun * (regular and PFC). 405*4882a593Smuzhiyun * @DPMAC_CNT_ING_BYTE: counts octet received except preamble for all valid 406*4882a593Smuzhiyun * frames and valid pause frames. 407*4882a593Smuzhiyun * @DPMAC_CNT_ING_MCAST_FRAME: counts received multicast frame 408*4882a593Smuzhiyun * @DPMAC_CNT_ING_BCAST_FRAME: counts received broadcast frame 409*4882a593Smuzhiyun * @DPMAC_CNT_ING_ALL_FRAME: counts each good or bad packet received. 410*4882a593Smuzhiyun * @DPMAC_CNT_ING_UCAST_FRAME: counts received unicast frame 411*4882a593Smuzhiyun * @DPMAC_CNT_ING_ERR_FRAME: counts frame received with an error 412*4882a593Smuzhiyun * (except for undersized/fragment frame) 413*4882a593Smuzhiyun * @DPMAC_CNT_EGR_BYTE: counts octet transmitted except preamble for all valid 414*4882a593Smuzhiyun * frames and valid pause frames transmitted. 415*4882a593Smuzhiyun * @DPMAC_CNT_EGR_MCAST_FRAME: counts transmitted multicast frame 416*4882a593Smuzhiyun * @DPMAC_CNT_EGR_BCAST_FRAME: counts transmitted broadcast frame 417*4882a593Smuzhiyun * @DPMAC_CNT_EGR_UCAST_FRAME: counts transmitted unicast frame 418*4882a593Smuzhiyun * @DPMAC_CNT_EGR_ERR_FRAME: counts frame transmitted with an error 419*4882a593Smuzhiyun * @DPMAC_CNT_ING_GOOD_FRAME: counts frame received without error, including 420*4882a593Smuzhiyun * pause frames. 421*4882a593Smuzhiyun */ 422*4882a593Smuzhiyun enum dpmac_counter { 423*4882a593Smuzhiyun DPMAC_CNT_ING_FRAME_64, 424*4882a593Smuzhiyun DPMAC_CNT_ING_FRAME_127, 425*4882a593Smuzhiyun DPMAC_CNT_ING_FRAME_255, 426*4882a593Smuzhiyun DPMAC_CNT_ING_FRAME_511, 427*4882a593Smuzhiyun DPMAC_CNT_ING_FRAME_1023, 428*4882a593Smuzhiyun DPMAC_CNT_ING_FRAME_1518, 429*4882a593Smuzhiyun DPMAC_CNT_ING_FRAME_1519_MAX, 430*4882a593Smuzhiyun DPMAC_CNT_ING_FRAG, 431*4882a593Smuzhiyun DPMAC_CNT_ING_JABBER, 432*4882a593Smuzhiyun DPMAC_CNT_ING_FRAME_DISCARD, 433*4882a593Smuzhiyun DPMAC_CNT_ING_ALIGN_ERR, 434*4882a593Smuzhiyun DPMAC_CNT_EGR_UNDERSIZED, 435*4882a593Smuzhiyun DPMAC_CNT_ING_OVERSIZED, 436*4882a593Smuzhiyun DPMAC_CNT_ING_VALID_PAUSE_FRAME, 437*4882a593Smuzhiyun DPMAC_CNT_EGR_VALID_PAUSE_FRAME, 438*4882a593Smuzhiyun DPMAC_CNT_ING_BYTE, 439*4882a593Smuzhiyun DPMAC_CNT_ING_MCAST_FRAME, 440*4882a593Smuzhiyun DPMAC_CNT_ING_BCAST_FRAME, 441*4882a593Smuzhiyun DPMAC_CNT_ING_ALL_FRAME, 442*4882a593Smuzhiyun DPMAC_CNT_ING_UCAST_FRAME, 443*4882a593Smuzhiyun DPMAC_CNT_ING_ERR_FRAME, 444*4882a593Smuzhiyun DPMAC_CNT_EGR_BYTE, 445*4882a593Smuzhiyun DPMAC_CNT_EGR_MCAST_FRAME, 446*4882a593Smuzhiyun DPMAC_CNT_EGR_BCAST_FRAME, 447*4882a593Smuzhiyun DPMAC_CNT_EGR_UCAST_FRAME, 448*4882a593Smuzhiyun DPMAC_CNT_EGR_ERR_FRAME, 449*4882a593Smuzhiyun DPMAC_CNT_ING_GOOD_FRAME 450*4882a593Smuzhiyun }; 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun /** 453*4882a593Smuzhiyun * dpmac_get_counter() - Read a specific DPMAC counter 454*4882a593Smuzhiyun * @mc_io: Pointer to opaque I/O object 455*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' 456*4882a593Smuzhiyun * @token: Token of DPMAC object 457*4882a593Smuzhiyun * @type: The requested counter 458*4882a593Smuzhiyun * @counter: Returned counter value 459*4882a593Smuzhiyun * 460*4882a593Smuzhiyun * Return: The requested counter; '0' otherwise. 461*4882a593Smuzhiyun */ 462*4882a593Smuzhiyun int dpmac_get_counter(struct fsl_mc_io *mc_io, 463*4882a593Smuzhiyun uint32_t cmd_flags, 464*4882a593Smuzhiyun uint16_t token, 465*4882a593Smuzhiyun enum dpmac_counter type, 466*4882a593Smuzhiyun uint64_t *counter); 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun #endif /* __FSL_DPMAC_H */ 469