net/mlx: control netdevices through ioctl only
[dpdk.git] / drivers / net / mlx5 / mlx5_ethdev.c
index 83657f5..b73cb53 100644 (file)
@@ -1,40 +1,13 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright 2015 6WIND S.A.
- *   Copyright 2015 Mellanox.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of 6WIND S.A. nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2015 6WIND S.A.
+ * Copyright 2015 Mellanox.
  */
 
 #define _GNU_SOURCE
 
 #include <stddef.h>
 #include <assert.h>
+#include <inttypes.h>
 #include <unistd.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -64,6 +37,7 @@
 #include <rte_malloc.h>
 
 #include "mlx5.h"
+#include "mlx5_glue.h"
 #include "mlx5_rxtx.h"
 #include "mlx5_utils.h"
 
@@ -199,181 +173,6 @@ try_dev_id:
        return 0;
 }
 
-/**
- * Check if the counter is located on ib counters file.
- *
- * @param[in] cntr
- *   Counter name.
- *
- * @return
- *   1 if counter is located on ib counters file , 0 otherwise.
- */
-int
-priv_is_ib_cntr(const char *cntr)
-{
-       if (!strcmp(cntr, "out_of_buffer"))
-               return 1;
-       return 0;
-}
-
-/**
- * Read from sysfs entry.
- *
- * @param[in] priv
- *   Pointer to private structure.
- * @param[in] entry
- *   Entry name relative to sysfs path.
- * @param[out] buf
- *   Data output buffer.
- * @param size
- *   Buffer size.
- *
- * @return
- *   0 on success, -1 on failure and errno is set.
- */
-static int
-priv_sysfs_read(const struct priv *priv, const char *entry,
-               char *buf, size_t size)
-{
-       char ifname[IF_NAMESIZE];
-       FILE *file;
-       int ret;
-       int err;
-
-       if (priv_get_ifname(priv, &ifname))
-               return -1;
-
-       if (priv_is_ib_cntr(entry)) {
-               MKSTR(path, "%s/ports/1/hw_counters/%s",
-                     priv->ibdev_path, entry);
-               file = fopen(path, "rb");
-       } else {
-               MKSTR(path, "%s/device/net/%s/%s",
-                     priv->ibdev_path, ifname, entry);
-               file = fopen(path, "rb");
-       }
-       if (file == NULL)
-               return -1;
-       ret = fread(buf, 1, size, file);
-       err = errno;
-       if (((size_t)ret < size) && (ferror(file)))
-               ret = -1;
-       else
-               ret = size;
-       fclose(file);
-       errno = err;
-       return ret;
-}
-
-/**
- * Write to sysfs entry.
- *
- * @param[in] priv
- *   Pointer to private structure.
- * @param[in] entry
- *   Entry name relative to sysfs path.
- * @param[in] buf
- *   Data buffer.
- * @param size
- *   Buffer size.
- *
- * @return
- *   0 on success, -1 on failure and errno is set.
- */
-static int
-priv_sysfs_write(const struct priv *priv, const char *entry,
-                char *buf, size_t size)
-{
-       char ifname[IF_NAMESIZE];
-       FILE *file;
-       int ret;
-       int err;
-
-       if (priv_get_ifname(priv, &ifname))
-               return -1;
-
-       MKSTR(path, "%s/device/net/%s/%s", priv->ibdev_path, ifname, entry);
-
-       file = fopen(path, "wb");
-       if (file == NULL)
-               return -1;
-       ret = fwrite(buf, 1, size, file);
-       err = errno;
-       if (((size_t)ret < size) || (ferror(file)))
-               ret = -1;
-       else
-               ret = size;
-       fclose(file);
-       errno = err;
-       return ret;
-}
-
-/**
- * Get unsigned long sysfs property.
- *
- * @param priv
- *   Pointer to private structure.
- * @param[in] name
- *   Entry name relative to sysfs path.
- * @param[out] value
- *   Value output buffer.
- *
- * @return
- *   0 on success, -1 on failure and errno is set.
- */
-static int
-priv_get_sysfs_ulong(struct priv *priv, const char *name, unsigned long *value)
-{
-       int ret;
-       unsigned long value_ret;
-       char value_str[32];
-
-       ret = priv_sysfs_read(priv, name, value_str, (sizeof(value_str) - 1));
-       if (ret == -1) {
-               DEBUG("cannot read %s value from sysfs: %s",
-                     name, strerror(errno));
-               return -1;
-       }
-       value_str[ret] = '\0';
-       errno = 0;
-       value_ret = strtoul(value_str, NULL, 0);
-       if (errno) {
-               DEBUG("invalid %s value `%s': %s", name, value_str,
-                     strerror(errno));
-               return -1;
-       }
-       *value = value_ret;
-       return 0;
-}
-
-/**
- * Set unsigned long sysfs property.
- *
- * @param priv
- *   Pointer to private structure.
- * @param[in] name
- *   Entry name relative to sysfs path.
- * @param value
- *   Value to set.
- *
- * @return
- *   0 on success, -1 on failure and errno is set.
- */
-static int
-priv_set_sysfs_ulong(struct priv *priv, const char *name, unsigned long value)
-{
-       int ret;
-       MKSTR(value_str, "%lu", value);
-
-       ret = priv_sysfs_write(priv, name, value_str, (sizeof(value_str) - 1));
-       if (ret == -1) {
-               DEBUG("cannot write %s `%s' (%lu) to sysfs: %s",
-                     name, value_str, value, strerror(errno));
-               return -1;
-       }
-       return 0;
-}
-
 /**
  * Perform ifreq ioctl() on associated Ethernet device.
  *
@@ -417,20 +216,25 @@ priv_get_num_vfs(struct priv *priv, uint16_t *num_vfs)
 {
        /* The sysfs entry name depends on the operating system. */
        const char **name = (const char *[]){
-               "device/sriov_numvfs",
-               "device/mlx5_num_vfs",
+               "sriov_numvfs",
+               "mlx5_num_vfs",
                NULL,
        };
