net/ionic: add Rx and Tx handling
[dpdk.git] / drivers / net / ionic / ionic_lif.h
index e0863c5..5e7d9ae 100644 (file)
 #define IONIC_ADMINQ_LENGTH    16      /* must be a power of two */
 #define IONIC_NOTIFYQ_LENGTH   64      /* must be a power of two */
 
+#define IONIC_GET_SG_CNTR_IDX(num_sg_elems)    (num_sg_elems)
+
+struct ionic_tx_stats {
+       uint64_t packets;
+       uint64_t bytes;
+       uint64_t drop;
+       uint64_t stop;
+       uint64_t tso;
+       uint64_t frags;
+};
+
+struct ionic_rx_stats {
+       uint64_t packets;
+       uint64_t bytes;
+       uint64_t no_cb_arg;
+       uint64_t bad_cq_status;
+       uint64_t no_room;
+       uint64_t bad_len;
+};
+
 #define IONIC_QCQ_F_INITED     BIT(0)
 #define IONIC_QCQ_F_SG         BIT(1)
 #define IONIC_QCQ_F_INTR       BIT(2)
 
 /* Queue / Completion Queue */
 struct ionic_qcq {
+       uint64_t offloads;
        struct ionic_queue q;        /**< Queue */
        struct ionic_cq cq;          /**< Completion Queue */
        struct ionic_lif *lif;       /**< LIF */
        struct rte_mempool *mb_pool; /**< mbuf pool to populate the RX ring */
+       union {
+               struct ionic_tx_stats tx;
+               struct ionic_rx_stats rx;
+       } stats;
        const struct rte_memzone *base_z;
        void *base;
        rte_iova_t base_pa;
        uint32_t total_size;
        uint32_t flags;
        struct ionic_intr_info intr;
+       bool deferred_start;
 };
 
+#define IONIC_Q_TO_QCQ(q)      container_of(q, struct ionic_qcq, q)
+#define IONIC_Q_TO_TX_STATS(q) (&IONIC_Q_TO_QCQ(q)->stats.tx)
+#define IONIC_Q_TO_RX_STATS(q) (&IONIC_Q_TO_QCQ(q)->stats.rx)
+
 #define IONIC_LIF_F_INITED             BIT(0)
 #define IONIC_LIF_F_LINK_CHECK_NEEDED  BIT(1)
 
@@ -49,11 +79,15 @@ struct ionic_lif {
        uint32_t index;
        uint32_t hw_index;
        uint32_t state;
+       uint32_t ntxqcqs;
+       uint32_t nrxqcqs;
        uint32_t kern_pid;
        rte_spinlock_t adminq_lock;
        rte_spinlock_t adminq_service_lock;
        struct ionic_qcq *adminqcq;
        struct ionic_qcq *notifyqcq;
+       struct ionic_qcq **txqcqs;
+       struct ionic_qcq **rxqcqs;
        struct ionic_rx_filters rx_filters;
        struct ionic_doorbell __iomem *kern_dbpage;
        uint64_t last_eid;
@@ -107,11 +141,21 @@ int ionic_dev_promiscuous_disable(struct rte_eth_dev *dev);
 int ionic_dev_allmulticast_enable(struct rte_eth_dev *dev);
 int ionic_dev_allmulticast_disable(struct rte_eth_dev *dev);
 
+int ionic_rx_qcq_alloc(struct ionic_lif *lif, uint32_t index,
+       uint16_t nrxq_descs, struct ionic_qcq **qcq);
+int ionic_tx_qcq_alloc(struct ionic_lif *lif, uint32_t index,
+       uint16_t ntxq_descs, struct ionic_qcq **qcq);
 void ionic_qcq_free(struct ionic_qcq *qcq);
 
 int ionic_qcq_enable(struct ionic_qcq *qcq);
 int ionic_qcq_disable(struct ionic_qcq *qcq);
 
+int ionic_lif_rxq_init(struct ionic_qcq *qcq);
+void ionic_lif_rxq_deinit(struct ionic_qcq *qcq);
+
+int ionic_lif_txq_init(struct ionic_qcq *qcq);
+void ionic_lif_txq_deinit(struct ionic_qcq *qcq);
+
 int ionic_lif_set_features(struct ionic_lif *lif);
 
 int ionic_notifyq_handler(struct ionic_lif *lif, int budget);