]> git.sur5r.net Git - u-boot/commitdiff
driver: net: fsl-mc: Add APIs for DPMAC objects in FLIB
authorPrabhakar Kushwaha <prabhakar@freescale.com>
Wed, 4 Nov 2015 06:55:54 +0000 (12:25 +0530)
committerYork Sun <yorksun@freescale.com>
Mon, 30 Nov 2015 16:53:02 +0000 (08:53 -0800)
DPMAC object of Management complex controls Physical MAC and MDIO controller.
It provides APIs for MDIO and link state updates. It also provides APIs for
PHY/link configuration.

Signed-off-by: Prabhakar Kushwaha <prabhakar@freescale.com>
Reviewed-by: York Sun <yorksun@freescale.com>
drivers/net/fsl-mc/Makefile
drivers/net/fsl-mc/dpmac.c [new file with mode: 0644]
include/fsl-mc/fsl_dpmac.h [new file with mode: 0644]

index 7563a5fdd3ba2ab761072c89d51e86e08f07014c..a492388821083bfcc1281794147509922ede02b3 100644 (file)
@@ -10,5 +10,6 @@ obj-y += mc.o \
        dpmng.o \
        dprc.o  \
        dpbp.o  \
-       dpni.o
+       dpni.o  \
+       dpmac.o
 obj-y += dpio/
