2 * Copyright (c) 2007 Mellanox Technologies. All rights reserved.
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:
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
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.
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
33 #include <linux/errno.h>
34 #include <linux/if_ether.h>
35 #include <linux/if_vlan.h>
36 #include <linux/export.h>
38 #include <linux/mlx4/cmd.h>
41 #include "mlx4_stats.h"
43 #define MLX4_MAC_VALID (1ull << 63)
45 #define MLX4_VLAN_VALID (1u << 31)
46 #define MLX4_VLAN_MASK 0xfff
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
53 #define MLX4_FLAG_V_IGNORE_FCS_MASK 0x2
54 #define MLX4_IGNORE_FCS_MASK 0x1
55 #define MLX4_TC_MAX_NUMBER 8
57 void mlx4_init_mac_table(struct mlx4_dev
*dev
, struct mlx4_mac_table
*table
)
61 mutex_init(&table
->mutex
);
62 for (i
= 0; i
< MLX4_MAX_MAC_NUM
; i
++) {
63 table
->entries
[i
] = 0;
65 table
->is_dup
[i
] = false;
67 table
->max
= 1 << dev
->caps
.log_num_macs
;
71 void mlx4_init_vlan_table(struct mlx4_dev
*dev
, struct mlx4_vlan_table
*table
)
75 mutex_init(&table
->mutex
);
76 for (i
= 0; i
< MLX4_MAX_VLAN_NUM
; i
++) {
77 table
->entries
[i
] = 0;
79 table
->is_dup
[i
] = false;
81 table
->max
= (1 << dev
->caps
.log_num_vlans
) - MLX4_VLAN_REGULAR
;
85 void mlx4_init_roce_gid_table(struct mlx4_dev
*dev
,
86 struct mlx4_roce_gid_table
*table
)
90 mutex_init(&table
->mutex
);
91 for (i
= 0; i
< MLX4_ROCE_MAX_GIDS
; i
++)
92 memset(table
->roce_gids
[i
].raw
, 0, MLX4_ROCE_GID_ENTRY_SIZE
);
95 static int validate_index(struct mlx4_dev
*dev
,
96 struct mlx4_mac_table
*table
, int index
)
100 if (index
< 0 || index
>= table
->max
|| !table
->entries
[index
]) {
101 mlx4_warn(dev
, "No valid Mac entry for the given index\n");
107 static int find_index(struct mlx4_dev
*dev
,
108 struct mlx4_mac_table
*table
, u64 mac
)
112 for (i
= 0; i
< MLX4_MAX_MAC_NUM
; i
++) {
113 if (table
->refs
[i
] &&
114 (MLX4_MAC_MASK
& mac
) ==
115 (MLX4_MAC_MASK
& be64_to_cpu(table
->entries
[i
])))
122 static int mlx4_set_port_mac_table(struct mlx4_dev
*dev
, u8 port
,
125 struct mlx4_cmd_mailbox
*mailbox
;
129 mailbox
= mlx4_alloc_cmd_mailbox(dev
);
131 return PTR_ERR(mailbox
);
133 memcpy(mailbox
->buf
, entries
, MLX4_MAC_TABLE_SIZE
);
135 in_mod
= MLX4_SET_PORT_MAC_TABLE
<< 8 | port
;
137 err
= mlx4_cmd(dev
, mailbox
->dma
, in_mod
, MLX4_SET_PORT_ETH_OPCODE
,
138 MLX4_CMD_SET_PORT
, MLX4_CMD_TIME_CLASS_B
,
141 mlx4_free_cmd_mailbox(dev
, mailbox
);
145 int mlx4_find_cached_mac(struct mlx4_dev
*dev
, u8 port
, u64 mac
, int *idx
)
147 struct mlx4_port_info
*info
= &mlx4_priv(dev
)->port
[port
];
148 struct mlx4_mac_table
*table
= &info
->mac_table
;
151 for (i
= 0; i
< MLX4_MAX_MAC_NUM
; i
++) {
155 if (mac
== (MLX4_MAC_MASK
& be64_to_cpu(table
->entries
[i
]))) {
163 EXPORT_SYMBOL_GPL(mlx4_find_cached_mac
);
165 static bool mlx4_need_mf_bond(struct mlx4_dev
*dev
)
167 int i
, num_eth_ports
= 0;
169 if (!mlx4_is_mfunc(dev
))
171 mlx4_foreach_port(i
, dev
, MLX4_PORT_TYPE_ETH
)
174 return (num_eth_ports
== 2) ? true : false;
177 int __mlx4_register_mac(struct mlx4_dev
*dev
, u8 port
, u64 mac
)
179 struct mlx4_port_info
*info
= &mlx4_priv(dev
)->port
[port
];
180 struct mlx4_mac_table
*table
= &info
->mac_table
;
183 int free_for_dup
= -1;
184 bool dup
= mlx4_is_mf_bonded(dev
);
185 u8 dup_port
= (port
== 1) ? 2 : 1;
186 struct mlx4_mac_table
*dup_table
= &mlx4_priv(dev
)->port
[dup_port
].mac_table
;
187 bool need_mf_bond
= mlx4_need_mf_bond(dev
);
188 bool can_mf_bond
= true;
190 mlx4_dbg(dev
, "Registering MAC: 0x%llx for port %d %s duplicate\n",
191 (unsigned long long)mac
, port
,
192 dup
? "with" : "without");
196 mutex_lock(&table
->mutex
);
197 mutex_lock_nested(&dup_table
->mutex
, SINGLE_DEPTH_NESTING
);
199 mutex_lock(&dup_table
->mutex
);
200 mutex_lock_nested(&table
->mutex
, SINGLE_DEPTH_NESTING
);
203 mutex_lock(&table
->mutex
);
207 int index_at_port
= -1;
208 int index_at_dup_port
= -1;
210 for (i
= 0; i
< MLX4_MAX_MAC_NUM
; i
++) {
211 if (((MLX4_MAC_MASK
& mac
) == (MLX4_MAC_MASK
& be64_to_cpu(table
->entries
[i
]))))
213 if (((MLX4_MAC_MASK
& mac
) == (MLX4_MAC_MASK
& be64_to_cpu(dup_table
->entries
[i
]))))
214 index_at_dup_port
= i
;
217 /* check that same mac is not in the tables at different indices */
218 if ((index_at_port
!= index_at_dup_port
) &&
219 (index_at_port
>= 0) &&
220 (index_at_dup_port
>= 0))
223 /* If the mac is already in the primary table, the slot must be
224 * available in the duplicate table as well.
226 if (index_at_port
>= 0 && index_at_dup_port
< 0 &&
227 dup_table
->refs
[index_at_port
]) {
230 /* If the mac is already in the duplicate table, check that the
231 * corresponding index is not occupied in the primary table, or
232 * the primary table already contains the mac at the same index.
233 * Otherwise, you cannot bond (primary contains a different mac
236 if (index_at_dup_port
>= 0) {
237 if (!table
->refs
[index_at_dup_port
] ||
238 ((MLX4_MAC_MASK
& mac
) == (MLX4_MAC_MASK
& be64_to_cpu(table
->entries
[index_at_dup_port
]))))
239 free_for_dup
= index_at_dup_port
;
245 for (i
= 0; i
< MLX4_MAX_MAC_NUM
; i
++) {
246 if (!table
->refs
[i
]) {
249 if (free_for_dup
< 0 && need_mf_bond
&& can_mf_bond
) {
250 if (!dup_table
->refs
[i
])
256 if ((MLX4_MAC_MASK
& mac
) ==
257 (MLX4_MAC_MASK
& be64_to_cpu(table
->entries
[i
]))) {
258 /* MAC already registered, increment ref count */
262 u64 dup_mac
= MLX4_MAC_MASK
& be64_to_cpu(dup_table
->entries
[i
]);
264 if (dup_mac
!= mac
|| !dup_table
->is_dup
[i
]) {
265 mlx4_warn(dev
, "register mac: expect duplicate mac 0x%llx on port %d index %d\n",
273 if (need_mf_bond
&& (free_for_dup
< 0)) {
275 mlx4_warn(dev
, "Fail to allocate duplicate MAC table entry\n");
276 mlx4_warn(dev
, "High Availability for virtual functions may not work as expected\n");
282 if (need_mf_bond
&& can_mf_bond
)
285 mlx4_dbg(dev
, "Free MAC index is %d\n", free
);
287 if (table
->total
== table
->max
) {
288 /* No free mac entries */
293 /* Register new MAC */
294 table
->entries
[free
] = cpu_to_be64(mac
| MLX4_MAC_VALID
);
296 err
= mlx4_set_port_mac_table(dev
, port
, table
->entries
);
298 mlx4_err(dev
, "Failed adding MAC: 0x%llx\n",
299 (unsigned long long) mac
);
300 table
->entries
[free
] = 0;
303 table
->refs
[free
] = 1;
304 table
->is_dup
[free
] = false;
307 dup_table
->refs
[free
] = 0;
308 dup_table
->is_dup
[free
] = true;
309 dup_table
->entries
[free
] = cpu_to_be64(mac
| MLX4_MAC_VALID
);
311 err
= mlx4_set_port_mac_table(dev
, dup_port
, dup_table
->entries
);
313 mlx4_warn(dev
, "Failed adding duplicate mac: 0x%llx\n", mac
);
314 dup_table
->is_dup
[free
] = false;
315 dup_table
->entries
[free
] = 0;
324 mutex_unlock(&table
->mutex
);
325 mutex_unlock(&dup_table
->mutex
);
327 mutex_unlock(&dup_table
->mutex
);
328 mutex_unlock(&table
->mutex
);
331 mutex_unlock(&table
->mutex
);
335 EXPORT_SYMBOL_GPL(__mlx4_register_mac
);
337 int mlx4_register_mac(struct mlx4_dev
*dev
, u8 port
, u64 mac
)
342 if (mlx4_is_mfunc(dev
)) {
343 if (!(dev
->flags
& MLX4_FLAG_OLD_REG_MAC
)) {
344 err
= mlx4_cmd_imm(dev
, mac
, &out_param
,
345 ((u32
) port
) << 8 | (u32
) RES_MAC
,
346 RES_OP_RESERVE_AND_MAP
, MLX4_CMD_ALLOC_RES
,
347 MLX4_CMD_TIME_CLASS_A
, MLX4_CMD_WRAPPED
);
349 if (err
&& err
== -EINVAL
&& mlx4_is_slave(dev
)) {
350 /* retry using old REG_MAC format */
351 set_param_l(&out_param
, port
);
352 err
= mlx4_cmd_imm(dev
, mac
, &out_param
, RES_MAC
,
353 RES_OP_RESERVE_AND_MAP
, MLX4_CMD_ALLOC_RES
,
354 MLX4_CMD_TIME_CLASS_A
, MLX4_CMD_WRAPPED
);
356 dev
->flags
|= MLX4_FLAG_OLD_REG_MAC
;
361 return get_param_l(&out_param
);
363 return __mlx4_register_mac(dev
, port
, mac
);
365 EXPORT_SYMBOL_GPL(mlx4_register_mac
);
367 int mlx4_get_base_qpn(struct mlx4_dev
*dev
, u8 port
)
369 return dev
->caps
.reserved_qps_base
[MLX4_QP_REGION_ETH_ADDR
] +
370 (port
- 1) * (1 << dev
->caps
.log_num_macs
);
372 EXPORT_SYMBOL_GPL(mlx4_get_base_qpn
);
374 void __mlx4_unregister_mac(struct mlx4_dev
*dev
, u8 port
, u64 mac
)
376 struct mlx4_port_info
*info
;
377 struct mlx4_mac_table
*table
;
379 bool dup
= mlx4_is_mf_bonded(dev
);
380 u8 dup_port
= (port
== 1) ? 2 : 1;
381 struct mlx4_mac_table
*dup_table
= &mlx4_priv(dev
)->port
[dup_port
].mac_table
;
383 if (port
< 1 || port
> dev
->caps
.num_ports
) {
384 mlx4_warn(dev
, "invalid port number (%d), aborting...\n", port
);
387 info
= &mlx4_priv(dev
)->port
[port
];
388 table
= &info
->mac_table
;
392 mutex_lock(&table
->mutex
);
393 mutex_lock_nested(&dup_table
->mutex
, SINGLE_DEPTH_NESTING
);
395 mutex_lock(&dup_table
->mutex
);
396 mutex_lock_nested(&table
->mutex
, SINGLE_DEPTH_NESTING
);
399 mutex_lock(&table
->mutex
);
402 index
= find_index(dev
, table
, mac
);
404 if (validate_index(dev
, table
, index
))
407 if (--table
->refs
[index
] || table
->is_dup
[index
]) {
408 mlx4_dbg(dev
, "Have more references for index %d, no need to modify mac table\n",
410 if (!table
->refs
[index
])
411 dup_table
->is_dup
[index
] = false;
415 table
->entries
[index
] = 0;
416 if (mlx4_set_port_mac_table(dev
, port
, table
->entries
))
417 mlx4_warn(dev
, "Fail to set mac in port %d during unregister\n", port
);
421 dup_table
->is_dup
[index
] = false;
422 if (dup_table
->refs
[index
])
424 dup_table
->entries
[index
] = 0;
425 if (mlx4_set_port_mac_table(dev
, dup_port
, dup_table
->entries
))
426 mlx4_warn(dev
, "Fail to set mac in duplicate port %d during unregister\n", dup_port
);
433 mutex_unlock(&table
->mutex
);
434 mutex_unlock(&dup_table
->mutex
);
436 mutex_unlock(&dup_table
->mutex
);
437 mutex_unlock(&table
->mutex
);
440 mutex_unlock(&table
->mutex
);
443 EXPORT_SYMBOL_GPL(__mlx4_unregister_mac
);
445 void mlx4_unregister_mac(struct mlx4_dev
*dev
, u8 port
, u64 mac
)
449 if (mlx4_is_mfunc(dev
)) {
450 if (!(dev
->flags
& MLX4_FLAG_OLD_REG_MAC
)) {
451 (void) mlx4_cmd_imm(dev
, mac
, &out_param
,
452 ((u32
) port
) << 8 | (u32
) RES_MAC
,
453 RES_OP_RESERVE_AND_MAP
, MLX4_CMD_FREE_RES
,
454 MLX4_CMD_TIME_CLASS_A
, MLX4_CMD_WRAPPED
);
456 /* use old unregister mac format */
457 set_param_l(&out_param
, port
);
458 (void) mlx4_cmd_imm(dev
, mac
, &out_param
, RES_MAC
,
459 RES_OP_RESERVE_AND_MAP
, MLX4_CMD_FREE_RES
,
460 MLX4_CMD_TIME_CLASS_A
, MLX4_CMD_WRAPPED
);
464 __mlx4_unregister_mac(dev
, port
, mac
);
467 EXPORT_SYMBOL_GPL(mlx4_unregister_mac
);
469 int __mlx4_replace_mac(struct mlx4_dev
*dev
, u8 port
, int qpn
, u64 new_mac
)
471 struct mlx4_port_info
*info
= &mlx4_priv(dev
)->port
[port
];
472 struct mlx4_mac_table
*table
= &info
->mac_table
;
473 int index
= qpn
- info
->base_qpn
;
475 bool dup
= mlx4_is_mf_bonded(dev
);
476 u8 dup_port
= (port
== 1) ? 2 : 1;
477 struct mlx4_mac_table
*dup_table
= &mlx4_priv(dev
)->port
[dup_port
].mac_table
;
479 /* CX1 doesn't support multi-functions */
482 mutex_lock(&table
->mutex
);
483 mutex_lock_nested(&dup_table
->mutex
, SINGLE_DEPTH_NESTING
);
485 mutex_lock(&dup_table
->mutex
);
486 mutex_lock_nested(&table
->mutex
, SINGLE_DEPTH_NESTING
);
489 mutex_lock(&table
->mutex
);
492 err
= validate_index(dev
, table
, index
);
496 table
->entries
[index
] = cpu_to_be64(new_mac
| MLX4_MAC_VALID
);
498 err
= mlx4_set_port_mac_table(dev
, port
, table
->entries
);
500 mlx4_err(dev
, "Failed adding MAC: 0x%llx\n",
501 (unsigned long long) new_mac
);
502 table
->entries
[index
] = 0;
505 dup_table
->entries
[index
] = cpu_to_be64(new_mac
| MLX4_MAC_VALID
);
507 err
= mlx4_set_port_mac_table(dev
, dup_port
, dup_table
->entries
);
509 mlx4_err(dev
, "Failed adding duplicate MAC: 0x%llx\n",
510 (unsigned long long)new_mac
);
511 dup_table
->entries
[index
] = 0;
518 mutex_unlock(&table
->mutex
);
519 mutex_unlock(&dup_table
->mutex
);
521 mutex_unlock(&dup_table
->mutex
);
522 mutex_unlock(&table
->mutex
);
525 mutex_unlock(&table
->mutex
);
529 EXPORT_SYMBOL_GPL(__mlx4_replace_mac
);
531 static int mlx4_set_port_vlan_table(struct mlx4_dev
*dev
, u8 port
,
534 struct mlx4_cmd_mailbox
*mailbox
;
538 mailbox
= mlx4_alloc_cmd_mailbox(dev
);
540 return PTR_ERR(mailbox
);
542 memcpy(mailbox
->buf
, entries
, MLX4_VLAN_TABLE_SIZE
);
543 in_mod
= MLX4_SET_PORT_VLAN_TABLE
<< 8 | port
;
544 err
= mlx4_cmd(dev
, mailbox
->dma
, in_mod
, MLX4_SET_PORT_ETH_OPCODE
,
545 MLX4_CMD_SET_PORT
, MLX4_CMD_TIME_CLASS_B
,
548 mlx4_free_cmd_mailbox(dev
, mailbox
);
553 int mlx4_find_cached_vlan(struct mlx4_dev
*dev
, u8 port
, u16 vid
, int *idx
)
555 struct mlx4_vlan_table
*table
= &mlx4_priv(dev
)->port
[port
].vlan_table
;
558 for (i
= 0; i
< MLX4_MAX_VLAN_NUM
; ++i
) {
559 if (table
->refs
[i
] &&
560 (vid
== (MLX4_VLAN_MASK
&
561 be32_to_cpu(table
->entries
[i
])))) {
562 /* VLAN already registered, increase reference count */
570 EXPORT_SYMBOL_GPL(mlx4_find_cached_vlan
);
572 int __mlx4_register_vlan(struct mlx4_dev
*dev
, u8 port
, u16 vlan
,
575 struct mlx4_vlan_table
*table
= &mlx4_priv(dev
)->port
[port
].vlan_table
;
578 int free_for_dup
= -1;
579 bool dup
= mlx4_is_mf_bonded(dev
);
580 u8 dup_port
= (port
== 1) ? 2 : 1;
581 struct mlx4_vlan_table
*dup_table
= &mlx4_priv(dev
)->port
[dup_port
].vlan_table
;
582 bool need_mf_bond
= mlx4_need_mf_bond(dev
);
583 bool can_mf_bond
= true;
585 mlx4_dbg(dev
, "Registering VLAN: %d for port %d %s duplicate\n",
587 dup
? "with" : "without");
591 mutex_lock(&table
->mutex
);
592 mutex_lock_nested(&dup_table
->mutex
, SINGLE_DEPTH_NESTING
);
594 mutex_lock(&dup_table
->mutex
);
595 mutex_lock_nested(&table
->mutex
, SINGLE_DEPTH_NESTING
);
598 mutex_lock(&table
->mutex
);
601 if (table
->total
== table
->max
) {
602 /* No free vlan entries */
608 int index_at_port
= -1;
609 int index_at_dup_port
= -1;
611 for (i
= MLX4_VLAN_REGULAR
; i
< MLX4_MAX_VLAN_NUM
; i
++) {
612 if ((vlan
== (MLX4_VLAN_MASK
& be32_to_cpu(table
->entries
[i
]))))
614 if ((vlan
== (MLX4_VLAN_MASK
& be32_to_cpu(dup_table
->entries
[i
]))))
615 index_at_dup_port
= i
;
617 /* check that same vlan is not in the tables at different indices */
618 if ((index_at_port
!= index_at_dup_port
) &&
619 (index_at_port
>= 0) &&
620 (index_at_dup_port
>= 0))
623 /* If the vlan is already in the primary table, the slot must be
624 * available in the duplicate table as well.
626 if (index_at_port
>= 0 && index_at_dup_port
< 0 &&
627 dup_table
->refs
[index_at_port
]) {
630 /* If the vlan is already in the duplicate table, check that the
631 * corresponding index is not occupied in the primary table, or
632 * the primary table already contains the vlan at the same index.
633 * Otherwise, you cannot bond (primary contains a different vlan
636 if (index_at_dup_port
>= 0) {
637 if (!table
->refs
[index_at_dup_port
] ||
638 (vlan
== (MLX4_VLAN_MASK
& be32_to_cpu(dup_table
->entries
[index_at_dup_port
]))))
639 free_for_dup
= index_at_dup_port
;
645 for (i
= MLX4_VLAN_REGULAR
; i
< MLX4_MAX_VLAN_NUM
; i
++) {
646 if (!table
->refs
[i
]) {
649 if (free_for_dup
< 0 && need_mf_bond
&& can_mf_bond
) {
650 if (!dup_table
->refs
[i
])
655 if ((table
->refs
[i
] || table
->is_dup
[i
]) &&
656 (vlan
== (MLX4_VLAN_MASK
&
657 be32_to_cpu(table
->entries
[i
])))) {
658 /* Vlan already registered, increase references count */
659 mlx4_dbg(dev
, "vlan %u is already registered.\n", vlan
);
663 u16 dup_vlan
= MLX4_VLAN_MASK
& be32_to_cpu(dup_table
->entries
[i
]);
665 if (dup_vlan
!= vlan
|| !dup_table
->is_dup
[i
]) {
666 mlx4_warn(dev
, "register vlan: expected duplicate vlan %u on port %d index %d\n",
674 if (need_mf_bond
&& (free_for_dup
< 0)) {
676 mlx4_warn(dev
, "Fail to allocate duplicate VLAN table entry\n");
677 mlx4_warn(dev
, "High Availability for virtual functions may not work as expected\n");
683 if (need_mf_bond
&& can_mf_bond
)
691 /* Register new VLAN */
692 table
->refs
[free
] = 1;
693 table
->is_dup
[free
] = false;
694 table
->entries
[free
] = cpu_to_be32(vlan
| MLX4_VLAN_VALID
);
696 err
= mlx4_set_port_vlan_table(dev
, port
, table
->entries
);
698 mlx4_warn(dev
, "Failed adding vlan: %u\n", vlan
);
699 table
->refs
[free
] = 0;
700 table
->entries
[free
] = 0;
705 dup_table
->refs
[free
] = 0;
706 dup_table
->is_dup
[free
] = true;
707 dup_table
->entries
[free
] = cpu_to_be32(vlan
| MLX4_VLAN_VALID
);
709 err
= mlx4_set_port_vlan_table(dev
, dup_port
, dup_table
->entries
);
711 mlx4_warn(dev
, "Failed adding duplicate vlan: %u\n", vlan
);
712 dup_table
->is_dup
[free
] = false;
713 dup_table
->entries
[free
] = 0;
723 mutex_unlock(&table
->mutex
);
724 mutex_unlock(&dup_table
->mutex
);
726 mutex_unlock(&dup_table
->mutex
);
727 mutex_unlock(&table
->mutex
);
730 mutex_unlock(&table
->mutex
);
735 int mlx4_register_vlan(struct mlx4_dev
*dev
, u8 port
, u16 vlan
, int *index
)
743 if (mlx4_is_mfunc(dev
)) {
744 err
= mlx4_cmd_imm(dev
, vlan
, &out_param
,
745 ((u32
) port
) << 8 | (u32
) RES_VLAN
,
746 RES_OP_RESERVE_AND_MAP
, MLX4_CMD_ALLOC_RES
,
747 MLX4_CMD_TIME_CLASS_A
, MLX4_CMD_WRAPPED
);
749 *index
= get_param_l(&out_param
);
753 return __mlx4_register_vlan(dev
, port
, vlan
, index
);
755 EXPORT_SYMBOL_GPL(mlx4_register_vlan
);
757 void __mlx4_unregister_vlan(struct mlx4_dev
*dev
, u8 port
, u16 vlan
)
759 struct mlx4_vlan_table
*table
= &mlx4_priv(dev
)->port
[port
].vlan_table
;
761 bool dup
= mlx4_is_mf_bonded(dev
);
762 u8 dup_port
= (port
== 1) ? 2 : 1;
763 struct mlx4_vlan_table
*dup_table
= &mlx4_priv(dev
)->port
[dup_port
].vlan_table
;
767 mutex_lock(&table
->mutex
);
768 mutex_lock_nested(&dup_table
->mutex
, SINGLE_DEPTH_NESTING
);
770 mutex_lock(&dup_table
->mutex
);
771 mutex_lock_nested(&table
->mutex
, SINGLE_DEPTH_NESTING
);
774 mutex_lock(&table
->mutex
);
777 if (mlx4_find_cached_vlan(dev
, port
, vlan
, &index
)) {
778 mlx4_warn(dev
, "vlan 0x%x is not in the vlan table\n", vlan
);
782 if (index
< MLX4_VLAN_REGULAR
) {
783 mlx4_warn(dev
, "Trying to free special vlan index %d\n", index
);
787 if (--table
->refs
[index
] || table
->is_dup
[index
]) {
788 mlx4_dbg(dev
, "Have %d more references for index %d, no need to modify vlan table\n",
789 table
->refs
[index
], index
);
790 if (!table
->refs
[index
])
791 dup_table
->is_dup
[index
] = false;
794 table
->entries
[index
] = 0;
795 if (mlx4_set_port_vlan_table(dev
, port
, table
->entries
))
796 mlx4_warn(dev
, "Fail to set vlan in port %d during unregister\n", port
);
799 dup_table
->is_dup
[index
] = false;
800 if (dup_table
->refs
[index
])
802 dup_table
->entries
[index
] = 0;
803 if (mlx4_set_port_vlan_table(dev
, dup_port
, dup_table
->entries
))
804 mlx4_warn(dev
, "Fail to set vlan in duplicate port %d during unregister\n", dup_port
);
810 mutex_unlock(&table
->mutex
);
811 mutex_unlock(&dup_table
->mutex
);
813 mutex_unlock(&dup_table
->mutex
);
814 mutex_unlock(&table
->mutex
);
817 mutex_unlock(&table
->mutex
);
821 void mlx4_unregister_vlan(struct mlx4_dev
*dev
, u8 port
, u16 vlan
)
825 if (mlx4_is_mfunc(dev
)) {
826 (void) mlx4_cmd_imm(dev
, vlan
, &out_param
,
827 ((u32
) port
) << 8 | (u32
) RES_VLAN
,
828 RES_OP_RESERVE_AND_MAP
,
829 MLX4_CMD_FREE_RES
, MLX4_CMD_TIME_CLASS_A
,
833 __mlx4_unregister_vlan(dev
, port
, vlan
);
835 EXPORT_SYMBOL_GPL(mlx4_unregister_vlan
);
837 int mlx4_bond_mac_table(struct mlx4_dev
*dev
)
839 struct mlx4_mac_table
*t1
= &mlx4_priv(dev
)->port
[1].mac_table
;
840 struct mlx4_mac_table
*t2
= &mlx4_priv(dev
)->port
[2].mac_table
;
843 bool update1
= false;
844 bool update2
= false;
846 mutex_lock(&t1
->mutex
);
847 mutex_lock(&t2
->mutex
);
848 for (i
= 0; i
< MLX4_MAX_MAC_NUM
; i
++) {
849 if ((t1
->entries
[i
] != t2
->entries
[i
]) &&
850 t1
->entries
[i
] && t2
->entries
[i
]) {
851 mlx4_warn(dev
, "can't duplicate entry %d in mac table\n", i
);
857 for (i
= 0; i
< MLX4_MAX_MAC_NUM
; i
++) {
858 if (t1
->entries
[i
] && !t2
->entries
[i
]) {
859 t2
->entries
[i
] = t1
->entries
[i
];
860 t2
->is_dup
[i
] = true;
862 } else if (!t1
->entries
[i
] && t2
->entries
[i
]) {
863 t1
->entries
[i
] = t2
->entries
[i
];
864 t1
->is_dup
[i
] = true;
866 } else if (t1
->entries
[i
] && t2
->entries
[i
]) {
867 t1
->is_dup
[i
] = true;
868 t2
->is_dup
[i
] = true;
873 ret
= mlx4_set_port_mac_table(dev
, 1, t1
->entries
);
875 mlx4_warn(dev
, "failed to set MAC table for port 1 (%d)\n", ret
);
877 if (!ret
&& update2
) {
878 ret
= mlx4_set_port_mac_table(dev
, 2, t2
->entries
);
880 mlx4_warn(dev
, "failed to set MAC table for port 2 (%d)\n", ret
);
884 mlx4_warn(dev
, "failed to create mirror MAC tables\n");
886 mutex_unlock(&t2
->mutex
);
887 mutex_unlock(&t1
->mutex
);
891 int mlx4_unbond_mac_table(struct mlx4_dev
*dev
)
893 struct mlx4_mac_table
*t1
= &mlx4_priv(dev
)->port
[1].mac_table
;
894 struct mlx4_mac_table
*t2
= &mlx4_priv(dev
)->port
[2].mac_table
;
898 bool update1
= false;
899 bool update2
= false;
901 mutex_lock(&t1
->mutex
);
902 mutex_lock(&t2
->mutex
);
903 for (i
= 0; i
< MLX4_MAX_MAC_NUM
; i
++) {
904 if (t1
->entries
[i
] != t2
->entries
[i
]) {
905 mlx4_warn(dev
, "mac table is in an unexpected state when trying to unbond\n");
911 for (i
= 0; i
< MLX4_MAX_MAC_NUM
; i
++) {
914 t1
->is_dup
[i
] = false;
919 t2
->is_dup
[i
] = false;
927 ret
= mlx4_set_port_mac_table(dev
, 1, t1
->entries
);
929 mlx4_warn(dev
, "failed to unmirror MAC tables for port 1(%d)\n", ret
);
932 ret1
= mlx4_set_port_mac_table(dev
, 2, t2
->entries
);
934 mlx4_warn(dev
, "failed to unmirror MAC tables for port 2(%d)\n", ret1
);
939 mutex_unlock(&t2
->mutex
);
940 mutex_unlock(&t1
->mutex
);
944 int mlx4_bond_vlan_table(struct mlx4_dev
*dev
)
946 struct mlx4_vlan_table
*t1
= &mlx4_priv(dev
)->port
[1].vlan_table
;
947 struct mlx4_vlan_table
*t2
= &mlx4_priv(dev
)->port
[2].vlan_table
;
950 bool update1
= false;
951 bool update2
= false;
953 mutex_lock(&t1
->mutex
);
954 mutex_lock(&t2
->mutex
);
955 for (i
= 0; i
< MLX4_MAX_VLAN_NUM
; i
++) {
956 if ((t1
->entries
[i
] != t2
->entries
[i
]) &&
957 t1
->entries
[i
] && t2
->entries
[i
]) {
958 mlx4_warn(dev
, "can't duplicate entry %d in vlan table\n", i
);
964 for (i
= 0; i
< MLX4_MAX_VLAN_NUM
; i
++) {
965 if (t1
->entries
[i
] && !t2
->entries
[i
]) {
966 t2
->entries
[i
] = t1
->entries
[i
];
967 t2
->is_dup
[i
] = true;
969 } else if (!t1
->entries
[i
] && t2
->entries
[i
]) {
970 t1
->entries
[i
] = t2
->entries
[i
];
971 t1
->is_dup
[i
] = true;
973 } else if (t1
->entries
[i
] && t2
->entries
[i
]) {
974 t1
->is_dup
[i
] = true;
975 t2
->is_dup
[i
] = true;
980 ret
= mlx4_set_port_vlan_table(dev
, 1, t1
->entries
);
982 mlx4_warn(dev
, "failed to set VLAN table for port 1 (%d)\n", ret
);
984 if (!ret
&& update2
) {
985 ret
= mlx4_set_port_vlan_table(dev
, 2, t2
->entries
);
987 mlx4_warn(dev
, "failed to set VLAN table for port 2 (%d)\n", ret
);
991 mlx4_warn(dev
, "failed to create mirror VLAN tables\n");
993 mutex_unlock(&t2
->mutex
);
994 mutex_unlock(&t1
->mutex
);
998 int mlx4_unbond_vlan_table(struct mlx4_dev
*dev
)
1000 struct mlx4_vlan_table
*t1
= &mlx4_priv(dev
)->port
[1].vlan_table
;
1001 struct mlx4_vlan_table
*t2
= &mlx4_priv(dev
)->port
[2].vlan_table
;
1005 bool update1
= false;
1006 bool update2
= false;
1008 mutex_lock(&t1
->mutex
);
1009 mutex_lock(&t2
->mutex
);
1010 for (i
= 0; i
< MLX4_MAX_VLAN_NUM
; i
++) {
1011 if (t1
->entries
[i
] != t2
->entries
[i
]) {
1012 mlx4_warn(dev
, "vlan table is in an unexpected state when trying to unbond\n");
1018 for (i
= 0; i
< MLX4_MAX_VLAN_NUM
; i
++) {
1019 if (!t1
->entries
[i
])
1021 t1
->is_dup
[i
] = false;
1026 t2
->is_dup
[i
] = false;
1034 ret
= mlx4_set_port_vlan_table(dev
, 1, t1
->entries
);
1036 mlx4_warn(dev
, "failed to unmirror VLAN tables for port 1(%d)\n", ret
);
1039 ret1
= mlx4_set_port_vlan_table(dev
, 2, t2
->entries
);
1041 mlx4_warn(dev
, "failed to unmirror VLAN tables for port 2(%d)\n", ret1
);
1046 mutex_unlock(&t2
->mutex
);
1047 mutex_unlock(&t1
->mutex
);
1051 int mlx4_get_port_ib_caps(struct mlx4_dev
*dev
, u8 port
, __be32
*caps
)
1053 struct mlx4_cmd_mailbox
*inmailbox
, *outmailbox
;
1057 inmailbox
= mlx4_alloc_cmd_mailbox(dev
);
1058 if (IS_ERR(inmailbox
))
1059 return PTR_ERR(inmailbox
);
1061 outmailbox
= mlx4_alloc_cmd_mailbox(dev
);
1062 if (IS_ERR(outmailbox
)) {
1063 mlx4_free_cmd_mailbox(dev
, inmailbox
);
1064 return PTR_ERR(outmailbox
);
1067 inbuf
= inmailbox
->buf
;
1068 outbuf
= outmailbox
->buf
;
1073 *(__be16
*) (&inbuf
[16]) = cpu_to_be16(0x0015);
1074 *(__be32
*) (&inbuf
[20]) = cpu_to_be32(port
);
1076 err
= mlx4_cmd_box(dev
, inmailbox
->dma
, outmailbox
->dma
, port
, 3,
1077 MLX4_CMD_MAD_IFC
, MLX4_CMD_TIME_CLASS_C
,
1080 *caps
= *(__be32
*) (outbuf
+ 84);
1081 mlx4_free_cmd_mailbox(dev
, inmailbox
);
1082 mlx4_free_cmd_mailbox(dev
, outmailbox
);
1085 static struct mlx4_roce_gid_entry zgid_entry
;
1087 int mlx4_get_slave_num_gids(struct mlx4_dev
*dev
, int slave
, int port
)
1090 int slave_gid
= slave
;
1092 struct mlx4_slaves_pport slaves_pport
;
1093 struct mlx4_active_ports actv_ports
;
1094 unsigned max_port_p_one
;
1097 return MLX4_ROCE_PF_GIDS
;
1100 slaves_pport
= mlx4_phys_to_slaves_pport(dev
, port
);
1101 actv_ports
= mlx4_get_active_ports(dev
, slave
);
1102 max_port_p_one
= find_first_bit(actv_ports
.ports
, dev
->caps
.num_ports
) +
1103 bitmap_weight(actv_ports
.ports
, dev
->caps
.num_ports
) + 1;
1105 for (i
= 1; i
< max_port_p_one
; i
++) {
1106 struct mlx4_active_ports exclusive_ports
;
1107 struct mlx4_slaves_pport slaves_pport_actv
;
1108 bitmap_zero(exclusive_ports
.ports
, dev
->caps
.num_ports
);
1109 set_bit(i
- 1, exclusive_ports
.ports
);
1112 slaves_pport_actv
= mlx4_phys_to_slaves_pport_actv(
1113 dev
, &exclusive_ports
);
1114 slave_gid
-= bitmap_weight(slaves_pport_actv
.slaves
,
1115 dev
->persist
->num_vfs
+ 1);
1117 vfs
= bitmap_weight(slaves_pport
.slaves
, dev
->persist
->num_vfs
+ 1) - 1;
1118 if (slave_gid
<= ((MLX4_ROCE_MAX_GIDS
- MLX4_ROCE_PF_GIDS
) % vfs
))
1119 return ((MLX4_ROCE_MAX_GIDS
- MLX4_ROCE_PF_GIDS
) / vfs
) + 1;
1120 return (MLX4_ROCE_MAX_GIDS
- MLX4_ROCE_PF_GIDS
) / vfs
;
1123 int mlx4_get_base_gid_ix(struct mlx4_dev
*dev
, int slave
, int port
)
1127 int slave_gid
= slave
;
1130 struct mlx4_slaves_pport slaves_pport
;
1131 struct mlx4_active_ports actv_ports
;
1132 unsigned max_port_p_one
;
1137 slaves_pport
= mlx4_phys_to_slaves_pport(dev
, port
);
1138 actv_ports
= mlx4_get_active_ports(dev
, slave
);
1139 max_port_p_one
= find_first_bit(actv_ports
.ports
, dev
->caps
.num_ports
) +
1140 bitmap_weight(actv_ports
.ports
, dev
->caps
.num_ports
) + 1;
1142 for (i
= 1; i
< max_port_p_one
; i
++) {
1143 struct mlx4_active_ports exclusive_ports
;
1144 struct mlx4_slaves_pport slaves_pport_actv
;
1145 bitmap_zero(exclusive_ports
.ports
, dev
->caps
.num_ports
);
1146 set_bit(i
- 1, exclusive_ports
.ports
);
1149 slaves_pport_actv
= mlx4_phys_to_slaves_pport_actv(
1150 dev
, &exclusive_ports
);
1151 slave_gid
-= bitmap_weight(slaves_pport_actv
.slaves
,
1152 dev
->persist
->num_vfs
+ 1);
1154 gids
= MLX4_ROCE_MAX_GIDS
- MLX4_ROCE_PF_GIDS
;
1155 vfs
= bitmap_weight(slaves_pport
.slaves
, dev
->persist
->num_vfs
+ 1) - 1;
1156 if (slave_gid
<= gids
% vfs
)
1157 return MLX4_ROCE_PF_GIDS
+ ((gids
/ vfs
) + 1) * (slave_gid
- 1);
1159 return MLX4_ROCE_PF_GIDS
+ (gids
% vfs
) +
1160 ((gids
/ vfs
) * (slave_gid
- 1));
1162 EXPORT_SYMBOL_GPL(mlx4_get_base_gid_ix
);
1164 static int mlx4_reset_roce_port_gids(struct mlx4_dev
*dev
, int slave
,
1165 int port
, struct mlx4_cmd_mailbox
*mailbox
)
1167 struct mlx4_roce_gid_entry
*gid_entry_mbox
;
1168 struct mlx4_priv
*priv
= mlx4_priv(dev
);
1169 int num_gids
, base
, offset
;
1172 num_gids
= mlx4_get_slave_num_gids(dev
, slave
, port
);
1173 base
= mlx4_get_base_gid_ix(dev
, slave
, port
);
1175 memset(mailbox
->buf
, 0, MLX4_MAILBOX_SIZE
);
1177 mutex_lock(&(priv
->port
[port
].gid_table
.mutex
));
1178 /* Zero-out gids belonging to that slave in the port GID table */
1179 for (i
= 0, offset
= base
; i
< num_gids
; offset
++, i
++)
1180 memcpy(priv
->port
[port
].gid_table
.roce_gids
[offset
].raw
,
1181 zgid_entry
.raw
, MLX4_ROCE_GID_ENTRY_SIZE
);
1183 /* Now, copy roce port gids table to mailbox for passing to FW */
1184 gid_entry_mbox
= (struct mlx4_roce_gid_entry
*)mailbox
->buf
;
1185 for (i
= 0; i
< MLX4_ROCE_MAX_GIDS
; gid_entry_mbox
++, i
++)
1186 memcpy(gid_entry_mbox
->raw
,
1187 priv
->port
[port
].gid_table
.roce_gids
[i
].raw
,
1188 MLX4_ROCE_GID_ENTRY_SIZE
);
1190 err
= mlx4_cmd(dev
, mailbox
->dma
,
1191 ((u32
)port
) | (MLX4_SET_PORT_GID_TABLE
<< 8),
1192 MLX4_SET_PORT_ETH_OPCODE
, MLX4_CMD_SET_PORT
,
1193 MLX4_CMD_TIME_CLASS_B
, MLX4_CMD_NATIVE
);
1194 mutex_unlock(&(priv
->port
[port
].gid_table
.mutex
));
1199 void mlx4_reset_roce_gids(struct mlx4_dev
*dev
, int slave
)
1201 struct mlx4_active_ports actv_ports
;
1202 struct mlx4_cmd_mailbox
*mailbox
;
1203 int num_eth_ports
, err
;
1206 if (slave
< 0 || slave
> dev
->persist
->num_vfs
)
1209 actv_ports
= mlx4_get_active_ports(dev
, slave
);
1211 for (i
= 0, num_eth_ports
= 0; i
< dev
->caps
.num_ports
; i
++) {
1212 if (test_bit(i
, actv_ports
.ports
)) {
1213 if (dev
->caps
.port_type
[i
+ 1] != MLX4_PORT_TYPE_ETH
)
1222 /* have ETH ports. Alloc mailbox for SET_PORT command */
1223 mailbox
= mlx4_alloc_cmd_mailbox(dev
);
1224 if (IS_ERR(mailbox
))
1227 for (i
= 0; i
< dev
->caps
.num_ports
; i
++) {
1228 if (test_bit(i
, actv_ports
.ports
)) {
1229 if (dev
->caps
.port_type
[i
+ 1] != MLX4_PORT_TYPE_ETH
)
1231 err
= mlx4_reset_roce_port_gids(dev
, slave
, i
+ 1, mailbox
);
1233 mlx4_warn(dev
, "Could not reset ETH port GID table for slave %d, port %d (%d)\n",
1238 mlx4_free_cmd_mailbox(dev
, mailbox
);
1242 static int mlx4_common_set_port(struct mlx4_dev
*dev
, int slave
, u32 in_mod
,
1243 u8 op_mod
, struct mlx4_cmd_mailbox
*inbox
)
1245 struct mlx4_priv
*priv
= mlx4_priv(dev
);
1246 struct mlx4_port_info
*port_info
;
1247 struct mlx4_mfunc_master_ctx
*master
= &priv
->mfunc
.master
;
1248 struct mlx4_slave_state
*slave_st
= &master
->slave_state
[slave
];
1249 struct mlx4_set_port_rqp_calc_context
*qpn_context
;
1250 struct mlx4_set_port_general_context
*gen_context
;
1251 struct mlx4_roce_gid_entry
*gid_entry_tbl
, *gid_entry_mbox
, *gid_entry_mb1
;
1252 int reset_qkey_viols
;
1263 __be32 agg_cap_mask
;
1264 __be32 slave_cap_mask
;
1265 __be32 new_cap_mask
;
1267 port
= in_mod
& 0xff;
1268 in_modifier
= in_mod
>> 8;
1270 port_info
= &priv
->port
[port
];
1272 /* Slaves cannot perform SET_PORT operations except changing MTU */
1274 if (slave
!= dev
->caps
.function
&&
1275 in_modifier
!= MLX4_SET_PORT_GENERAL
&&
1276 in_modifier
!= MLX4_SET_PORT_GID_TABLE
) {
1277 mlx4_warn(dev
, "denying SET_PORT for slave:%d\n",
1281 switch (in_modifier
) {
1282 case MLX4_SET_PORT_RQP_CALC
:
1283 qpn_context
= inbox
->buf
;
1284 qpn_context
->base_qpn
=
1285 cpu_to_be32(port_info
->base_qpn
);
1286 qpn_context
->n_mac
= 0x7;
1287 promisc
= be32_to_cpu(qpn_context
->promisc
) >>
1288 SET_PORT_PROMISC_SHIFT
;
1289 qpn_context
->promisc
= cpu_to_be32(
1290 promisc
<< SET_PORT_PROMISC_SHIFT
|
1291 port_info
->base_qpn
);
1292 promisc
= be32_to_cpu(qpn_context
->mcast
) >>
1293 SET_PORT_MC_PROMISC_SHIFT
;
1294 qpn_context
->mcast
= cpu_to_be32(
1295 promisc
<< SET_PORT_MC_PROMISC_SHIFT
|
1296 port_info
->base_qpn
);
1298 case MLX4_SET_PORT_GENERAL
:
1299 gen_context
= inbox
->buf
;
1300 /* Mtu is configured as the max MTU among all the
1301 * the functions on the port. */
1302 mtu
= be16_to_cpu(gen_context
->mtu
);
1303 mtu
= min_t(int, mtu
, dev
->caps
.eth_mtu_cap
[port
] +
1304 ETH_HLEN
+ VLAN_HLEN
+ ETH_FCS_LEN
);
1305 prev_mtu
= slave_st
->mtu
[port
];
1306 slave_st
->mtu
[port
] = mtu
;
1307 if (mtu
> master
->max_mtu
[port
])
1308 master
->max_mtu
[port
] = mtu
;
1309 if (mtu
< prev_mtu
&& prev_mtu
==
1310 master
->max_mtu
[port
]) {
1311 slave_st
->mtu
[port
] = mtu
;
1312 master
->max_mtu
[port
] = mtu
;
1313 for (i
= 0; i
< dev
->num_slaves
; i
++) {
1314 master
->max_mtu
[port
] =
1315 max(master
->max_mtu
[port
],
1316 master
->slave_state
[i
].mtu
[port
]);
1320 gen_context
->mtu
= cpu_to_be16(master
->max_mtu
[port
]);
1321 /* Slave cannot change Global Pause configuration */
1322 if (slave
!= mlx4_master_func_num(dev
) &&
1323 ((gen_context
->pptx
!= master
->pptx
) ||
1324 (gen_context
->pprx
!= master
->pprx
))) {
1325 gen_context
->pptx
= master
->pptx
;
1326 gen_context
->pprx
= master
->pprx
;
1328 "denying Global Pause change for slave:%d\n",
1331 master
->pptx
= gen_context
->pptx
;
1332 master
->pprx
= gen_context
->pprx
;
1335 case MLX4_SET_PORT_GID_TABLE
:
1336 /* change to MULTIPLE entries: number of guest's gids
1337 * need a FOR-loop here over number of gids the guest has.
1338 * 1. Check no duplicates in gids passed by slave
1340 num_gids
= mlx4_get_slave_num_gids(dev
, slave
, port
);
1341 base
= mlx4_get_base_gid_ix(dev
, slave
, port
);
1342 gid_entry_mbox
= (struct mlx4_roce_gid_entry
*)(inbox
->buf
);
1343 for (i
= 0; i
< num_gids
; gid_entry_mbox
++, i
++) {
1344 if (!memcmp(gid_entry_mbox
->raw
, zgid_entry
.raw
,
1345 sizeof(zgid_entry
)))
1347 gid_entry_mb1
= gid_entry_mbox
+ 1;
1348 for (j
= i
+ 1; j
< num_gids
; gid_entry_mb1
++, j
++) {
1349 if (!memcmp(gid_entry_mb1
->raw
,
1350 zgid_entry
.raw
, sizeof(zgid_entry
)))
1352 if (!memcmp(gid_entry_mb1
->raw
, gid_entry_mbox
->raw
,
1353 sizeof(gid_entry_mbox
->raw
))) {
1354 /* found duplicate */
1360 /* 2. Check that do not have duplicates in OTHER
1361 * entries in the port GID table
1364 mutex_lock(&(priv
->port
[port
].gid_table
.mutex
));
1365 for (i
= 0; i
< MLX4_ROCE_MAX_GIDS
; i
++) {
1366 if (i
>= base
&& i
< base
+ num_gids
)
1367 continue; /* don't compare to slave's current gids */
1368 gid_entry_tbl
= &priv
->port
[port
].gid_table
.roce_gids
[i
];
1369 if (!memcmp(gid_entry_tbl
->raw
, zgid_entry
.raw
, sizeof(zgid_entry
)))
1371 gid_entry_mbox
= (struct mlx4_roce_gid_entry
*)(inbox
->buf
);
1372 for (j
= 0; j
< num_gids
; gid_entry_mbox
++, j
++) {
1373 if (!memcmp(gid_entry_mbox
->raw
, zgid_entry
.raw
,
1374 sizeof(zgid_entry
)))
1376 if (!memcmp(gid_entry_mbox
->raw
, gid_entry_tbl
->raw
,
1377 sizeof(gid_entry_tbl
->raw
))) {
1378 /* found duplicate */
1379 mlx4_warn(dev
, "requested gid entry for slave:%d is a duplicate of gid at index %d\n",
1381 mutex_unlock(&(priv
->port
[port
].gid_table
.mutex
));
1387 /* insert slave GIDs with memcpy, starting at slave's base index */
1388 gid_entry_mbox
= (struct mlx4_roce_gid_entry
*)(inbox
->buf
);
1389 for (i
= 0, offset
= base
; i
< num_gids
; gid_entry_mbox
++, offset
++, i
++)
1390 memcpy(priv
->port
[port
].gid_table
.roce_gids
[offset
].raw
,
1391 gid_entry_mbox
->raw
, MLX4_ROCE_GID_ENTRY_SIZE
);
1393 /* Now, copy roce port gids table to current mailbox for passing to FW */
1394 gid_entry_mbox
= (struct mlx4_roce_gid_entry
*)(inbox
->buf
);
1395 for (i
= 0; i
< MLX4_ROCE_MAX_GIDS
; gid_entry_mbox
++, i
++)
1396 memcpy(gid_entry_mbox
->raw
,
1397 priv
->port
[port
].gid_table
.roce_gids
[i
].raw
,
1398 MLX4_ROCE_GID_ENTRY_SIZE
);
1400 err
= mlx4_cmd(dev
, inbox
->dma
, in_mod
& 0xffff, op_mod
,
1401 MLX4_CMD_SET_PORT
, MLX4_CMD_TIME_CLASS_B
,
1403 mutex_unlock(&(priv
->port
[port
].gid_table
.mutex
));
1407 return mlx4_cmd(dev
, inbox
->dma
, in_mod
& 0xffff, op_mod
,
1408 MLX4_CMD_SET_PORT
, MLX4_CMD_TIME_CLASS_B
,
1412 /* Slaves are not allowed to SET_PORT beacon (LED) blink */
1413 if (op_mod
== MLX4_SET_PORT_BEACON_OPCODE
) {
1414 mlx4_warn(dev
, "denying SET_PORT Beacon slave:%d\n", slave
);
1418 /* For IB, we only consider:
1419 * - The capability mask, which is set to the aggregate of all
1420 * slave function capabilities
1421 * - The QKey violatin counter - reset according to each request.
1424 if (dev
->flags
& MLX4_FLAG_OLD_PORT_CMDS
) {
1425 reset_qkey_viols
= (*(u8
*) inbox
->buf
) & 0x40;
1426 new_cap_mask
= ((__be32
*) inbox
->buf
)[2];
1428 reset_qkey_viols
= ((u8
*) inbox
->buf
)[3] & 0x1;
1429 new_cap_mask
= ((__be32
*) inbox
->buf
)[1];
1432 /* slave may not set the IS_SM capability for the port */
1433 if (slave
!= mlx4_master_func_num(dev
) &&
1434 (be32_to_cpu(new_cap_mask
) & MLX4_PORT_CAP_IS_SM
))
1437 /* No DEV_MGMT in multifunc mode */
1438 if (mlx4_is_mfunc(dev
) &&
1439 (be32_to_cpu(new_cap_mask
) & MLX4_PORT_CAP_DEV_MGMT_SUP
))
1444 priv
->mfunc
.master
.slave_state
[slave
].ib_cap_mask
[port
];
1445 priv
->mfunc
.master
.slave_state
[slave
].ib_cap_mask
[port
] = new_cap_mask
;
1446 for (i
= 0; i
< dev
->num_slaves
; i
++)
1448 priv
->mfunc
.master
.slave_state
[i
].ib_cap_mask
[port
];
1450 /* only clear mailbox for guests. Master may be setting
1451 * MTU or PKEY table size
1453 if (slave
!= dev
->caps
.function
)
1454 memset(inbox
->buf
, 0, 256);
1455 if (dev
->flags
& MLX4_FLAG_OLD_PORT_CMDS
) {
1456 *(u8
*) inbox
->buf
|= !!reset_qkey_viols
<< 6;
1457 ((__be32
*) inbox
->buf
)[2] = agg_cap_mask
;
1459 ((u8
*) inbox
->buf
)[3] |= !!reset_qkey_viols
;
1460 ((__be32
*) inbox
->buf
)[1] = agg_cap_mask
;
1463 err
= mlx4_cmd(dev
, inbox
->dma
, port
, is_eth
, MLX4_CMD_SET_PORT
,
1464 MLX4_CMD_TIME_CLASS_B
, MLX4_CMD_NATIVE
);
1466 priv
->mfunc
.master
.slave_state
[slave
].ib_cap_mask
[port
] =
1471 int mlx4_SET_PORT_wrapper(struct mlx4_dev
*dev
, int slave
,
1472 struct mlx4_vhcr
*vhcr
,
1473 struct mlx4_cmd_mailbox
*inbox
,
1474 struct mlx4_cmd_mailbox
*outbox
,
1475 struct mlx4_cmd_info
*cmd
)
1477 int port
= mlx4_slave_convert_port(
1478 dev
, slave
, vhcr
->in_modifier
& 0xFF);
1483 vhcr
->in_modifier
= (vhcr
->in_modifier
& ~0xFF) |
1486 return mlx4_common_set_port(dev
, slave
, vhcr
->in_modifier
,
1487 vhcr
->op_modifier
, inbox
);
1490 /* bit locations for set port command with zero op modifier */
1492 MLX4_SET_PORT_VL_CAP
= 4, /* bits 7:4 */
1493 MLX4_SET_PORT_MTU_CAP
= 12, /* bits 15:12 */
1494 MLX4_CHANGE_PORT_PKEY_TBL_SZ
= 20,
1495 MLX4_CHANGE_PORT_VL_CAP
= 21,
1496 MLX4_CHANGE_PORT_MTU_CAP
= 22,
1499 int mlx4_SET_PORT(struct mlx4_dev
*dev
, u8 port
, int pkey_tbl_sz
)
1501 struct mlx4_cmd_mailbox
*mailbox
;
1502 int err
, vl_cap
, pkey_tbl_flag
= 0;
1504 if (dev
->caps
.port_type
[port
] == MLX4_PORT_TYPE_ETH
)
1507 mailbox
= mlx4_alloc_cmd_mailbox(dev
);
1508 if (IS_ERR(mailbox
))
1509 return PTR_ERR(mailbox
);
1511 ((__be32
*) mailbox
->buf
)[1] = dev
->caps
.ib_port_def_cap
[port
];
1513 if (pkey_tbl_sz
>= 0 && mlx4_is_master(dev
)) {
1515 ((__be16
*) mailbox
->buf
)[20] = cpu_to_be16(pkey_tbl_sz
);
1518 /* IB VL CAP enum isn't used by the firmware, just numerical values */
1519 for (vl_cap
= 8; vl_cap
>= 1; vl_cap
>>= 1) {
1520 ((__be32
*) mailbox
->buf
)[0] = cpu_to_be32(
1521 (1 << MLX4_CHANGE_PORT_MTU_CAP
) |
1522 (1 << MLX4_CHANGE_PORT_VL_CAP
) |
1523 (pkey_tbl_flag
<< MLX4_CHANGE_PORT_PKEY_TBL_SZ
) |
1524 (dev
->caps
.port_ib_mtu
[port
] << MLX4_SET_PORT_MTU_CAP
) |
1525 (vl_cap
<< MLX4_SET_PORT_VL_CAP
));
1526 err
= mlx4_cmd(dev
, mailbox
->dma
, port
,
1527 MLX4_SET_PORT_IB_OPCODE
, MLX4_CMD_SET_PORT
,
1528 MLX4_CMD_TIME_CLASS_B
, MLX4_CMD_WRAPPED
);
1533 mlx4_free_cmd_mailbox(dev
, mailbox
);
1537 #define SET_PORT_ROCE_2_FLAGS 0x10
1538 #define MLX4_SET_PORT_ROCE_V1_V2 0x2
1539 int mlx4_SET_PORT_general(struct mlx4_dev
*dev
, u8 port
, int mtu
,
1540 u8 pptx
, u8 pfctx
, u8 pprx
, u8 pfcrx
)
1542 struct mlx4_cmd_mailbox
*mailbox
;
1543 struct mlx4_set_port_general_context
*context
;
1547 mailbox
= mlx4_alloc_cmd_mailbox(dev
);
1548 if (IS_ERR(mailbox
))
1549 return PTR_ERR(mailbox
);
1550 context
= mailbox
->buf
;
1551 context
->flags
= SET_PORT_GEN_ALL_VALID
;
1552 context
->mtu
= cpu_to_be16(mtu
);
1553 context
->pptx
= (pptx
* (!pfctx
)) << 7;
1554 context
->pfctx
= pfctx
;
1555 context
->pprx
= (pprx
* (!pfcrx
)) << 7;
1556 context
->pfcrx
= pfcrx
;
1558 if (dev
->caps
.flags2
& MLX4_DEV_CAP_FLAG2_ROCE_V1_V2
) {
1559 context
->flags
|= SET_PORT_ROCE_2_FLAGS
;
1560 context
->roce_mode
|=
1561 MLX4_SET_PORT_ROCE_V1_V2
<< 4;
1563 in_mod
= MLX4_SET_PORT_GENERAL
<< 8 | port
;
1564 err
= mlx4_cmd(dev
, mailbox
->dma
, in_mod
, MLX4_SET_PORT_ETH_OPCODE
,
1565 MLX4_CMD_SET_PORT
, MLX4_CMD_TIME_CLASS_B
,
1568 mlx4_free_cmd_mailbox(dev
, mailbox
);
1571 EXPORT_SYMBOL(mlx4_SET_PORT_general
);
1573 int mlx4_SET_PORT_qpn_calc(struct mlx4_dev
*dev
, u8 port
, u32 base_qpn
,
1576 struct mlx4_cmd_mailbox
*mailbox
;
1577 struct mlx4_set_port_rqp_calc_context
*context
;
1580 u32 m_promisc
= (dev
->caps
.flags
& MLX4_DEV_CAP_FLAG_VEP_MC_STEER
) ?
1581 MCAST_DIRECT
: MCAST_DEFAULT
;
1583 if (dev
->caps
.steering_mode
!= MLX4_STEERING_MODE_A0
)
1586 mailbox
= mlx4_alloc_cmd_mailbox(dev
);
1587 if (IS_ERR(mailbox
))
1588 return PTR_ERR(mailbox
);
1589 context
= mailbox
->buf
;
1590 context
->base_qpn
= cpu_to_be32(base_qpn
);
1591 context
->n_mac
= dev
->caps
.log_num_macs
;
1592 context
->promisc
= cpu_to_be32(promisc
<< SET_PORT_PROMISC_SHIFT
|
1594 context
->mcast
= cpu_to_be32(m_promisc
<< SET_PORT_MC_PROMISC_SHIFT
|
1596 context
->intra_no_vlan
= 0;
1597 context
->no_vlan
= MLX4_NO_VLAN_IDX
;
1598 context
->intra_vlan_miss
= 0;
1599 context
->vlan_miss
= MLX4_VLAN_MISS_IDX
;
1601 in_mod
= MLX4_SET_PORT_RQP_CALC
<< 8 | port
;
1602 err
= mlx4_cmd(dev
, mailbox
->dma
, in_mod
, MLX4_SET_PORT_ETH_OPCODE
,
1603 MLX4_CMD_SET_PORT
, MLX4_CMD_TIME_CLASS_B
,
1606 mlx4_free_cmd_mailbox(dev
, mailbox
);
1609 EXPORT_SYMBOL(mlx4_SET_PORT_qpn_calc
);
1611 int mlx4_SET_PORT_fcs_check(struct mlx4_dev
*dev
, u8 port
, u8 ignore_fcs_value
)
1613 struct mlx4_cmd_mailbox
*mailbox
;
1614 struct mlx4_set_port_general_context
*context
;
1618 mailbox
= mlx4_alloc_cmd_mailbox(dev
);
1619 if (IS_ERR(mailbox
))
1620 return PTR_ERR(mailbox
);
1621 context
= mailbox
->buf
;
1622 context
->v_ignore_fcs
|= MLX4_FLAG_V_IGNORE_FCS_MASK
;
1623 if (ignore_fcs_value
)
1624 context
->ignore_fcs
|= MLX4_IGNORE_FCS_MASK
;
1626 context
->ignore_fcs
&= ~MLX4_IGNORE_FCS_MASK
;
1628 in_mod
= MLX4_SET_PORT_GENERAL
<< 8 | port
;
1629 err
= mlx4_cmd(dev
, mailbox
->dma
, in_mod
, 1, MLX4_CMD_SET_PORT
,
1630 MLX4_CMD_TIME_CLASS_B
, MLX4_CMD_NATIVE
);
1632 mlx4_free_cmd_mailbox(dev
, mailbox
);
1635 EXPORT_SYMBOL(mlx4_SET_PORT_fcs_check
);
1638 VXLAN_ENABLE_MODIFY
= 1 << 7,
1639 VXLAN_STEERING_MODIFY
= 1 << 6,
1641 VXLAN_ENABLE
= 1 << 7,
1644 struct mlx4_set_port_vxlan_context
{
1652 int mlx4_SET_PORT_VXLAN(struct mlx4_dev
*dev
, u8 port
, u8 steering
, int enable
)
1656 struct mlx4_cmd_mailbox
*mailbox
;
1657 struct mlx4_set_port_vxlan_context
*context
;
1659 mailbox
= mlx4_alloc_cmd_mailbox(dev
);
1660 if (IS_ERR(mailbox
))
1661 return PTR_ERR(mailbox
);
1662 context
= mailbox
->buf
;
1663 memset(context
, 0, sizeof(*context
));
1665 context
->modify_flags
= VXLAN_ENABLE_MODIFY
| VXLAN_STEERING_MODIFY
;
1667 context
->enable_flags
= VXLAN_ENABLE
;
1668 context
->steering
= steering
;
1670 in_mod
= MLX4_SET_PORT_VXLAN
<< 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
,
1675 mlx4_free_cmd_mailbox(dev
, mailbox
);
1678 EXPORT_SYMBOL(mlx4_SET_PORT_VXLAN
);
1680 int mlx4_SET_PORT_BEACON(struct mlx4_dev
*dev
, u8 port
, u16 time
)
1683 struct mlx4_cmd_mailbox
*mailbox
;
1685 mailbox
= mlx4_alloc_cmd_mailbox(dev
);
1686 if (IS_ERR(mailbox
))
1687 return PTR_ERR(mailbox
);
1689 *((__be32
*)mailbox
->buf
) = cpu_to_be32(time
);
1691 err
= mlx4_cmd(dev
, mailbox
->dma
, port
, MLX4_SET_PORT_BEACON_OPCODE
,
1692 MLX4_CMD_SET_PORT
, MLX4_CMD_TIME_CLASS_B
,
1695 mlx4_free_cmd_mailbox(dev
, mailbox
);
1698 EXPORT_SYMBOL(mlx4_SET_PORT_BEACON
);
1700 int mlx4_SET_MCAST_FLTR_wrapper(struct mlx4_dev
*dev
, int slave
,
1701 struct mlx4_vhcr
*vhcr
,
1702 struct mlx4_cmd_mailbox
*inbox
,
1703 struct mlx4_cmd_mailbox
*outbox
,
1704 struct mlx4_cmd_info
*cmd
)
1711 int mlx4_SET_MCAST_FLTR(struct mlx4_dev
*dev
, u8 port
,
1712 u64 mac
, u64 clear
, u8 mode
)
1714 return mlx4_cmd(dev
, (mac
| (clear
<< 63)), port
, mode
,
1715 MLX4_CMD_SET_MCAST_FLTR
, MLX4_CMD_TIME_CLASS_B
,
1718 EXPORT_SYMBOL(mlx4_SET_MCAST_FLTR
);
1720 int mlx4_SET_VLAN_FLTR_wrapper(struct mlx4_dev
*dev
, int slave
,
1721 struct mlx4_vhcr
*vhcr
,
1722 struct mlx4_cmd_mailbox
*inbox
,
1723 struct mlx4_cmd_mailbox
*outbox
,
1724 struct mlx4_cmd_info
*cmd
)
1731 int mlx4_common_dump_eth_stats(struct mlx4_dev
*dev
, int slave
,
1732 u32 in_mod
, struct mlx4_cmd_mailbox
*outbox
)
1734 return mlx4_cmd_box(dev
, 0, outbox
->dma
, in_mod
, 0,
1735 MLX4_CMD_DUMP_ETH_STATS
, MLX4_CMD_TIME_CLASS_B
,
1739 int mlx4_DUMP_ETH_STATS_wrapper(struct mlx4_dev
*dev
, int slave
,
1740 struct mlx4_vhcr
*vhcr
,
1741 struct mlx4_cmd_mailbox
*inbox
,
1742 struct mlx4_cmd_mailbox
*outbox
,
1743 struct mlx4_cmd_info
*cmd
)
1745 if (slave
!= dev
->caps
.function
)
1747 return mlx4_common_dump_eth_stats(dev
, slave
,
1748 vhcr
->in_modifier
, outbox
);
1751 int mlx4_get_slave_from_roce_gid(struct mlx4_dev
*dev
, int port
, u8
*gid
,
1754 struct mlx4_priv
*priv
= mlx4_priv(dev
);
1755 int i
, found_ix
= -1;
1756 int vf_gids
= MLX4_ROCE_MAX_GIDS
- MLX4_ROCE_PF_GIDS
;
1757 struct mlx4_slaves_pport slaves_pport
;
1761 if (!mlx4_is_mfunc(dev
))
1764 slaves_pport
= mlx4_phys_to_slaves_pport(dev
, port
);
1765 num_vfs
= bitmap_weight(slaves_pport
.slaves
,
1766 dev
->persist
->num_vfs
+ 1) - 1;
1768 for (i
= 0; i
< MLX4_ROCE_MAX_GIDS
; i
++) {
1769 if (!memcmp(priv
->port
[port
].gid_table
.roce_gids
[i
].raw
, gid
,
1770 MLX4_ROCE_GID_ENTRY_SIZE
)) {
1776 if (found_ix
>= 0) {
1777 /* Calculate a slave_gid which is the slave number in the gid
1778 * table and not a globally unique slave number.
1780 if (found_ix
< MLX4_ROCE_PF_GIDS
)
1782 else if (found_ix
< MLX4_ROCE_PF_GIDS
+ (vf_gids
% num_vfs
) *
1783 (vf_gids
/ num_vfs
+ 1))
1784 slave_gid
= ((found_ix
- MLX4_ROCE_PF_GIDS
) /
1785 (vf_gids
/ num_vfs
+ 1)) + 1;
1788 ((found_ix
- MLX4_ROCE_PF_GIDS
-
1789 ((vf_gids
% num_vfs
) * ((vf_gids
/ num_vfs
+ 1)))) /
1790 (vf_gids
/ num_vfs
)) + vf_gids
% num_vfs
+ 1;
1792 /* Calculate the globally unique slave id */
1794 struct mlx4_active_ports exclusive_ports
;
1795 struct mlx4_active_ports actv_ports
;
1796 struct mlx4_slaves_pport slaves_pport_actv
;
1797 unsigned max_port_p_one
;
1798 int num_vfs_before
= 0;
1799 int candidate_slave_gid
;
1801 /* Calculate how many VFs are on the previous port, if exists */
1802 for (i
= 1; i
< port
; i
++) {
1803 bitmap_zero(exclusive_ports
.ports
, dev
->caps
.num_ports
);
1804 set_bit(i
- 1, exclusive_ports
.ports
);
1806 mlx4_phys_to_slaves_pport_actv(
1807 dev
, &exclusive_ports
);
1808 num_vfs_before
+= bitmap_weight(
1809 slaves_pport_actv
.slaves
,
1810 dev
->persist
->num_vfs
+ 1);
1813 /* candidate_slave_gid isn't necessarily the correct slave, but
1814 * it has the same number of ports and is assigned to the same
1815 * ports as the real slave we're looking for. On dual port VF,
1816 * slave_gid = [single port VFs on port <port>] +
1817 * [offset of the current slave from the first dual port VF] +
1820 candidate_slave_gid
= slave_gid
+ num_vfs_before
;
1822 actv_ports
= mlx4_get_active_ports(dev
, candidate_slave_gid
);
1823 max_port_p_one
= find_first_bit(
1824 actv_ports
.ports
, dev
->caps
.num_ports
) +
1825 bitmap_weight(actv_ports
.ports
,
1826 dev
->caps
.num_ports
) + 1;
1828 /* Calculate the real slave number */
1829 for (i
= 1; i
< max_port_p_one
; i
++) {
1832 bitmap_zero(exclusive_ports
.ports
,
1833 dev
->caps
.num_ports
);
1834 set_bit(i
- 1, exclusive_ports
.ports
);
1836 mlx4_phys_to_slaves_pport_actv(
1837 dev
, &exclusive_ports
);
1838 slave_gid
+= bitmap_weight(
1839 slaves_pport_actv
.slaves
,
1840 dev
->persist
->num_vfs
+ 1);
1843 *slave_id
= slave_gid
;
1846 return (found_ix
>= 0) ? 0 : -EINVAL
;
1848 EXPORT_SYMBOL(mlx4_get_slave_from_roce_gid
);
1850 int mlx4_get_roce_gid_from_slave(struct mlx4_dev
*dev
, int port
, int slave_id
,
1853 struct mlx4_priv
*priv
= mlx4_priv(dev
);
1855 if (!mlx4_is_master(dev
))
1858 memcpy(gid
, priv
->port
[port
].gid_table
.roce_gids
[slave_id
].raw
,
1859 MLX4_ROCE_GID_ENTRY_SIZE
);
1862 EXPORT_SYMBOL(mlx4_get_roce_gid_from_slave
);
1864 /* Cable Module Info */
1865 #define MODULE_INFO_MAX_READ 48
1867 #define I2C_ADDR_LOW 0x50
1868 #define I2C_ADDR_HIGH 0x51
1869 #define I2C_PAGE_SIZE 256
1871 /* Module Info Data */
1872 struct mlx4_cable_info
{
1875 __be16 dev_mem_address
;
1878 __be32 reserved2
[2];
1879 u8 data
[MODULE_INFO_MAX_READ
];
1882 enum cable_info_err
{
1883 CABLE_INF_INV_PORT
= 0x1,
1884 CABLE_INF_OP_NOSUP
= 0x2,
1885 CABLE_INF_NOT_CONN
= 0x3,
1886 CABLE_INF_NO_EEPRM
= 0x4,
1887 CABLE_INF_PAGE_ERR
= 0x5,
1888 CABLE_INF_INV_ADDR
= 0x6,
1889 CABLE_INF_I2C_ADDR
= 0x7,
1890 CABLE_INF_QSFP_VIO
= 0x8,
1891 CABLE_INF_I2C_BUSY
= 0x9,
1894 #define MAD_STATUS_2_CABLE_ERR(mad_status) ((mad_status >> 8) & 0xFF)
1896 static inline const char *cable_info_mad_err_str(u16 mad_status
)
1898 u8 err
= MAD_STATUS_2_CABLE_ERR(mad_status
);
1901 case CABLE_INF_INV_PORT
:
1902 return "invalid port selected";
1903 case CABLE_INF_OP_NOSUP
:
1904 return "operation not supported for this port (the port is of type CX4 or internal)";
1905 case CABLE_INF_NOT_CONN
:
1906 return "cable is not connected";
1907 case CABLE_INF_NO_EEPRM
:
1908 return "the connected cable has no EPROM (passive copper cable)";
1909 case CABLE_INF_PAGE_ERR
:
1910 return "page number is greater than 15";
1911 case CABLE_INF_INV_ADDR
:
1912 return "invalid device_address or size (that is, size equals 0 or address+size is greater than 256)";
1913 case CABLE_INF_I2C_ADDR
:
1914 return "invalid I2C slave address";
1915 case CABLE_INF_QSFP_VIO
:
1916 return "at least one cable violates the QSFP specification and ignores the modsel signal";
1917 case CABLE_INF_I2C_BUSY
:
1918 return "I2C bus is constantly busy";
1920 return "Unknown Error";
1924 * mlx4_get_module_info - Read cable module eeprom data
1926 * @port: port number.
1927 * @offset: byte offset in eeprom to start reading data from.
1928 * @size: num of bytes to read.
1929 * @data: output buffer to put the requested data into.
1931 * Reads cable module eeprom data, puts the outcome data into
1932 * data pointer paramer.
1933 * Returns num of read bytes on success or a negative error
1936 int mlx4_get_module_info(struct mlx4_dev
*dev
, u8 port
,
1937 u16 offset
, u16 size
, u8
*data
)
1939 struct mlx4_cmd_mailbox
*inbox
, *outbox
;
1940 struct mlx4_mad_ifc
*inmad
, *outmad
;
1941 struct mlx4_cable_info
*cable_info
;
1945 if (size
> MODULE_INFO_MAX_READ
)
1946 size
= MODULE_INFO_MAX_READ
;
1948 inbox
= mlx4_alloc_cmd_mailbox(dev
);
1950 return PTR_ERR(inbox
);
1952 outbox
= mlx4_alloc_cmd_mailbox(dev
);
1953 if (IS_ERR(outbox
)) {
1954 mlx4_free_cmd_mailbox(dev
, inbox
);
1955 return PTR_ERR(outbox
);
1958 inmad
= (struct mlx4_mad_ifc
*)(inbox
->buf
);
1959 outmad
= (struct mlx4_mad_ifc
*)(outbox
->buf
);
1961 inmad
->method
= 0x1; /* Get */
1962 inmad
->class_version
= 0x1;
1963 inmad
->mgmt_class
= 0x1;
1964 inmad
->base_version
= 0x1;
1965 inmad
->attr_id
= cpu_to_be16(0xFF60); /* Module Info */
1967 if (offset
< I2C_PAGE_SIZE
&& offset
+ size
> I2C_PAGE_SIZE
)
1968 /* Cross pages reads are not allowed
1969 * read until offset 256 in low page
1971 size
-= offset
+ size
- I2C_PAGE_SIZE
;
1973 i2c_addr
= I2C_ADDR_LOW
;
1974 if (offset
>= I2C_PAGE_SIZE
) {
1975 /* Reset offset to high page */
1976 i2c_addr
= I2C_ADDR_HIGH
;
1977 offset
-= I2C_PAGE_SIZE
;
1980 cable_info
= (struct mlx4_cable_info
*)inmad
->data
;
1981 cable_info
->dev_mem_address
= cpu_to_be16(offset
);
1982 cable_info
->page_num
= 0;
1983 cable_info
->i2c_addr
= i2c_addr
;
1984 cable_info
->size
= cpu_to_be16(size
);
1986 ret
= mlx4_cmd_box(dev
, inbox
->dma
, outbox
->dma
, port
, 3,
1987 MLX4_CMD_MAD_IFC
, MLX4_CMD_TIME_CLASS_C
,
1992 if (be16_to_cpu(outmad
->status
)) {
1993 /* Mad returned with bad status */
1994 ret
= be16_to_cpu(outmad
->status
);
1996 "MLX4_CMD_MAD_IFC Get Module info attr(%x) port(%d) i2c_addr(%x) offset(%d) size(%d): Response Mad Status(%x) - %s\n",
1997 0xFF60, port
, i2c_addr
, offset
, size
,
1998 ret
, cable_info_mad_err_str(ret
));
2000 if (i2c_addr
== I2C_ADDR_HIGH
&&
2001 MAD_STATUS_2_CABLE_ERR(ret
) == CABLE_INF_I2C_ADDR
)
2002 /* Some SFP cables do not support i2c slave
2003 * address 0x51 (high page), abort silently.
2010 cable_info
= (struct mlx4_cable_info
*)outmad
->data
;
2011 memcpy(data
, cable_info
->data
, size
);
2014 mlx4_free_cmd_mailbox(dev
, inbox
);
2015 mlx4_free_cmd_mailbox(dev
, outbox
);
2018 EXPORT_SYMBOL(mlx4_get_module_info
);
2020 int mlx4_max_tc(struct mlx4_dev
*dev
)
2022 u8 num_tc
= dev
->caps
.max_tc_eth
;
2025 num_tc
= MLX4_TC_MAX_NUMBER
;
2029 EXPORT_SYMBOL(mlx4_max_tc
);