cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

port.c (62634B)


      1/*
      2 * Copyright (c) 2007 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 <linux/errno.h>
     34#include <linux/if_ether.h>
     35#include <linux/if_vlan.h>
     36#include <linux/export.h>
     37
     38#include <linux/mlx4/cmd.h>
     39
     40#include "mlx4.h"
     41#include "mlx4_stats.h"
     42
     43#define MLX4_MAC_VALID		(1ull << 63)
     44
     45#define MLX4_VLAN_VALID		(1u << 31)
     46#define MLX4_VLAN_MASK		0xfff
     47
     48#define MLX4_STATS_TRAFFIC_COUNTERS_MASK	0xfULL
     49#define MLX4_STATS_TRAFFIC_DROPS_MASK		0xc0ULL
     50#define MLX4_STATS_ERROR_COUNTERS_MASK		0x1ffc30ULL
     51#define MLX4_STATS_PORT_COUNTERS_MASK		0x1fe00000ULL
     52
     53#define MLX4_FLAG2_V_IGNORE_FCS_MASK		BIT(1)
     54#define MLX4_FLAG2_V_USER_MTU_MASK		BIT(5)
     55#define MLX4_FLAG2_V_USER_MAC_MASK		BIT(6)
     56#define MLX4_FLAG_V_MTU_MASK			BIT(0)
     57#define MLX4_FLAG_V_PPRX_MASK			BIT(1)
     58#define MLX4_FLAG_V_PPTX_MASK			BIT(2)
     59#define MLX4_IGNORE_FCS_MASK			0x1
     60#define MLX4_TC_MAX_NUMBER			8
     61
     62void mlx4_init_mac_table(struct mlx4_dev *dev, struct mlx4_mac_table *table)
     63{
     64	int i;
     65
     66	mutex_init(&table->mutex);
     67	for (i = 0; i < MLX4_MAX_MAC_NUM; i++) {
     68		table->entries[i] = 0;
     69		table->refs[i]	 = 0;
     70		table->is_dup[i] = false;
     71	}
     72	table->max   = 1 << dev->caps.log_num_macs;
     73	table->total = 0;
     74}
     75
     76void mlx4_init_vlan_table(struct mlx4_dev *dev, struct mlx4_vlan_table *table)
     77{
     78	int i;
     79
     80	mutex_init(&table->mutex);
     81	for (i = 0; i < MLX4_MAX_VLAN_NUM; i++) {
     82		table->entries[i] = 0;
     83		table->refs[i]	 = 0;
     84		table->is_dup[i] = false;
     85	}
     86	table->max   = (1 << dev->caps.log_num_vlans) - MLX4_VLAN_REGULAR;
     87	table->total = 0;
     88}
     89
     90void mlx4_init_roce_gid_table(struct mlx4_dev *dev,
     91			      struct mlx4_roce_gid_table *table)
     92{
     93	int i;
     94
     95	mutex_init(&table->mutex);
     96	for (i = 0; i < MLX4_ROCE_MAX_GIDS; i++)
     97		memset(table->roce_gids[i].raw, 0, MLX4_ROCE_GID_ENTRY_SIZE);
     98}
     99
    100static int validate_index(struct mlx4_dev *dev,
    101			  struct mlx4_mac_table *table, int index)
    102{
    103	int err = 0;
    104
    105	if (index < 0 || index >= table->max || !table->entries[index]) {
    106		mlx4_warn(dev, "No valid Mac entry for the given index\n");
    107		err = -EINVAL;
    108	}
    109	return err;
    110}
    111
    112static int find_index(struct mlx4_dev *dev,
    113		      struct mlx4_mac_table *table, u64 mac)
    114{
    115	int i;
    116
    117	for (i = 0; i < MLX4_MAX_MAC_NUM; i++) {
    118		if (table->refs[i] &&
    119		    (MLX4_MAC_MASK & mac) ==
    120		    (MLX4_MAC_MASK & be64_to_cpu(table->entries[i])))
    121			return i;
    122	}
    123	/* Mac not found */
    124	return -EINVAL;
    125}
    126
    127static int mlx4_set_port_mac_table(struct mlx4_dev *dev, u8 port,
    128				   __be64 *entries)
    129{
    130	struct mlx4_cmd_mailbox *mailbox;
    131	u32 in_mod;
    132	int err;
    133
    134	mailbox = mlx4_alloc_cmd_mailbox(dev);
    135	if (IS_ERR(mailbox))
    136		return PTR_ERR(mailbox);
    137
    138	memcpy(mailbox->buf, entries, MLX4_MAC_TABLE_SIZE);
    139
    140	in_mod = MLX4_SET_PORT_MAC_TABLE << 8 | port;
    141
    142	err = mlx4_cmd(dev, mailbox->dma, in_mod, MLX4_SET_PORT_ETH_OPCODE,
    143		       MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
    144		       MLX4_CMD_NATIVE);
    145
    146	mlx4_free_cmd_mailbox(dev, mailbox);
    147	return err;
    148}
    149
    150int mlx4_find_cached_mac(struct mlx4_dev *dev, u8 port, u64 mac, int *idx)
    151{
    152	struct mlx4_port_info *info = &mlx4_priv(dev)->port[port];
    153	struct mlx4_mac_table *table = &info->mac_table;
    154	int i;
    155
    156	for (i = 0; i < MLX4_MAX_MAC_NUM; i++) {
    157		if (!table->refs[i])
    158			continue;
    159
    160		if (mac == (MLX4_MAC_MASK & be64_to_cpu(table->entries[i]))) {
    161			*idx = i;
    162			return 0;
    163		}
    164	}
    165
    166	return -ENOENT;
    167}
    168EXPORT_SYMBOL_GPL(mlx4_find_cached_mac);
    169
    170static bool mlx4_need_mf_bond(struct mlx4_dev *dev)
    171{
    172	int i, num_eth_ports = 0;
    173
    174	if (!mlx4_is_mfunc(dev))
    175		return false;
    176	mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_ETH)
    177		++num_eth_ports;
    178
    179	return (num_eth_ports ==  2) ? true : false;
    180}
    181
    182int __mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac)
    183{
    184	struct mlx4_port_info *info = &mlx4_priv(dev)->port[port];
    185	struct mlx4_mac_table *table = &info->mac_table;
    186	int i, err = 0;
    187	int free = -1;
    188	int free_for_dup = -1;
    189	bool dup = mlx4_is_mf_bonded(dev);
    190	u8 dup_port = (port == 1) ? 2 : 1;
    191	struct mlx4_mac_table *dup_table = &mlx4_priv(dev)->port[dup_port].mac_table;
    192	bool need_mf_bond = mlx4_need_mf_bond(dev);
    193	bool can_mf_bond = true;
    194
    195	mlx4_dbg(dev, "Registering MAC: 0x%llx for port %d %s duplicate\n",
    196		 (unsigned long long)mac, port,
    197		 dup ? "with" : "without");
    198
    199	if (need_mf_bond) {
    200		if (port == 1) {
    201			mutex_lock(&table->mutex);
    202			mutex_lock_nested(&dup_table->mutex, SINGLE_DEPTH_NESTING);
    203		} else {
    204			mutex_lock(&dup_table->mutex);
    205			mutex_lock_nested(&table->mutex, SINGLE_DEPTH_NESTING);
    206		}
    207	} else {
    208		mutex_lock(&table->mutex);
    209	}
    210
    211	if (need_mf_bond) {
    212		int index_at_port = -1;
    213		int index_at_dup_port = -1;
    214
    215		for (i = 0; i < MLX4_MAX_MAC_NUM; i++) {
    216			if (((MLX4_MAC_MASK & mac) == (MLX4_MAC_MASK & be64_to_cpu(table->entries[i]))))
    217				index_at_port = i;
    218			if (((MLX4_MAC_MASK & mac) == (MLX4_MAC_MASK & be64_to_cpu(dup_table->entries[i]))))
    219				index_at_dup_port = i;
    220		}
    221
    222		/* check that same mac is not in the tables at different indices */
    223		if ((index_at_port != index_at_dup_port) &&
    224		    (index_at_port >= 0) &&
    225		    (index_at_dup_port >= 0))
    226			can_mf_bond = false;
    227
    228		/* If the mac is already in the primary table, the slot must be
    229		 * available in the duplicate table as well.
    230		 */
    231		if (index_at_port >= 0 && index_at_dup_port < 0 &&
    232		    dup_table->refs[index_at_port]) {
    233			can_mf_bond = false;
    234		}
    235		/* If the mac is already in the duplicate table, check that the
    236		 * corresponding index is not occupied in the primary table, or
    237		 * the primary table already contains the mac at the same index.
    238		 * Otherwise, you cannot bond (primary contains a different mac
    239		 * at that index).
    240		 */
    241		if (index_at_dup_port >= 0) {
    242			if (!table->refs[index_at_dup_port] ||
    243			    ((MLX4_MAC_MASK & mac) == (MLX4_MAC_MASK & be64_to_cpu(table->entries[index_at_dup_port]))))
    244				free_for_dup = index_at_dup_port;
    245			else
    246				can_mf_bond = false;
    247		}
    248	}
    249
    250	for (i = 0; i < MLX4_MAX_MAC_NUM; i++) {
    251		if (!table->refs[i]) {
    252			if (free < 0)
    253				free = i;
    254			if (free_for_dup < 0 && need_mf_bond && can_mf_bond) {
    255				if (!dup_table->refs[i])
    256					free_for_dup = i;
    257			}
    258			continue;
    259		}
    260
    261		if ((MLX4_MAC_MASK & mac) ==
    262		     (MLX4_MAC_MASK & be64_to_cpu(table->entries[i]))) {
    263			/* MAC already registered, increment ref count */
    264			err = i;
    265			++table->refs[i];
    266			if (dup) {
    267				u64 dup_mac = MLX4_MAC_MASK & be64_to_cpu(dup_table->entries[i]);
    268
    269				if (dup_mac != mac || !dup_table->is_dup[i]) {
    270					mlx4_warn(dev, "register mac: expect duplicate mac 0x%llx on port %d index %d\n",
    271						  mac, dup_port, i);
    272				}
    273			}
    274			goto out;
    275		}
    276	}
    277
    278	if (need_mf_bond && (free_for_dup < 0)) {
    279		if (dup) {
    280			mlx4_warn(dev, "Fail to allocate duplicate MAC table entry\n");
    281			mlx4_warn(dev, "High Availability for virtual functions may not work as expected\n");
    282			dup = false;
    283		}
    284		can_mf_bond = false;
    285	}
    286
    287	if (need_mf_bond && can_mf_bond)
    288		free = free_for_dup;
    289
    290	mlx4_dbg(dev, "Free MAC index is %d\n", free);
    291
    292	if (table->total == table->max) {
    293		/* No free mac entries */
    294		err = -ENOSPC;
    295		goto out;
    296	}
    297
    298	/* Register new MAC */
    299	table->entries[free] = cpu_to_be64(mac | MLX4_MAC_VALID);
    300
    301	err = mlx4_set_port_mac_table(dev, port, table->entries);
    302	if (unlikely(err)) {
    303		mlx4_err(dev, "Failed adding MAC: 0x%llx\n",
    304			 (unsigned long long) mac);
    305		table->entries[free] = 0;
    306		goto out;
    307	}
    308	table->refs[free] = 1;
    309	table->is_dup[free] = false;
    310	++table->total;
    311	if (dup) {
    312		dup_table->refs[free] = 0;
    313		dup_table->is_dup[free] = true;
    314		dup_table->entries[free] = cpu_to_be64(mac | MLX4_MAC_VALID);
    315
    316		err = mlx4_set_port_mac_table(dev, dup_port, dup_table->entries);
    317		if (unlikely(err)) {
    318			mlx4_warn(dev, "Failed adding duplicate mac: 0x%llx\n", mac);
    319			dup_table->is_dup[free] = false;
    320			dup_table->entries[free] = 0;
    321			goto out;
    322		}
    323		++dup_table->total;
    324	}
    325	err = free;
    326out:
    327	if (need_mf_bond) {
    328		if (port == 2) {
    329			mutex_unlock(&table->mutex);
    330			mutex_unlock(&dup_table->mutex);
    331		} else {
    332			mutex_unlock(&dup_table->mutex);
    333			mutex_unlock(&table->mutex);
    334		}
    335	} else {
    336		mutex_unlock(&table->mutex);
    337	}
    338	return err;
    339}
    340EXPORT_SYMBOL_GPL(__mlx4_register_mac);
    341
    342int mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac)
    343{
    344	u64 out_param = 0;
    345	int err = -EINVAL;
    346
    347	if (mlx4_is_mfunc(dev)) {
    348		if (!(dev->flags & MLX4_FLAG_OLD_REG_MAC)) {
    349			err = mlx4_cmd_imm(dev, mac, &out_param,
    350					   ((u32) port) << 8 | (u32) RES_MAC,
    351					   RES_OP_RESERVE_AND_MAP, MLX4_CMD_ALLOC_RES,
    352					   MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
    353		}
    354		if (err && err == -EINVAL && mlx4_is_slave(dev)) {
    355			/* retry using old REG_MAC format */
    356			set_param_l(&out_param, port);
    357			err = mlx4_cmd_imm(dev, mac, &out_param, RES_MAC,
    358					   RES_OP_RESERVE_AND_MAP, MLX4_CMD_ALLOC_RES,
    359					   MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
    360			if (!err)
    361				dev->flags |= MLX4_FLAG_OLD_REG_MAC;
    362		}
    363		if (err)
    364			return err;
    365
    366		return get_param_l(&out_param);
    367	}
    368	return __mlx4_register_mac(dev, port, mac);
    369}
    370EXPORT_SYMBOL_GPL(mlx4_register_mac);
    371
    372int mlx4_get_base_qpn(struct mlx4_dev *dev, u8 port)
    373{
    374	return dev->caps.reserved_qps_base[MLX4_QP_REGION_ETH_ADDR] +
    375			(port - 1) * (1 << dev->caps.log_num_macs);
    376}
    377EXPORT_SYMBOL_GPL(mlx4_get_base_qpn);
    378
    379void __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac)
    380{
    381	struct mlx4_port_info *info;
    382	struct mlx4_mac_table *table;
    383	int index;
    384	bool dup = mlx4_is_mf_bonded(dev);
    385	u8 dup_port = (port == 1) ? 2 : 1;
    386	struct mlx4_mac_table *dup_table = &mlx4_priv(dev)->port[dup_port].mac_table;
    387
    388	if (port < 1 || port > dev->caps.num_ports) {
    389		mlx4_warn(dev, "invalid port number (%d), aborting...\n", port);
    390		return;
    391	}
    392	info = &mlx4_priv(dev)->port[port];
    393	table = &info->mac_table;
    394
    395	if (dup) {
    396		if (port == 1) {
    397			mutex_lock(&table->mutex);
    398			mutex_lock_nested(&dup_table->mutex, SINGLE_DEPTH_NESTING);
    399		} else {
    400			mutex_lock(&dup_table->mutex);
    401			mutex_lock_nested(&table->mutex, SINGLE_DEPTH_NESTING);
    402		}
    403	} else {
    404		mutex_lock(&table->mutex);
    405	}
    406
    407	index = find_index(dev, table, mac);
    408
    409	if (validate_index(dev, table, index))
    410		goto out;
    411
    412	if (--table->refs[index] || table->is_dup[index]) {
    413		mlx4_dbg(dev, "Have more references for index %d, no need to modify mac table\n",
    414			 index);
    415		if (!table->refs[index])
    416			dup_table->is_dup[index] = false;
    417		goto out;
    418	}
    419
    420	table->entries[index] = 0;
    421	if (mlx4_set_port_mac_table(dev, port, table->entries))
    422		mlx4_warn(dev, "Fail to set mac in port %d during unregister\n", port);
    423	--table->total;
    424
    425	if (dup) {
    426		dup_table->is_dup[index] = false;
    427		if (dup_table->refs[index])
    428			goto out;
    429		dup_table->entries[index] = 0;
    430		if (mlx4_set_port_mac_table(dev, dup_port, dup_table->entries))
    431			mlx4_warn(dev, "Fail to set mac in duplicate port %d during unregister\n", dup_port);
    432
    433		--table->total;
    434	}
    435out:
    436	if (dup) {
    437		if (port == 2) {
    438			mutex_unlock(&table->mutex);
    439			mutex_unlock(&dup_table->mutex);
    440		} else {
    441			mutex_unlock(&dup_table->mutex);
    442			mutex_unlock(&table->mutex);
    443		}
    444	} else {
    445		mutex_unlock(&table->mutex);
    446	}
    447}
    448EXPORT_SYMBOL_GPL(__mlx4_unregister_mac);
    449
    450void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac)
    451{
    452	u64 out_param = 0;
    453
    454	if (mlx4_is_mfunc(dev)) {
    455		if (!(dev->flags & MLX4_FLAG_OLD_REG_MAC)) {
    456			(void) mlx4_cmd_imm(dev, mac, &out_param,
    457					    ((u32) port) << 8 | (u32) RES_MAC,
    458					    RES_OP_RESERVE_AND_MAP, MLX4_CMD_FREE_RES,
    459					    MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
    460		} else {
    461			/* use old unregister mac format */
    462			set_param_l(&out_param, port);
    463			(void) mlx4_cmd_imm(dev, mac, &out_param, RES_MAC,
    464					    RES_OP_RESERVE_AND_MAP, MLX4_CMD_FREE_RES,
    465					    MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
    466		}
    467		return;
    468	}
    469	__mlx4_unregister_mac(dev, port, mac);
    470	return;
    471}
    472EXPORT_SYMBOL_GPL(mlx4_unregister_mac);
    473
    474int __mlx4_replace_mac(struct mlx4_dev *dev, u8 port, int qpn, u64 new_mac)
    475{
    476	struct mlx4_port_info *info = &mlx4_priv(dev)->port[port];
    477	struct mlx4_mac_table *table = &info->mac_table;
    478	int index = qpn - info->base_qpn;
    479	int err = 0;
    480	bool dup = mlx4_is_mf_bonded(dev);
    481	u8 dup_port = (port == 1) ? 2 : 1;
    482	struct mlx4_mac_table *dup_table = &mlx4_priv(dev)->port[dup_port].mac_table;
    483
    484	/* CX1 doesn't support multi-functions */
    485	if (dup) {
    486		if (port == 1) {
    487			mutex_lock(&table->mutex);
    488			mutex_lock_nested(&dup_table->mutex, SINGLE_DEPTH_NESTING);
    489		} else {
    490			mutex_lock(&dup_table->mutex);
    491			mutex_lock_nested(&table->mutex, SINGLE_DEPTH_NESTING);
    492		}
    493	} else {
    494		mutex_lock(&table->mutex);
    495	}
    496
    497	err = validate_index(dev, table, index);
    498	if (err)
    499		goto out;
    500
    501	table->entries[index] = cpu_to_be64(new_mac | MLX4_MAC_VALID);
    502
    503	err = mlx4_set_port_mac_table(dev, port, table->entries);
    504	if (unlikely(err)) {
    505		mlx4_err(dev, "Failed adding MAC: 0x%llx\n",
    506			 (unsigned long long) new_mac);
    507		table->entries[index] = 0;
    508	} else {
    509		if (dup) {
    510			dup_table->entries[index] = cpu_to_be64(new_mac | MLX4_MAC_VALID);
    511
    512			err = mlx4_set_port_mac_table(dev, dup_port, dup_table->entries);
    513			if (unlikely(err)) {
    514				mlx4_err(dev, "Failed adding duplicate MAC: 0x%llx\n",
    515					 (unsigned long long)new_mac);
    516				dup_table->entries[index] = 0;
    517			}
    518		}
    519	}
    520out:
    521	if (dup) {
    522		if (port == 2) {
    523			mutex_unlock(&table->mutex);
    524			mutex_unlock(&dup_table->mutex);
    525		} else {
    526			mutex_unlock(&dup_table->mutex);
    527			mutex_unlock(&table->mutex);
    528		}
    529	} else {
    530		mutex_unlock(&table->mutex);
    531	}
    532	return err;
    533}
    534EXPORT_SYMBOL_GPL(__mlx4_replace_mac);
    535
    536static int mlx4_set_port_vlan_table(struct mlx4_dev *dev, u8 port,
    537				    __be32 *entries)
    538{
    539	struct mlx4_cmd_mailbox *mailbox;
    540	u32 in_mod;
    541	int err;
    542
    543	mailbox = mlx4_alloc_cmd_mailbox(dev);
    544	if (IS_ERR(mailbox))
    545		return PTR_ERR(mailbox);
    546
    547	memcpy(mailbox->buf, entries, MLX4_VLAN_TABLE_SIZE);
    548	in_mod = MLX4_SET_PORT_VLAN_TABLE << 8 | port;
    549	err = mlx4_cmd(dev, mailbox->dma, in_mod, MLX4_SET_PORT_ETH_OPCODE,
    550		       MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
    551		       MLX4_CMD_NATIVE);
    552
    553	mlx4_free_cmd_mailbox(dev, mailbox);
    554
    555	return err;
    556}
    557
    558int mlx4_find_cached_vlan(struct mlx4_dev *dev, u8 port, u16 vid, int *idx)
    559{
    560	struct mlx4_vlan_table *table = &mlx4_priv(dev)->port[port].vlan_table;
    561	int i;
    562
    563	for (i = 0; i < MLX4_MAX_VLAN_NUM; ++i) {
    564		if (table->refs[i] &&
    565		    (vid == (MLX4_VLAN_MASK &
    566			      be32_to_cpu(table->entries[i])))) {
    567			/* VLAN already registered, increase reference count */
    568			*idx = i;
    569			return 0;
    570		}
    571	}
    572
    573	return -ENOENT;
    574}
    575EXPORT_SYMBOL_GPL(mlx4_find_cached_vlan);
    576
    577int __mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan,
    578				int *index)
    579{
    580	struct mlx4_vlan_table *table = &mlx4_priv(dev)->port[port].vlan_table;
    581	int i, err = 0;
    582	int free = -1;
    583	int free_for_dup = -1;
    584	bool dup = mlx4_is_mf_bonded(dev);
    585	u8 dup_port = (port == 1) ? 2 : 1;
    586	struct mlx4_vlan_table *dup_table = &mlx4_priv(dev)->port[dup_port].vlan_table;
    587	bool need_mf_bond = mlx4_need_mf_bond(dev);
    588	bool can_mf_bond = true;
    589
    590	mlx4_dbg(dev, "Registering VLAN: %d for port %d %s duplicate\n",
    591		 vlan, port,
    592		 dup ? "with" : "without");
    593
    594	if (need_mf_bond) {
    595		if (port == 1) {
    596			mutex_lock(&table->mutex);
    597			mutex_lock_nested(&dup_table->mutex, SINGLE_DEPTH_NESTING);
    598		} else {
    599			mutex_lock(&dup_table->mutex);
    600			mutex_lock_nested(&table->mutex, SINGLE_DEPTH_NESTING);
    601		}
    602	} else {
    603		mutex_lock(&table->mutex);
    604	}
    605
    606	if (table->total == table->max) {
    607		/* No free vlan entries */
    608		err = -ENOSPC;
    609		goto out;
    610	}
    611
    612	if (need_mf_bond) {
    613		int index_at_port = -1;
    614		int index_at_dup_port = -1;
    615
    616		for (i = MLX4_VLAN_REGULAR; i < MLX4_MAX_VLAN_NUM; i++) {
    617			if (vlan == (MLX4_VLAN_MASK & be32_to_cpu(table->entries[i])))
    618				index_at_port = i;
    619			if (vlan == (MLX4_VLAN_MASK & be32_to_cpu(dup_table->entries[i])))
    620				index_at_dup_port = i;
    621		}
    622		/* check that same vlan is not in the tables at different indices */
    623		if ((index_at_port != index_at_dup_port) &&
    624		    (index_at_port >= 0) &&
    625		    (index_at_dup_port >= 0))
    626			can_mf_bond = false;
    627
    628		/* If the vlan is already in the primary table, the slot must be
    629		 * available in the duplicate table as well.
    630		 */
    631		if (index_at_port >= 0 && index_at_dup_port < 0 &&
    632		    dup_table->refs[index_at_port]) {
    633			can_mf_bond = false;
    634		}
    635		/* If the vlan is already in the duplicate table, check that the
    636		 * corresponding index is not occupied in the primary table, or
    637		 * the primary table already contains the vlan at the same index.
    638		 * Otherwise, you cannot bond (primary contains a different vlan
    639		 * at that index).
    640		 */
    641		if (index_at_dup_port >= 0) {
    642			if (!table->refs[index_at_dup_port] ||
    643			    (vlan == (MLX4_VLAN_MASK & be32_to_cpu(dup_table->entries[index_at_dup_port]))))
    644				free_for_dup = index_at_dup_port;
    645			else
    646				can_mf_bond = false;
    647		}
    648	}
    649
    650	for (i = MLX4_VLAN_REGULAR; i < MLX4_MAX_VLAN_NUM; i++) {
    651		if (!table->refs[i]) {
    652			if (free < 0)
    653				free = i;
    654			if (free_for_dup < 0 && need_mf_bond && can_mf_bond) {
    655				if (!dup_table->refs[i])
    656					free_for_dup = i;
    657			}
    658		}
    659
    660		if ((table->refs[i] || table->is_dup[i]) &&
    661		    (vlan == (MLX4_VLAN_MASK &
    662			      be32_to_cpu(table->entries[i])))) {
    663			/* Vlan already registered, increase references count */
    664			mlx4_dbg(dev, "vlan %u is already registered.\n", vlan);
    665			*index = i;
    666			++table->refs[i];
    667			if (dup) {
    668				u16 dup_vlan = MLX4_VLAN_MASK & be32_to_cpu(dup_table->entries[i]);
    669
    670				if (dup_vlan != vlan || !dup_table->is_dup[i]) {
    671					mlx4_warn(dev, "register vlan: expected duplicate vlan %u on port %d index %d\n",
    672						  vlan, dup_port, i);
    673				}
    674			}
    675			goto out;
    676		}
    677	}
    678
    679	if (need_mf_bond && (free_for_dup < 0)) {
    680		if (dup) {
    681			mlx4_warn(dev, "Fail to allocate duplicate VLAN table entry\n");
    682			mlx4_warn(dev, "High Availability for virtual functions may not work as expected\n");
    683			dup = false;
    684		}
    685		can_mf_bond = false;
    686	}
    687
    688	if (need_mf_bond && can_mf_bond)
    689		free = free_for_dup;
    690
    691	if (free < 0) {
    692		err = -ENOMEM;
    693		goto out;
    694	}
    695
    696	/* Register new VLAN */
    697	table->refs[free] = 1;
    698	table->is_dup[free] = false;
    699	table->entries[free] = cpu_to_be32(vlan | MLX4_VLAN_VALID);
    700
    701	err = mlx4_set_port_vlan_table(dev, port, table->entries);
    702	if (unlikely(err)) {
    703		mlx4_warn(dev, "Failed adding vlan: %u\n", vlan);
    704		table->refs[free] = 0;
    705		table->entries[free] = 0;
    706		goto out;
    707	}
    708	++table->total;
    709	if (dup) {
    710		dup_table->refs[free] = 0;
    711		dup_table->is_dup[free] = true;
    712		dup_table->entries[free] = cpu_to_be32(vlan | MLX4_VLAN_VALID);
    713
    714		err = mlx4_set_port_vlan_table(dev, dup_port, dup_table->entries);
    715		if (unlikely(err)) {
    716			mlx4_warn(dev, "Failed adding duplicate vlan: %u\n", vlan);
    717			dup_table->is_dup[free] = false;
    718			dup_table->entries[free] = 0;
    719			goto out;
    720		}
    721		++dup_table->total;
    722	}
    723
    724	*index = free;
    725out:
    726	if (need_mf_bond) {
    727		if (port == 2) {
    728			mutex_unlock(&table->mutex);
    729			mutex_unlock(&dup_table->mutex);
    730		} else {
    731			mutex_unlock(&dup_table->mutex);
    732			mutex_unlock(&table->mutex);
    733		}
    734	} else {
    735		mutex_unlock(&table->mutex);
    736	}
    737	return err;
    738}
    739
    740int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index)
    741{
    742	u64 out_param = 0;
    743	int err;
    744
    745	if (vlan > 4095)
    746		return -EINVAL;
    747
    748	if (mlx4_is_mfunc(dev)) {
    749		err = mlx4_cmd_imm(dev, vlan, &out_param,
    750				   ((u32) port) << 8 | (u32) RES_VLAN,
    751				   RES_OP_RESERVE_AND_MAP, MLX4_CMD_ALLOC_RES,
    752				   MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
    753		if (!err)
    754			*index = get_param_l(&out_param);
    755
    756		return err;
    757	}
    758	return __mlx4_register_vlan(dev, port, vlan, index);
    759}
    760EXPORT_SYMBOL_GPL(mlx4_register_vlan);
    761
    762void __mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, u16 vlan)
    763{
    764	struct mlx4_vlan_table *table = &mlx4_priv(dev)->port[port].vlan_table;
    765	int index;
    766	bool dup = mlx4_is_mf_bonded(dev);
    767	u8 dup_port = (port == 1) ? 2 : 1;
    768	struct mlx4_vlan_table *dup_table = &mlx4_priv(dev)->port[dup_port].vlan_table;
    769
    770	if (dup) {
    771		if (port == 1) {
    772			mutex_lock(&table->mutex);
    773			mutex_lock_nested(&dup_table->mutex, SINGLE_DEPTH_NESTING);
    774		} else {
    775			mutex_lock(&dup_table->mutex);
    776			mutex_lock_nested(&table->mutex, SINGLE_DEPTH_NESTING);
    777		}
    778	} else {
    779		mutex_lock(&table->mutex);
    780	}
    781
    782	if (mlx4_find_cached_vlan(dev, port, vlan, &index)) {
    783		mlx4_warn(dev, "vlan 0x%x is not in the vlan table\n", vlan);
    784		goto out;
    785	}
    786
    787	if (index < MLX4_VLAN_REGULAR) {
    788		mlx4_warn(dev, "Trying to free special vlan index %d\n", index);
    789		goto out;
    790	}
    791
    792	if (--table->refs[index] || table->is_dup[index]) {
    793		mlx4_dbg(dev, "Have %d more references for index %d, no need to modify vlan table\n",
    794			 table->refs[index], index);
    795		if (!table->refs[index])
    796			dup_table->is_dup[index] = false;
    797		goto out;
    798	}
    799	table->entries[index] = 0;
    800	if (mlx4_set_port_vlan_table(dev, port, table->entries))
    801		mlx4_warn(dev, "Fail to set vlan in port %d during unregister\n", port);
    802	--table->total;
    803	if (dup) {
    804		dup_table->is_dup[index] = false;
    805		if (dup_table->refs[index])
    806			goto out;
    807		dup_table->entries[index] = 0;
    808		if (mlx4_set_port_vlan_table(dev, dup_port, dup_table->entries))
    809			mlx4_warn(dev, "Fail to set vlan in duplicate port %d during unregister\n", dup_port);
    810		--dup_table->total;
    811	}
    812out:
    813	if (dup) {
    814		if (port == 2) {
    815			mutex_unlock(&table->mutex);
    816			mutex_unlock(&dup_table->mutex);
    817		} else {
    818			mutex_unlock(&dup_table->mutex);
    819			mutex_unlock(&table->mutex);
    820		}
    821	} else {
    822		mutex_unlock(&table->mutex);
    823	}
    824}
    825
    826void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, u16 vlan)
    827{
    828	u64 out_param = 0;
    829
    830	if (mlx4_is_mfunc(dev)) {
    831		(void) mlx4_cmd_imm(dev, vlan, &out_param,
    832				    ((u32) port) << 8 | (u32) RES_VLAN,
    833				    RES_OP_RESERVE_AND_MAP,
    834				    MLX4_CMD_FREE_RES, MLX4_CMD_TIME_CLASS_A,
    835				    MLX4_CMD_WRAPPED);
    836		return;
    837	}
    838	__mlx4_unregister_vlan(dev, port, vlan);
    839}
    840EXPORT_SYMBOL_GPL(mlx4_unregister_vlan);
    841
    842int mlx4_bond_mac_table(struct mlx4_dev *dev)
    843{
    844	struct mlx4_mac_table *t1 = &mlx4_priv(dev)->port[1].mac_table;
    845	struct mlx4_mac_table *t2 = &mlx4_priv(dev)->port[2].mac_table;
    846	int ret = 0;
    847	int i;
    848	bool update1 = false;
    849	bool update2 = false;
    850
    851	mutex_lock(&t1->mutex);
    852	mutex_lock(&t2->mutex);
    853	for (i = 0; i < MLX4_MAX_MAC_NUM; i++) {
    854		if ((t1->entries[i] != t2->entries[i]) &&
    855		    t1->entries[i] && t2->entries[i]) {
    856			mlx4_warn(dev, "can't duplicate entry %d in mac table\n", i);
    857			ret = -EINVAL;
    858			goto unlock;
    859		}
    860	}
    861
    862	for (i = 0; i < MLX4_MAX_MAC_NUM; i++) {
    863		if (t1->entries[i] && !t2->entries[i]) {
    864			t2->entries[i] = t1->entries[i];
    865			t2->is_dup[i] = true;
    866			update2 = true;
    867		} else if (!t1->entries[i] && t2->entries[i]) {
    868			t1->entries[i] = t2->entries[i];
    869			t1->is_dup[i] = true;
    870			update1 = true;
    871		} else if (t1->entries[i] && t2->entries[i]) {
    872			t1->is_dup[i] = true;
    873			t2->is_dup[i] = true;
    874		}
    875	}
    876
    877	if (update1) {
    878		ret = mlx4_set_port_mac_table(dev, 1, t1->entries);
    879		if (ret)
    880			mlx4_warn(dev, "failed to set MAC table for port 1 (%d)\n", ret);
    881	}
    882	if (!ret && update2) {
    883		ret = mlx4_set_port_mac_table(dev, 2, t2->entries);
    884		if (ret)
    885			mlx4_warn(dev, "failed to set MAC table for port 2 (%d)\n", ret);
    886	}
    887
    888	if (ret)
    889		mlx4_warn(dev, "failed to create mirror MAC tables\n");
    890unlock:
    891	mutex_unlock(&t2->mutex);
    892	mutex_unlock(&t1->mutex);
    893	return ret;
    894}
    895
    896int mlx4_unbond_mac_table(struct mlx4_dev *dev)
    897{
    898	struct mlx4_mac_table *t1 = &mlx4_priv(dev)->port[1].mac_table;
    899	struct mlx4_mac_table *t2 = &mlx4_priv(dev)->port[2].mac_table;
    900	int ret = 0;
    901	int ret1;
    902	int i;
    903	bool update1 = false;
    904	bool update2 = false;
    905
    906	mutex_lock(&t1->mutex);
    907	mutex_lock(&t2->mutex);
    908	for (i = 0; i < MLX4_MAX_MAC_NUM; i++) {
    909		if (t1->entries[i] != t2->entries[i]) {
    910			mlx4_warn(dev, "mac table is in an unexpected state when trying to unbond\n");
    911			ret = -EINVAL;
    912			goto unlock;
    913		}
    914	}
    915
    916	for (i = 0; i < MLX4_MAX_MAC_NUM; i++) {
    917		if (!t1->entries[i])
    918			continue;
    919		t1->is_dup[i] = false;
    920		if (!t1->refs[i]) {
    921			t1->entries[i] = 0;
    922			update1 = true;
    923		}
    924		t2->is_dup[i] = false;
    925		if (!t2->refs[i]) {
    926			t2->entries[i] = 0;
    927			update2 = true;
    928		}
    929	}
    930
    931	if (update1) {
    932		ret = mlx4_set_port_mac_table(dev, 1, t1->entries);
    933		if (ret)
    934			mlx4_warn(dev, "failed to unmirror MAC tables for port 1(%d)\n", ret);
    935	}
    936	if (update2) {
    937		ret1 = mlx4_set_port_mac_table(dev, 2, t2->entries);
    938		if (ret1) {
    939			mlx4_warn(dev, "failed to unmirror MAC tables for port 2(%d)\n", ret1);
    940			ret = ret1;
    941		}
    942	}
    943unlock:
    944	mutex_unlock(&t2->mutex);
    945	mutex_unlock(&t1->mutex);
    946	return ret;
    947}
    948
    949int mlx4_bond_vlan_table(struct mlx4_dev *dev)
    950{
    951	struct mlx4_vlan_table *t1 = &mlx4_priv(dev)->port[1].vlan_table;
    952	struct mlx4_vlan_table *t2 = &mlx4_priv(dev)->port[2].vlan_table;
    953	int ret = 0;
    954	int i;
    955	bool update1 = false;
    956	bool update2 = false;
    957
    958	mutex_lock(&t1->mutex);
    959	mutex_lock(&t2->mutex);
    960	for (i = 0; i < MLX4_MAX_VLAN_NUM; i++) {
    961		if ((t1->entries[i] != t2->entries[i]) &&
    962		    t1->entries[i] && t2->entries[i]) {
    963			mlx4_warn(dev, "can't duplicate entry %d in vlan table\n", i);
    964			ret = -EINVAL;
    965			goto unlock;
    966		}
    967	}
    968
    969	for (i = 0; i < MLX4_MAX_VLAN_NUM; i++) {
    970		if (t1->entries[i] && !t2->entries[i]) {
    971			t2->entries[i] = t1->entries[i];
    972			t2->is_dup[i] = true;
    973			update2 = true;
    974		} else if (!t1->entries[i] && t2->entries[i]) {
    975			t1->entries[i] = t2->entries[i];
    976			t1->is_dup[i] = true;
    977			update1 = true;
    978		} else if (t1->entries[i] && t2->entries[i]) {
    979			t1->is_dup[i] = true;
    980			t2->is_dup[i] = true;
    981		}
    982	}
    983
    984	if (update1) {
    985		ret = mlx4_set_port_vlan_table(dev, 1, t1->entries);
    986		if (ret)
    987			mlx4_warn(dev, "failed to set VLAN table for port 1 (%d)\n", ret);
    988	}
    989	if (!ret && update2) {
    990		ret = mlx4_set_port_vlan_table(dev, 2, t2->entries);
    991		if (ret)
    992			mlx4_warn(dev, "failed to set VLAN table for port 2 (%d)\n", ret);
    993	}
    994
    995	if (ret)
    996		mlx4_warn(dev, "failed to create mirror VLAN tables\n");
    997unlock:
    998	mutex_unlock(&t2->mutex);
    999	mutex_unlock(&t1->mutex);
   1000	return ret;
   1001}
   1002
   1003int mlx4_unbond_vlan_table(struct mlx4_dev *dev)
   1004{
   1005	struct mlx4_vlan_table *t1 = &mlx4_priv(dev)->port[1].vlan_table;
   1006	struct mlx4_vlan_table *t2 = &mlx4_priv(dev)->port[2].vlan_table;
   1007	int ret = 0;
   1008	int ret1;
   1009	int i;
   1010	bool update1 = false;
   1011	bool update2 = false;
   1012
   1013	mutex_lock(&t1->mutex);
   1014	mutex_lock(&t2->mutex);
   1015	for (i = 0; i < MLX4_MAX_VLAN_NUM; i++) {
   1016		if (t1->entries[i] != t2->entries[i]) {
   1017			mlx4_warn(dev, "vlan table is in an unexpected state when trying to unbond\n");
   1018			ret = -EINVAL;
   1019			goto unlock;
   1020		}
   1021	}
   1022
   1023	for (i = 0; i < MLX4_MAX_VLAN_NUM; i++) {
   1024		if (!t1->entries[i])
   1025			continue;
   1026		t1->is_dup[i] = false;
   1027		if (!t1->refs[i]) {
   1028			t1->entries[i] = 0;
   1029			update1 = true;
   1030		}
   1031		t2->is_dup[i] = false;
   1032		if (!t2->refs[i]) {
   1033			t2->entries[i] = 0;
   1034			update2 = true;
   1035		}
   1036	}
   1037
   1038	if (update1) {
   1039		ret = mlx4_set_port_vlan_table(dev, 1, t1->entries);
   1040		if (ret)
   1041			mlx4_warn(dev, "failed to unmirror VLAN tables for port 1(%d)\n", ret);
   1042	}
   1043	if (update2) {
   1044		ret1 = mlx4_set_port_vlan_table(dev, 2, t2->entries);
   1045		if (ret1) {
   1046			mlx4_warn(dev, "failed to unmirror VLAN tables for port 2(%d)\n", ret1);
   1047			ret = ret1;
   1048		}
   1049	}
   1050unlock:
   1051	mutex_unlock(&t2->mutex);
   1052	mutex_unlock(&t1->mutex);
   1053	return ret;
   1054}
   1055
   1056int mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps)
   1057{
   1058	struct mlx4_cmd_mailbox *inmailbox, *outmailbox;
   1059	u8 *inbuf, *outbuf;
   1060	int err;
   1061
   1062	inmailbox = mlx4_alloc_cmd_mailbox(dev);
   1063	if (IS_ERR(inmailbox))
   1064		return PTR_ERR(inmailbox);
   1065
   1066	outmailbox = mlx4_alloc_cmd_mailbox(dev);
   1067	if (IS_ERR(outmailbox)) {
   1068		mlx4_free_cmd_mailbox(dev, inmailbox);
   1069		return PTR_ERR(outmailbox);
   1070	}
   1071
   1072	inbuf = inmailbox->buf;
   1073	outbuf = outmailbox->buf;
   1074	inbuf[0] = 1;
   1075	inbuf[1] = 1;
   1076	inbuf[2] = 1;
   1077	inbuf[3] = 1;
   1078	*(__be16 *) (&inbuf[16]) = cpu_to_be16(0x0015);
   1079	*(__be32 *) (&inbuf[20]) = cpu_to_be32(port);
   1080
   1081	err = mlx4_cmd_box(dev, inmailbox->dma, outmailbox->dma, port, 3,
   1082			   MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C,
   1083			   MLX4_CMD_NATIVE);
   1084	if (!err)
   1085		*caps = *(__be32 *) (outbuf + 84);
   1086	mlx4_free_cmd_mailbox(dev, inmailbox);
   1087	mlx4_free_cmd_mailbox(dev, outmailbox);
   1088	return err;
   1089}
   1090static struct mlx4_roce_gid_entry zgid_entry;
   1091
   1092int mlx4_get_slave_num_gids(struct mlx4_dev *dev, int slave, int port)
   1093{
   1094	int vfs;
   1095	int slave_gid = slave;
   1096	unsigned i;
   1097	struct mlx4_slaves_pport slaves_pport;
   1098	struct mlx4_active_ports actv_ports;
   1099	unsigned max_port_p_one;
   1100
   1101	if (slave == 0)
   1102		return MLX4_ROCE_PF_GIDS;
   1103
   1104	/* Slave is a VF */
   1105	slaves_pport = mlx4_phys_to_slaves_pport(dev, port);
   1106	actv_ports = mlx4_get_active_ports(dev, slave);
   1107	max_port_p_one = find_first_bit(actv_ports.ports, dev->caps.num_ports) +
   1108		bitmap_weight(actv_ports.ports, dev->caps.num_ports) + 1;
   1109
   1110	for (i = 1; i < max_port_p_one; i++) {
   1111		struct mlx4_active_ports exclusive_ports;
   1112		struct mlx4_slaves_pport slaves_pport_actv;
   1113		bitmap_zero(exclusive_ports.ports, dev->caps.num_ports);
   1114		set_bit(i - 1, exclusive_ports.ports);
   1115		if (i == port)
   1116			continue;
   1117		slaves_pport_actv = mlx4_phys_to_slaves_pport_actv(
   1118				    dev, &exclusive_ports);
   1119		slave_gid -= bitmap_weight(slaves_pport_actv.slaves,
   1120					   dev->persist->num_vfs + 1);
   1121	}
   1122	vfs = bitmap_weight(slaves_pport.slaves, dev->persist->num_vfs + 1) - 1;
   1123	if (slave_gid <= ((MLX4_ROCE_MAX_GIDS - MLX4_ROCE_PF_GIDS) % vfs))
   1124		return ((MLX4_ROCE_MAX_GIDS - MLX4_ROCE_PF_GIDS) / vfs) + 1;
   1125	return (MLX4_ROCE_MAX_GIDS - MLX4_ROCE_PF_GIDS) / vfs;
   1126}
   1127
   1128int mlx4_get_base_gid_ix(struct mlx4_dev *dev, int slave, int port)
   1129{
   1130	int gids;
   1131	unsigned i;
   1132	int slave_gid = slave;
   1133	int vfs;
   1134
   1135	struct mlx4_slaves_pport slaves_pport;
   1136	struct mlx4_active_ports actv_ports;
   1137	unsigned max_port_p_one;
   1138
   1139	if (slave == 0)
   1140		return 0;
   1141
   1142	slaves_pport = mlx4_phys_to_slaves_pport(dev, port);
   1143	actv_ports = mlx4_get_active_ports(dev, slave);
   1144	max_port_p_one = find_first_bit(actv_ports.ports, dev->caps.num_ports) +
   1145		bitmap_weight(actv_ports.ports, dev->caps.num_ports) + 1;
   1146
   1147	for (i = 1; i < max_port_p_one; i++) {
   1148		struct mlx4_active_ports exclusive_ports;
   1149		struct mlx4_slaves_pport slaves_pport_actv;
   1150		bitmap_zero(exclusive_ports.ports, dev->caps.num_ports);
   1151		set_bit(i - 1, exclusive_ports.ports);
   1152		if (i == port)
   1153			continue;
   1154		slaves_pport_actv = mlx4_phys_to_slaves_pport_actv(
   1155				    dev, &exclusive_ports);
   1156		slave_gid -= bitmap_weight(slaves_pport_actv.slaves,
   1157					   dev->persist->num_vfs + 1);
   1158	}
   1159	gids = MLX4_ROCE_MAX_GIDS - MLX4_ROCE_PF_GIDS;
   1160	vfs = bitmap_weight(slaves_pport.slaves, dev->persist->num_vfs + 1) - 1;
   1161	if (slave_gid <= gids % vfs)
   1162		return MLX4_ROCE_PF_GIDS + ((gids / vfs) + 1) * (slave_gid - 1);
   1163
   1164	return MLX4_ROCE_PF_GIDS + (gids % vfs) +
   1165		((gids / vfs) * (slave_gid - 1));
   1166}
   1167EXPORT_SYMBOL_GPL(mlx4_get_base_gid_ix);
   1168
   1169static int mlx4_reset_roce_port_gids(struct mlx4_dev *dev, int slave,
   1170				     int port, struct mlx4_cmd_mailbox *mailbox)
   1171{
   1172	struct mlx4_roce_gid_entry *gid_entry_mbox;
   1173	struct mlx4_priv *priv = mlx4_priv(dev);
   1174	int num_gids, base, offset;
   1175	int i, err;
   1176
   1177	num_gids = mlx4_get_slave_num_gids(dev, slave, port);
   1178	base = mlx4_get_base_gid_ix(dev, slave, port);
   1179
   1180	memset(mailbox->buf, 0, MLX4_MAILBOX_SIZE);
   1181
   1182	mutex_lock(&(priv->port[port].gid_table.mutex));
   1183	/* Zero-out gids belonging to that slave in the port GID table */
   1184	for (i = 0, offset = base; i < num_gids; offset++, i++)
   1185		memcpy(priv->port[port].gid_table.roce_gids[offset].raw,
   1186		       zgid_entry.raw, MLX4_ROCE_GID_ENTRY_SIZE);
   1187
   1188	/* Now, copy roce port gids table to mailbox for passing to FW */
   1189	gid_entry_mbox = (struct mlx4_roce_gid_entry *)mailbox->buf;
   1190	for (i = 0; i < MLX4_ROCE_MAX_GIDS; gid_entry_mbox++, i++)
   1191		memcpy(gid_entry_mbox->raw,
   1192		       priv->port[port].gid_table.roce_gids[i].raw,
   1193		       MLX4_ROCE_GID_ENTRY_SIZE);
   1194
   1195	err = mlx4_cmd(dev, mailbox->dma,
   1196		       ((u32)port) | (MLX4_SET_PORT_GID_TABLE << 8),
   1197		       MLX4_SET_PORT_ETH_OPCODE, MLX4_CMD_SET_PORT,
   1198		       MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE);
   1199	mutex_unlock(&(priv->port[port].gid_table.mutex));
   1200	return err;
   1201}
   1202
   1203
   1204void mlx4_reset_roce_gids(struct mlx4_dev *dev, int slave)
   1205{
   1206	struct mlx4_active_ports actv_ports;
   1207	struct mlx4_cmd_mailbox *mailbox;
   1208	int num_eth_ports, err;
   1209	int i;
   1210
   1211	if (slave < 0 || slave > dev->persist->num_vfs)
   1212		return;
   1213
   1214	actv_ports = mlx4_get_active_ports(dev, slave);
   1215
   1216	for (i = 0, num_eth_ports = 0; i < dev->caps.num_ports; i++) {
   1217		if (test_bit(i, actv_ports.ports)) {
   1218			if (dev->caps.port_type[i + 1] != MLX4_PORT_TYPE_ETH)
   1219				continue;
   1220			num_eth_ports++;
   1221		}
   1222	}
   1223
   1224	if (!num_eth_ports)
   1225		return;
   1226
   1227	/* have ETH ports.  Alloc mailbox for SET_PORT command */
   1228	mailbox = mlx4_alloc_cmd_mailbox(dev);
   1229	if (IS_ERR(mailbox))
   1230		return;
   1231
   1232	for (i = 0; i < dev->caps.num_ports; i++) {
   1233		if (test_bit(i, actv_ports.ports)) {
   1234			if (dev->caps.port_type[i + 1] != MLX4_PORT_TYPE_ETH)
   1235				continue;
   1236			err = mlx4_reset_roce_port_gids(dev, slave, i + 1, mailbox);
   1237			if (err)
   1238				mlx4_warn(dev, "Could not reset ETH port GID table for slave %d, port %d (%d)\n",
   1239					  slave, i + 1, err);
   1240		}
   1241	}
   1242
   1243	mlx4_free_cmd_mailbox(dev, mailbox);
   1244	return;
   1245}
   1246
   1247static void
   1248mlx4_en_set_port_mtu(struct mlx4_dev *dev, int slave, int port,
   1249		     struct mlx4_set_port_general_context *gen_context)
   1250{
   1251	struct mlx4_priv *priv = mlx4_priv(dev);
   1252	struct mlx4_mfunc_master_ctx *master = &priv->mfunc.master;
   1253	struct mlx4_slave_state *slave_st = &master->slave_state[slave];
   1254	u16 mtu, prev_mtu;
   1255
   1256	/* Mtu is configured as the max USER_MTU among all
   1257	 * the functions on the port.
   1258	 */
   1259	mtu = be16_to_cpu(gen_context->mtu);
   1260	mtu = min_t(int, mtu, dev->caps.eth_mtu_cap[port] +
   1261		    ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN);
   1262	prev_mtu = slave_st->mtu[port];
   1263	slave_st->mtu[port] = mtu;
   1264	if (mtu > master->max_mtu[port])
   1265		master->max_mtu[port] = mtu;
   1266	if (mtu < prev_mtu && prev_mtu == master->max_mtu[port]) {
   1267		int i;
   1268
   1269		slave_st->mtu[port] = mtu;
   1270		master->max_mtu[port] = mtu;
   1271		for (i = 0; i < dev->num_slaves; i++)
   1272			master->max_mtu[port] =
   1273				max_t(u16, master->max_mtu[port],
   1274				      master->slave_state[i].mtu[port]);
   1275	}
   1276	gen_context->mtu = cpu_to_be16(master->max_mtu[port]);
   1277}
   1278
   1279static void
   1280mlx4_en_set_port_user_mtu(struct mlx4_dev *dev, int slave, int port,
   1281			  struct mlx4_set_port_general_context *gen_context)
   1282{
   1283	struct mlx4_priv *priv = mlx4_priv(dev);
   1284	struct mlx4_mfunc_master_ctx *master = &priv->mfunc.master;
   1285	struct mlx4_slave_state *slave_st = &master->slave_state[slave];
   1286	u16 user_mtu, prev_user_mtu;
   1287
   1288	/* User Mtu is configured as the max USER_MTU among all
   1289	 * the functions on the port.
   1290	 */
   1291	user_mtu = be16_to_cpu(gen_context->user_mtu);
   1292	user_mtu = min_t(int, user_mtu, dev->caps.eth_mtu_cap[port]);
   1293	prev_user_mtu = slave_st->user_mtu[port];
   1294	slave_st->user_mtu[port] = user_mtu;
   1295	if (user_mtu > master->max_user_mtu[port])
   1296		master->max_user_mtu[port] = user_mtu;
   1297	if (user_mtu < prev_user_mtu &&
   1298	    prev_user_mtu == master->max_user_mtu[port]) {
   1299		int i;
   1300
   1301		slave_st->user_mtu[port] = user_mtu;
   1302		master->max_user_mtu[port] = user_mtu;
   1303		for (i = 0; i < dev->num_slaves; i++)
   1304			master->max_user_mtu[port] =
   1305				max_t(u16, master->max_user_mtu[port],
   1306				      master->slave_state[i].user_mtu[port]);
   1307	}
   1308	gen_context->user_mtu = cpu_to_be16(master->max_user_mtu[port]);
   1309}
   1310
   1311static void
   1312mlx4_en_set_port_global_pause(struct mlx4_dev *dev, int slave,
   1313			      struct mlx4_set_port_general_context *gen_context)
   1314{
   1315	struct mlx4_priv *priv = mlx4_priv(dev);
   1316	struct mlx4_mfunc_master_ctx *master = &priv->mfunc.master;
   1317
   1318	/* Slave cannot change Global Pause configuration */
   1319	if (slave != mlx4_master_func_num(dev) &&
   1320	    (gen_context->pptx != master->pptx ||
   1321	     gen_context->pprx != master->pprx)) {
   1322		gen_context->pptx = master->pptx;
   1323		gen_context->pprx = master->pprx;
   1324		mlx4_warn(dev, "denying Global Pause change for slave:%d\n",
   1325			  slave);
   1326	} else {
   1327		master->pptx = gen_context->pptx;
   1328		master->pprx = gen_context->pprx;
   1329	}
   1330}
   1331
   1332static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod,
   1333				u8 op_mod, struct mlx4_cmd_mailbox *inbox)
   1334{
   1335	struct mlx4_priv *priv = mlx4_priv(dev);
   1336	struct mlx4_port_info *port_info;
   1337	struct mlx4_set_port_rqp_calc_context *qpn_context;
   1338	struct mlx4_set_port_general_context *gen_context;
   1339	struct mlx4_roce_gid_entry *gid_entry_tbl, *gid_entry_mbox, *gid_entry_mb1;
   1340	int reset_qkey_viols;
   1341	int port;
   1342	int is_eth;
   1343	int num_gids;
   1344	int base;
   1345	u32 in_modifier;
   1346	u32 promisc;
   1347	int err;
   1348	int i, j;
   1349	int offset;
   1350	__be32 agg_cap_mask;
   1351	__be32 slave_cap_mask;
   1352	__be32 new_cap_mask;
   1353
   1354	port = in_mod & 0xff;
   1355	in_modifier = in_mod >> 8;
   1356	is_eth = op_mod;
   1357	port_info = &priv->port[port];
   1358
   1359	/* Slaves cannot perform SET_PORT operations,
   1360	 * except for changing MTU and USER_MTU.
   1361	 */
   1362	if (is_eth) {
   1363		if (slave != dev->caps.function &&
   1364		    in_modifier != MLX4_SET_PORT_GENERAL &&
   1365		    in_modifier != MLX4_SET_PORT_GID_TABLE) {
   1366			mlx4_warn(dev, "denying SET_PORT for slave:%d\n",
   1367					slave);
   1368			return -EINVAL;
   1369		}
   1370		switch (in_modifier) {
   1371		case MLX4_SET_PORT_RQP_CALC:
   1372			qpn_context = inbox->buf;
   1373			qpn_context->base_qpn =
   1374				cpu_to_be32(port_info->base_qpn);
   1375			qpn_context->n_mac = 0x7;
   1376			promisc = be32_to_cpu(qpn_context->promisc) >>
   1377				SET_PORT_PROMISC_SHIFT;
   1378			qpn_context->promisc = cpu_to_be32(
   1379				promisc << SET_PORT_PROMISC_SHIFT |
   1380				port_info->base_qpn);
   1381			promisc = be32_to_cpu(qpn_context->mcast) >>
   1382				SET_PORT_MC_PROMISC_SHIFT;
   1383			qpn_context->mcast = cpu_to_be32(
   1384				promisc << SET_PORT_MC_PROMISC_SHIFT |
   1385				port_info->base_qpn);
   1386			break;
   1387		case MLX4_SET_PORT_GENERAL:
   1388			gen_context = inbox->buf;
   1389
   1390			if (gen_context->flags & MLX4_FLAG_V_MTU_MASK)
   1391				mlx4_en_set_port_mtu(dev, slave, port,
   1392						     gen_context);
   1393
   1394			if (gen_context->flags2 & MLX4_FLAG2_V_USER_MTU_MASK)
   1395				mlx4_en_set_port_user_mtu(dev, slave, port,
   1396							  gen_context);
   1397
   1398			if (gen_context->flags &
   1399			    (MLX4_FLAG_V_PPRX_MASK | MLX4_FLAG_V_PPTX_MASK))
   1400				mlx4_en_set_port_global_pause(dev, slave,
   1401							      gen_context);
   1402
   1403			break;
   1404		case MLX4_SET_PORT_GID_TABLE:
   1405			/* change to MULTIPLE entries: number of guest's gids
   1406			 * need a FOR-loop here over number of gids the guest has.
   1407			 * 1. Check no duplicates in gids passed by slave
   1408			 */
   1409			num_gids = mlx4_get_slave_num_gids(dev, slave, port);
   1410			base = mlx4_get_base_gid_ix(dev, slave, port);
   1411			gid_entry_mbox = (struct mlx4_roce_gid_entry *)(inbox->buf);
   1412			for (i = 0; i < num_gids; gid_entry_mbox++, i++) {
   1413				if (!memcmp(gid_entry_mbox->raw, zgid_entry.raw,
   1414					    sizeof(zgid_entry)))
   1415					continue;
   1416				gid_entry_mb1 = gid_entry_mbox + 1;
   1417				for (j = i + 1; j < num_gids; gid_entry_mb1++, j++) {
   1418					if (!memcmp(gid_entry_mb1->raw,
   1419						    zgid_entry.raw, sizeof(zgid_entry)))
   1420						continue;
   1421					if (!memcmp(gid_entry_mb1->raw, gid_entry_mbox->raw,
   1422						    sizeof(gid_entry_mbox->raw))) {
   1423						/* found duplicate */
   1424						return -EINVAL;
   1425					}
   1426				}
   1427			}
   1428
   1429			/* 2. Check that do not have duplicates in OTHER
   1430			 *    entries in the port GID table
   1431			 */
   1432
   1433			mutex_lock(&(priv->port[port].gid_table.mutex));
   1434			for (i = 0; i < MLX4_ROCE_MAX_GIDS; i++) {
   1435				if (i >= base && i < base + num_gids)
   1436					continue; /* don't compare to slave's current gids */
   1437				gid_entry_tbl = &priv->port[port].gid_table.roce_gids[i];
   1438				if (!memcmp(gid_entry_tbl->raw, zgid_entry.raw, sizeof(zgid_entry)))
   1439					continue;
   1440				gid_entry_mbox = (struct mlx4_roce_gid_entry *)(inbox->buf);
   1441				for (j = 0; j < num_gids; gid_entry_mbox++, j++) {
   1442					if (!memcmp(gid_entry_mbox->raw, zgid_entry.raw,
   1443						    sizeof(zgid_entry)))
   1444						continue;
   1445					if (!memcmp(gid_entry_mbox->raw, gid_entry_tbl->raw,
   1446						    sizeof(gid_entry_tbl->raw))) {
   1447						/* found duplicate */
   1448						mlx4_warn(dev, "requested gid entry for slave:%d is a duplicate of gid at index %d\n",
   1449							  slave, i);
   1450						mutex_unlock(&(priv->port[port].gid_table.mutex));
   1451						return -EINVAL;
   1452					}
   1453				}
   1454			}
   1455
   1456			/* insert slave GIDs with memcpy, starting at slave's base index */
   1457			gid_entry_mbox = (struct mlx4_roce_gid_entry *)(inbox->buf);
   1458			for (i = 0, offset = base; i < num_gids; gid_entry_mbox++, offset++, i++)
   1459				memcpy(priv->port[port].gid_table.roce_gids[offset].raw,
   1460				       gid_entry_mbox->raw, MLX4_ROCE_GID_ENTRY_SIZE);
   1461
   1462			/* Now, copy roce port gids table to current mailbox for passing to FW */
   1463			gid_entry_mbox = (struct mlx4_roce_gid_entry *)(inbox->buf);
   1464			for (i = 0; i < MLX4_ROCE_MAX_GIDS; gid_entry_mbox++, i++)
   1465				memcpy(gid_entry_mbox->raw,
   1466				       priv->port[port].gid_table.roce_gids[i].raw,
   1467				       MLX4_ROCE_GID_ENTRY_SIZE);
   1468
   1469			err = mlx4_cmd(dev, inbox->dma, in_mod & 0xffff, op_mod,
   1470				       MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
   1471				       MLX4_CMD_NATIVE);
   1472			mutex_unlock(&(priv->port[port].gid_table.mutex));
   1473			return err;
   1474		}
   1475
   1476		return mlx4_cmd(dev, inbox->dma, in_mod & 0xffff, op_mod,
   1477				MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
   1478				MLX4_CMD_NATIVE);
   1479	}
   1480
   1481	/* Slaves are not allowed to SET_PORT beacon (LED) blink */
   1482	if (op_mod == MLX4_SET_PORT_BEACON_OPCODE) {
   1483		mlx4_warn(dev, "denying SET_PORT Beacon slave:%d\n", slave);
   1484		return -EPERM;
   1485	}
   1486
   1487	/* For IB, we only consider:
   1488	 * - The capability mask, which is set to the aggregate of all
   1489	 *   slave function capabilities
   1490	 * - The QKey violatin counter - reset according to each request.
   1491	 */
   1492
   1493	if (dev->flags & MLX4_FLAG_OLD_PORT_CMDS) {
   1494		reset_qkey_viols = (*(u8 *) inbox->buf) & 0x40;
   1495		new_cap_mask = ((__be32 *) inbox->buf)[2];
   1496	} else {
   1497		reset_qkey_viols = ((u8 *) inbox->buf)[3] & 0x1;
   1498		new_cap_mask = ((__be32 *) inbox->buf)[1];
   1499	}
   1500
   1501	/* slave may not set the IS_SM capability for the port */
   1502	if (slave != mlx4_master_func_num(dev) &&
   1503	    (be32_to_cpu(new_cap_mask) & MLX4_PORT_CAP_IS_SM))
   1504		return -EINVAL;
   1505
   1506	/* No DEV_MGMT in multifunc mode */
   1507	if (mlx4_is_mfunc(dev) &&
   1508	    (be32_to_cpu(new_cap_mask) & MLX4_PORT_CAP_DEV_MGMT_SUP))
   1509		return -EINVAL;
   1510
   1511	agg_cap_mask = 0;
   1512	slave_cap_mask =
   1513		priv->mfunc.master.slave_state[slave].ib_cap_mask[port];
   1514	priv->mfunc.master.slave_state[slave].ib_cap_mask[port] = new_cap_mask;
   1515	for (i = 0; i < dev->num_slaves; i++)
   1516		agg_cap_mask |=
   1517			priv->mfunc.master.slave_state[i].ib_cap_mask[port];
   1518
   1519	/* only clear mailbox for guests.  Master may be setting
   1520	* MTU or PKEY table size
   1521	*/
   1522	if (slave != dev->caps.function)
   1523		memset(inbox->buf, 0, 256);
   1524	if (dev->flags & MLX4_FLAG_OLD_PORT_CMDS) {
   1525		*(u8 *) inbox->buf	   |= !!reset_qkey_viols << 6;
   1526		((__be32 *) inbox->buf)[2] = agg_cap_mask;
   1527	} else {
   1528		((u8 *) inbox->buf)[3]     |= !!reset_qkey_viols;
   1529		((__be32 *) inbox->buf)[1] = agg_cap_mask;
   1530	}
   1531
   1532	err = mlx4_cmd(dev, inbox->dma, port, is_eth, MLX4_CMD_SET_PORT,
   1533		       MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE);
   1534	if (err)
   1535		priv->mfunc.master.slave_state[slave].ib_cap_mask[port] =
   1536			slave_cap_mask;
   1537	return err;
   1538}
   1539
   1540int mlx4_SET_PORT_wrapper(struct mlx4_dev *dev, int slave,
   1541			  struct mlx4_vhcr *vhcr,
   1542			  struct mlx4_cmd_mailbox *inbox,
   1543			  struct mlx4_cmd_mailbox *outbox,
   1544			  struct mlx4_cmd_info *cmd)
   1545{
   1546	int port = mlx4_slave_convert_port(
   1547			dev, slave, vhcr->in_modifier & 0xFF);
   1548
   1549	if (port < 0)
   1550		return -EINVAL;
   1551
   1552	vhcr->in_modifier = (vhcr->in_modifier & ~0xFF) |
   1553			    (port & 0xFF);
   1554
   1555	return mlx4_common_set_port(dev, slave, vhcr->in_modifier,
   1556				    vhcr->op_modifier, inbox);
   1557}
   1558
   1559/* bit locations for set port command with zero op modifier */
   1560enum {
   1561	MLX4_SET_PORT_VL_CAP	 = 4, /* bits 7:4 */
   1562	MLX4_SET_PORT_MTU_CAP	 = 12, /* bits 15:12 */
   1563	MLX4_CHANGE_PORT_PKEY_TBL_SZ = 20,
   1564	MLX4_CHANGE_PORT_VL_CAP	 = 21,
   1565	MLX4_CHANGE_PORT_MTU_CAP = 22,
   1566};
   1567
   1568int mlx4_SET_PORT(struct mlx4_dev *dev, u8 port, int pkey_tbl_sz)
   1569{
   1570	struct mlx4_cmd_mailbox *mailbox;
   1571	int err, vl_cap, pkey_tbl_flag = 0;
   1572
   1573	if (dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH)
   1574		return 0;
   1575
   1576	mailbox = mlx4_alloc_cmd_mailbox(dev);
   1577	if (IS_ERR(mailbox))
   1578		return PTR_ERR(mailbox);
   1579
   1580	((__be32 *) mailbox->buf)[1] = dev->caps.ib_port_def_cap[port];
   1581
   1582	if (pkey_tbl_sz >= 0 && mlx4_is_master(dev)) {
   1583		pkey_tbl_flag = 1;
   1584		((__be16 *) mailbox->buf)[20] = cpu_to_be16(pkey_tbl_sz);
   1585	}
   1586
   1587	/* IB VL CAP enum isn't used by the firmware, just numerical values */
   1588	for (vl_cap = 8; vl_cap >= 1; vl_cap >>= 1) {
   1589		((__be32 *) mailbox->buf)[0] = cpu_to_be32(
   1590			(1 << MLX4_CHANGE_PORT_MTU_CAP) |
   1591			(1 << MLX4_CHANGE_PORT_VL_CAP)  |
   1592			(pkey_tbl_flag << MLX4_CHANGE_PORT_PKEY_TBL_SZ) |
   1593			(dev->caps.port_ib_mtu[port] << MLX4_SET_PORT_MTU_CAP) |
   1594			(vl_cap << MLX4_SET_PORT_VL_CAP));
   1595		err = mlx4_cmd(dev, mailbox->dma, port,
   1596			       MLX4_SET_PORT_IB_OPCODE, MLX4_CMD_SET_PORT,
   1597			       MLX4_CMD_TIME_CLASS_B, MLX4_CMD_WRAPPED);
   1598		if (err != -ENOMEM)
   1599			break;
   1600	}
   1601
   1602	mlx4_free_cmd_mailbox(dev, mailbox);
   1603	return err;
   1604}
   1605
   1606#define SET_PORT_ROCE_2_FLAGS          0x10
   1607#define MLX4_SET_PORT_ROCE_V1_V2       0x2
   1608int mlx4_SET_PORT_general(struct mlx4_dev *dev, u8 port, int mtu,
   1609			  u8 pptx, u8 pfctx, u8 pprx, u8 pfcrx)
   1610{
   1611	struct mlx4_cmd_mailbox *mailbox;
   1612	struct mlx4_set_port_general_context *context;
   1613	int err;
   1614	u32 in_mod;
   1615
   1616	mailbox = mlx4_alloc_cmd_mailbox(dev);
   1617	if (IS_ERR(mailbox))
   1618		return PTR_ERR(mailbox);
   1619	context = mailbox->buf;
   1620	context->flags = SET_PORT_GEN_ALL_VALID;
   1621	context->mtu = cpu_to_be16(mtu);
   1622	context->pptx = (pptx * (!pfctx)) << 7;
   1623	context->pfctx = pfctx;
   1624	context->pprx = (pprx * (!pfcrx)) << 7;
   1625	context->pfcrx = pfcrx;
   1626
   1627	if (dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_ROCE_V1_V2) {
   1628		context->flags |= SET_PORT_ROCE_2_FLAGS;
   1629		context->roce_mode |=
   1630			MLX4_SET_PORT_ROCE_V1_V2 << 4;
   1631	}
   1632	in_mod = MLX4_SET_PORT_GENERAL << 8 | port;
   1633	err = mlx4_cmd(dev, mailbox->dma, in_mod, MLX4_SET_PORT_ETH_OPCODE,
   1634		       MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
   1635		       MLX4_CMD_WRAPPED);
   1636
   1637	mlx4_free_cmd_mailbox(dev, mailbox);
   1638	return err;
   1639}
   1640EXPORT_SYMBOL(mlx4_SET_PORT_general);
   1641
   1642int mlx4_SET_PORT_qpn_calc(struct mlx4_dev *dev, u8 port, u32 base_qpn,
   1643			   u8 promisc)
   1644{
   1645	struct mlx4_cmd_mailbox *mailbox;
   1646	struct mlx4_set_port_rqp_calc_context *context;
   1647	int err;
   1648	u32 in_mod;
   1649	u32 m_promisc = (dev->caps.flags & MLX4_DEV_CAP_FLAG_VEP_MC_STEER) ?
   1650		MCAST_DIRECT : MCAST_DEFAULT;
   1651
   1652	if (dev->caps.steering_mode != MLX4_STEERING_MODE_A0)
   1653		return 0;
   1654
   1655	mailbox = mlx4_alloc_cmd_mailbox(dev);
   1656	if (IS_ERR(mailbox))
   1657		return PTR_ERR(mailbox);
   1658	context = mailbox->buf;
   1659	context->base_qpn = cpu_to_be32(base_qpn);
   1660	context->n_mac = dev->caps.log_num_macs;
   1661	context->promisc = cpu_to_be32(promisc << SET_PORT_PROMISC_SHIFT |
   1662				       base_qpn);
   1663	context->mcast = cpu_to_be32(m_promisc << SET_PORT_MC_PROMISC_SHIFT |
   1664				     base_qpn);
   1665	context->intra_no_vlan = 0;
   1666	context->no_vlan = MLX4_NO_VLAN_IDX;
   1667	context->intra_vlan_miss = 0;
   1668	context->vlan_miss = MLX4_VLAN_MISS_IDX;
   1669
   1670	in_mod = MLX4_SET_PORT_RQP_CALC << 8 | port;
   1671	err = mlx4_cmd(dev, mailbox->dma, in_mod, MLX4_SET_PORT_ETH_OPCODE,
   1672		       MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
   1673		       MLX4_CMD_WRAPPED);
   1674
   1675	mlx4_free_cmd_mailbox(dev, mailbox);
   1676	return err;
   1677}
   1678EXPORT_SYMBOL(mlx4_SET_PORT_qpn_calc);
   1679
   1680int mlx4_SET_PORT_user_mtu(struct mlx4_dev *dev, u8 port, u16 user_mtu)
   1681{
   1682	struct mlx4_cmd_mailbox *mailbox;
   1683	struct mlx4_set_port_general_context *context;
   1684	u32 in_mod;
   1685	int err;
   1686
   1687	mailbox = mlx4_alloc_cmd_mailbox(dev);
   1688	if (IS_ERR(mailbox))
   1689		return PTR_ERR(mailbox);
   1690	context = mailbox->buf;
   1691	context->flags2 |= MLX4_FLAG2_V_USER_MTU_MASK;
   1692	context->user_mtu = cpu_to_be16(user_mtu);
   1693
   1694	in_mod = MLX4_SET_PORT_GENERAL << 8 | port;
   1695	err = mlx4_cmd(dev, mailbox->dma, in_mod, MLX4_SET_PORT_ETH_OPCODE,
   1696		       MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
   1697		       MLX4_CMD_WRAPPED);
   1698
   1699	mlx4_free_cmd_mailbox(dev, mailbox);
   1700	return err;
   1701}
   1702EXPORT_SYMBOL(mlx4_SET_PORT_user_mtu);
   1703
   1704int mlx4_SET_PORT_user_mac(struct mlx4_dev *dev, u8 port, u8 *user_mac)
   1705{
   1706	struct mlx4_cmd_mailbox *mailbox;
   1707	struct mlx4_set_port_general_context *context;
   1708	u32 in_mod;
   1709	int err;
   1710
   1711	mailbox = mlx4_alloc_cmd_mailbox(dev);
   1712	if (IS_ERR(mailbox))
   1713		return PTR_ERR(mailbox);
   1714	context = mailbox->buf;
   1715	context->flags2 |= MLX4_FLAG2_V_USER_MAC_MASK;
   1716	memcpy(context->user_mac, user_mac, sizeof(context->user_mac));
   1717
   1718	in_mod = MLX4_SET_PORT_GENERAL << 8 | port;
   1719	err = mlx4_cmd(dev, mailbox->dma, in_mod, MLX4_SET_PORT_ETH_OPCODE,
   1720		       MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
   1721		       MLX4_CMD_NATIVE);
   1722
   1723	mlx4_free_cmd_mailbox(dev, mailbox);
   1724	return err;
   1725}
   1726EXPORT_SYMBOL(mlx4_SET_PORT_user_mac);
   1727
   1728int mlx4_SET_PORT_fcs_check(struct mlx4_dev *dev, u8 port, u8 ignore_fcs_value)
   1729{
   1730	struct mlx4_cmd_mailbox *mailbox;
   1731	struct mlx4_set_port_general_context *context;
   1732	u32 in_mod;
   1733	int err;
   1734
   1735	mailbox = mlx4_alloc_cmd_mailbox(dev);
   1736	if (IS_ERR(mailbox))
   1737		return PTR_ERR(mailbox);
   1738	context = mailbox->buf;
   1739	context->flags2 |= MLX4_FLAG2_V_IGNORE_FCS_MASK;
   1740	if (ignore_fcs_value)
   1741		context->ignore_fcs |= MLX4_IGNORE_FCS_MASK;
   1742	else
   1743		context->ignore_fcs &= ~MLX4_IGNORE_FCS_MASK;
   1744
   1745	in_mod = MLX4_SET_PORT_GENERAL << 8 | port;
   1746	err = mlx4_cmd(dev, mailbox->dma, in_mod, 1, MLX4_CMD_SET_PORT,
   1747		       MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE);
   1748
   1749	mlx4_free_cmd_mailbox(dev, mailbox);
   1750	return err;
   1751}
   1752EXPORT_SYMBOL(mlx4_SET_PORT_fcs_check);
   1753
   1754enum {
   1755	VXLAN_ENABLE_MODIFY	= 1 << 7,
   1756	VXLAN_STEERING_MODIFY	= 1 << 6,
   1757
   1758	VXLAN_ENABLE		= 1 << 7,
   1759};
   1760
   1761struct mlx4_set_port_vxlan_context {
   1762	u32	reserved1;
   1763	u8	modify_flags;
   1764	u8	reserved2;
   1765	u8	enable_flags;
   1766	u8	steering;
   1767};
   1768
   1769int mlx4_SET_PORT_VXLAN(struct mlx4_dev *dev, u8 port, u8 steering, int enable)
   1770{
   1771	int err;
   1772	u32 in_mod;
   1773	struct mlx4_cmd_mailbox *mailbox;
   1774	struct mlx4_set_port_vxlan_context  *context;
   1775
   1776	mailbox = mlx4_alloc_cmd_mailbox(dev);
   1777	if (IS_ERR(mailbox))
   1778		return PTR_ERR(mailbox);
   1779	context = mailbox->buf;
   1780	memset(context, 0, sizeof(*context));
   1781
   1782	context->modify_flags = VXLAN_ENABLE_MODIFY | VXLAN_STEERING_MODIFY;
   1783	if (enable)
   1784		context->enable_flags = VXLAN_ENABLE;
   1785	context->steering  = steering;
   1786
   1787	in_mod = MLX4_SET_PORT_VXLAN << 8 | port;
   1788	err = mlx4_cmd(dev, mailbox->dma, in_mod, MLX4_SET_PORT_ETH_OPCODE,
   1789		       MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
   1790		       MLX4_CMD_NATIVE);
   1791
   1792	mlx4_free_cmd_mailbox(dev, mailbox);
   1793	return err;
   1794}
   1795EXPORT_SYMBOL(mlx4_SET_PORT_VXLAN);
   1796
   1797int mlx4_SET_PORT_BEACON(struct mlx4_dev *dev, u8 port, u16 time)
   1798{
   1799	int err;
   1800	struct mlx4_cmd_mailbox *mailbox;
   1801
   1802	mailbox = mlx4_alloc_cmd_mailbox(dev);
   1803	if (IS_ERR(mailbox))
   1804		return PTR_ERR(mailbox);
   1805
   1806	*((__be32 *)mailbox->buf) = cpu_to_be32(time);
   1807
   1808	err = mlx4_cmd(dev, mailbox->dma, port, MLX4_SET_PORT_BEACON_OPCODE,
   1809		       MLX4_CMD_SET_PORT, MLX4_CMD_TIME_CLASS_B,
   1810		       MLX4_CMD_NATIVE);
   1811
   1812	mlx4_free_cmd_mailbox(dev, mailbox);
   1813	return err;
   1814}
   1815EXPORT_SYMBOL(mlx4_SET_PORT_BEACON);
   1816
   1817int mlx4_SET_MCAST_FLTR_wrapper(struct mlx4_dev *dev, int slave,
   1818				struct mlx4_vhcr *vhcr,
   1819				struct mlx4_cmd_mailbox *inbox,
   1820				struct mlx4_cmd_mailbox *outbox,
   1821				struct mlx4_cmd_info *cmd)
   1822{
   1823	int err = 0;
   1824
   1825	return err;
   1826}
   1827
   1828int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port,
   1829			u64 mac, u64 clear, u8 mode)
   1830{
   1831	return mlx4_cmd(dev, (mac | (clear << 63)), port, mode,
   1832			MLX4_CMD_SET_MCAST_FLTR, MLX4_CMD_TIME_CLASS_B,
   1833			MLX4_CMD_WRAPPED);
   1834}
   1835EXPORT_SYMBOL(mlx4_SET_MCAST_FLTR);
   1836
   1837int mlx4_SET_VLAN_FLTR_wrapper(struct mlx4_dev *dev, int slave,
   1838			       struct mlx4_vhcr *vhcr,
   1839			       struct mlx4_cmd_mailbox *inbox,
   1840			       struct mlx4_cmd_mailbox *outbox,
   1841			       struct mlx4_cmd_info *cmd)
   1842{
   1843	int err = 0;
   1844
   1845	return err;
   1846}
   1847
   1848int mlx4_DUMP_ETH_STATS_wrapper(struct mlx4_dev *dev, int slave,
   1849				struct mlx4_vhcr *vhcr,
   1850				struct mlx4_cmd_mailbox *inbox,
   1851				struct mlx4_cmd_mailbox *outbox,
   1852				struct mlx4_cmd_info *cmd)
   1853{
   1854	return 0;
   1855}
   1856
   1857int mlx4_get_slave_from_roce_gid(struct mlx4_dev *dev, int port, u8 *gid,
   1858				 int *slave_id)
   1859{
   1860	struct mlx4_priv *priv = mlx4_priv(dev);
   1861	int i, found_ix = -1;
   1862	int vf_gids = MLX4_ROCE_MAX_GIDS - MLX4_ROCE_PF_GIDS;
   1863	struct mlx4_slaves_pport slaves_pport;
   1864	unsigned num_vfs;
   1865	int slave_gid;
   1866
   1867	if (!mlx4_is_mfunc(dev))
   1868		return -EINVAL;
   1869
   1870	slaves_pport = mlx4_phys_to_slaves_pport(dev, port);
   1871	num_vfs = bitmap_weight(slaves_pport.slaves,
   1872				dev->persist->num_vfs + 1) - 1;
   1873
   1874	for (i = 0; i < MLX4_ROCE_MAX_GIDS; i++) {
   1875		if (!memcmp(priv->port[port].gid_table.roce_gids[i].raw, gid,
   1876			    MLX4_ROCE_GID_ENTRY_SIZE)) {
   1877			found_ix = i;
   1878			break;
   1879		}
   1880	}
   1881
   1882	if (found_ix >= 0) {
   1883		/* Calculate a slave_gid which is the slave number in the gid
   1884		 * table and not a globally unique slave number.
   1885		 */
   1886		if (found_ix < MLX4_ROCE_PF_GIDS)
   1887			slave_gid = 0;
   1888		else if (found_ix < MLX4_ROCE_PF_GIDS + (vf_gids % num_vfs) *
   1889			 (vf_gids / num_vfs + 1))
   1890			slave_gid = ((found_ix - MLX4_ROCE_PF_GIDS) /
   1891				     (vf_gids / num_vfs + 1)) + 1;
   1892		else
   1893			slave_gid =
   1894			((found_ix - MLX4_ROCE_PF_GIDS -
   1895			  ((vf_gids % num_vfs) * ((vf_gids / num_vfs + 1)))) /
   1896			 (vf_gids / num_vfs)) + vf_gids % num_vfs + 1;
   1897
   1898		/* Calculate the globally unique slave id */
   1899		if (slave_gid) {
   1900			struct mlx4_active_ports exclusive_ports;
   1901			struct mlx4_active_ports actv_ports;
   1902			struct mlx4_slaves_pport slaves_pport_actv;
   1903			unsigned max_port_p_one;
   1904			int num_vfs_before = 0;
   1905			int candidate_slave_gid;
   1906
   1907			/* Calculate how many VFs are on the previous port, if exists */
   1908			for (i = 1; i < port; i++) {
   1909				bitmap_zero(exclusive_ports.ports, dev->caps.num_ports);
   1910				set_bit(i - 1, exclusive_ports.ports);
   1911				slaves_pport_actv =
   1912					mlx4_phys_to_slaves_pport_actv(
   1913							dev, &exclusive_ports);
   1914				num_vfs_before += bitmap_weight(
   1915						slaves_pport_actv.slaves,
   1916						dev->persist->num_vfs + 1);
   1917			}
   1918
   1919			/* candidate_slave_gid isn't necessarily the correct slave, but
   1920			 * it has the same number of ports and is assigned to the same
   1921			 * ports as the real slave we're looking for. On dual port VF,
   1922			 * slave_gid = [single port VFs on port <port>] +
   1923			 * [offset of the current slave from the first dual port VF] +
   1924			 * 1 (for the PF).
   1925			 */
   1926			candidate_slave_gid = slave_gid + num_vfs_before;
   1927
   1928			actv_ports = mlx4_get_active_ports(dev, candidate_slave_gid);
   1929			max_port_p_one = find_first_bit(
   1930				actv_ports.ports, dev->caps.num_ports) +
   1931				bitmap_weight(actv_ports.ports,
   1932					      dev->caps.num_ports) + 1;
   1933
   1934			/* Calculate the real slave number */
   1935			for (i = 1; i < max_port_p_one; i++) {
   1936				if (i == port)
   1937					continue;
   1938				bitmap_zero(exclusive_ports.ports,
   1939					    dev->caps.num_ports);
   1940				set_bit(i - 1, exclusive_ports.ports);
   1941				slaves_pport_actv =
   1942					mlx4_phys_to_slaves_pport_actv(
   1943						dev, &exclusive_ports);
   1944				slave_gid += bitmap_weight(
   1945						slaves_pport_actv.slaves,
   1946						dev->persist->num_vfs + 1);
   1947			}
   1948		}
   1949		*slave_id = slave_gid;
   1950	}
   1951
   1952	return (found_ix >= 0) ? 0 : -EINVAL;
   1953}
   1954EXPORT_SYMBOL(mlx4_get_slave_from_roce_gid);
   1955
   1956int mlx4_get_roce_gid_from_slave(struct mlx4_dev *dev, int port, int slave_id,
   1957				 u8 *gid)
   1958{
   1959	struct mlx4_priv *priv = mlx4_priv(dev);
   1960
   1961	if (!mlx4_is_master(dev))
   1962		return -EINVAL;
   1963
   1964	memcpy(gid, priv->port[port].gid_table.roce_gids[slave_id].raw,
   1965	       MLX4_ROCE_GID_ENTRY_SIZE);
   1966	return 0;
   1967}
   1968EXPORT_SYMBOL(mlx4_get_roce_gid_from_slave);
   1969
   1970/* Cable Module Info */
   1971#define MODULE_INFO_MAX_READ 48
   1972
   1973#define I2C_ADDR_LOW  0x50
   1974#define I2C_ADDR_HIGH 0x51
   1975#define I2C_PAGE_SIZE 256
   1976#define I2C_HIGH_PAGE_SIZE 128
   1977
   1978/* Module Info Data */
   1979struct mlx4_cable_info {
   1980	u8	i2c_addr;
   1981	u8	page_num;
   1982	__be16	dev_mem_address;
   1983	__be16	reserved1;
   1984	__be16	size;
   1985	__be32	reserved2[2];
   1986	u8	data[MODULE_INFO_MAX_READ];
   1987};
   1988
   1989enum cable_info_err {
   1990	 CABLE_INF_INV_PORT      = 0x1,
   1991	 CABLE_INF_OP_NOSUP      = 0x2,
   1992	 CABLE_INF_NOT_CONN      = 0x3,
   1993	 CABLE_INF_NO_EEPRM      = 0x4,
   1994	 CABLE_INF_PAGE_ERR      = 0x5,
   1995	 CABLE_INF_INV_ADDR      = 0x6,
   1996	 CABLE_INF_I2C_ADDR      = 0x7,
   1997	 CABLE_INF_QSFP_VIO      = 0x8,
   1998	 CABLE_INF_I2C_BUSY      = 0x9,
   1999};
   2000
   2001#define MAD_STATUS_2_CABLE_ERR(mad_status) ((mad_status >> 8) & 0xFF)
   2002
   2003static inline const char *cable_info_mad_err_str(u16 mad_status)
   2004{
   2005	u8 err = MAD_STATUS_2_CABLE_ERR(mad_status);
   2006
   2007	switch (err) {
   2008	case CABLE_INF_INV_PORT:
   2009		return "invalid port selected";
   2010	case CABLE_INF_OP_NOSUP:
   2011		return "operation not supported for this port (the port is of type CX4 or internal)";
   2012	case CABLE_INF_NOT_CONN:
   2013		return "cable is not connected";
   2014	case CABLE_INF_NO_EEPRM:
   2015		return "the connected cable has no EPROM (passive copper cable)";
   2016	case CABLE_INF_PAGE_ERR:
   2017		return "page number is greater than 15";
   2018	case CABLE_INF_INV_ADDR:
   2019		return "invalid device_address or size (that is, size equals 0 or address+size is greater than 256)";
   2020	case CABLE_INF_I2C_ADDR:
   2021		return "invalid I2C slave address";
   2022	case CABLE_INF_QSFP_VIO:
   2023		return "at least one cable violates the QSFP specification and ignores the modsel signal";
   2024	case CABLE_INF_I2C_BUSY:
   2025		return "I2C bus is constantly busy";
   2026	}
   2027	return "Unknown Error";
   2028}
   2029
   2030static int mlx4_get_module_id(struct mlx4_dev *dev, u8 port, u8 *module_id)
   2031{
   2032	struct mlx4_cmd_mailbox *inbox, *outbox;
   2033	struct mlx4_mad_ifc *inmad, *outmad;
   2034	struct mlx4_cable_info *cable_info;
   2035	int ret;
   2036
   2037	inbox = mlx4_alloc_cmd_mailbox(dev);
   2038	if (IS_ERR(inbox))
   2039		return PTR_ERR(inbox);
   2040
   2041	outbox = mlx4_alloc_cmd_mailbox(dev);
   2042	if (IS_ERR(outbox)) {
   2043		mlx4_free_cmd_mailbox(dev, inbox);
   2044		return PTR_ERR(outbox);
   2045	}
   2046
   2047	inmad = (struct mlx4_mad_ifc *)(inbox->buf);
   2048	outmad = (struct mlx4_mad_ifc *)(outbox->buf);
   2049
   2050	inmad->method = 0x1; /* Get */
   2051	inmad->class_version = 0x1;
   2052	inmad->mgmt_class = 0x1;
   2053	inmad->base_version = 0x1;
   2054	inmad->attr_id = cpu_to_be16(0xFF60); /* Module Info */
   2055
   2056	cable_info = (struct mlx4_cable_info *)inmad->data;
   2057	cable_info->dev_mem_address = 0;
   2058	cable_info->page_num = 0;
   2059	cable_info->i2c_addr = I2C_ADDR_LOW;
   2060	cable_info->size = cpu_to_be16(1);
   2061
   2062	ret = mlx4_cmd_box(dev, inbox->dma, outbox->dma, port, 3,
   2063			   MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C,
   2064			   MLX4_CMD_NATIVE);
   2065	if (ret)
   2066		goto out;
   2067
   2068	if (be16_to_cpu(outmad->status)) {
   2069		/* Mad returned with bad status */
   2070		ret = be16_to_cpu(outmad->status);
   2071		mlx4_warn(dev,
   2072			  "MLX4_CMD_MAD_IFC Get Module ID attr(%x) port(%d) i2c_addr(%x) offset(%d) size(%d): Response Mad Status(%x) - %s\n",
   2073			  0xFF60, port, I2C_ADDR_LOW, 0, 1, ret,
   2074			  cable_info_mad_err_str(ret));
   2075		ret = -ret;
   2076		goto out;
   2077	}
   2078	cable_info = (struct mlx4_cable_info *)outmad->data;
   2079	*module_id = cable_info->data[0];
   2080out:
   2081	mlx4_free_cmd_mailbox(dev, inbox);
   2082	mlx4_free_cmd_mailbox(dev, outbox);
   2083	return ret;
   2084}
   2085
   2086static void mlx4_sfp_eeprom_params_set(u8 *i2c_addr, u8 *page_num, u16 *offset)
   2087{
   2088	*i2c_addr = I2C_ADDR_LOW;
   2089	*page_num = 0;
   2090
   2091	if (*offset < I2C_PAGE_SIZE)
   2092		return;
   2093
   2094	*i2c_addr = I2C_ADDR_HIGH;
   2095	*offset -= I2C_PAGE_SIZE;
   2096}
   2097
   2098static void mlx4_qsfp_eeprom_params_set(u8 *i2c_addr, u8 *page_num, u16 *offset)
   2099{
   2100	/* Offsets 0-255 belong to page 0.
   2101	 * Offsets 256-639 belong to pages 01, 02, 03.
   2102	 * For example, offset 400 is page 02: 1 + (400 - 256) / 128 = 2
   2103	 */
   2104	if (*offset < I2C_PAGE_SIZE)
   2105		*page_num = 0;
   2106	else
   2107		*page_num = 1 + (*offset - I2C_PAGE_SIZE) / I2C_HIGH_PAGE_SIZE;
   2108	*i2c_addr = I2C_ADDR_LOW;
   2109	*offset -= *page_num * I2C_HIGH_PAGE_SIZE;
   2110}
   2111
   2112/**
   2113 * mlx4_get_module_info - Read cable module eeprom data
   2114 * @dev: mlx4_dev.
   2115 * @port: port number.
   2116 * @offset: byte offset in eeprom to start reading data from.
   2117 * @size: num of bytes to read.
   2118 * @data: output buffer to put the requested data into.
   2119 *
   2120 * Reads cable module eeprom data, puts the outcome data into
   2121 * data pointer paramer.
   2122 * Returns num of read bytes on success or a negative error
   2123 * code.
   2124 */
   2125int mlx4_get_module_info(struct mlx4_dev *dev, u8 port,
   2126			 u16 offset, u16 size, u8 *data)
   2127{
   2128	struct mlx4_cmd_mailbox *inbox, *outbox;
   2129	struct mlx4_mad_ifc *inmad, *outmad;
   2130	struct mlx4_cable_info *cable_info;
   2131	u8 module_id, i2c_addr, page_num;
   2132	int ret;
   2133
   2134	if (size > MODULE_INFO_MAX_READ)
   2135		size = MODULE_INFO_MAX_READ;
   2136
   2137	ret = mlx4_get_module_id(dev, port, &module_id);
   2138	if (ret)
   2139		return ret;
   2140
   2141	switch (module_id) {
   2142	case MLX4_MODULE_ID_SFP:
   2143		mlx4_sfp_eeprom_params_set(&i2c_addr, &page_num, &offset);
   2144		break;
   2145	case MLX4_MODULE_ID_QSFP:
   2146	case MLX4_MODULE_ID_QSFP_PLUS:
   2147	case MLX4_MODULE_ID_QSFP28:
   2148		mlx4_qsfp_eeprom_params_set(&i2c_addr, &page_num, &offset);
   2149		break;
   2150	default:
   2151		mlx4_err(dev, "Module ID not recognized: %#x\n", module_id);
   2152		return -EINVAL;
   2153	}
   2154
   2155	inbox = mlx4_alloc_cmd_mailbox(dev);
   2156	if (IS_ERR(inbox))
   2157		return PTR_ERR(inbox);
   2158
   2159	outbox = mlx4_alloc_cmd_mailbox(dev);
   2160	if (IS_ERR(outbox)) {
   2161		mlx4_free_cmd_mailbox(dev, inbox);
   2162		return PTR_ERR(outbox);
   2163	}
   2164
   2165	inmad = (struct mlx4_mad_ifc *)(inbox->buf);
   2166	outmad = (struct mlx4_mad_ifc *)(outbox->buf);
   2167
   2168	inmad->method = 0x1; /* Get */
   2169	inmad->class_version = 0x1;
   2170	inmad->mgmt_class = 0x1;
   2171	inmad->base_version = 0x1;
   2172	inmad->attr_id = cpu_to_be16(0xFF60); /* Module Info */
   2173
   2174	if (offset < I2C_PAGE_SIZE && offset + size > I2C_PAGE_SIZE)
   2175		/* Cross pages reads are not allowed
   2176		 * read until offset 256 in low page
   2177		 */
   2178		size -= offset + size - I2C_PAGE_SIZE;
   2179
   2180	cable_info = (struct mlx4_cable_info *)inmad->data;
   2181	cable_info->dev_mem_address = cpu_to_be16(offset);
   2182	cable_info->page_num = page_num;
   2183	cable_info->i2c_addr = i2c_addr;
   2184	cable_info->size = cpu_to_be16(size);
   2185
   2186	ret = mlx4_cmd_box(dev, inbox->dma, outbox->dma, port, 3,
   2187			   MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C,
   2188			   MLX4_CMD_NATIVE);
   2189	if (ret)
   2190		goto out;
   2191
   2192	if (be16_to_cpu(outmad->status)) {
   2193		/* Mad returned with bad status */
   2194		ret = be16_to_cpu(outmad->status);
   2195		mlx4_warn(dev,
   2196			  "MLX4_CMD_MAD_IFC Get Module info attr(%x) port(%d) i2c_addr(%x) offset(%d) size(%d): Response Mad Status(%x) - %s\n",
   2197			  0xFF60, port, i2c_addr, offset, size,
   2198			  ret, cable_info_mad_err_str(ret));
   2199
   2200		if (i2c_addr == I2C_ADDR_HIGH &&
   2201		    MAD_STATUS_2_CABLE_ERR(ret) == CABLE_INF_I2C_ADDR)
   2202			/* Some SFP cables do not support i2c slave
   2203			 * address 0x51 (high page), abort silently.
   2204			 */
   2205			ret = 0;
   2206		else
   2207			ret = -ret;
   2208		goto out;
   2209	}
   2210	cable_info = (struct mlx4_cable_info *)outmad->data;
   2211	memcpy(data, cable_info->data, size);
   2212	ret = size;
   2213out:
   2214	mlx4_free_cmd_mailbox(dev, inbox);
   2215	mlx4_free_cmd_mailbox(dev, outbox);
   2216	return ret;
   2217}
   2218EXPORT_SYMBOL(mlx4_get_module_info);
   2219
   2220int mlx4_max_tc(struct mlx4_dev *dev)
   2221{
   2222	u8 num_tc = dev->caps.max_tc_eth;
   2223
   2224	if (!num_tc)
   2225		num_tc = MLX4_TC_MAX_NUMBER;
   2226
   2227	return num_tc;
   2228}
   2229EXPORT_SYMBOL(mlx4_max_tc);