root/drivers/net/ethernet/mellanox/mlx5/core/en_common.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mlx5e_create_tir
  2. mlx5e_destroy_tir
  3. mlx5e_create_mkey
  4. mlx5e_create_mdev_resources
  5. mlx5e_destroy_mdev_resources
  6. mlx5e_refresh_tirs

   1 /*
   2  * Copyright (c) 2016, Mellanox Technologies. All rights reserved.
   3  *
   4  * This software is available to you under a choice of one of two
   5  * licenses.  You may choose to be licensed under the terms of the GNU
   6  * General Public License (GPL) Version 2, available from the file
   7  * COPYING in the main directory of this source tree, or the
   8  * OpenIB.org BSD license below:
   9  *
  10  *     Redistribution and use in source and binary forms, with or
  11  *     without modification, are permitted provided that the following
  12  *     conditions are met:
  13  *
  14  *      - Redistributions of source code must retain the above
  15  *        copyright notice, this list of conditions and the following
  16  *        disclaimer.
  17  *
  18  *      - Redistributions in binary form must reproduce the above
  19  *        copyright notice, this list of conditions and the following
  20  *        disclaimer in the documentation and/or other materials
  21  *        provided with the distribution.
  22  *
  23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30  * SOFTWARE.
  31  */
  32 
  33 #include "en.h"
  34 
  35 /* mlx5e global resources should be placed in this file.
  36  * Global resources are common to all the netdevices crated on the same nic.
  37  */
  38 
  39 int mlx5e_create_tir(struct mlx5_core_dev *mdev,
  40                      struct mlx5e_tir *tir, u32 *in, int inlen)
  41 {
  42         int err;
  43 
  44         err = mlx5_core_create_tir(mdev, in, inlen, &tir->tirn);
  45         if (err)
  46                 return err;
  47 
  48         mutex_lock(&mdev->mlx5e_res.td.list_lock);
  49         list_add(&tir->list, &mdev->mlx5e_res.td.tirs_list);
  50         mutex_unlock(&mdev->mlx5e_res.td.list_lock);
  51 
  52         return 0;
  53 }
  54 
  55 void mlx5e_destroy_tir(struct mlx5_core_dev *mdev,
  56                        struct mlx5e_tir *tir)
  57 {
  58         mutex_lock(&mdev->mlx5e_res.td.list_lock);
  59         mlx5_core_destroy_tir(mdev, tir->tirn);
  60         list_del(&tir->list);
  61         mutex_unlock(&mdev->mlx5e_res.td.list_lock);
  62 }
  63 
  64 static int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn,
  65                              struct mlx5_core_mkey *mkey)
  66 {
  67         int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
  68         void *mkc;
  69         u32 *in;
  70         int err;
  71 
  72         in = kvzalloc(inlen, GFP_KERNEL);
  73         if (!in)
  74                 return -ENOMEM;
  75 
  76         mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
  77         MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA);
  78         MLX5_SET(mkc, mkc, lw, 1);
  79         MLX5_SET(mkc, mkc, lr, 1);
  80 
  81         MLX5_SET(mkc, mkc, pd, pdn);
  82         MLX5_SET(mkc, mkc, length64, 1);
  83         MLX5_SET(mkc, mkc, qpn, 0xffffff);
  84 
  85         err = mlx5_core_create_mkey(mdev, mkey, in, inlen);
  86 
  87         kvfree(in);
  88         return err;
  89 }
  90 
  91 int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
  92 {
  93         struct mlx5e_resources *res = &mdev->mlx5e_res;
  94         int err;
  95 
  96         err = mlx5_core_alloc_pd(mdev, &res->pdn);
  97         if (err) {
  98                 mlx5_core_err(mdev, "alloc pd failed, %d\n", err);
  99                 return err;
 100         }
 101 
 102         err = mlx5_core_alloc_transport_domain(mdev, &res->td.tdn);
 103         if (err) {
 104                 mlx5_core_err(mdev, "alloc td failed, %d\n", err);
 105                 goto err_dealloc_pd;
 106         }
 107 
 108         err = mlx5e_create_mkey(mdev, res->pdn, &res->mkey);
 109         if (err) {
 110                 mlx5_core_err(mdev, "create mkey failed, %d\n", err);
 111                 goto err_dealloc_transport_domain;
 112         }
 113 
 114         err = mlx5_alloc_bfreg(mdev, &res->bfreg, false, false);
 115         if (err) {
 116                 mlx5_core_err(mdev, "alloc bfreg failed, %d\n", err);
 117                 goto err_destroy_mkey;
 118         }
 119 
 120         INIT_LIST_HEAD(&mdev->mlx5e_res.td.tirs_list);
 121         mutex_init(&mdev->mlx5e_res.td.list_lock);
 122 
 123         return 0;
 124 
 125 err_destroy_mkey:
 126         mlx5_core_destroy_mkey(mdev, &res->mkey);
 127 err_dealloc_transport_domain:
 128         mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
 129 err_dealloc_pd:
 130         mlx5_core_dealloc_pd(mdev, res->pdn);
 131         return err;
 132 }
 133 
 134 void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev)
 135 {
 136         struct mlx5e_resources *res = &mdev->mlx5e_res;
 137 
 138         mlx5_free_bfreg(mdev, &res->bfreg);
 139         mlx5_core_destroy_mkey(mdev, &res->mkey);
 140         mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
 141         mlx5_core_dealloc_pd(mdev, res->pdn);
 142         memset(res, 0, sizeof(*res));
 143 }
 144 
 145 int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb)
 146 {
 147         struct mlx5_core_dev *mdev = priv->mdev;
 148         struct mlx5e_tir *tir;
 149         int err  = 0;
 150         u32 tirn = 0;
 151         int inlen;
 152         void *in;
 153 
 154         inlen = MLX5_ST_SZ_BYTES(modify_tir_in);
 155         in = kvzalloc(inlen, GFP_KERNEL);
 156         if (!in) {
 157                 err = -ENOMEM;
 158                 goto out;
 159         }
 160 
 161         if (enable_uc_lb)
 162                 MLX5_SET(modify_tir_in, in, ctx.self_lb_block,
 163                          MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST);
 164 
 165         MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1);
 166 
 167         mutex_lock(&mdev->mlx5e_res.td.list_lock);
 168         list_for_each_entry(tir, &mdev->mlx5e_res.td.tirs_list, list) {
 169                 tirn = tir->tirn;
 170                 err = mlx5_core_modify_tir(mdev, tirn, in, inlen);
 171                 if (err)
 172                         goto out;
 173         }
 174 
 175 out:
 176         kvfree(in);
 177         if (err)
 178                 netdev_err(priv->netdev, "refresh tir(0x%x) failed, %d\n", tirn, err);
 179         mutex_unlock(&mdev->mlx5e_res.td.list_lock);
 180 
 181         return err;
 182 }

/* [<][>][^][v][top][bottom][index][help] */