net: add rte prefix to ether structures
[dpdk.git] / drivers / net / axgbe / axgbe_ethdev.h
index effb132..810ac4a 100644 (file)
 #include <rte_lcore.h>
 #include "axgbe_common.h"
 
+#define IRQ                            0xff
+#define VLAN_HLEN                      4
+
+#define AXGBE_TX_MAX_BUF_SIZE          (0x3fff & ~(64 - 1))
+#define AXGBE_RX_MAX_BUF_SIZE          (0x3fff & ~(64 - 1))
+#define AXGBE_RX_MIN_BUF_SIZE          (ETHER_MAX_LEN + VLAN_HLEN)
+#define AXGBE_MAX_MAC_ADDRS            1
+
+#define AXGBE_RX_BUF_ALIGN             64
+
 #define AXGBE_MAX_DMA_CHANNELS         16
 #define AXGBE_MAX_QUEUES               16
 #define AXGBE_PRIORITY_QUEUES          8
 #define AXGBE_DMA_SYS_ARCACHE          0x0
 #define AXGBE_DMA_SYS_AWCACHE          0x0
 
+/* DMA channel interrupt modes */
+#define AXGBE_IRQ_MODE_EDGE            0
+#define AXGBE_IRQ_MODE_LEVEL           1
+
+#define AXGBE_DMA_INTERRUPT_MASK       0x31c7
+
+#define AXGMAC_MIN_PACKET              60
+#define AXGMAC_STD_PACKET_MTU          1500
+#define AXGMAC_MAX_STD_PACKET          1518
+#define AXGMAC_JUMBO_PACKET_MTU                9000
+#define AXGMAC_MAX_JUMBO_PACKET                9018
+/* Inter-frame gap + preamble */
+#define AXGMAC_ETH_PREAMBLE            (12 + 8)
+
+#define AXGMAC_PFC_DATA_LEN            46
+#define AXGMAC_PFC_DELAYS              14000
+
 /* PCI BAR mapping */
 #define AXGBE_AXGMAC_BAR               0
 #define AXGBE_XPCS_BAR                 1
@@ -189,6 +216,61 @@ enum axgbe_mdio_mode {
        AXGBE_MDIO_MODE_CL45,
 };
 
