Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[firefly-linux-kernel-4.4.55.git] / drivers / net / ethernet / stmicro / stmmac / common.h
index 186d1480612210d39d26b05305243d8fc71e1c16..7788fbe44f0ad35eee37a701733f3576cec271e4 100644 (file)
@@ -117,6 +117,36 @@ struct stmmac_extra_stats {
        unsigned long irq_rx_path_in_lpi_mode_n;
        unsigned long irq_rx_path_exit_lpi_mode_n;
        unsigned long phy_eee_wakeup_error_n;
+       /* Extended RDES status */
+       unsigned long ip_hdr_err;
+       unsigned long ip_payload_err;
+       unsigned long ip_csum_bypassed;
+       unsigned long ipv4_pkt_rcvd;
+       unsigned long ipv6_pkt_rcvd;
+       unsigned long rx_msg_type_ext_no_ptp;
+       unsigned long rx_msg_type_sync;
+       unsigned long rx_msg_type_follow_up;
+       unsigned long rx_msg_type_delay_req;
+       unsigned long rx_msg_type_delay_resp;
+       unsigned long rx_msg_type_pdelay_req;
+       unsigned long rx_msg_type_pdelay_resp;
+       unsigned long rx_msg_type_pdelay_follow_up;
+       unsigned long ptp_frame_type;
+       unsigned long ptp_ver;
+       unsigned long timestamp_dropped;
+       unsigned long av_pkt_rcvd;
+       unsigned long av_tagged_pkt_rcvd;
+       unsigned long vlan_tag_priority_val;
+       unsigned long l3_filter_match;
+       unsigned long l4_filter_match;
+       unsigned long l3_l4_filter_no_match;
+       /* PCS */
+       unsigned long irq_pcs_ane_n;
+       unsigned long irq_pcs_link_n;
+       unsigned long irq_rgmii_n;
+       unsigned long pcs_link;
+       unsigned long pcs_duplex;
+       unsigned long pcs_speed;
 };
 
 /* CSR Frequency Access Defines*/
