RDMA: Fix link active_speed size
authorAharon Landau <aharonl@mellanox.com>
Thu, 17 Sep 2020 09:02:23 +0000 (12:02 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Fri, 18 Sep 2020 13:31:24 +0000 (10:31 -0300)
According to the IB spec active_speed size should be u16 and not u8 as
before. Changing it to allow further extensions in offered speeds.

Link: https://lore.kernel.org/r/20200917090223.1018224-4-leon@kernel.org
Signed-off-by: Aharon Landau <aharonl@mellanox.com>
Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/core/uverbs_std_types_device.c
drivers/infiniband/core/verbs.c
drivers/infiniband/hw/bnxt_re/bnxt_re.h
drivers/infiniband/hw/hfi1/verbs.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
drivers/infiniband/hw/qedr/verbs.c
drivers/infiniband/hw/qib/qib.h
drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.h
include/rdma/ib_verbs.h

index 75df209..9f43c01 100644 (file)
@@ -165,7 +165,8 @@ void copy_port_attr_to_resp(struct ib_port_attr *attr,
        resp->subnet_timeout = attr->subnet_timeout;
        resp->init_type_reply = attr->init_type_reply;
        resp->active_width = attr->active_width;
-       resp->active_speed = attr->active_speed;
+       /* This ABI needs to be extended to provide any speed more than IB_SPEED_NDR */
+       resp->active_speed = min_t(u16, attr->active_speed, IB_SPEED_NDR);
        resp->phys_state = attr->phys_state;
        resp->link_layer = rdma_port_get_link_layer(ib_dev, port_num);
 }
index 3078867..f5f8959 100644 (file)
@@ -1781,7 +1781,7 @@ int ib_modify_qp_with_udata(struct ib_qp *ib_qp, struct ib_qp_attr *attr,
 }
 EXPORT_SYMBOL(ib_modify_qp_with_udata);
 
-int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u8 *speed, u8 *width)
+int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u16 *speed, u8 *width)
 {
        int rc;
        u32 netdev_speed;
index a300588..b930ea3 100644 (file)
@@ -150,7 +150,7 @@ struct bnxt_re_dev {
 
        struct delayed_work             worker;
        u8                              cur_prio_map;
-       u                             active_speed;
+       u16                             active_speed;
        u8                              active_width;
 
        /* FP Notification Queue (CQ & SRQ) */
index 3086563..3591923 100644 (file)
@@ -1424,7 +1424,7 @@ static int query_port(struct rvt_dev_info *rdi, u8 port_num,
        props->gid_tbl_len = HFI1_GUIDS_PER_PORT;
        props->active_width = (u8)opa_width_to_ib(ppd->link_width_active);
        /* see rate_show() in ib core/sysfs.c */
-       props->active_speed = (u8)opa_speed_to_ib(ppd->link_speed_active);
+       props->active_speed = opa_speed_to_ib(ppd->link_speed_active);
        props->max_vl_num = ppd->vls_supported;
 
        /* Once we are a "first class" citizen and have added the OPA MTUs to
index 2dbacf0..b13d1be 100644 (file)
@@ -457,7 +457,6 @@ static int mlx5_query_port_roce(struct ib_device *device, u8 port_num,
        bool put_mdev = true;
        u16 qkey_viol_cntr;
        u32 eth_prot_oper;
-       u16 active_speed;
        u8 mdev_port_num;
        bool ext;
        int err;
@@ -491,12 +490,9 @@ static int mlx5_query_port_roce(struct ib_device *device, u8 port_num,
        props->active_width     = IB_WIDTH_4X;
        props->active_speed     = IB_SPEED_QDR;
 
-       translate_eth_proto_oper(eth_prot_oper, &active_speed,
+       translate_eth_proto_oper(eth_prot_oper, &props->active_speed,
                                 &props->active_width, ext);
 
-       WARN_ON_ONCE(active_speed & ~0xFF);
-       props->active_speed = (u8)active_speed;
-
        props->port_cap_flags |= IB_PORT_CM_SUP;
        props->ip_gids = true;
 
@@ -1307,7 +1303,7 @@ static int mlx5_query_hca_port(struct ib_device *ibdev, u8 port,
                props->port_cap_flags2 = rep->cap_mask2;
 
        err = mlx5_query_ib_port_oper(mdev, &ib_link_width_oper,
-                                     (u16 *)&props->active_speed, port);
+                                     &props->active_speed, port);
        if (err)
                goto out;
 
index c1751c9..8cf237d 100644 (file)
@@ -112,7 +112,7 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr,
 }
 
 static inline void get_link_speed_and_width(struct ocrdma_dev *dev,
-                                           u8 *ib_speed, u8 *ib_width)
+                                           u16 *ib_speed, u8 *ib_width)
 {
        int status;
        u8 speed;
index b49bef9..b138451 100644 (file)
@@ -163,7 +163,7 @@ int qedr_query_device(struct ib_device *ibdev,
        return 0;
 }
 
-static inline void get_link_speed_and_width(int speed, u8 *ib_speed,
+static inline void get_link_speed_and_width(int speed, u16 *ib_speed,
                                            u8 *ib_width)
 {
        switch (speed) {
index 432d6d0..ee21142 100644 (file)
@@ -619,11 +619,11 @@ struct qib_pportdata {
        /* LID mask control */
        u8 lmc;
        u8 link_width_supported;
-       u8 link_speed_supported;
+       u16 link_speed_supported;
        u8 link_width_enabled;
-       u8 link_speed_enabled;
+       u16 link_speed_enabled;
        u8 link_width_active;
-       u8 link_speed_active;
+       u16 link_speed_active;
        u8 vls_supported;
        u8 vls_operational;
        /* Rx Polarity inversion (compensate for ~tx on partner) */
index 699b208..f3d6421 100644 (file)
@@ -176,7 +176,7 @@ struct pvrdma_port_attr {
        u8                      subnet_timeout;
        u8                      init_type_reply;
        u8                      active_width;
-       u                     active_speed;
+       u16                     active_speed;
        u8                      phys_state;
        u8                      reserved[2];
 };
index c0b2fa7..a7e203b 100644 (file)
@@ -535,7 +535,8 @@ enum ib_port_speed {
        IB_SPEED_FDR10  = 8,
        IB_SPEED_FDR    = 16,
        IB_SPEED_EDR    = 32,
-       IB_SPEED_HDR    = 64
+       IB_SPEED_HDR    = 64,
+       IB_SPEED_NDR    = 128,
 };
 
 /**
@@ -669,7 +670,7 @@ struct ib_port_attr {
        u8                      subnet_timeout;
        u8                      init_type_reply;
        u8                      active_width;
-       u                     active_speed;
+       u16                     active_speed;
        u8                      phys_state;
        u16                     port_cap_flags2;
 };
@@ -4410,7 +4411,7 @@ void ib_drain_rq(struct ib_qp *qp);
 void ib_drain_sq(struct ib_qp *qp);
 void ib_drain_qp(struct ib_qp *qp);
 
-int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u8 *speed, u8 *width);
+int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u16 *speed, u8 *width);
 
 static inline u8 *rdma_ah_retrieve_dmac(struct rdma_ah_attr *attr)
 {