-       int ret;
 
        do {
-               unsigned long ulong_num_vfs;
+               int n;
+               FILE *file;
+               MKSTR(path, "%s/device/%s", priv->ibdev_path, *name);
 
-               ret = priv_get_sysfs_ulong(priv, *name, &ulong_num_vfs);
-               if (!ret)
-                       *num_vfs = ulong_num_vfs;
-       } while (*(++name) && ret);
-       return ret;
+               file = fopen(path, "rb");
+               if (!file)
+                       continue;
+               n = fscanf(file, "%" SCNu16, num_vfs);
+               fclose(file);
+               if (n == 1)
+                       return 0;
+       } while (*(++name));
+       return -1;
 }
 
 /**
@@ -447,35 +251,12 @@ priv_get_num_vfs(struct priv *priv, uint16_t *num_vfs)
 int
 priv_get_mtu(struct priv *priv, uint16_t *mtu)
 {
-       unsigned long ulong_mtu;
-
-       if (priv_get_sysfs_ulong(priv, "mtu", &ulong_mtu) == -1)
-               return -1;
-       *mtu = ulong_mtu;
-       return 0;
-}
-
-/**
- * Read device counter from sysfs.
- *
- * @param priv
- *   Pointer to private structure.
- * @param name
- *   Counter name.
- * @param[out] cntr
- *   Counter output buffer.
- *
- * @return
- *   0 on success, -1 on failure and errno is set.
- */
-int
-priv_get_cntr_sysfs(struct priv *priv, const char *name, uint64_t *cntr)
-{
-       unsigned long ulong_ctr;
+       struct ifreq request;
+       int ret = priv_ifreq(priv, SIOCGIFMTU, &request);
 
-       if (priv_get_sysfs_ulong(priv, name, &ulong_ctr) == -1)
-               return -1;
-       *cntr = ulong_ctr;
+       if (ret)
+               return ret;
+       *mtu = request.ifr_mtu;
        return 0;
 }
 
@@ -493,15 +274,9 @@ priv_get_cntr_sysfs(struct priv *priv, const char *name, uint64_t *cntr)
 static int
 priv_set_mtu(struct priv *priv, uint16_t mtu)
 {
-       uint16_t new_mtu;
+       struct ifreq request = { .ifr_mtu = mtu, };
 
-       if (priv_set_sysfs_ulong(priv, "mtu", mtu) ||
-           priv_get_mtu(priv, &new_mtu))
-               return -1;
-       if (new_mtu == mtu)
-               return 0;
-       errno = EINVAL;
-       return -1;
+       return priv_ifreq(priv, SIOCSIFMTU, &request);
 }
 
 /**
@@ -520,13 +295,14 @@ priv_set_mtu(struct priv *priv, uint16_t mtu)
 int
 priv_set_flags(struct priv *priv, unsigned int keep, unsigned int flags)
 {
-       unsigned long tmp;
+       struct ifreq request;
+       int ret = priv_ifreq(priv, SIOCGIFFLAGS, &request);
 
-       if (priv_get_sysfs_ulong(priv, "flags", &tmp) == -1)
-               return -1;
-       tmp &= keep;
-       tmp |= (flags & (~keep));
-       return priv_set_sysfs_ulong(priv, "flags", tmp);
+       if (ret)
+               return ret;
+       request.ifr_flags &= keep;
+       request.ifr_flags |= flags & ~keep;
+       return priv_ifreq(priv, SIOCSIFFLAGS, &request);
 }
 
 /**
@@ -1261,7 +1037,7 @@ priv_dev_status_handler(struct priv *priv)
 
        /* Read all message and acknowledge them. */
        for (;;) {
-               if (ibv_get_async_event(priv->ctx, &event))
+               if (mlx5_glue->get_async_event(priv->ctx, &event))
                        break;
                if ((event.event_type == IBV_EVENT_PORT_ACTIVE ||
                        event.event_type == IBV_EVENT_PORT_ERR) &&
@@ -1273,7 +1049,7 @@ priv_dev_status_handler(struct priv *priv)
                else
                        DEBUG("event type %d on port %d not handled",
                              event.event_type, event.element.port_num);
-               ibv_ack_async_event(&event);
+               mlx5_glue->ack_async_event(&event);
        }
        if (ret & (1 << RTE_ETH_EVENT_INTR_LSC))
                if (priv_link_status_update(priv))
@@ -1559,7 +1335,7 @@ mlx5_is_removed(struct rte_eth_dev *dev)
        struct ibv_device_attr device_attr;
        struct priv *priv = dev->data->dev_private;
 
-       if (ibv_query_device(priv->ctx, &device_attr) == EIO)
+       if (mlx5_glue->query_device(priv->ctx, &device_attr) == EIO)
                return 1;
        return 0;
 }