@@ -138,37 +168,43 @@ struct stmmac_extra_stats {
 #define FLOW_TX                2
 #define FLOW_AUTO      (FLOW_TX | FLOW_RX)
 
-#define SF_DMA_MODE 1 /* DMA STORE-AND-FORWARD Operation Mode */
+/* PCS defines */
+#define STMMAC_PCS_RGMII       (1 << 0)
+#define STMMAC_PCS_SGMII       (1 << 1)
+#define STMMAC_PCS_TBI         (1 << 2)
+#define STMMAC_PCS_RTBI                (1 << 3)
+
+#define SF_DMA_MODE 1          /* DMA STORE-AND-FORWARD Operation Mode */
 
 /* DAM HW feature register fields */
-#define DMA_HW_FEAT_MIISEL     0x00000001 /* 10/100 Mbps Support */
-#define DMA_HW_FEAT_GMIISEL    0x00000002 /* 1000 Mbps Support */
-#define DMA_HW_FEAT_HDSEL      0x00000004 /* Half-Duplex Support */
-#define DMA_HW_FEAT_EXTHASHEN  0x00000008 /* Expanded DA Hash Filter */
-#define DMA_HW_FEAT_HASHSEL    0x00000010 /* HASH Filter */
-#define DMA_HW_FEAT_ADDMACADRSEL       0x00000020 /* Multiple MAC Addr Reg */
-#define DMA_HW_FEAT_PCSSEL     0x00000040 /* PCS registers */
-#define DMA_HW_FEAT_L3L4FLTREN 0x00000080 /* Layer 3 & Layer 4 Feature */
-#define DMA_HW_FEAT_SMASEL     0x00000100 /* SMA(MDIO) Interface */
-#define DMA_HW_FEAT_RWKSEL     0x00000200 /* PMT Remote Wakeup */
-#define DMA_HW_FEAT_MGKSEL     0x00000400 /* PMT Magic Packet */
-#define DMA_HW_FEAT_MMCSEL     0x00000800 /* RMON Module */
-#define DMA_HW_FEAT_TSVER1SEL  0x00001000 /* Only IEEE 1588-2002 Timestamp */
-#define DMA_HW_FEAT_TSVER2SEL  0x00002000 /* IEEE 1588-2008 Adv Timestamp */
-#define DMA_HW_FEAT_EEESEL     0x00004000 /* Energy Efficient Ethernet */
-#define DMA_HW_FEAT_AVSEL      0x00008000 /* AV Feature */
-#define DMA_HW_FEAT_TXCOESEL   0x00010000 /* Checksum Offload in Tx */
-#define DMA_HW_FEAT_RXTYP1COE  0x00020000 /* IP csum Offload(Type 1) in Rx */
-#define DMA_HW_FEAT_RXTYP2COE  0x00040000 /* IP csum Offload(Type 2) in Rx */
-#define DMA_HW_FEAT_RXFIFOSIZE 0x00080000 /* Rx FIFO > 2048 Bytes */
-#define DMA_HW_FEAT_RXCHCNT    0x00300000 /* No. of additional Rx Channels */
-#define DMA_HW_FEAT_TXCHCNT    0x00c00000 /* No. of additional Tx Channels */
-#define DMA_HW_FEAT_ENHDESSEL  0x01000000 /* Alternate (Enhanced Descriptor) */
-#define DMA_HW_FEAT_INTTSEN    0x02000000 /* Timestamping with Internal
-                                             System Time */
-#define DMA_HW_FEAT_FLEXIPPSEN 0x04000000 /* Flexible PPS Output */
-#define DMA_HW_FEAT_SAVLANINS  0x08000000 /* Source Addr or VLAN Insertion */
-#define DMA_HW_FEAT_ACTPHYIF   0x70000000 /* Active/selected PHY interface */
+#define DMA_HW_FEAT_MIISEL     0x00000001      /* 10/100 Mbps Support */
+#define DMA_HW_FEAT_GMIISEL    0x00000002      /* 1000 Mbps Support */
+#define DMA_HW_FEAT_HDSEL      0x00000004      /* Half-Duplex Support */
+#define DMA_HW_FEAT_EXTHASHEN  0x00000008      /* Expanded DA Hash Filter */
+#define DMA_HW_FEAT_HASHSEL    0x00000010      /* HASH Filter */
+#define DMA_HW_FEAT_ADDMAC     0x00000020      /* Multiple MAC Addr Reg */
+#define DMA_HW_FEAT_PCSSEL     0x00000040      /* PCS registers */
+#define DMA_HW_FEAT_L3L4FLTREN 0x00000080      /* Layer 3 & Layer 4 Feature */
+#define DMA_HW_FEAT_SMASEL     0x00000100      /* SMA(MDIO) Interface */
+#define DMA_HW_FEAT_RWKSEL     0x00000200      /* PMT Remote Wakeup */
+#define DMA_HW_FEAT_MGKSEL     0x00000400      /* PMT Magic Packet */
+#define DMA_HW_FEAT_MMCSEL     0x00000800      /* RMON Module */
+#define DMA_HW_FEAT_TSVER1SEL  0x00001000      /* Only IEEE 1588-2002 */
+#define DMA_HW_FEAT_TSVER2SEL  0x00002000      /* IEEE 1588-2008 PTPv2 */
+#define DMA_HW_FEAT_EEESEL     0x00004000      /* Energy Efficient Ethernet */
+#define DMA_HW_FEAT_AVSEL      0x00008000      /* AV Feature */
+#define DMA_HW_FEAT_TXCOESEL   0x00010000      /* Checksum Offload in Tx */
+#define DMA_HW_FEAT_RXTYP1COE  0x00020000      /* IP COE (Type 1) in Rx */
+#define DMA_HW_FEAT_RXTYP2COE  0x00040000      /* IP COE (Type 2) in Rx */
+#define DMA_HW_FEAT_RXFIFOSIZE 0x00080000      /* Rx FIFO > 2048 Bytes */
+#define DMA_HW_FEAT_RXCHCNT    0x00300000      /* No. additional Rx Channels */
+#define DMA_HW_FEAT_TXCHCNT    0x00c00000      /* No. additional Tx Channels */
+#define DMA_HW_FEAT_ENHDESSEL  0x01000000      /* Alternate Descriptor */
+/* Timestamping with Internal System Time */
+#define DMA_HW_FEAT_INTTSEN    0x02000000
+#define DMA_HW_FEAT_FLEXIPPSEN 0x04000000      /* Flexible PPS Output */
+#define DMA_HW_FEAT_SAVLANINS  0x08000000      /* Source Addr or VLAN */
+#define DMA_HW_FEAT_ACTPHYIF   0x70000000      /* Active/selected PHY iface */
 #define DEFAULT_DMA_PBL                8
 
 /* Max/Min RI Watchdog Timer count value */
@@ -180,7 +216,8 @@ struct stmmac_extra_stats {
 #define STMMAC_TX_MAX_FRAMES   256
 #define STMMAC_TX_FRAMES       64
 
-enum rx_frame_status { /* IPC status */
+/* Rx IPC status */
+enum rx_frame_status {
        good_frame = 0,
        discard_frame = 1,
        csum_none = 2,
@@ -194,17 +231,25 @@ enum dma_irq_status {
        handle_tx = 0x8,
 };
 
-enum core_specific_irq_mask {
-       core_mmc_tx_irq = 1,
-       core_mmc_rx_irq = 2,
-       core_mmc_rx_csum_offload_irq = 4,
-       core_irq_receive_pmt_irq = 8,
-       core_irq_tx_path_in_lpi_mode = 16,
-       core_irq_tx_path_exit_lpi_mode = 32,
-       core_irq_rx_path_in_lpi_mode = 64,
-       core_irq_rx_path_exit_lpi_mode = 128,
+#define        CORE_IRQ_TX_PATH_IN_LPI_MODE    (1 << 1)
+#define        CORE_IRQ_TX_PATH_EXIT_LPI_MODE  (1 << 2)
+#define        CORE_IRQ_RX_PATH_IN_LPI_MODE    (1 << 3)
+#define        CORE_IRQ_RX_PATH_EXIT_LPI_MODE  (1 << 4)
+
+#define        CORE_PCS_ANE_COMPLETE           (1 << 5)
+#define        CORE_PCS_LINK_STATUS            (1 << 6)
+#define        CORE_RGMII_IRQ                  (1 << 7)
+
+struct rgmii_adv {
+       unsigned int pause;
+       unsigned int duplex;
+       unsigned int lp_pause;
+       unsigned int lp_duplex;
 };
 
+#define STMMAC_PCS_PAUSE       1
+#define STMMAC_PCS_ASYM_PAUSE  2
+
 /* DMA HW capabilities */
 struct dma_features {
        unsigned int mbps_10_100;
@@ -217,9 +262,9 @@ struct dma_features {
        unsigned int pmt_remote_wake_up;
        unsigned int pmt_magic_frame;
        unsigned int rmon;
-       /* IEEE 1588-2002*/
+       /* IEEE 1588-2002 */
        unsigned int time_stamp;
-       /* IEEE 1588-2008*/
+       /* IEEE 1588-2008 */
        unsigned int atime_stamp;
        /* 802.3az - Energy-Efficient Ethernet (EEE) */
        unsigned int eee;
@@ -232,7 +277,7 @@ struct dma_features {
        /* TX and RX number of channels */
        unsigned int number_rx_channel;
        unsigned int number_tx_channel;
-       /* Alternate (enhanced) DESC mode*/
+       /* Alternate (enhanced) DESC mode */
        unsigned int enh_desc;
 };
 
@@ -255,23 +300,26 @@ struct dma_features {
 #define STMMAC_DEFAULT_LIT_LS_TIMER    0x3E8
 #define STMMAC_DEFAULT_TWT_LS_TIMER    0x0
 
+#define STMMAC_CHAIN_MODE      0x1
+#define STMMAC_RING_MODE       0x2
+
 struct stmmac_desc_ops {
        /* DMA RX descriptor ring initialization */
-       void (*init_rx_desc) (struct dma_desc *p, unsigned int ring_size,
-                             int disable_rx_ic);
+       void (*init_rx_desc) (struct dma_desc *p, int disable_rx_ic, int mode,
+                             int end);
        /* DMA TX descriptor ring initialization */
-       void (*init_tx_desc) (struct dma_desc *p, unsigned int ring_size);
+       void (*init_tx_desc) (struct dma_desc *p, int mode, int end);
 
        /* Invoked by the xmit function to prepare the tx descriptor */
        void (*prepare_tx_desc) (struct dma_desc *p, int is_fs, int len,
-                                int csum_flag);
+                                int csum_flag, int mode);
        /* Set/get the owner of the descriptor */
        void (*set_tx_owner) (struct dma_desc *p);
        int (*get_tx_owner) (struct dma_desc *p);
        /* Invoked by the xmit function to close the tx descriptor */
        void (*close_tx_desc) (struct dma_desc *p);
        /* Clean the tx descriptor as soon as the tx irq is received */
-       void (*release_tx_desc) (struct dma_desc *p);
+       void (*release_tx_desc) (struct dma_desc *p, int mode);
        /* Clear interrupt on tx frame completion. When this bit is
         * set an interrupt happens as soon as the frame is transmitted */
        void (*clear_tx_ic) (struct dma_desc *p);
@@ -290,12 +338,22 @@ struct stmmac_desc_ops {
        /* Return the reception status looking at the RDES1 */
        int (*rx_status) (void *data, struct stmmac_extra_stats *x,
                          struct dma_desc *p);
+       void (*rx_extended_status) (void *data, struct stmmac_extra_stats *x,
+                                   struct dma_extended_desc *p);
+       /* Set tx timestamp enable bit */
+       void (*enable_tx_timestamp) (struct dma_desc *p);
+       /* get tx timestamp status */
+       int (*get_tx_timestamp_status) (struct dma_desc *p);
+       /* get timestamp value */
+        u64(*get_timestamp) (void *desc, u32 ats);
+       /* get rx timestamp status */
+       int (*get_rx_timestamp_status) (void *desc, u32 ats);
 };
 
 struct stmmac_dma_ops {
        /* DMA core initialization */
        int (*init) (void __iomem *ioaddr, int pbl, int fb, int mb,
-                    int burst_len, u32 dma_tx, u32 dma_rx);
+                    int burst_len, u32 dma_tx, u32 dma_rx, int atds);
        /* Dump DMA registers */
        void (*dump_regs) (void __iomem *ioaddr);
        /* Set tx/rx threshold in the csr6 register
@@ -321,13 +379,14 @@ struct stmmac_dma_ops {
 
 struct stmmac_ops {
        /* MAC core initialization */
-       void (*core_init) (void __iomem *ioaddr) ____cacheline_aligned;
+       void (*core_init) (void __iomem *ioaddr);
        /* Enable and verify that the IPC module is supported */
        int (*rx_ipc) (void __iomem *ioaddr);
        /* Dump MAC registers */
        void (*dump_regs) (void __iomem *ioaddr);
        /* Handle extra events on specific interrupts hw dependent */
-       int (*host_irq_status) (void __iomem *ioaddr);
+       int (*host_irq_status) (void __iomem *ioaddr,
+                               struct stmmac_extra_stats *x);
        /* Multicast filter setting */
        void (*set_filter) (struct net_device *dev, int id);
        /* Flow control setting */
@@ -344,6 +403,18 @@ struct stmmac_ops {
        void (*reset_eee_mode) (void __iomem *ioaddr);
        void (*set_eee_timer) (void __iomem *ioaddr, int ls, int tw);
        void (*set_eee_pls) (void __iomem *ioaddr, int link);
+       void (*ctrl_ane) (void __iomem *ioaddr, bool restart);
+       void (*get_adv) (void __iomem *ioaddr, struct rgmii_adv *adv);
+};
+
+struct stmmac_hwtimestamp {
+       void (*config_hw_tstamping) (void __iomem *ioaddr, u32 data);
+       void (*config_sub_second_increment) (void __iomem *ioaddr);
+       int (*init_systime) (void __iomem *ioaddr, u32 sec, u32 nsec);
+       int (*config_addend) (void __iomem *ioaddr, u32 addend);
+       int (*adjust_systime) (void __iomem *ioaddr, u32 sec, u32 nsec,
+                              int add_sub);
+        u64(*get_systime) (void __iomem *ioaddr);
 };
 
 struct mac_link {
@@ -360,19 +431,28 @@ struct mii_regs {
 struct stmmac_ring_mode_ops {
        unsigned int (*is_jumbo_frm) (int len, int ehn_desc);
        unsigned int (*jumbo_frm) (void *priv, struct sk_buff *skb, int csum);
-       void (*refill_desc3) (int bfsize, struct dma_desc *p);
-       void (*init_desc3) (int des3_as_data_buf, struct dma_desc *p);
-       void (*init_dma_chain) (struct dma_desc *des, dma_addr_t phy_addr,
-                               unsigned int size);
-       void (*clean_desc3) (struct dma_desc *p);
+       void (*refill_desc3) (void *priv, struct dma_desc *p);
+       void (*init_desc3) (struct dma_desc *p);
+       void (*clean_desc3) (void *priv, struct dma_desc *p);
        int (*set_16kib_bfsize) (int mtu);
 };
 
+struct stmmac_chain_mode_ops {
+       void (*init) (void *des, dma_addr_t phy_addr, unsigned int size,
+                     unsigned int extend_desc);
+       unsigned int (*is_jumbo_frm) (int len, int ehn_desc);
+       unsigned int (*jumbo_frm) (void *priv, struct sk_buff *skb, int csum);
+       void (*refill_desc3) (void *priv, struct dma_desc *p);
+       void (*clean_desc3) (void *priv, struct dma_desc *p);
+};
+
 struct mac_device_info {
-       const struct stmmac_ops         *mac;
-       const struct stmmac_desc_ops    *desc;
-       const struct stmmac_dma_ops     *dma;
-       const struct stmmac_ring_mode_ops       *ring;
+       const struct stmmac_ops *mac;
+       const struct stmmac_desc_ops *desc;
+       const struct stmmac_dma_ops *dma;
+       const struct stmmac_ring_mode_ops *ring;
+       const struct stmmac_chain_mode_ops *chain;
+       const struct stmmac_hwtimestamp *ptp;
        struct mii_regs mii;    /* MII register Addresses */
        struct mac_link link;
        unsigned int synopsys_uid;
@@ -390,5 +470,6 @@ extern void stmmac_set_mac(void __iomem *ioaddr, bool enable);
 
 extern void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr);
 extern const struct stmmac_ring_mode_ops ring_mode_ops;
+extern const struct stmmac_chain_mode_ops chain_mode_ops;
 
 #endif /* __COMMON_H__ */