unknown changes from android-tegra-nv-3.4
[linux-3.10.git] / drivers / net / ethernet / mellanox / mlx4 / mlx4_en.h
index d3eba8b..12a7b2b 100644 (file)
@@ -40,6 +40,7 @@
 #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
@@ -67,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)
@@ -76,6 +78,7 @@
 #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
@@ -91,9 +94,8 @@
 
 #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_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) */
@@ -118,6 +120,8 @@ enum {
 #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
@@ -195,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 {
@@ -205,6 +208,7 @@ struct mlx4_en_tx_info {
        u8 linear;
        u8 data_offset;
        u8 inl;
+       u8 ts_requested;
 };
 
 
@@ -260,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 {
@@ -286,6 +291,7 @@ struct mlx4_en_rx_ring {
        unsigned long packets;
        unsigned long csum_ok;
        unsigned long csum_none;
+       int hwtstamp_rx_filter;
 };
 
 struct mlx4_en_cq {
@@ -346,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;
 };
 
 
@@ -424,10 +434,26 @@ 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;
@@ -438,6 +464,8 @@ struct mlx4_en_priv {
        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;
@@ -466,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;
@@ -488,11 +516,11 @@ struct mlx4_en_priv {
        struct mlx4_en_cq *tx_cq;
        struct mlx4_en_cq rx_cq[MAX_RX_RINGS];
        struct mlx4_qp drop_qp;
-       struct work_struct mcast_task;
-       struct work_struct mac_task;
+       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;
@@ -505,6 +533,8 @@ struct mlx4_en_priv {
        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;
@@ -524,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);
@@ -594,8 +634,11 @@ 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);
@@ -604,9 +647,21 @@ void mlx4_en_cleanup_filters(struct mlx4_en_priv *priv,
 #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;