Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / net / ethernet / samsung / sxgbe / sxgbe_common.h
diff --git a/kernel/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h b/kernel/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h
new file mode 100644 (file)
index 0000000..4501964
--- /dev/null
@@ -0,0 +1,537 @@
+/* 10G controller driver for Samsung SoCs
+ *
+ * Copyright (C) 2013 Samsung Electronics Co., Ltd.
+ *             http://www.samsung.com
+ *
+ * Author: Siva Reddy Kallam <siva.kallam@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __SXGBE_COMMON_H__
+#define __SXGBE_COMMON_H__
+
+/* forward references */
+struct sxgbe_desc_ops;
+struct sxgbe_dma_ops;
+struct sxgbe_mtl_ops;
+
+#define SXGBE_RESOURCE_NAME    "sam_sxgbeeth"
+#define DRV_MODULE_VERSION     "November_2013"
+
+/* MAX HW feature words */
+#define SXGBE_HW_WORDS 3
+
+#define SXGBE_RX_COE_NONE      0
+
+/* CSR Frequency Access Defines*/
+#define SXGBE_CSR_F_150M       150000000
+#define SXGBE_CSR_F_250M       250000000
+#define SXGBE_CSR_F_300M       300000000
+#define SXGBE_CSR_F_350M       350000000
+#define SXGBE_CSR_F_400M       400000000
+#define SXGBE_CSR_F_500M       500000000
+
+/* pause time */
+#define SXGBE_PAUSE_TIME 0x200
+
+/* tx queues */
+#define SXGBE_TX_QUEUES   8
+#define SXGBE_RX_QUEUES   16
+
+/* Calculated based how much time does it take to fill 256KB Rx memory
+ * at 10Gb speed at 156MHz clock rate and considered little less then
+ * the actual value.
+ */
+#define SXGBE_MAX_DMA_RIWT     0x70
+#define SXGBE_MIN_DMA_RIWT     0x01
+
+/* Tx coalesce parameters */
+#define SXGBE_COAL_TX_TIMER    40000
+#define SXGBE_MAX_COAL_TX_TICK 100000
+#define SXGBE_TX_MAX_FRAMES    512
+#define SXGBE_TX_FRAMES        128
+
+/* SXGBE TX FIFO is 8K, Rx FIFO is 16K */
+#define BUF_SIZE_16KiB 16384
+#define BUF_SIZE_8KiB 8192
+#define BUF_SIZE_4KiB 4096
+#define BUF_SIZE_2KiB 2048
+
+#define SXGBE_DEFAULT_LIT_LS   0x3E8
+#define SXGBE_DEFAULT_TWT_LS   0x0
+
+/* Flow Control defines */
+#define SXGBE_FLOW_OFF         0
+#define SXGBE_FLOW_RX          1
+#define SXGBE_FLOW_TX          2
+#define SXGBE_FLOW_AUTO                (SXGBE_FLOW_TX | SXGBE_FLOW_RX)
+
+#define SF_DMA_MODE 1          /* DMA STORE-AND-FORWARD Operation Mode */
+
+/* errors */
+#define RX_GMII_ERR            0x01
+#define RX_WATCHDOG_ERR                0x02
+#define RX_CRC_ERR             0x03
+#define RX_GAINT_ERR           0x04
+#define RX_IP_HDR_ERR          0x05
+#define RX_PAYLOAD_ERR         0x06
+#define RX_OVERFLOW_ERR                0x07
+
+/* pkt type */
+#define RX_LEN_PKT             0x00
+#define RX_MACCTL_PKT          0x01
+#define RX_DCBCTL_PKT          0x02
+#define RX_ARP_PKT             0x03
+#define RX_OAM_PKT             0x04
+#define RX_UNTAG_PKT           0x05
+#define RX_OTHER_PKT           0x07
+#define RX_SVLAN_PKT           0x08
+#define RX_CVLAN_PKT           0x09
+#define RX_DVLAN_OCVLAN_ICVLAN_PKT             0x0A
+#define RX_DVLAN_OSVLAN_ISVLAN_PKT             0x0B
+#define RX_DVLAN_OSVLAN_ICVLAN_PKT             0x0C
+#define RX_DVLAN_OCVLAN_ISVLAN_PKT             0x0D
+
+#define RX_NOT_IP_PKT          0x00
+#define RX_IPV4_TCP_PKT                0x01
+#define RX_IPV4_UDP_PKT                0x02
+#define RX_IPV4_ICMP_PKT       0x03
+#define RX_IPV4_UNKNOWN_PKT    0x07
+#define RX_IPV6_TCP_PKT                0x09
+#define RX_IPV6_UDP_PKT                0x0A
+#define RX_IPV6_ICMP_PKT       0x0B
+#define RX_IPV6_UNKNOWN_PKT    0x0F
+
+#define RX_NO_PTP              0x00
+#define RX_PTP_SYNC            0x01
+#define RX_PTP_FOLLOW_UP       0x02
+#define RX_PTP_DELAY_REQ       0x03
+#define RX_PTP_DELAY_RESP      0x04
+#define RX_PTP_PDELAY_REQ      0x05
+#define RX_PTP_PDELAY_RESP     0x06
+#define RX_PTP_PDELAY_FOLLOW_UP        0x07
+#define RX_PTP_ANNOUNCE                0x08
+#define RX_PTP_MGMT            0x09
+#define RX_PTP_SIGNAL          0x0A
+#define RX_PTP_RESV_MSG                0x0F
+
+/* EEE-LPI mode  flags*/
+#define TX_ENTRY_LPI_MODE      0x10
+#define TX_EXIT_LPI_MODE       0x20
+#define RX_ENTRY_LPI_MODE      0x40
+#define RX_EXIT_LPI_MODE       0x80
+
+/* EEE-LPI Interrupt status flag */
+#define LPI_INT_STATUS         BIT(5)
+
+/* EEE-LPI Default timer values */
+#define LPI_LINK_STATUS_TIMER  0x3E8
+#define LPI_MAC_WAIT_TIMER     0x00
+
+/* EEE-LPI Control and status definitions */
+#define LPI_CTRL_STATUS_TXA    BIT(19)
+#define LPI_CTRL_STATUS_PLSDIS BIT(18)
+#define LPI_CTRL_STATUS_PLS    BIT(17)
+#define LPI_CTRL_STATUS_LPIEN  BIT(16)
+#define LPI_CTRL_STATUS_TXRSTP BIT(11)
+#define LPI_CTRL_STATUS_RXRSTP BIT(10)
+#define LPI_CTRL_STATUS_RLPIST BIT(9)
+#define LPI_CTRL_STATUS_TLPIST BIT(8)
+#define LPI_CTRL_STATUS_RLPIEX BIT(3)
+#define LPI_CTRL_STATUS_RLPIEN BIT(2)
+#define LPI_CTRL_STATUS_TLPIEX BIT(1)
+#define LPI_CTRL_STATUS_TLPIEN BIT(0)
+
+enum dma_irq_status {
+       tx_hard_error   = BIT(0),
+       tx_bump_tc      = BIT(1),
+       handle_tx       = BIT(2),
+       rx_hard_error   = BIT(3),
+       rx_bump_tc      = BIT(4),
+       handle_rx       = BIT(5),
+};
+
+#define NETIF_F_HW_VLAN_ALL     (NETIF_F_HW_VLAN_CTAG_RX |     \
+                                NETIF_F_HW_VLAN_STAG_RX |      \
+                                NETIF_F_HW_VLAN_CTAG_TX |      \
+                                NETIF_F_HW_VLAN_STAG_TX |      \
+                                NETIF_F_HW_VLAN_CTAG_FILTER |  \
+                                NETIF_F_HW_VLAN_STAG_FILTER)
+
+/* MMC control defines */
+#define SXGBE_MMC_CTRL_CNT_FRZ  0x00000008
+
+/* SXGBE HW ADDR regs */
+#define SXGBE_ADDR_HIGH(reg)    (((reg > 15) ? 0x00000800 : 0x00000040) + \
+                                (reg * 8))
+#define SXGBE_ADDR_LOW(reg)     (((reg > 15) ? 0x00000804 : 0x00000044) + \
+                                (reg * 8))
+#define SXGBE_MAX_PERFECT_ADDRESSES 32 /* Maximum unicast perfect filtering */
+#define SXGBE_FRAME_FILTER       0x00000004      /* Frame Filter */
+
+/* SXGBE Frame Filter defines */
+#define SXGBE_FRAME_FILTER_PR    0x00000001      /* Promiscuous Mode */
+#define SXGBE_FRAME_FILTER_HUC   0x00000002      /* Hash Unicast */
+#define SXGBE_FRAME_FILTER_HMC   0x00000004      /* Hash Multicast */
+#define SXGBE_FRAME_FILTER_DAIF  0x00000008      /* DA Inverse Filtering */
+#define SXGBE_FRAME_FILTER_PM    0x00000010      /* Pass all multicast */
+#define SXGBE_FRAME_FILTER_DBF   0x00000020      /* Disable Broadcast frames */
+#define SXGBE_FRAME_FILTER_SAIF  0x00000100      /* Inverse Filtering */
+#define SXGBE_FRAME_FILTER_SAF   0x00000200      /* Source Address Filter */
+#define SXGBE_FRAME_FILTER_HPF   0x00000400      /* Hash or perfect Filter */
+#define SXGBE_FRAME_FILTER_RA    0x80000000      /* Receive all mode */
+
+#define SXGBE_HASH_TABLE_SIZE    64
+#define SXGBE_HASH_HIGH          0x00000008      /* Multicast Hash Table High */
+#define SXGBE_HASH_LOW           0x0000000c      /* Multicast Hash Table Low */
+
+#define SXGBE_HI_REG_AE          0x80000000
+
+/* Minimum and maximum MTU */
+#define MIN_MTU         68
+#define MAX_MTU         9000
+
+#define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)                    \
+       for (queue_num = 0; queue_num < max_queues; queue_num++)
+
+#define DRV_VERSION "1.0.0"
+
+#define SXGBE_MAX_RX_CHANNELS  16
+#define SXGBE_MAX_TX_CHANNELS  16
+
+#define START_MAC_REG_OFFSET   0x0000
+#define MAX_MAC_REG_OFFSET     0x0DFC
+#define START_MTL_REG_OFFSET   0x1000
+#define MAX_MTL_REG_OFFSET     0x18FC
+#define START_DMA_REG_OFFSET   0x3000
+#define MAX_DMA_REG_OFFSET     0x38FC
+
+#define REG_SPACE_SIZE         0x2000
+
+/* sxgbe statistics counters */
+struct sxgbe_extra_stats {
+       /* TX/RX IRQ events */
+       unsigned long tx_underflow_irq;
+       unsigned long tx_process_stopped_irq;
+       unsigned long tx_ctxt_desc_err;
+       unsigned long tx_threshold;
+       unsigned long rx_threshold;
+       unsigned long tx_pkt_n;
+       unsigned long rx_pkt_n;
+       unsigned long normal_irq_n;
+       unsigned long tx_normal_irq_n;
+       unsigned long rx_normal_irq_n;
+       unsigned long napi_poll;
+       unsigned long tx_clean;
+       unsigned long tx_reset_ic_bit;
+       unsigned long rx_process_stopped_irq;
+       unsigned long rx_underflow_irq;
+
+       /* Bus access errors */
+       unsigned long fatal_bus_error_irq;
+       unsigned long tx_read_transfer_err;
+       unsigned long tx_write_transfer_err;
+       unsigned long tx_desc_access_err;
+       unsigned long tx_buffer_access_err;
+       unsigned long tx_data_transfer_err;
+       unsigned long rx_read_transfer_err;
+       unsigned long rx_write_transfer_err;
+       unsigned long rx_desc_access_err;
+       unsigned long rx_buffer_access_err;
+       unsigned long rx_data_transfer_err;
+
+       /* EEE-LPI stats */
+       unsigned long tx_lpi_entry_n;
+       unsigned long tx_lpi_exit_n;
+       unsigned long rx_lpi_entry_n;
+       unsigned long rx_lpi_exit_n;
+       unsigned long eee_wakeup_error_n;
+
+       /* RX specific */
+       /* L2 error */
+       unsigned long rx_code_gmii_err;
+       unsigned long rx_watchdog_err;
+       unsigned long rx_crc_err;
+       unsigned long rx_gaint_pkt_err;
+       unsigned long ip_hdr_err;
+       unsigned long ip_payload_err;
+       unsigned long overflow_error;
+
+       /* L2 Pkt type */
+       unsigned long len_pkt;
+       unsigned long mac_ctl_pkt;
+       unsigned long dcb_ctl_pkt;
+       unsigned long arp_pkt;
+       unsigned long oam_pkt;
+       unsigned long untag_okt;
+       unsigned long other_pkt;
+       unsigned long svlan_tag_pkt;
+       unsigned long cvlan_tag_pkt;
+       unsigned long dvlan_ocvlan_icvlan_pkt;
+       unsigned long dvlan_osvlan_isvlan_pkt;
+       unsigned long dvlan_osvlan_icvlan_pkt;
+       unsigned long dvan_ocvlan_icvlan_pkt;
+
+       /* L3/L4 Pkt type */
+       unsigned long not_ip_pkt;
+       unsigned long ip4_tcp_pkt;
+       unsigned long ip4_udp_pkt;
+       unsigned long ip4_icmp_pkt;
+       unsigned long ip4_unknown_pkt;
+       unsigned long ip6_tcp_pkt;
+       unsigned long ip6_udp_pkt;
+       unsigned long ip6_icmp_pkt;
+       unsigned long ip6_unknown_pkt;
+
+       /* Filter specific */
+       unsigned long vlan_filter_match;
+       unsigned long sa_filter_fail;
+       unsigned long da_filter_fail;
+       unsigned long hash_filter_pass;
+       unsigned long l3_filter_match;
+       unsigned long l4_filter_match;
+
+       /* RX context specific */
+       unsigned long timestamp_dropped;
+       unsigned long rx_msg_type_no_ptp;
+       unsigned long rx_ptp_type_sync;
+       unsigned long rx_ptp_type_follow_up;
+       unsigned long rx_ptp_type_delay_req;
+       unsigned long rx_ptp_type_delay_resp;
+       unsigned long rx_ptp_type_pdelay_req;
+       unsigned long rx_ptp_type_pdelay_resp;
+       unsigned long rx_ptp_type_pdelay_follow_up;
+       unsigned long rx_ptp_announce;
+       unsigned long rx_ptp_mgmt;
+       unsigned long rx_ptp_signal;
+       unsigned long rx_ptp_resv_msg_type;
+};
+
+struct mac_link {
+       int port;
+       int duplex;
+       int speed;
+};
+
+struct mii_regs {
+       unsigned int addr;      /* MII Address */
+       unsigned int data;      /* MII Data */
+};
+
+struct sxgbe_core_ops {
+       /* MAC core initialization */
+       void (*core_init)(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,
+                              struct sxgbe_extra_stats *x);
+       /* Set power management mode (e.g. magic frame) */
+       void (*pmt)(void __iomem *ioaddr, unsigned long mode);
+       /* Set/Get Unicast MAC addresses */
+       void (*set_umac_addr)(void __iomem *ioaddr, unsigned char *addr,
+                             unsigned int reg_n);
+       void (*get_umac_addr)(void __iomem *ioaddr, unsigned char *addr,
+                             unsigned int reg_n);
+       void (*enable_rx)(void __iomem *ioaddr, bool enable);
+       void (*enable_tx)(void __iomem *ioaddr, bool enable);
+
+       /* controller version specific operations */
+       int (*get_controller_version)(void __iomem *ioaddr);
+
+       /* If supported then get the optional core features */
+       unsigned int (*get_hw_feature)(void __iomem *ioaddr,
+                                      unsigned char feature_index);
+       /* adjust SXGBE speed */
+       void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
+
+       /* EEE-LPI specific operations */
+       void (*set_eee_mode)(void __iomem *ioaddr);
+       void (*reset_eee_mode)(void __iomem *ioaddr);
+       void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
+                             const int tw);
+       void (*set_eee_pls)(void __iomem *ioaddr, const int link);
+
+       /* Enable disable checksum offload operations */
+       void (*enable_rx_csum)(void __iomem *ioaddr);
+       void (*disable_rx_csum)(void __iomem *ioaddr);
+       void (*enable_rxqueue)(void __iomem *ioaddr, int queue_num);
+       void (*disable_rxqueue)(void __iomem *ioaddr, int queue_num);
+};
+
+const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
+
+struct sxgbe_ops {
+       const struct sxgbe_core_ops *mac;
+       const struct sxgbe_desc_ops *desc;
+       const struct sxgbe_dma_ops *dma;
+       const struct sxgbe_mtl_ops *mtl;
+       struct mii_regs mii;    /* MII register Addresses */
+       struct mac_link link;
+       unsigned int ctrl_uid;
+       unsigned int ctrl_id;
+};
+
+/* SXGBE private data structures */
+struct sxgbe_tx_queue {
+       unsigned int irq_no;
+       struct sxgbe_priv_data *priv_ptr;
+       struct sxgbe_tx_norm_desc *dma_tx;
+       dma_addr_t dma_tx_phy;
+       dma_addr_t *tx_skbuff_dma;
+       struct sk_buff **tx_skbuff;
+       struct timer_list txtimer;
+       spinlock_t tx_lock;     /* lock for tx queues */
+       unsigned int cur_tx;
+       unsigned int dirty_tx;
+       u32 tx_count_frames;
+       u32 tx_coal_frames;
+       u32 tx_coal_timer;
+       int hwts_tx_en;
+       u16 prev_mss;
+       u8 queue_no;
+};
+
+struct sxgbe_rx_queue {
+       struct sxgbe_priv_data *priv_ptr;
+       struct sxgbe_rx_norm_desc *dma_rx;
+       struct sk_buff **rx_skbuff;
+       unsigned int cur_rx;
+       unsigned int dirty_rx;
+       unsigned int irq_no;
+       u32 rx_riwt;
+       dma_addr_t *rx_skbuff_dma;
+       dma_addr_t dma_rx_phy;
+       u8 queue_no;
+};
+
+/* SXGBE HW capabilities */
+struct sxgbe_hw_features {
+       /****** CAP [0] *******/
+       unsigned int pmt_remote_wake_up;
+       unsigned int pmt_magic_frame;
+       /* IEEE 1588-2008 */
+       unsigned int atime_stamp;
+
+       unsigned int eee;
+
+       unsigned int tx_csum_offload;
+       unsigned int rx_csum_offload;
+       unsigned int multi_macaddr;
+       unsigned int tstamp_srcselect;
+       unsigned int sa_vlan_insert;
+
+       /****** CAP [1] *******/
+       unsigned int rxfifo_size;
+       unsigned int txfifo_size;
+       unsigned int atstmap_hword;
+       unsigned int dcb_enable;
+       unsigned int splithead_enable;
+       unsigned int tcpseg_offload;
+       unsigned int debug_mem;
+       unsigned int rss_enable;
+       unsigned int hash_tsize;
+       unsigned int l3l4_filer_size;
+
+       /* This value is in bytes and
+        * as mentioned in HW features
+        * of SXGBE data book
+        */
+       unsigned int rx_mtl_qsize;
+       unsigned int tx_mtl_qsize;
+
+       /****** CAP [2] *******/
+       /* TX and RX number of channels */
+       unsigned int rx_mtl_queues;
+       unsigned int tx_mtl_queues;
+       unsigned int rx_dma_channels;
+       unsigned int tx_dma_channels;
+       unsigned int pps_output_count;
+       unsigned int aux_input_count;
+};
+
+struct sxgbe_priv_data {
+       /* DMA descriptos */
+       struct sxgbe_tx_queue *txq[SXGBE_TX_QUEUES];
+       struct sxgbe_rx_queue *rxq[SXGBE_RX_QUEUES];
+       u8 cur_rx_qnum;
+
+       unsigned int dma_tx_size;
+       unsigned int dma_rx_size;
+       unsigned int dma_buf_sz;
+       u32 rx_riwt;
+
+       struct napi_struct napi;
+
+       void __iomem *ioaddr;
+       struct net_device *dev;
+       struct device *device;
+       struct sxgbe_ops *hw;   /* sxgbe specific ops */
+       int no_csum_insertion;
+       int irq;
+       int rxcsum_insertion;
+       spinlock_t stats_lock;  /* lock for tx/rx statatics */
+
+       struct phy_device *phydev;
+       int oldlink;
+       int speed;
+       int oldduplex;
+       struct mii_bus *mii;
+       int mii_irq[PHY_MAX_ADDR];
+       u8 rx_pause;
+       u8 tx_pause;
+
+       struct sxgbe_extra_stats xstats;
+       struct sxgbe_plat_data *plat;
+       struct sxgbe_hw_features hw_cap;
+
+       u32 msg_enable;
+
+       struct clk *sxgbe_clk;
+       int clk_csr;
+       unsigned int mode;
+       unsigned int default_addend;
+
+       /* advanced time stamp support */
+       u32 adv_ts;
+       int use_riwt;
+       struct ptp_clock *ptp_clock;
+
+       /* tc control */
+       int tx_tc;
+       int rx_tc;
+       /* EEE-LPI specific members */
+       struct timer_list eee_ctrl_timer;
+       bool tx_path_in_lpi_mode;
+       int lpi_irq;
+       int eee_enabled;
+       int eee_active;
+       int tx_lpi_timer;
+};
+
+/* Function prototypes */
+struct sxgbe_priv_data *sxgbe_drv_probe(struct device *device,
+                                       struct sxgbe_plat_data *plat_dat,
+                                       void __iomem *addr);
+int sxgbe_drv_remove(struct net_device *ndev);
+void sxgbe_set_ethtool_ops(struct net_device *netdev);
+int sxgbe_mdio_unregister(struct net_device *ndev);
+int sxgbe_mdio_register(struct net_device *ndev);
+int sxgbe_register_platform(void);
+void sxgbe_unregister_platform(void);
+
+#ifdef CONFIG_PM
+int sxgbe_suspend(struct net_device *ndev);
+int sxgbe_resume(struct net_device *ndev);
+int sxgbe_freeze(struct net_device *ndev);
+int sxgbe_restore(struct net_device *ndev);
+#endif /* CONFIG_PM */
+
+const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
+
+void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
+bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
+#endif /* __SXGBE_COMMON_H__ */