diff --git a/drivers/net/fsl-mc/dpmac.c b/drivers/net/fsl-mc/dpmac.c
new file mode 100644 (file)
index 0000000..072a90d
--- /dev/null
@@ -0,0 +1,222 @@
+/*
+ * Freescale Layerscape MC I/O wrapper
+ *
+ * Copyright (C) 2015 Freescale Semiconductor, Inc.
+ * Author: Prabhakar Kushwaha <prabhakar@freescale.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <fsl-mc/fsl_mc_sys.h>
+#include <fsl-mc/fsl_mc_cmd.h>
+#include <fsl-mc/fsl_dpmac.h>
+
+int dpmac_open(struct fsl_mc_io *mc_io,
+              uint32_t cmd_flags,
+              int dpmac_id,
+              uint16_t *token)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMAC_CMDID_OPEN,
+                                         cmd_flags,
+                                         0);
+       DPMAC_CMD_OPEN(cmd, dpmac_id);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+
+       return err;
+}
+
+int dpmac_close(struct fsl_mc_io *mc_io,
+               uint32_t cmd_flags,
+               uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMAC_CMDID_CLOSE, cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpmac_create(struct fsl_mc_io *mc_io,
+                uint32_t cmd_flags,
+                const struct dpmac_cfg *cfg,
+                uint16_t *token)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMAC_CMDID_CREATE,
+                                         cmd_flags,
+                                         0);
+       DPMAC_CMD_CREATE(cmd, cfg);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+
+       return 0;
+}
+
+int dpmac_destroy(struct fsl_mc_io *mc_io,
+                 uint32_t cmd_flags,
+                 uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMAC_CMDID_DESTROY,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpmac_get_attributes(struct fsl_mc_io *mc_io,
+                        uint32_t cmd_flags,
+                        uint16_t token,
+                        struct dpmac_attr *attr)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_ATTR,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPMAC_RSP_GET_ATTRIBUTES(cmd, attr);
+
+       return 0;
+}
+
+int dpmac_mdio_read(struct fsl_mc_io *mc_io,
+                   uint32_t cmd_flags,
+                   uint16_t token,
+                   struct dpmac_mdio_cfg *cfg)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMAC_CMDID_MDIO_READ,
+                                         cmd_flags,
+                                         token);
+       DPMAC_CMD_MDIO_READ(cmd, cfg);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPMAC_RSP_MDIO_READ(cmd, cfg->data);
+
+       return 0;
+}
+
+int dpmac_mdio_write(struct fsl_mc_io *mc_io,
+                    uint32_t cmd_flags,
+                    uint16_t token,
+                    struct dpmac_mdio_cfg *cfg)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMAC_CMDID_MDIO_WRITE,
+                                         cmd_flags,
+                                         token);
+       DPMAC_CMD_MDIO_WRITE(cmd, cfg);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpmac_get_link_cfg(struct fsl_mc_io *mc_io,
+                      uint32_t cmd_flags,
+                      uint16_t token,
+                      struct dpmac_link_cfg *cfg)
+{
+       struct mc_command cmd = { 0 };
+       int err = 0;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_LINK_CFG,
+                                         cmd_flags,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       DPMAC_RSP_GET_LINK_CFG(cmd, cfg);
+
+       return 0;
+}
+
+int dpmac_set_link_state(struct fsl_mc_io *mc_io,
+                        uint32_t cmd_flags,
+                        uint16_t token,
+                        struct dpmac_link_state *link_state)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMAC_CMDID_SET_LINK_STATE,
+                                         cmd_flags,
+                                         token);
+       DPMAC_CMD_SET_LINK_STATE(cmd, link_state);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpmac_get_counter(struct fsl_mc_io *mc_io,
+                     uint32_t cmd_flags,
+                     uint16_t token,
+                     enum dpmac_counter type,
+                     uint64_t *counter)
+{
+       struct mc_command cmd = { 0 };
+       int err = 0;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_COUNTER,
+                                         cmd_flags,
+                                         token);
+       DPMAC_CMD_GET_COUNTER(cmd, type);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       DPMAC_RSP_GET_COUNTER(cmd, *counter);
+
+       return 0;
+}
diff --git a/include/fsl-mc/fsl_dpmac.h b/include/fsl-mc/fsl_dpmac.h
new file mode 100644 (file)
index 0000000..24f0b48
--- /dev/null
@@ -0,0 +1,468 @@
+/*
+ * Freescale Layerscape MC I/O wrapper
+ *
+ * Copyright (C) 2015 Freescale Semiconductor, Inc.
+ * Author: Prabhakar Kushwaha <prabhakar@freescale.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __FSL_DPMAC_H
+#define __FSL_DPMAC_H
+
+/* DPMAC Version */
+#define DPMAC_VER_MAJOR                                3
+#define DPMAC_VER_MINOR                                1
+
+/* Command IDs */
+#define DPMAC_CMDID_CLOSE                      0x800
+#define DPMAC_CMDID_OPEN                       0x80c
+#define DPMAC_CMDID_CREATE                     0x90c
+#define DPMAC_CMDID_DESTROY                    0x900
+
+#define DPMAC_CMDID_GET_ATTR                   0x004
+#define DPMAC_CMDID_RESET                      0x005
+
+#define DPMAC_CMDID_MDIO_READ                  0x0c0
+#define DPMAC_CMDID_MDIO_WRITE                 0x0c1
+#define DPMAC_CMDID_GET_LINK_CFG               0x0c2
+#define DPMAC_CMDID_SET_LINK_STATE             0x0c3
+#define DPMAC_CMDID_GET_COUNTER                        0x0c4
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPMAC_CMD_CREATE(cmd, cfg) \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      cfg->mac_id)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPMAC_CMD_OPEN(cmd, dpmac_id) \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      dpmac_id)
+
+/*                cmd, param, offset, width, type,     arg_name */
+#define DPMAC_RSP_GET_ATTRIBUTES(cmd, attr) \
+do { \
+       MC_RSP_OP(cmd, 0, 0,  32, int,                  attr->phy_id);\
+       MC_RSP_OP(cmd, 0, 32, 32, int,                  attr->id);\
+       MC_RSP_OP(cmd, 1, 0,  16, uint16_t,             attr->version.major);\
+       MC_RSP_OP(cmd, 1, 16, 16, uint16_t,             attr->version.minor);\
+       MC_RSP_OP(cmd, 1, 32,  8, enum dpmac_link_type, attr->link_type);\
+       MC_RSP_OP(cmd, 1, 40,  8, enum dpmac_eth_if,    attr->eth_if);\
+       MC_RSP_OP(cmd, 2, 0,  32, uint32_t,             attr->max_rate);\
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPMAC_CMD_MDIO_READ(cmd, cfg) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  8,  uint8_t,  cfg->phy_addr); \
+       MC_CMD_OP(cmd, 0, 8,  8,  uint8_t,  cfg->reg); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPMAC_RSP_MDIO_READ(cmd, data) \
+       MC_RSP_OP(cmd, 0, 16, 16, uint16_t, data)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPMAC_CMD_MDIO_WRITE(cmd, cfg) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  8,  uint8_t,  cfg->phy_addr); \
+       MC_CMD_OP(cmd, 0, 8,  8,  uint8_t,  cfg->reg); \
+       MC_CMD_OP(cmd, 0, 16, 16, uint16_t, cfg->data); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPMAC_RSP_GET_LINK_CFG(cmd, cfg) \
+do { \
+       MC_RSP_OP(cmd, 0, 0,  64, uint64_t, cfg->options); \
+       MC_RSP_OP(cmd, 1, 0,  32, uint32_t, cfg->rate); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPMAC_CMD_SET_LINK_STATE(cmd, cfg) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  64, uint64_t, cfg->options); \
+       MC_CMD_OP(cmd, 1, 0,  32, uint32_t, cfg->rate); \
+       MC_CMD_OP(cmd, 2, 0,  1,  int,      cfg->up); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPMAC_CMD_GET_COUNTER(cmd, type) \
+       MC_CMD_OP(cmd, 0, 0,  8, enum dpmac_counter, type)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPMAC_RSP_GET_COUNTER(cmd, counter) \
+       MC_RSP_OP(cmd, 1, 0, 64, uint64_t, counter)
+
+/* Data Path MAC API
+ * Contains initialization APIs and runtime control APIs for DPMAC
+ */
+
+struct fsl_mc_io;
+
+/**
+ * dpmac_open() - Open a control session for the specified object.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @dpmac_id:  DPMAC unique ID
+ * @token:     Returned token; use in subsequent API calls
+ *
+ * This function can be used to open a control session for an
+ * already created object; an object may have been declared in
+ * the DPL or by calling the dpmac_create function.
+ * This function returns a unique authentication token,
+ * associated with the specific object ID and the specific MC
+ * portal; this token must be used in all subsequent commands for
+ * this specific object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpmac_open(struct fsl_mc_io        *mc_io,
+              uint32_t         cmd_flags,
+              int                      dpmac_id,
+              uint16_t         *token);
+
+/**
+ * dpmac_close() - Close the control session of the object
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPMAC object
+ *
+ * After this function is called, no further operations are
+ * allowed on the object without opening a new control session.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpmac_close(struct fsl_mc_io       *mc_io,
+               uint32_t                cmd_flags,
+               uint16_t                token);
+
+/**
+ * enum dpmac_link_type -  DPMAC link type
+ * @DPMAC_LINK_TYPE_NONE: No link
+ * @DPMAC_LINK_TYPE_FIXED: Link is fixed type
+ * @DPMAC_LINK_TYPE_PHY: Link by PHY ID
+ * @DPMAC_LINK_TYPE_BACKPLANE: Backplane link type
+ */
+enum dpmac_link_type {
+       DPMAC_LINK_TYPE_NONE,
+       DPMAC_LINK_TYPE_FIXED,
+       DPMAC_LINK_TYPE_PHY,
+       DPMAC_LINK_TYPE_BACKPLANE
+};
+
+/**
+ * enum dpmac_eth_if - DPMAC Ethrnet interface
+ * @DPMAC_ETH_IF_MII: MII interface
+ * @DPMAC_ETH_IF_RMII: RMII interface
+ * @DPMAC_ETH_IF_SMII: SMII interface
+ * @DPMAC_ETH_IF_GMII: GMII interface
+ * @DPMAC_ETH_IF_RGMII: RGMII interface
+ * @DPMAC_ETH_IF_SGMII: SGMII interface
+ * @DPMAC_ETH_IF_QSGMII: QSGMII interface
+ * @DPMAC_ETH_IF_XAUI: XAUI interface
+ * @DPMAC_ETH_IF_XFI: XFI interface
+ */
+enum dpmac_eth_if {
+       DPMAC_ETH_IF_MII,
+       DPMAC_ETH_IF_RMII,
+       DPMAC_ETH_IF_SMII,
+       DPMAC_ETH_IF_GMII,
+       DPMAC_ETH_IF_RGMII,
+       DPMAC_ETH_IF_SGMII,
+       DPMAC_ETH_IF_QSGMII,
+       DPMAC_ETH_IF_XAUI,
+       DPMAC_ETH_IF_XFI
+};
+
+/**
+ * struct dpmac_cfg - Structure representing DPMAC configuration
+ * @mac_id:    Represents the Hardware MAC ID; in case of multiple WRIOP,
+ *             the MAC IDs are continuous.
+ *             For example:  2 WRIOPs, 16 MACs in each:
+ *                             MAC IDs for the 1st WRIOP: 1-16,
+ *                             MAC IDs for the 2nd WRIOP: 17-32.
+ */
+struct dpmac_cfg {
+       int mac_id;
+};
+
+/**
+ * dpmac_create() - Create the DPMAC object.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @cfg:       Configuration structure
+ * @token:     Returned token; use in subsequent API calls
+ *
+ * Create the DPMAC object, allocate required resources and
+ * perform required initialization.
+ *
+ * The object can be created either by declaring it in the
+ * DPL file, or by calling this function.
+ * This function returns a unique authentication token,
+ * associated with the specific object ID and the specific MC
+ * portal; this token must be used in all subsequent calls to
+ * this specific object. For objects that are created using the
+ * DPL file, call dpmac_open function to get an authentication
+ * token first.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpmac_create(struct fsl_mc_io      *mc_io,
+                uint32_t               cmd_flags,
+                const struct dpmac_cfg *cfg,
+                uint16_t               *token);
+
+/**
+ * dpmac_destroy() - Destroy the DPMAC object and release all its resources.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPMAC object
+ *
+ * Return:     '0' on Success; error code otherwise.
+ */
+int dpmac_destroy(struct fsl_mc_io     *mc_io,
+                 uint32_t              cmd_flags,
+                 uint16_t              token);
+
+/* DPMAC IRQ Index and Events */
+
+/* IRQ index */
+#define DPMAC_IRQ_INDEX                                                0
+/* IRQ event - indicates a change in link state */
+#define DPMAC_IRQ_EVENT_LINK_CFG_REQ           0x00000001
+/* irq event - Indicates that the link state changed */
+#define DPMAC_IRQ_EVENT_LINK_CHANGED           0x00000002
+
+/**
+ * struct dpmac_attr - Structure representing DPMAC attributes
+ * @id:                DPMAC object ID
+ * @phy_id:    PHY ID
+ * @link_type: link type
+ * @eth_if: Ethernet interface
+ * @max_rate: Maximum supported rate - in Mbps
+ * @version:   DPMAC version
+ */
+struct dpmac_attr {
+       int                     id;
+       int                     phy_id;
+       enum dpmac_link_type    link_type;
+       enum dpmac_eth_if       eth_if;
+       uint32_t                max_rate;
+       /**
+        * struct version - Structure representing DPMAC version
+        * @major:      DPMAC major version
+        * @minor:      DPMAC minor version
+        */
+       struct {
+               uint16_t major;
+               uint16_t minor;
+       } version;
+};
+
+/**
+ * dpmac_get_attributes - Retrieve DPMAC attributes.
+ *
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPMAC object
+ * @attr:      Returned object's attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpmac_get_attributes(struct fsl_mc_io      *mc_io,
+                        uint32_t               cmd_flags,
+                        uint16_t               token,
+                        struct dpmac_attr      *attr);
+
+/**
+ * struct dpmac_mdio_cfg - DPMAC MDIO read/write parameters
+ * @phy_addr: MDIO device address
+ * @reg: Address of the register within the Clause 45 PHY device from which data
+ *     is to be read
+ * @data: Data read/write from/to MDIO
+ */
+struct dpmac_mdio_cfg {
+       uint8_t         phy_addr;
+       uint8_t         reg;
+       uint16_t        data;
+};
+
+/**
+ * dpmac_mdio_read() - Perform MDIO read transaction
+ * @mc_io:     Pointer to opaque I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPMAC object
+ * @cfg:       Structure with MDIO transaction parameters
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpmac_mdio_read(struct fsl_mc_io           *mc_io,
+                   uint32_t                    cmd_flags,
+                   uint16_t                    token,
+                   struct dpmac_mdio_cfg       *cfg);
+
+/**
+ * dpmac_mdio_write() - Perform MDIO write transaction
+ * @mc_io:     Pointer to opaque I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPMAC object
+ * @cfg:       Structure with MDIO transaction parameters
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpmac_mdio_write(struct fsl_mc_io          *mc_io,
+                    uint32_t                   cmd_flags,
+                    uint16_t                   token,
+                    struct dpmac_mdio_cfg      *cfg);
+
+/* DPMAC link configuration/state options */
+
+/* Enable auto-negotiation */
+#define DPMAC_LINK_OPT_AUTONEG         0x0000000000000001ULL
+/* Enable half-duplex mode */
+#define DPMAC_LINK_OPT_HALF_DUPLEX     0x0000000000000002ULL
+/* Enable pause frames */
+#define DPMAC_LINK_OPT_PAUSE           0x0000000000000004ULL
+/* Enable a-symmetric pause frames */
+#define DPMAC_LINK_OPT_ASYM_PAUSE      0x0000000000000008ULL
+
+/**
+ * struct dpmac_link_cfg - Structure representing DPMAC link configuration
+ * @rate: Link's rate - in Mbps
+ * @options: Enable/Disable DPMAC link cfg features (bitmap)
+ */
+struct dpmac_link_cfg {
+       uint32_t rate;
+       uint64_t options;
+};
+
+/**
+ * dpmac_get_link_cfg() - Get Ethernet link configuration
+ * @mc_io:     Pointer to opaque I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPMAC object
+ * @cfg:       Returned structure with the link configuration
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpmac_get_link_cfg(struct fsl_mc_io        *mc_io,
+                      uint32_t         cmd_flags,
+                      uint16_t         token,
+                      struct dpmac_link_cfg    *cfg);
+
+/**
+ * struct dpmac_link_state - DPMAC link configuration request
+ * @rate: Rate in Mbps
+ * @options: Enable/Disable DPMAC link cfg features (bitmap)
+ * @up: Link state
+ */
+struct dpmac_link_state {
+       uint32_t        rate;
+       uint64_t        options;
+       int             up;
+};
+
+/**
+ * dpmac_set_link_state() - Set the Ethernet link status
+ * @mc_io:     Pointer to opaque I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPMAC object
+ * @link_state:        Link state configuration
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpmac_set_link_state(struct fsl_mc_io              *mc_io,
+                        uint32_t                       cmd_flags,
+                        uint16_t                       token,
+                        struct dpmac_link_state        *link_state);
+
+/**
+ * enum dpni_counter - DPNI counter types
+ * @DPMAC_CNT_ING_FRAME_64: counts 64-octet frame, good or bad.
+ * @DPMAC_CNT_ING_FRAME_127: counts 65- to 127-octet frame, good or bad.
+ * @DPMAC_CNT_ING_FRAME_255: counts 128- to 255-octet frame, good or bad.
+ * @DPMAC_CNT_ING_FRAME_511: counts 256- to 511-octet frame, good or bad.
+ * @DPMAC_CNT_ING_FRAME_1023: counts 512- to 1023-octet frame, good or bad.
+ * @DPMAC_CNT_ING_FRAME_1518: counts 1024- to 1518-octet frame, good or bad.
+ * @DPMAC_CNT_ING_FRAME_1519_MAX: counts 1519-octet frame and larger
+ *                               (up to max frame length specified),
+ *                               good or bad.
+ * @DPMAC_CNT_ING_FRAG: counts packet which is shorter than 64 octets received
+ *                     with a wrong CRC
+ * @DPMAC_CNT_ING_JABBER: counts packet longer than the maximum frame length
+ *                       specified, with a bad frame check sequence.
+ * @DPMAC_CNT_ING_FRAME_DISCARD: counts dropped packet due to internal errors.
+ *                              Occurs when a receive FIFO overflows.
+ *                              Includes also packets truncated as a result of
+ *                              the receive FIFO overflow.
+ * @DPMAC_CNT_ING_ALIGN_ERR: counts frame with an alignment error
+ *                          (optional used for wrong SFD)
+ * @DPMAC_CNT_EGR_UNDERSIZED: counts packet transmitted that was less than 64
+ *                           octets long with a good CRC.
+ * @DPMAC_CNT_ING_OVERSIZED: counts packet longer than the maximum frame length
+ *                          specified, with a good frame check sequence.
+ * @DPMAC_CNT_ING_VALID_PAUSE_FRAME: counts valid pause frame (regular and PFC).
+ * @DPMAC_CNT_EGR_VALID_PAUSE_FRAME: counts valid pause frame transmitted
+ *                                  (regular and PFC).
+ * @DPMAC_CNT_ING_BYTE: counts octet received except preamble for all valid
+ *                             frames and valid pause frames.
+ * @DPMAC_CNT_ING_MCAST_FRAME: counts received multicast frame
+ * @DPMAC_CNT_ING_BCAST_FRAME: counts received broadcast frame
+ * @DPMAC_CNT_ING_ALL_FRAME: counts each good or bad packet received.
+ * @DPMAC_CNT_ING_UCAST_FRAME: counts received unicast frame
+ * @DPMAC_CNT_ING_ERR_FRAME: counts frame received with an error
+ *                          (except for undersized/fragment frame)
+ * @DPMAC_CNT_EGR_BYTE: counts octet transmitted except preamble for all valid
+ *                     frames and valid pause frames transmitted.
+ * @DPMAC_CNT_EGR_MCAST_FRAME: counts transmitted multicast frame
+ * @DPMAC_CNT_EGR_BCAST_FRAME: counts transmitted broadcast frame
+ * @DPMAC_CNT_EGR_UCAST_FRAME: counts transmitted unicast frame
+ * @DPMAC_CNT_EGR_ERR_FRAME: counts frame transmitted with an error
+ * @DPMAC_CNT_ING_GOOD_FRAME: counts frame received without error, including
+ *                           pause frames.
+ */
+enum dpmac_counter {
+       DPMAC_CNT_ING_FRAME_64,
+       DPMAC_CNT_ING_FRAME_127,
+       DPMAC_CNT_ING_FRAME_255,
+       DPMAC_CNT_ING_FRAME_511,
+       DPMAC_CNT_ING_FRAME_1023,
+       DPMAC_CNT_ING_FRAME_1518,
+       DPMAC_CNT_ING_FRAME_1519_MAX,
+       DPMAC_CNT_ING_FRAG,
+       DPMAC_CNT_ING_JABBER,
+       DPMAC_CNT_ING_FRAME_DISCARD,
+       DPMAC_CNT_ING_ALIGN_ERR,
+       DPMAC_CNT_EGR_UNDERSIZED,
+       DPMAC_CNT_ING_OVERSIZED,
+       DPMAC_CNT_ING_VALID_PAUSE_FRAME,
+       DPMAC_CNT_EGR_VALID_PAUSE_FRAME,
+       DPMAC_CNT_ING_BYTE,
+       DPMAC_CNT_ING_MCAST_FRAME,
+       DPMAC_CNT_ING_BCAST_FRAME,
+       DPMAC_CNT_ING_ALL_FRAME,
+       DPMAC_CNT_ING_UCAST_FRAME,
+       DPMAC_CNT_ING_ERR_FRAME,
+       DPMAC_CNT_EGR_BYTE,
+       DPMAC_CNT_EGR_MCAST_FRAME,
+       DPMAC_CNT_EGR_BCAST_FRAME,
+       DPMAC_CNT_EGR_UCAST_FRAME,
+       DPMAC_CNT_EGR_ERR_FRAME,
+       DPMAC_CNT_ING_GOOD_FRAME
+};
+
+/**
+ * dpmac_get_counter() - Read a specific DPMAC counter
+ * @mc_io:     Pointer to opaque I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPMAC object
+ * @type:      The requested counter
+ * @counter:   Returned counter value
+ *
+ * Return:     The requested counter; '0' otherwise.
+ */
+int dpmac_get_counter(struct fsl_mc_io         *mc_io,
+                     uint32_t                  cmd_flags,
+                     uint16_t                  token,
+                     enum dpmac_counter         type,
+                     uint64_t                  *counter);
+
+#endif /* __FSL_DPMAC_H */