Skip to content

Commit 7ff93f8

Browse files
Yevgeny PetrilinRoland Dreier
authored andcommitted
mlx4_core: Multiple port type support
Multi-protocol adapters support different port types. Each consumer of mlx4_core queries for supported port types; in particular mlx4_ib can no longer assume that all physical ports belong to it. Port type is configured through a sysfs interface. When the type of a port is changed, all mlx4 interfaces are unregistered, and then registered again with the new port types. Signed-off-by: Yevgeny Petrilin <[email protected]> Signed-off-by: Roland Dreier <[email protected]>
1 parent 2a2336f commit 7ff93f8

File tree

9 files changed

+266
-11
lines changed

9 files changed

+266
-11
lines changed

drivers/infiniband/hw/mlx4/mad.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ int mlx4_ib_mad_init(struct mlx4_ib_dev *dev)
298298
int p, q;
299299
int ret;
300300

301-
for (p = 0; p < dev->dev->caps.num_ports; ++p)
301+
for (p = 0; p < dev->num_ports; ++p)
302302
for (q = 0; q <= 1; ++q) {
303303
agent = ib_register_mad_agent(&dev->ib_dev, p + 1,
304304
q ? IB_QPT_GSI : IB_QPT_SMI,
@@ -314,7 +314,7 @@ int mlx4_ib_mad_init(struct mlx4_ib_dev *dev)
314314
return 0;
315315

316316
err:
317-
for (p = 0; p < dev->dev->caps.num_ports; ++p)
317+
for (p = 0; p < dev->num_ports; ++p)
318318
for (q = 0; q <= 1; ++q)
319319
if (dev->send_agent[p][q])
320320
ib_unregister_mad_agent(dev->send_agent[p][q]);
@@ -327,7 +327,7 @@ void mlx4_ib_mad_cleanup(struct mlx4_ib_dev *dev)
327327
struct ib_mad_agent *agent;
328328
int p, q;
329329

330-
for (p = 0; p < dev->dev->caps.num_ports; ++p) {
330+
for (p = 0; p < dev->num_ports; ++p) {
331331
for (q = 0; q <= 1; ++q) {
332332
agent = dev->send_agent[p][q];
333333
dev->send_agent[p][q] = NULL;

drivers/infiniband/hw/mlx4/main.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,10 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
574574
ibdev->ib_dev.owner = THIS_MODULE;
575575
ibdev->ib_dev.node_type = RDMA_NODE_IB_CA;
576576
ibdev->ib_dev.local_dma_lkey = dev->caps.reserved_lkey;
577-
ibdev->ib_dev.phys_port_cnt = dev->caps.num_ports;
577+
ibdev->num_ports = 0;
578+
mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB)
579+
ibdev->num_ports++;
580+
ibdev->ib_dev.phys_port_cnt = ibdev->num_ports;
578581
ibdev->ib_dev.num_comp_vectors = 1;
579582
ibdev->ib_dev.dma_device = &dev->pdev->dev;
580583

@@ -691,7 +694,7 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr)
691694
struct mlx4_ib_dev *ibdev = ibdev_ptr;
692695
int p;
693696

694-
for (p = 1; p <= dev->caps.num_ports; ++p)
697+
for (p = 1; p <= ibdev->num_ports; ++p)
695698
mlx4_CLOSE_PORT(dev, p);
696699

697700
mlx4_ib_mad_cleanup(ibdev);
@@ -706,6 +709,10 @@ static void mlx4_ib_event(struct mlx4_dev *dev, void *ibdev_ptr,
706709
enum mlx4_dev_event event, int port)
707710
{
708711
struct ib_event ibev;
712+
struct mlx4_ib_dev *ibdev = to_mdev((struct ib_device *) ibdev_ptr);
713+
714+
if (port > ibdev->num_ports)
715+
return;
709716

710717
switch (event) {
711718
case MLX4_DEV_EVENT_PORT_UP:

drivers/infiniband/hw/mlx4/mlx4_ib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ struct mlx4_ib_ah {
162162
struct mlx4_ib_dev {
163163
struct ib_device ib_dev;
164164
struct mlx4_dev *dev;
165+
int num_ports;
165166
void __iomem *uar_map;
166167

167168
struct mlx4_uar priv_uar;

drivers/net/mlx4/fw.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ static void dump_dev_cap_flags(struct mlx4_dev *dev, u32 flags)
8888
[ 8] = "P_Key violation counter",
8989
[ 9] = "Q_Key violation counter",
9090
[10] = "VMM",
91+
[12] = "DPDP",
9192
[16] = "MW support",
9293
[17] = "APM support",
9394
[18] = "Atomic ops support",
@@ -354,6 +355,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
354355
dev_cap->max_pkeys[i] = 1 << (field & 0xf);
355356
}
356357
} else {
358+
#define QUERY_PORT_SUPPORTED_TYPE_OFFSET 0x00
357359
#define QUERY_PORT_MTU_OFFSET 0x01
358360
#define QUERY_PORT_ETH_MTU_OFFSET 0x02
359361
#define QUERY_PORT_WIDTH_OFFSET 0x06
@@ -368,6 +370,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
368370
if (err)
369371
goto out;
370372

373+
MLX4_GET(field, outbox, QUERY_PORT_SUPPORTED_TYPE_OFFSET);
374+
dev_cap->supported_port_types[i] = field & 3;
371375
MLX4_GET(field, outbox, QUERY_PORT_MTU_OFFSET);
372376
dev_cap->ib_mtu[i] = field & 0xf;
373377
MLX4_GET(field, outbox, QUERY_PORT_WIDTH_OFFSET);

drivers/net/mlx4/fw.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ struct mlx4_dev_cap {
104104
u32 reserved_lkey;
105105
u64 max_icm_sz;
106106
int max_gso_sz;
107+
u8 supported_port_types[MLX4_MAX_PORTS + 1];
107108
u8 log_max_macs[MLX4_MAX_PORTS + 1];
108109
u8 log_max_vlans[MLX4_MAX_PORTS + 1];
109110
};

0 commit comments

Comments
 (0)