+struct axgbe_phy {
+       uint32_t supported;
+       uint32_t advertising;
+       uint32_t lp_advertising;
+
+       int address;
+
+       int autoneg;
+       int speed;
+       int duplex;
+
+       int link;
+
+       int pause_autoneg;
+       int tx_pause;
+       int rx_pause;
+};
+
+enum axgbe_i2c_cmd {
+       AXGBE_I2C_CMD_READ = 0,
+       AXGBE_I2C_CMD_WRITE,
+};
+
+struct axgbe_i2c_op {
+       enum axgbe_i2c_cmd cmd;
+
+       unsigned int target;
+
+       uint8_t *buf;
+       unsigned int len;
+};
+
+struct axgbe_i2c_op_state {
+       struct axgbe_i2c_op *op;
+
+       unsigned int tx_len;
+       unsigned char *tx_buf;
+
+       unsigned int rx_len;
+       unsigned char *rx_buf;
+
+       unsigned int tx_abort_source;
+
+       int ret;
+};
+
+struct axgbe_i2c {
+       unsigned int started;
+       unsigned int max_speed_mode;
+       unsigned int rx_fifo_size;
+       unsigned int tx_fifo_size;
+
+       struct axgbe_i2c_op_state op_state;
+};
+
 struct axgbe_hw_if {
        void (*config_flow_control)(struct axgbe_port *);
        int (*config_rx_mode)(struct axgbe_port *);
@@ -211,6 +293,93 @@ struct axgbe_hw_if {
        int (*exit)(struct axgbe_port *);
 };
 
+/* This structure represents implementation specific routines for an
+ * implementation of a PHY. All routines are required unless noted below.
+ *   Optional routines:
+ *     kr_training_pre, kr_training_post
+ */
+struct axgbe_phy_impl_if {
+       /* Perform Setup/teardown actions */
+       int (*init)(struct axgbe_port *);
+       void (*exit)(struct axgbe_port *);
+
+       /* Perform start/stop specific actions */
+       int (*reset)(struct axgbe_port *);
+       int (*start)(struct axgbe_port *);
+       void (*stop)(struct axgbe_port *);
+
+       /* Return the link status */
+       int (*link_status)(struct axgbe_port *, int *);
+
+       /* Indicate if a particular speed is valid */
+       int (*valid_speed)(struct axgbe_port *, int);
+
+       /* Check if the specified mode can/should be used */
+       bool (*use_mode)(struct axgbe_port *, enum axgbe_mode);
+       /* Switch the PHY into various modes */
+       void (*set_mode)(struct axgbe_port *, enum axgbe_mode);
+       /* Retrieve mode needed for a specific speed */
+       enum axgbe_mode (*get_mode)(struct axgbe_port *, int);
+       /* Retrieve new/next mode when trying to auto-negotiate */
+       enum axgbe_mode (*switch_mode)(struct axgbe_port *);
+       /* Retrieve current mode */
+       enum axgbe_mode (*cur_mode)(struct axgbe_port *);
+
+       /* Retrieve current auto-negotiation mode */
+       enum axgbe_an_mode (*an_mode)(struct axgbe_port *);
+
+       /* Configure auto-negotiation settings */
+       int (*an_config)(struct axgbe_port *);
+
+       /* Set/override auto-negotiation advertisement settings */
+       unsigned int (*an_advertising)(struct axgbe_port *port);
+
+       /* Process results of auto-negotiation */
+       enum axgbe_mode (*an_outcome)(struct axgbe_port *);
+
+       /* Pre/Post auto-negotiation support */
+       void (*an_pre)(struct axgbe_port *port);
+       void (*an_post)(struct axgbe_port *port);
+
+       /* Pre/Post KR training enablement support */
+       void (*kr_training_pre)(struct axgbe_port *);
+       void (*kr_training_post)(struct axgbe_port *);
+};
+
+struct axgbe_phy_if {
+       /* For PHY setup/teardown */
+       int (*phy_init)(struct axgbe_port *);
+       void (*phy_exit)(struct axgbe_port *);
+
+       /* For PHY support when setting device up/down */
+       int (*phy_reset)(struct axgbe_port *);
+       int (*phy_start)(struct axgbe_port *);
+       void (*phy_stop)(struct axgbe_port *);
+
+       /* For PHY support while device is up */
+       void (*phy_status)(struct axgbe_port *);
+       int (*phy_config_aneg)(struct axgbe_port *);
+
+       /* For PHY settings validation */
+       int (*phy_valid_speed)(struct axgbe_port *, int);
+       /* For single interrupt support */
+       void (*an_isr)(struct axgbe_port *);
+       /* PHY implementation specific services */
+       struct axgbe_phy_impl_if phy_impl;
+};
+
+struct axgbe_i2c_if {
+       /* For initial I2C setup */
+       int (*i2c_init)(struct axgbe_port *);
+
+       /* For I2C support when setting device up/down */
+       int (*i2c_start)(struct axgbe_port *);
+       void (*i2c_stop)(struct axgbe_port *);
+
+       /* For performing I2C operations */
+       int (*i2c_xfer)(struct axgbe_port *, struct axgbe_i2c_op *);
+};
+
 /* This structure contains flags that indicate what hardware features
  * or configurations are present in the device.
  */
@@ -258,6 +427,7 @@ struct axgbe_hw_features {
 };
 
 struct axgbe_version_data {
+       void (*init_function_ptrs_phy_impl)(struct axgbe_phy_if *);
        enum axgbe_xpcs_access xpcs_access;
        unsigned int mmc_64bit;
        unsigned int tx_max_fifo_size;
@@ -265,6 +435,7 @@ struct axgbe_version_data {
        unsigned int tx_tstamp_workaround;
        unsigned int ecc_support;
        unsigned int i2c_support;
+       unsigned int an_cdr_workaround;
 };
 
 /*
@@ -279,11 +450,12 @@ struct axgbe_port {
        struct axgbe_version_data *vdata;
 
        /* AXGMAC/XPCS related mmio registers */
-       uint64_t xgmac_regs;    /* AXGMAC CSRs */
-       uint64_t xpcs_regs;     /* XPCS MMD registers */
-       uint64_t xprop_regs;    /* AXGBE property registers */
-       uint64_t xi2c_regs;     /* AXGBE I2C CSRs */
+       void *xgmac_regs;       /* AXGMAC CSRs */
+       void *xpcs_regs;        /* XPCS MMD registers */
+       void *xprop_regs;       /* AXGBE property registers */
+       void *xi2c_regs;        /* AXGBE I2C CSRs */
 
+       bool cdr_track_early;
        /* XPCS indirect addressing lock */
        unsigned int xpcs_window_def_reg;
        unsigned int xpcs_window_sel_reg;
@@ -295,6 +467,8 @@ struct axgbe_port {
        unsigned long dev_state;
 
        struct axgbe_hw_if hw_if;
+       struct axgbe_phy_if phy_if;
+       struct axgbe_i2c_if i2c_if;
 
        /* AXI DMA settings */
        unsigned int coherent;
@@ -365,8 +539,48 @@ struct axgbe_port {
        /* Hardware features of the device */
        struct axgbe_hw_features hw_feat;
 
-       struct ether_addr mac_addr;
+       struct rte_ether_addr mac_addr;
+
+       /* Software Tx/Rx structure pointers*/
+       void **rx_queues;
+       void **tx_queues;
+
+       /* MDIO/PHY related settings */
+       unsigned int phy_started;
+       void *phy_data;
+       struct axgbe_phy phy;
+       int mdio_mmd;
+       unsigned long link_check;
+       volatile int mdio_completion;
+
+       unsigned int kr_redrv;
+
+       /* Auto-negotiation atate machine support */
+       unsigned int an_int;
+       unsigned int an_status;
+       enum axgbe_an an_result;
+       enum axgbe_an an_state;
+       enum axgbe_rx kr_state;
+       enum axgbe_rx kx_state;
+       unsigned int an_supported;
+       unsigned int parallel_detect;
+       unsigned int fec_ability;
+       unsigned long an_start;
+       enum axgbe_an_mode an_mode;
+
+       /* I2C support */
+       struct axgbe_i2c i2c;
+       volatile int i2c_complete;
+
+       /* CRC stripping by H/w for Rx packet*/
+       int crc_strip_enable;
+       /* csum enable to hardware */
+       uint32_t rx_csum_enable;
 };
 
 void axgbe_init_function_ptrs_dev(struct axgbe_hw_if *hw_if);
+void axgbe_init_function_ptrs_phy(struct axgbe_phy_if *phy_if);
+void axgbe_init_function_ptrs_phy_v2(struct axgbe_phy_if *phy_if);
+void axgbe_init_function_ptrs_i2c(struct axgbe_i2c_if *i2c_if);
+
 #endif /* RTE_ETH_AXGBE_H_ */