Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[cascardo/linux.git] / drivers / net / ethernet / chelsio / cxgb4 / cxgb4.h
index edd2338..28e653e 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
@@ -53,6 +53,8 @@
 #include "cxgb4_uld.h"
 
 #define CH_WARN(adap, fmt, ...) dev_warn(adap->pdev_dev, fmt, ## __VA_ARGS__)
+extern struct list_head adapter_list;
+extern struct mutex uld_mutex;
 
 enum {
        MAX_NPORTS      = 4,     /* max # of ports */
@@ -338,12 +340,14 @@ struct adapter_params {
        enum chip_type chip;               /* chip code */
        struct arch_specific_params arch;  /* chip specific params */
        unsigned char offload;
+       unsigned char crypto;           /* HW capability for crypto */
 
        unsigned char bypass;
 
        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 */
 };
@@ -403,7 +407,6 @@ struct fw_info {
        struct fw_hdr fw_hdr;
 };
 
-
 struct trace_params {
        u32 data[TRACE_LEN / 4];
        u32 mask[TRACE_LEN / 4];
@@ -434,11 +437,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 {
@@ -455,8 +453,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;
@@ -493,6 +490,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;
@@ -510,6 +508,10 @@ enum {                                 /* adapter flags */
        FW_OFLD_CONN       = (1 << 9),
 };
 
+enum {
+       ULP_CRYPTO_LOOKASIDE = 1 << 0,
+};
+
 struct rx_sw_desc;
 
 struct sge_fl {                     /* SGE free-buffer queue state */
@@ -680,17 +682,24 @@ struct sge_ctrl_txq {               /* state for an SGE control Tx queue */
        u8 full;                    /* the Tx ring is full */
 } ____cacheline_aligned_in_smp;
 
+struct sge_uld_rxq_info {
+       char name[IFNAMSIZ];    /* name of ULD driver */
+       struct sge_ofld_rxq *uldrxq; /* Rxq's for ULD */
+       u16 *msix_tbl;          /* msix_tbl for uld */
+       u16 *rspq_id;           /* response queue id's of rxq */
+       u16 nrxq;               /* # of ingress uld queues */
+       u16 nciq;               /* # of completion queues */
+       u8 uld;                 /* uld type */
+};
+
 struct sge {
        struct sge_eth_txq ethtxq[MAX_ETH_QSETS];
        struct sge_ofld_txq ofldtxq[MAX_OFLD_QSETS];
        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;
 
        struct sge_rspq intrq ____cacheline_aligned_in_smp;
        spinlock_t intrq_lock;
@@ -698,14 +707,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 iscsi_rxq[MAX_OFLD_QSETS];
-       u16 iscsit_rxq[MAX_ISCSIT_QUEUES];
-       u16 rdma_rxq[MAX_RDMA_QUEUES];
-       u16 rdma_ciq[MAX_RDMA_CIQS];
+       u16 ofldqsets;              /* # of active ofld queue sets */
+       u16 nqs_per_uld;            /* # of Rx queues per ULD */
        u16 timer_val[SGE_NTIMERS];
        u8 counter_val[SGE_NCOUNTERS];
        u32 fl_pg_order;            /* large page allocation size */
@@ -729,10 +732,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;
 
@@ -757,6 +757,23 @@ struct hash_mac_addr {
        u8 addr[ETH_ALEN];
 };
 
+struct uld_msix_bmap {
+       unsigned long *msix_bmap;
+       unsigned int mapsize;
+       spinlock_t lock; /* lock for acquiring bitmap */
+};
+
+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 {
        void __iomem *regs;
        void __iomem *bar2;
@@ -767,6 +784,7 @@ struct adapter {
        unsigned int mbox;
        unsigned int pf;
        unsigned int flags;
+       unsigned int adap_idx;
        enum chip_type chip;
 
        int msg_enable;
@@ -779,6 +797,9 @@ struct adapter {
                unsigned short vec;
                char desc[IFNAMSIZ + 10];
        } 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 */
+       int msi_idx;
 
        struct doorbell_stats db_stats;
        struct sge sge;
@@ -786,6 +807,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;
@@ -793,7 +817,10 @@ struct adapter {
        unsigned int clipt_start;
        unsigned int clipt_end;
        struct clip_tbl *clipt;
+       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 */
@@ -813,6 +840,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
@@ -822,6 +851,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
@@ -947,11 +1028,47 @@ 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;
 }
 
+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);
@@ -1178,6 +1295,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);
@@ -1185,8 +1304,6 @@ int t4_sge_init(struct adapter *adap);
 void t4_sge_start(struct adapter *adap);
 void t4_sge_stop(struct adapter *adap);
 int cxgb_busy_poll(struct napi_struct *napi);
-int cxgb4_set_rspq_intr_params(struct sge_rspq *q, unsigned int us,
-                              unsigned int cnt);
 void cxgb4_set_ethtool_ops(struct net_device *netdev);
 int cxgb4_write_rss(const struct port_info *pi, const u16 *queues);
 extern int dbfifo_int_thresh;
@@ -1289,6 +1406,18 @@ static inline int hash_mac_addr(const u8 *addr)
        return a & 0x3f;
 }
 
+int cxgb4_set_rspq_intr_params(struct sge_rspq *q, unsigned int us,
+                              unsigned int cnt);
+static inline void init_rspq(struct adapter *adap, struct sge_rspq *q,
+                            unsigned int us, unsigned int cnt,
+                            unsigned int size, unsigned int iqe_size)
+{
+       q->adap = adap;
+       cxgb4_set_rspq_intr_params(q, us, cnt);
+       q->iqe_len = iqe_size;
+       q->size = size;
+}
+
 void t4_write_indirect(struct adapter *adap, unsigned int addr_reg,
                       unsigned int data_reg, const u32 *vals,
                       unsigned int nregs, unsigned int start_idx);
@@ -1514,6 +1643,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,
@@ -1521,4 +1653,11 @@ void t4_idma_monitor_init(struct adapter *adapter,
 void t4_idma_monitor(struct adapter *adapter,
                     struct sge_idma_monitor_state *idma,
                     int hz, int ticks);
+int t4_set_vf_mac_acl(struct adapter *adapter, unsigned int vf,
+                     unsigned int naddr, u8 *addr);
+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__ */