net: add rte prefix to ether defines
[dpdk.git] / drivers / net / mlx4 / mlx4.c
index 252658f..640e06f 100644 (file)
@@ -126,30 +126,6 @@ error:
        return ret;
 }
 
-/**
- * Uninitialize shared data between primary and secondary process.
- *
- * The pointer of secondary process is dereferenced and primary process frees
- * the memzone.
- */
-static void
-mlx4_uninit_shared_data(void)
-{
-       const struct rte_memzone *mz;
-
-       rte_spinlock_lock(&mlx4_shared_data_lock);
-       if (mlx4_shared_data) {
-               if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
-                       mz = rte_memzone_lookup(MZ_MLX4_PMD_SHARED_DATA);
-                       rte_memzone_free(mz);
-               } else {
-                       memset(&mlx4_local_data, 0, sizeof(mlx4_local_data));
-               }
-               mlx4_shared_data = NULL;
-       }
-       rte_spinlock_unlock(&mlx4_shared_data_lock);
-}
-
 #ifdef HAVE_IBV_MLX4_BUF_ALLOCATORS
 /**
  * Verbs callback to allocate a memory. This function should allocate the space
@@ -206,6 +182,53 @@ mlx4_free_verbs_buf(void *ptr, void *data __rte_unused)
 }
 #endif
 
+/**
+ * Initialize process private data structure.
+ *
+ * @param dev
+ *   Pointer to Ethernet device structure.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+static int
+mlx4_proc_priv_init(struct rte_eth_dev *dev)
+{
+       struct mlx4_proc_priv *ppriv;
+       size_t ppriv_size;
+
+       /*
+        * UAR register table follows the process private structure. BlueFlame
+        * registers for Tx queues are stored in the table.
+        */
+       ppriv_size = sizeof(struct mlx4_proc_priv) +
+                    dev->data->nb_tx_queues * sizeof(void *);
+       ppriv = rte_malloc_socket("mlx4_proc_priv", ppriv_size,
+                                 RTE_CACHE_LINE_SIZE, dev->device->numa_node);
+       if (!ppriv) {
+               rte_errno = ENOMEM;
+               return -rte_errno;
+       }
+       ppriv->uar_table_sz = ppriv_size;
+       dev->process_private = ppriv;
+       return 0;
+}
+
+/**
+ * Un-initialize process private data structure.
+ *
+ * @param dev
+ *   Pointer to Ethernet device structure.
+ */
+static void
+mlx4_proc_priv_uninit(struct rte_eth_dev *dev)
+{
+       if (!dev->process_private)
+               return;
+       rte_free(dev->process_private);
+       dev->process_private = NULL;
+}
+
 /**
  * DPDK callback for Ethernet device configuration.
  *
@@ -232,9 +255,17 @@ mlx4_dev_configure(struct rte_eth_dev *dev)
                goto exit;
        }
        ret = mlx4_intr_install(priv);
-       if (ret)
+       if (ret) {
                ERROR("%p: interrupt handler installation failed",
                      (void *)dev);
+               goto exit;
+       }
+       ret = mlx4_proc_priv_init(dev);
+       if (ret) {
+               ERROR("%p: process private data allocation failed",
+                     (void *)dev);
+               goto exit;
+       }
 exit:
        return ret;
 }
@@ -262,11 +293,6 @@ mlx4_dev_start(struct rte_eth_dev *dev)
                return 0;
        DEBUG("%p: attaching configured flows to all RX queues", (void *)dev);
        priv->started = 1;
-       ret = mlx4_tx_uar_remap(dev, priv->ctx->cmd_fd);
-       if (ret) {
-               ERROR("%p: cannot remap UAR", (void *)dev);
-               goto err;
-       }
        ret = mlx4_rss_init(priv);
        if (ret) {
                ERROR("%p: cannot initialize RSS resources: %s",
@@ -314,8 +340,6 @@ static void
 mlx4_dev_stop(struct rte_eth_dev *dev)
 {
        struct mlx4_priv *priv = dev->data->dev_private;
-       const size_t page_size = sysconf(_SC_PAGESIZE);
-       int i;
 
        if (!priv->started)
                return;
@@ -329,15 +353,6 @@ mlx4_dev_stop(struct rte_eth_dev *dev)
        mlx4_flow_sync(priv, NULL);
        mlx4_rxq_intr_disable(priv);
        mlx4_rss_deinit(priv);
-       for (i = 0; i != dev->data->nb_tx_queues; ++i) {
-               struct txq *txq;
-
-               txq = dev->data->tx_queues[i];
-               if (!txq)
-                       continue;
-               munmap((void *)RTE_ALIGN_FLOOR((uintptr_t)txq->msq.db,
-                                              page_size), page_size);
-       }
 }
 
 /**
@@ -368,6 +383,7 @@ mlx4_dev_close(struct rte_eth_dev *dev)
                mlx4_rx_queue_release(dev->data->rx_queues[i]);
        for (i = 0; i != dev->data->nb_tx_queues; ++i)
                mlx4_tx_queue_release(dev->data->tx_queues[i]);
+       mlx4_proc_priv_uninit(dev);
        mlx4_mr_release(dev);
        if (priv->pd != NULL) {
                assert(priv->ctx != NULL);
@@ -394,6 +410,7 @@ static const struct eth_dev_ops mlx4_dev_ops = {
        .mac_addr_remove = mlx4_mac_addr_remove,
        .mac_addr_add = mlx4_mac_addr_add,
        .mac_addr_set = mlx4_mac_addr_set,
+       .set_mc_addr_list = mlx4_set_mc_addr_list,
        .stats_get = mlx4_stats_get,
        .stats_reset = mlx4_stats_reset,
        .fw_version_get = mlx4_fw_version_get,
@@ -662,130 +679,6 @@ mlx4_hw_rss_sup(struct ibv_context *ctx, struct ibv_pd *pd,
 
 static struct rte_pci_driver mlx4_driver;
 
-static int
-find_lower_va_bound(const struct rte_memseg_list *msl,
-               const struct rte_memseg *ms, void *arg)
-{
-       void **addr = arg;
-
-       if (msl->external)
-               return 0;
-       if (*addr == NULL)
-               *addr = ms->addr;
-       else
-               *addr = RTE_MIN(*addr, ms->addr);
-
-       return 0;
-}
-
-/**
- * Reserve UAR address space for primary process.
- *
- * Process local resource is used by both primary and secondary to avoid
- * duplicate reservation. The space has to be available on both primary and
- * secondary process, TXQ UAR maps to this area using fixed mmap w/o double
- * check.
- *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
- */
-static int
-mlx4_uar_init_primary(void)
-{
-       struct mlx4_shared_data *sd = mlx4_shared_data;
-       void *addr = (void *)0;
-
-       if (sd->uar_base)
-               return 0;
-       /* find out lower bound of hugepage segments */
-       rte_memseg_walk(find_lower_va_bound, &addr);
-       /* keep distance to hugepages to minimize potential conflicts. */
-       addr = RTE_PTR_SUB(addr, (uintptr_t)(MLX4_UAR_OFFSET + MLX4_UAR_SIZE));
-       /* anonymous mmap, no real memory consumption. */
-       addr = mmap(addr, MLX4_UAR_SIZE,
-                   PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-       if (addr == MAP_FAILED) {
-               ERROR("failed to reserve UAR address space, please"
-                     " adjust MLX4_UAR_SIZE or try --base-virtaddr");
-               rte_errno = ENOMEM;
-               return -rte_errno;
-       }
-       /* Accept either same addr or a new addr returned from mmap if target
-        * range occupied.
-        */
-       INFO("reserved UAR address space: %p", addr);
-       sd->uar_base = addr; /* for primary and secondary UAR re-mmap. */
-       return 0;
-}
-
-/**
- * Unmap UAR address space reserved for primary process.
- */
-static void
-mlx4_uar_uninit_primary(void)
-{
-       struct mlx4_shared_data *sd = mlx4_shared_data;
-
-       if (!sd->uar_base)
-               return;
-       munmap(sd->uar_base, MLX4_UAR_SIZE);
-       sd->uar_base = NULL;
-}
-
-/**
- * Reserve UAR address space for secondary process, align with primary process.
- *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
- */
-static int
-mlx4_uar_init_secondary(void)
-{
-       struct mlx4_shared_data *sd = mlx4_shared_data;
-       struct mlx4_local_data *ld = &mlx4_local_data;
-       void *addr;
-
-       if (ld->uar_base) { /* Already reserved. */
-               assert(sd->uar_base == ld->uar_base);
-               return 0;
-       }
-       assert(sd->uar_base);
-       /* anonymous mmap, no real memory consumption. */
-       addr = mmap(sd->uar_base, MLX4_UAR_SIZE,
-                   PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-       if (addr == MAP_FAILED) {
-               ERROR("UAR mmap failed: %p size: %llu",
-                     sd->uar_base, MLX4_UAR_SIZE);
-               rte_errno = ENXIO;
-               return -rte_errno;
-       }
-       if (sd->uar_base != addr) {
-               ERROR("UAR address %p size %llu occupied, please"
-                     " adjust MLX4_UAR_OFFSET or try EAL parameter"
-                     " --base-virtaddr",
-                     sd->uar_base, MLX4_UAR_SIZE);
-               rte_errno = ENXIO;
-               return -rte_errno;
-       }
-       ld->uar_base = addr;
-       INFO("reserved UAR address space: %p", addr);
-       return 0;
-}
-
-/**
- * Unmap UAR address space reserved for secondary process.
- */
-static void
-mlx4_uar_uninit_secondary(void)
-{
-       struct mlx4_local_data *ld = &mlx4_local_data;
-
-       if (!ld->uar_base)
-               return;
-       munmap(ld->uar_base, MLX4_UAR_SIZE);
-       ld->uar_base = NULL;
-}
-
 /**
  * PMD global initialization.
  *
@@ -801,7 +694,6 @@ mlx4_init_once(void)
 {
        struct mlx4_shared_data *sd;
        struct mlx4_local_data *ld = &mlx4_local_data;
-       int ret;
 
        if (mlx4_init_shared_data())
                return -rte_errno;
@@ -817,18 +709,12 @@ mlx4_init_once(void)
                rte_mem_event_callback_register("MLX4_MEM_EVENT_CB",
                                                mlx4_mr_mem_event_cb, NULL);
                mlx4_mp_init_primary();
-               ret = mlx4_uar_init_primary();
-               if (ret)
-                       goto error;
                sd->init_done = true;
                break;
        case RTE_PROC_SECONDARY:
                if (ld->init_done)
                        break;
                mlx4_mp_init_secondary();
-               ret = mlx4_uar_init_secondary();
-               if (ret)
-                       goto error;
                ++sd->secondary_cnt;
                ld->init_done = true;
                break;
@@ -837,23 +723,6 @@ mlx4_init_once(void)
        }
        rte_spinlock_unlock(&sd->lock);
        return 0;
-error:
-       switch (rte_eal_process_type()) {
-       case RTE_PROC_PRIMARY:
-               mlx4_uar_uninit_primary();
-               mlx4_mp_uninit_primary();
-               rte_mem_event_callback_unregister("MLX4_MEM_EVENT_CB", NULL);
-               break;
-       case RTE_PROC_SECONDARY:
-               mlx4_uar_uninit_secondary();
-               mlx4_mp_uninit_secondary();
-               break;
-       default:
-               break;
-       }
-       rte_spinlock_unlock(&sd->lock);
-       mlx4_uninit_shared_data();
-       return -rte_errno;
 }
 
 /**
@@ -972,7 +841,7 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                struct ibv_pd *pd = NULL;
                struct mlx4_priv *priv = NULL;
                struct rte_eth_dev *eth_dev = NULL;
-               struct ether_addr mac;
+               struct rte_ether_addr mac;
                char name[RTE_ETH_NAME_MAX_LEN];
 
                /* If port is not enabled, skip. */
@@ -1005,6 +874,9 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                        }
                        eth_dev->device = &pci_dev->device;
                        eth_dev->dev_ops = &mlx4_dev_sec_ops;
+                       err = mlx4_proc_priv_init(eth_dev);
+                       if (err)
+                               goto error;
                        /* Receive command fd from primary process. */
                        err = mlx4_mp_req_verbs_cmd_fd(eth_dev);
                        if (err < 0) {
@@ -1012,7 +884,7 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                                goto error;
                        }
                        /* Remap UAR for Tx queues. */
-                       err = mlx4_tx_uar_remap(eth_dev, err);
+                       err = mlx4_tx_uar_init_secondary(eth_dev, err);
                        if (err) {
                                err = rte_errno;
                                goto error;
@@ -1073,7 +945,7 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                priv->device_attr = device_attr;
                priv->port = port;
                priv->pd = pd;
-               priv->mtu = ETHER_MTU;
+               priv->mtu = RTE_ETHER_MTU;
                priv->vf = vf;
                priv->hw_csum = !!(device_attr.device_cap_flags &
                                   IBV_DEVICE_RAW_IP_CSUM);