IB/core: Add per port immutable struct to ib_device
[cascardo/linux.git] / drivers / infiniband / hw / qib / qib_verbs.c
index 4a35998..48f4784 100644 (file)
@@ -1650,6 +1650,12 @@ static int qib_query_port(struct ib_device *ibdev, u8 port,
        return 0;
 }
 
+static enum rdma_protocol_type
+qib_query_protocol(struct ib_device *device, u8 port_num)
+{
+       return RDMA_PROTOCOL_IB;
+}
+
 static int qib_modify_device(struct ib_device *device,
                             int device_modify_mask,
                             struct ib_device_modify *device_modify)
@@ -2040,6 +2046,22 @@ static void init_ibport(struct qib_pportdata *ppd)
        RCU_INIT_POINTER(ibp->qp1, NULL);
 }
 
+static int qib_port_immutable(struct ib_device *ibdev, u8 port_num,
+                             struct ib_port_immutable *immutable)
+{
+       struct ib_port_attr attr;
+       int err;
+
+       err = qib_query_port(ibdev, port_num, &attr);
+       if (err)
+               return err;
+
+       immutable->pkey_tbl_len = attr.pkey_tbl_len;
+       immutable->gid_tbl_len = attr.gid_tbl_len;
+
+       return 0;
+}
+
 /**
  * qib_register_ib_device - register our device with the infiniband core
  * @dd: the device data structure
@@ -2184,6 +2206,7 @@ int qib_register_ib_device(struct qib_devdata *dd)
        ibdev->query_device = qib_query_device;
        ibdev->modify_device = qib_modify_device;
        ibdev->query_port = qib_query_port;
+       ibdev->query_protocol = qib_query_protocol;
        ibdev->modify_port = qib_modify_port;
        ibdev->query_pkey = qib_query_pkey;
        ibdev->query_gid = qib_query_gid;
@@ -2227,6 +2250,7 @@ int qib_register_ib_device(struct qib_devdata *dd)
        ibdev->process_mad = qib_process_mad;
        ibdev->mmap = qib_mmap;
        ibdev->dma_ops = &qib_dma_mapping_ops;
+       ibdev->get_port_immutable = qib_port_immutable;
 
        snprintf(ibdev->node_desc, sizeof(ibdev->node_desc),
                 "Intel Infiniband HCA %s", init_utsname()->nodename);