Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
[cascardo/linux.git] / drivers / net / ethernet / chelsio / cxgb4 / cxgb4.h
index f6099d0..2125903 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the Chelsio T4 Ethernet driver for Linux.
  *
- * Copyright (c) 2003-2014 Chelsio Communications, Inc. All rights reserved.
+ * Copyright (c) 2003-2016 Chelsio Communications, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -347,6 +347,7 @@ struct adapter_params {
        unsigned int ofldq_wr_cred;
        bool ulptx_memwrite_dsgl;          /* use of T5 DSGL allowed */
 
+       unsigned int nsched_cls;          /* number of traffic classes */
        unsigned int max_ordird_qp;       /* Max read depth per RDMA QP */
        unsigned int max_ird_adapter;     /* Max read depth per adapter */
        bool fr_nsmr_tpte_wr_support;     /* FW support for FR_NSMR_TPTE_WR */
@@ -422,8 +423,8 @@ struct link_config {
        unsigned short supported;        /* link capabilities */
        unsigned short advertising;      /* advertised capabilities */
        unsigned short lp_advertising;   /* peer advertised capabilities */
-       unsigned short requested_speed;  /* speed user has requested */
-       unsigned short speed;            /* actual link speed */
+       unsigned int   requested_speed;  /* speed user has requested */
+       unsigned int   speed;            /* actual link speed */
        unsigned char  requested_fc;     /* flow control user has requested */
        unsigned char  fc;               /* actual link flow control */
        unsigned char  autoneg;          /* autonegotiating? */
@@ -437,11 +438,6 @@ enum {
        MAX_ETH_QSETS = 32,           /* # of Ethernet Tx/Rx queue sets */
        MAX_OFLD_QSETS = 16,          /* # of offload Tx, iscsi Rx queue sets */
        MAX_CTRL_QUEUES = NCHAN,      /* # of control Tx queues */
-       MAX_RDMA_QUEUES = NCHAN,      /* # of streaming RDMA Rx queues */
-       MAX_RDMA_CIQS = 32,        /* # of  RDMA concentrator IQs */
-
-       /* # of streaming iSCSIT Rx queues */
-       MAX_ISCSIT_QUEUES = MAX_OFLD_QSETS,
 };
 
 enum {
@@ -458,8 +454,7 @@ enum {
 enum {
        INGQ_EXTRAS = 2,        /* firmware event queue and */
                                /*   forwarded interrupts */
-       MAX_INGQ = MAX_ETH_QSETS + MAX_OFLD_QSETS + MAX_RDMA_QUEUES +
-                  MAX_RDMA_CIQS + MAX_ISCSIT_QUEUES + INGQ_EXTRAS,
+       MAX_INGQ = MAX_ETH_QSETS + INGQ_EXTRAS,
 };
 
 struct adapter;
@@ -496,6 +491,7 @@ struct port_info {
 #endif /* CONFIG_CHELSIO_T4_FCOE */
        bool rxtstamp;  /* Enable TS */
        struct hwtstamp_config tstamp_config;
+       struct sched_table *sched_tbl;
 };
 
 struct dentry;
@@ -703,10 +699,6 @@ struct sge {
        struct sge_ctrl_txq ctrlq[MAX_CTRL_QUEUES];
 
        struct sge_eth_rxq ethrxq[MAX_ETH_QSETS];
-       struct sge_ofld_rxq iscsirxq[MAX_OFLD_QSETS];
-       struct sge_ofld_rxq iscsitrxq[MAX_ISCSIT_QUEUES];
-       struct sge_ofld_rxq rdmarxq[MAX_RDMA_QUEUES];
-       struct sge_ofld_rxq rdmaciq[MAX_RDMA_CIQS];
        struct sge_rspq fw_evtq ____cacheline_aligned_in_smp;
        struct sge_uld_rxq_info **uld_rxq_info;
 
@@ -716,15 +708,8 @@ struct sge {
        u16 max_ethqsets;           /* # of available Ethernet queue sets */
        u16 ethqsets;               /* # of active Ethernet queue sets */
        u16 ethtxq_rover;           /* Tx queue to clean up next */
-       u16 iscsiqsets;              /* # of active iSCSI queue sets */
-       u16 niscsitq;               /* # of available iSCST Rx queues */
-       u16 rdmaqs;                 /* # of available RDMA Rx queues */
-       u16 rdmaciqs;               /* # of available RDMA concentrator IQs */
+       u16 ofldqsets;              /* # of active ofld queue sets */
        u16 nqs_per_uld;            /* # of Rx queues per ULD */
-       u16 iscsi_rxq[MAX_OFLD_QSETS];
-       u16 iscsit_rxq[MAX_ISCSIT_QUEUES];
-       u16 rdma_rxq[MAX_RDMA_QUEUES];
-       u16 rdma_ciq[MAX_RDMA_CIQS];
        u16 timer_val[SGE_NTIMERS];
        u8 counter_val[SGE_NCOUNTERS];
        u32 fl_pg_order;            /* large page allocation size */
@@ -748,10 +733,7 @@ struct sge {
 };
 
 #define for_each_ethrxq(sge, i) for (i = 0; i < (sge)->ethqsets; i++)
-#define for_each_iscsirxq(sge, i) for (i = 0; i < (sge)->iscsiqsets; i++)
-#define for_each_iscsitrxq(sge, i) for (i = 0; i < (sge)->niscsitq; i++)
-#define for_each_rdmarxq(sge, i) for (i = 0; i < (sge)->rdmaqs; i++)
-#define for_each_rdmaciq(sge, i) for (i = 0; i < (sge)->rdmaciqs; i++)
+#define for_each_ofldtxq(sge, i) for (i = 0; i < (sge)->ofldqsets; i++)
 
 struct l2t_data;
 
@@ -785,6 +767,12 @@ struct uld_msix_bmap {
 struct uld_msix_info {
        unsigned short vec;
        char desc[IFNAMSIZ + 10];
+       unsigned int idx;
+};
+
+struct vf_info {
+       unsigned char vf_mac_addr[ETH_ALEN];
+       bool pf_set_mac;
 };
 
 struct adapter {
@@ -797,6 +785,7 @@ struct adapter {
        unsigned int mbox;
        unsigned int pf;
        unsigned int flags;
+       unsigned int adap_idx;
        enum chip_type chip;
 
        int msg_enable;
@@ -811,7 +800,7 @@ struct adapter {
        } msix_info[MAX_INGQ + 1];
        struct uld_msix_info *msix_info_ulds; /* msix info for uld's */
        struct uld_msix_bmap msix_bmap_ulds; /* msix bitmap for all uld */
-       unsigned int msi_idx;
+       int msi_idx;
 
        struct doorbell_stats db_stats;
        struct sge sge;
@@ -819,6 +808,9 @@ struct adapter {
        struct net_device *port[MAX_NPORTS];
        u8 chan_map[NCHAN];                   /* channel -> port map */
 
+       struct vf_info *vfinfo;
+       u8 num_vfs;
+
        u32 filter_mode;
        unsigned int l2t_start;
        unsigned int l2t_end;
@@ -826,9 +818,10 @@ struct adapter {
        unsigned int clipt_start;
        unsigned int clipt_end;
        struct clip_tbl *clipt;
-       struct cxgb4_pci_uld_info *uld;
+       struct cxgb4_uld_info *uld;
        void *uld_handle[CXGB4_ULD_MAX];
        unsigned int num_uld;
+       unsigned int num_ofld_uld;
        struct list_head list_node;
        struct list_head rcu_node;
        struct list_head mac_hlist; /* list of MAC addresses in MPS Hash */
@@ -848,6 +841,8 @@ struct adapter {
 #define T4_OS_LOG_MBOX_CMDS 256
        struct mbox_cmd_log *mbox_log;
 
+       struct mutex uld_mutex;
+
        struct dentry *debugfs_root;
        bool use_bd;     /* Use SGE Back Door intfc for reading SGE Contexts */
        bool trace_rss; /* 1 implies that different RSS flit per filter is
@@ -857,6 +852,58 @@ struct adapter {
 
        spinlock_t stats_lock;
        spinlock_t win0_lock ____cacheline_aligned_in_smp;
+
+       /* TC u32 offload */
+       struct cxgb4_tc_u32_table *tc_u32;
+};
+
+/* Support for "sched-class" command to allow a TX Scheduling Class to be
+ * programmed with various parameters.
+ */
+struct ch_sched_params {
+       s8   type;                     /* packet or flow */
+       union {
+               struct {
+                       s8   level;    /* scheduler hierarchy level */
+                       s8   mode;     /* per-class or per-flow */
+                       s8   rateunit; /* bit or packet rate */
+                       s8   ratemode; /* %port relative or kbps absolute */
+                       s8   channel;  /* scheduler channel [0..N] */
+                       s8   class;    /* scheduler class [0..N] */
+                       s32  minrate;  /* minimum rate */
+                       s32  maxrate;  /* maximum rate */
+                       s16  weight;   /* percent weight */
+                       s16  pktsize;  /* average packet size */
+               } params;
+       } u;
+};
+
+enum {
+       SCHED_CLASS_TYPE_PACKET = 0,    /* class type */
+};
+
+enum {
+       SCHED_CLASS_LEVEL_CL_RL = 0,    /* class rate limiter */
+};
+
+enum {
+       SCHED_CLASS_MODE_CLASS = 0,     /* per-class scheduling */
+};
+
+enum {
+       SCHED_CLASS_RATEUNIT_BITS = 0,  /* bit rate scheduling */
+};
+
+enum {
+       SCHED_CLASS_RATEMODE_ABS = 1,   /* Kb/s */
+};
+
+/* Support for "sched_queue" command to allow one or more NIC TX Queues
+ * to be bound to a TX Scheduling Class.
+ */
+struct ch_sched_queue {
+       s8   queue;    /* queue index */
+       s8   class;    /* class index */
 };
 
 /* Defined bit width of user definable filter tuples
@@ -982,6 +1029,32 @@ enum {
        VLAN_REWRITE
 };
 
+/* Host shadow copy of ingress filter entry.  This is in host native format
+ * and doesn't match the ordering or bit order, etc. of the hardware of the
+ * firmware command.  The use of bit-field structure elements is purely to
+ * remind ourselves of the field size limitations and save memory in the case
+ * where the filter table is large.
+ */
+struct filter_entry {
+       /* Administrative fields for filter. */
+       u32 valid:1;            /* filter allocated and valid */
+       u32 locked:1;           /* filter is administratively locked */
+
+       u32 pending:1;          /* filter action is pending firmware reply */
+       u32 smtidx:8;           /* Source MAC Table index for smac */
+       struct filter_ctx *ctx; /* Caller's completion hook */
+       struct l2t_entry *l2t;  /* Layer Two Table entry for dmac */
+       struct net_device *dev; /* Associated net device */
+       u32 tid;                /* This will store the actual tid */
+
+       /* The filter itself.  Most of this is a straight copy of information
+        * provided by the extended ioctl().  Some fields are translated to
+        * internal forms -- for instance the Ingress Queue ID passed in from
+        * the ioctl() is translated into the Absolute Ingress Queue ID.
+        */
+       struct ch_filter_specification fs;
+};
+
 static inline int is_offload(const struct adapter *adap)
 {
        return adap->params.offload;
@@ -992,6 +1065,11 @@ static inline int is_pci_uld(const struct adapter *adap)
        return adap->params.crypto;
 }
 
+static inline int is_uld(const struct adapter *adap)
+{
+       return (adap->params.offload || adap->params.crypto);
+}
+
 static inline u32 t4_read_reg(struct adapter *adap, u32 reg_addr)
 {
        return readl(adap->regs + reg_addr);
@@ -1218,6 +1296,8 @@ int t4_sge_alloc_eth_txq(struct adapter *adap, struct sge_eth_txq *txq,
 int t4_sge_alloc_ctrl_txq(struct adapter *adap, struct sge_ctrl_txq *txq,
                          struct net_device *dev, unsigned int iqid,
                          unsigned int cmplqid);
+int t4_sge_mod_ctrl_txq(struct adapter *adap, unsigned int eqid,
+                       unsigned int cmplqid);
 int t4_sge_alloc_ofld_txq(struct adapter *adap, struct sge_ofld_txq *txq,
                          struct net_device *dev, unsigned int iqid);
 irqreturn_t t4_sge_intr_msix(int irq, void *cookie);
@@ -1564,6 +1644,9 @@ void t4_get_trace_filter(struct adapter *adapter, struct trace_params *tp,
                         int filter_index, int *enabled);
 int t4_fwaddrspace_write(struct adapter *adap, unsigned int mbox,
                         u32 addr, u32 val);
+int t4_sched_params(struct adapter *adapter, int type, int level, int mode,
+                   int rateunit, int ratemode, int channel, int class,
+                   int minrate, int maxrate, int weight, int pktsize);
 void t4_sge_decode_idma_state(struct adapter *adapter, int state);
 void t4_free_mem(void *addr);
 void t4_idma_monitor_init(struct adapter *adapter,
@@ -1573,7 +1656,9 @@ void t4_idma_monitor(struct adapter *adapter,
                     int hz, int ticks);
 int t4_set_vf_mac_acl(struct adapter *adapter, unsigned int vf,
                      unsigned int naddr, u8 *addr);
-void uld_mem_free(struct adapter *adap);
-int uld_mem_alloc(struct adapter *adap);
+void t4_uld_mem_free(struct adapter *adap);
+int t4_uld_mem_alloc(struct adapter *adap);
+void t4_uld_clean_up(struct adapter *adap);
+void t4_register_netevent_notifier(void);
 void free_rspq_fl(struct adapter *adap, struct sge_rspq *rq, struct sge_fl *fl);
 #endif /* __CXGB4_H__ */