unknown changes from android-tegra-nv-3.4
[linux-3.10.git] / drivers / net / ethernet / mellanox / mlx4 / mlx4_en.h
index 5d87637..12a7b2b 100644 (file)
 #include <linux/mutex.h>
 #include <linux/netdevice.h>
 #include <linux/if_vlan.h>
+#include <linux/net_tstamp.h>
 #ifdef CONFIG_MLX4_EN_DCB
 #include <linux/dcbnl.h>
 #endif
+#include <linux/cpu_rmap.h>
 
 #include <linux/mlx4/device.h>
 #include <linux/mlx4/qp.h>
@@ -66,7 +68,8 @@
 
 #define MLX4_EN_PAGE_SHIFT     12
 #define MLX4_EN_PAGE_SIZE      (1 << MLX4_EN_PAGE_SHIFT)
-#define MAX_RX_RINGS           16
+#define DEF_RX_RINGS           16
+#define MAX_RX_RINGS           128
 #define MIN_RX_RINGS           4
 #define TXBB_SIZE              64
 #define HEADROOM               (2048 / TXBB_SIZE + 1)
 #define STAMP_SHIFT            31
 #define STAMP_VAL              0x7fffffff
 #define STATS_DELAY            (HZ / 4)
+#define SERVICE_TASK_DELAY     (HZ / 4)
+#define MAX_NUM_OF_FS_RULES    256
+
+#define MLX4_EN_FILTER_HASH_SHIFT 4
+#define MLX4_EN_FILTER_EXPIRY_QUOTA 60
 
 /* Typical TSO descriptor with 16 gather entries is 352 bytes... */
 #define MAX_DESC_SIZE          512
 
 #define MLX4_EN_WATCHDOG_TIMEOUT       (15 * HZ)
 
-/* Use the maximum between 16384 and a single page */
-#define MLX4_EN_ALLOC_SIZE     PAGE_ALIGN(16384)
-#define MLX4_EN_ALLOC_ORDER    get_order(MLX4_EN_ALLOC_SIZE)
-
-#define MLX4_EN_MAX_LRO_DESCRIPTORS    32
+#define MLX4_EN_ALLOC_ORDER    2
+#define MLX4_EN_ALLOC_SIZE     (PAGE_SIZE << MLX4_EN_ALLOC_ORDER)
 
 /* Receive fragment sizes; we use at most 4 fragments (for 9600 byte MTU
  * and 4K allocations) */
@@ -106,24 +111,24 @@ enum {
 #define MLX4_EN_MAX_TX_SIZE    8192
 #define MLX4_EN_MAX_RX_SIZE    8192
 
-/* Minimum ring size for our page-allocation sceme to work */
+/* Minimum ring size for our page-allocation scheme to work */
 #define MLX4_EN_MIN_RX_SIZE    (MLX4_EN_ALLOC_SIZE / SMP_CACHE_BYTES)
 #define MLX4_EN_MIN_TX_SIZE    (4096 / TXBB_SIZE)
 
 #define MLX4_EN_SMALL_PKT_SIZE         64
-#define MLX4_EN_NUM_TX_RINGS           8
-#define MLX4_EN_NUM_PPP_RINGS          8
-#define MAX_TX_RINGS                   (MLX4_EN_NUM_TX_RINGS + MLX4_EN_NUM_PPP_RINGS)
+#define MLX4_EN_MAX_TX_RING_P_UP       32
 #define MLX4_EN_NUM_UP                 8
 #define MLX4_EN_DEF_TX_RING_SIZE       512
 #define MLX4_EN_DEF_RX_RING_SIZE       1024
+#define MAX_TX_RINGS                   (MLX4_EN_MAX_TX_RING_P_UP * \
+                                        MLX4_EN_NUM_UP)
 
 /* Target number of packets to coalesce with interrupt moderation */
 #define MLX4_EN_RX_COAL_TARGET 44
 #define MLX4_EN_RX_COAL_TIME   0x10
 
 #define MLX4_EN_TX_COAL_PKTS   16
