net/mlx5: update translate function for mirroring
[dpdk.git] / drivers / raw / octeontx2_ep / otx2_ep_rawdev.c
index 0c56609..2b78a79 100644 (file)
@@ -62,6 +62,45 @@ sdp_get_defconf(struct sdp_device *sdp_dev __rte_unused)
        return default_conf;
 }
 
+static int
+sdp_vfdev_exit(struct rte_rawdev *rawdev)
+{
+       struct sdp_device *sdpvf;
+       uint32_t rawdev_queues, q;
+
+       otx2_info("%s:", __func__);
+
+       sdpvf = (struct sdp_device *)rawdev->dev_private;
+
+       sdpvf->fn_list.disable_io_queues(sdpvf);
+
+       rawdev_queues = sdpvf->num_oqs;
+       for (q = 0; q < rawdev_queues; q++) {
+               if (sdp_delete_oqs(sdpvf, q)) {
+                       otx2_err("Failed to delete OQ:%d", q);
+                       return -ENOMEM;
+               }
+       }
+       otx2_info("Num OQs:%d freed", sdpvf->num_oqs);
+
+       /* Free the oqbuf_pool */
+       rte_mempool_free(sdpvf->enqdeq_mpool);
+       sdpvf->enqdeq_mpool = NULL;
+
+       otx2_info("Enqdeq_mpool free done");
+
+       rawdev_queues = sdpvf->num_iqs;
+       for (q = 0; q < rawdev_queues; q++) {
+               if (sdp_delete_iqs(sdpvf, q)) {
+                       otx2_err("Failed to delete IQ:%d", q);
+                       return -ENOMEM;
+               }
+       }
+       otx2_sdp_dbg("Num IQs:%d freed", sdpvf->num_iqs);
+
+       return 0;
+}
+
 static int
 sdp_chip_specific_setup(struct sdp_device *sdpvf)
 {
@@ -142,20 +181,57 @@ sdp_vfdev_init(struct sdp_device *sdpvf)
 
        return 0;
 
+/* Error handling  */
 oq_fail:
+       /* Free the allocated OQs */
+       for (q = 0; q < sdpvf->num_oqs; q++)
+               sdp_delete_oqs(sdpvf, q);
+
 iq_fail:
+       /* Free the allocated IQs */
+       for (q = 0; q < sdpvf->num_iqs; q++)
+               sdp_delete_iqs(sdpvf, q);
+
 setup_fail:
        return -ENOMEM;
 }
 
 static int
-sdp_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
+sdp_rawdev_start(struct rte_rawdev *dev)
+{
+       dev->started = 1;
+
+       return 0;
+}
+
+static void
+sdp_rawdev_stop(struct rte_rawdev *dev)
+{
+       dev->started = 0;
+}
+
+static int
+sdp_rawdev_close(struct rte_rawdev *dev)
+{
+       int ret;
+       ret = sdp_vfdev_exit(dev);
+       if (ret) {
+               otx2_err(" SDP_EP rawdev exit error");
+               return ret;
+       }
+
+       return 0;
+}
+
+static int
+sdp_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config,
+               size_t config_size)
 {
        struct sdp_rawdev_info *app_info = (struct sdp_rawdev_info *)config;
        struct sdp_device *sdpvf;
 
-       if (app_info == NULL) {
-               otx2_err("Application config info [NULL]");
+       if (app_info == NULL || config_size != sizeof(*app_info)) {
+               otx2_err("Application config info [NULL] or incorrect size");
                return -EINVAL;
        }
 
@@ -173,6 +249,12 @@ sdp_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config)
 /* SDP VF endpoint rawdev ops */
 static const struct rte_rawdev_ops sdp_rawdev_ops = {
        .dev_configure  = sdp_rawdev_configure,
+       .dev_start      = sdp_rawdev_start,
+       .dev_stop       = sdp_rawdev_stop,
+       .dev_close      = sdp_rawdev_close,
+       .enqueue_bufs   = sdp_rawdev_enqueue,
+       .dequeue_bufs   = sdp_rawdev_dequeue,
+       .dev_selftest   = sdp_rawdev_selftest,
 };
 
 static int