-#define MLX4_EN_TX_COAL_TIME   0x80
+#define MLX4_EN_TX_COAL_TIME   0x10
 
 #define MLX4_EN_RX_RATE_LOW            400000
 #define MLX4_EN_RX_COAL_TIME_LOW       0
@@ -194,7 +199,6 @@ enum cq_type {
  */
 #define ROUNDUP_LOG2(x)                ilog2(roundup_pow_of_two(x))
 #define XNOR(x, y)             (!(x) == !(y))
-#define ILLEGAL_MAC(addr)      (addr == 0xffffffffffffULL || addr == 0x0)
 
 
 struct mlx4_en_tx_info {
@@ -204,6 +208,7 @@ struct mlx4_en_tx_info {
        u8 linear;
        u8 data_offset;
        u8 inl;
+       u8 ts_requested;
 };
 
 
@@ -229,6 +234,7 @@ struct mlx4_en_tx_desc {
 
 struct mlx4_en_rx_alloc {
        struct page *page;
+       dma_addr_t dma;
        u16 offset;
 };
 
@@ -244,7 +250,6 @@ struct mlx4_en_tx_ring {
        u32 doorbell_qpn;
        void *buf;
        u16 poll_cnt;
-       int blocked;
        struct mlx4_en_tx_info *tx_info;
        u8 *bounce_buf;
        u32 last_nr_txbb;
@@ -259,6 +264,7 @@ struct mlx4_en_tx_ring {
        struct mlx4_bf bf;
        bool bf_enabled;
        struct netdev_queue *tx_queue;
+       int hwtstamp_tx_type;
 };
 
 struct mlx4_en_rx_desc {
@@ -285,23 +291,9 @@ struct mlx4_en_rx_ring {
        unsigned long packets;
        unsigned long csum_ok;
        unsigned long csum_none;
+       int hwtstamp_rx_filter;
 };
 
-
-static inline int mlx4_en_can_lro(__be16 status)
-{
-       return (status & cpu_to_be16(MLX4_CQE_STATUS_IPV4       |
-                                    MLX4_CQE_STATUS_IPV4F      |
-                                    MLX4_CQE_STATUS_IPV6       |
-                                    MLX4_CQE_STATUS_IPV4OPT    |
-                                    MLX4_CQE_STATUS_TCP        |
-                                    MLX4_CQE_STATUS_UDP        |
-                                    MLX4_CQE_STATUS_IPOK)) ==
-               cpu_to_be16(MLX4_CQE_STATUS_IPV4 |
-                           MLX4_CQE_STATUS_IPOK |
-                           MLX4_CQE_STATUS_TCP);
-}
-
 struct mlx4_en_cq {
        struct mlx4_cq          mcq;
        struct mlx4_hwq_resources wqres;
@@ -339,6 +331,7 @@ struct mlx4_en_profile {
        u32 active_ports;
        u32 small_pkt_int;
        u8 no_reset;
+       u8 num_tx_rings_p_up;
        struct mlx4_en_port_profile prof[MLX4_MAX_PORTS + 1];
 };
 
@@ -359,6 +352,10 @@ struct mlx4_en_dev {
        u32                     priv_pdn;
        spinlock_t              uar_lock;
        u8                      mac_removed[MLX4_MAX_PORTS + 1];
+       struct cyclecounter     cycles;
+       struct timecounter      clock;
+       unsigned long           last_overflow_check;
+       unsigned long           overflow_period;
 };
 
 
@@ -405,6 +402,19 @@ struct mlx4_en_perf_stats {
 #define NUM_PERF_COUNTERS              6
 };
 
+enum mlx4_en_mclist_act {
+       MCLIST_NONE,
+       MCLIST_REM,
+       MCLIST_ADD,
+};
+
+struct mlx4_en_mc_list {
+       struct list_head        list;
+       enum mlx4_en_mclist_act action;
+       u8                      addr[ETH_ALEN];
+       u64                     reg_id;
+};
+
 struct mlx4_en_frag_info {
        u16 frag_size;
        u16 frag_prefix_size;
@@ -423,6 +433,27 @@ struct mlx4_en_frag_info {
 
 #endif
 
+struct ethtool_flow_id {
+       struct list_head list;
+       struct ethtool_rx_flow_spec flow_spec;
+       u64 id;
+};
+
+enum {
+       MLX4_EN_FLAG_PROMISC            = (1 << 0),
+       MLX4_EN_FLAG_MC_PROMISC         = (1 << 1),
+       /* whether we need to enable hardware loopback by putting dmac
+        * in Tx WQE
+        */
+       MLX4_EN_FLAG_ENABLE_HW_LOOPBACK = (1 << 2),
+       /* whether we need to drop packets that hardware loopback-ed */
+       MLX4_EN_FLAG_RX_FILTER_NEEDED   = (1 << 3),
+       MLX4_EN_FLAG_FORCE_PROMISC      = (1 << 4)
+};
+
+#define MLX4_EN_MAC_HASH_SIZE (1 << BITS_PER_BYTE)
+#define MLX4_EN_MAC_HASH_IDX 5
+
 struct mlx4_en_priv {
        struct mlx4_en_dev *mdev;
        struct mlx4_en_port_profile *prof;
@@ -432,6 +463,9 @@ struct mlx4_en_priv {
        struct net_device_stats ret_stats;
        struct mlx4_en_port_state port_state;
        spinlock_t stats_lock;
+       struct ethtool_flow_id ethtool_rules[MAX_NUM_OF_FS_RULES];
+       /* To allow rules removal while port is going down */
+       struct list_head ethtool_list;
 
        unsigned long last_moder_packets[MAX_RX_RINGS];
        unsigned long last_moder_tx_packets;
@@ -460,16 +494,16 @@ struct mlx4_en_priv {
        int registered;
        int allocated;
        int stride;
-       u64 mac;
+       unsigned char prev_mac[ETH_ALEN + 2];
        int mac_index;
        unsigned max_mtu;
        int base_qpn;
+       int cqe_factor;
 
        struct mlx4_en_rss_map rss_map;
        __be32 ctrl_flags;
        u32 flags;
-#define MLX4_EN_FLAG_PROMISC   0x1
-#define MLX4_EN_FLAG_MC_PROMISC        0x2
+       u8 num_tx_rings_p_up;
        u32 tx_ring_num;
        u32 rx_ring_num;
        u32 rx_skb_size;
@@ -477,30 +511,42 @@ struct mlx4_en_priv {
        u16 num_frags;
        u16 log_rx_info;
 
-       struct mlx4_en_tx_ring tx_ring[MAX_TX_RINGS];
+       struct mlx4_en_tx_ring *tx_ring;
        struct mlx4_en_rx_ring rx_ring[MAX_RX_RINGS];
-       struct mlx4_en_cq tx_cq[MAX_TX_RINGS];
+       struct mlx4_en_cq *tx_cq;
        struct mlx4_en_cq rx_cq[MAX_RX_RINGS];
-       struct work_struct mcast_task;
-       struct work_struct mac_task;
+       struct mlx4_qp drop_qp;
+       struct work_struct rx_mode_task;
        struct work_struct watchdog_task;
        struct work_struct linkstate_task;
        struct delayed_work stats_task;
+       struct delayed_work service_task;
        struct mlx4_en_perf_stats pstats;
        struct mlx4_en_pkt_stats pkstats;
        struct mlx4_en_port_stats port_stats;
        u64 stats_bitmap;
-       char *mc_addrs;
-       int mc_addrs_cnt;
+       struct list_head mc_list;
+       struct list_head curr_list;
+       u64 broadcast_id;
        struct mlx4_en_stat_out_mbox hw_stats;
        int vids[128];
        bool wol;
        struct device *ddev;
+       int base_tx_qpn;
+       struct hlist_head mac_hash[MLX4_EN_MAC_HASH_SIZE];
+       struct hwtstamp_config hwtstamp_config;
 
 #ifdef CONFIG_MLX4_EN_DCB
        struct ieee_ets ets;
        u16 maxrate[IEEE_8021QAZ_MAX_TCS];
 #endif
+#ifdef CONFIG_RFS_ACCEL
+       spinlock_t filters_lock;
+       int last_filter_id;
+       struct list_head filters;
+       struct hlist_head filter_hash[1 << MLX4_EN_FILTER_HASH_SHIFT];
+#endif
+
 };
 
 enum mlx4_en_wol {
@@ -508,14 +554,24 @@ enum mlx4_en_wol {
        MLX4_EN_WOL_ENABLED = (1ULL << 62),
 };
 
+struct mlx4_mac_entry {
+       struct hlist_node hlist;
+       unsigned char mac[ETH_ALEN + 2];
+       u64 reg_id;
+       struct rcu_head rcu;
+};
+
 #define MLX4_EN_WOL_DO_MODIFY (1ULL << 63)
 
+void mlx4_en_update_loopback_state(struct net_device *dev,
+                                  netdev_features_t features);
+
 void mlx4_en_destroy_netdev(struct net_device *dev);
 int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
                        struct mlx4_en_port_profile *prof);
 
 int mlx4_en_start_port(struct net_device *dev);
-void mlx4_en_stop_port(struct net_device *dev);
+void mlx4_en_stop_port(struct net_device *dev, int detach);
 
 void mlx4_en_free_resources(struct mlx4_en_priv *priv);
 int mlx4_en_alloc_resources(struct mlx4_en_priv *priv);
@@ -565,6 +621,8 @@ void mlx4_en_unmap_buffer(struct mlx4_buf *buf);
 void mlx4_en_calc_rx_buf(struct net_device *dev);
 int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv);
 void mlx4_en_release_rss_steer(struct mlx4_en_priv *priv);
+int mlx4_en_create_drop_qp(struct mlx4_en_priv *priv);
+void mlx4_en_destroy_drop_qp(struct mlx4_en_priv *priv);
 int mlx4_en_free_tx_buf(struct net_device *dev, struct mlx4_en_tx_ring *ring);
 void mlx4_en_rx_irq(struct mlx4_cq *mcq);
 
@@ -576,14 +634,34 @@ int mlx4_en_QUERY_PORT(struct mlx4_en_dev *mdev, u8 port);
 
 #ifdef CONFIG_MLX4_EN_DCB
 extern const struct dcbnl_rtnl_ops mlx4_en_dcbnl_ops;
+extern const struct dcbnl_rtnl_ops mlx4_en_dcbnl_pfc_ops;
+#endif
+
+int mlx4_en_setup_tc(struct net_device *dev, u8 up);
+
+#ifdef CONFIG_RFS_ACCEL
+void mlx4_en_cleanup_filters(struct mlx4_en_priv *priv,
+                            struct mlx4_en_rx_ring *rx_ring);
 #endif
 
 #define MLX4_EN_NUM_SELF_TEST  5
 void mlx4_en_ex_selftest(struct net_device *dev, u32 *flags, u64 *buf);
 u64 mlx4_en_mac_to_u64(u8 *addr);
+void mlx4_en_ptp_overflow_check(struct mlx4_en_dev *mdev);
 
 /*
- * Globals
+ * Functions for time stamping
+ */
+u64 mlx4_en_get_cqe_ts(struct mlx4_cqe *cqe);
+void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev,
+                           struct skb_shared_hwtstamps *hwts,
+                           u64 timestamp);
+void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev);
+int mlx4_en_timestamp_config(struct net_device *dev,
+                            int tx_type,
+                            int rx_filter);
+
+/* Globals
  */
 extern const struct ethtool_ops mlx4_en_ethtool_ops;