|
33 | 33 | #include <rdma/ib_verbs.h>
|
34 | 34 | #include <rdma/ib_addr.h>
|
35 | 35 | #include <rdma/ib_user_verbs.h>
|
| 36 | +#include <rdma/iw_cm.h> |
| 37 | +#include <rdma/ib_mad.h> |
36 | 38 | #include <linux/netdevice.h>
|
37 | 39 | #include <linux/iommu.h>
|
38 | 40 | #include <linux/pci.h>
|
@@ -94,8 +96,75 @@ static struct net_device *qedr_get_netdev(struct ib_device *dev, u8 port_num)
|
94 | 96 | return qdev->ndev;
|
95 | 97 | }
|
96 | 98 |
|
| 99 | +int qedr_roce_port_immutable(struct ib_device *ibdev, u8 port_num, |
| 100 | + struct ib_port_immutable *immutable) |
| 101 | +{ |
| 102 | + struct ib_port_attr attr; |
| 103 | + int err; |
| 104 | + |
| 105 | + err = qedr_query_port(ibdev, port_num, &attr); |
| 106 | + if (err) |
| 107 | + return err; |
| 108 | + |
| 109 | + immutable->pkey_tbl_len = attr.pkey_tbl_len; |
| 110 | + immutable->gid_tbl_len = attr.gid_tbl_len; |
| 111 | + immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE | |
| 112 | + RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP; |
| 113 | + immutable->max_mad_size = IB_MGMT_MAD_SIZE; |
| 114 | + |
| 115 | + return 0; |
| 116 | +} |
| 117 | + |
| 118 | +int qedr_iw_port_immutable(struct ib_device *ibdev, u8 port_num, |
| 119 | + struct ib_port_immutable *immutable) |
| 120 | +{ |
| 121 | + struct ib_port_attr attr; |
| 122 | + int err; |
| 123 | + |
| 124 | + err = qedr_query_port(ibdev, port_num, &attr); |
| 125 | + if (err) |
| 126 | + return err; |
| 127 | + |
| 128 | + immutable->pkey_tbl_len = 1; |
| 129 | + immutable->gid_tbl_len = 1; |
| 130 | + immutable->core_cap_flags = RDMA_CORE_PORT_IWARP; |
| 131 | + immutable->max_mad_size = 0; |
| 132 | + |
| 133 | + return 0; |
| 134 | +} |
| 135 | + |
| 136 | +int qedr_iw_register_device(struct qedr_dev *dev) |
| 137 | +{ |
| 138 | + dev->ibdev.node_type = RDMA_NODE_RNIC; |
| 139 | + dev->ibdev.query_gid = qedr_iw_query_gid; |
| 140 | + |
| 141 | + dev->ibdev.get_port_immutable = qedr_iw_port_immutable; |
| 142 | + |
| 143 | + dev->ibdev.iwcm = kzalloc(sizeof(*dev->ibdev.iwcm), GFP_KERNEL); |
| 144 | + if (!dev->ibdev.iwcm) |
| 145 | + return -ENOMEM; |
| 146 | + |
| 147 | + memcpy(dev->ibdev.iwcm->ifname, |
| 148 | + dev->ndev->name, sizeof(dev->ibdev.iwcm->ifname)); |
| 149 | + |
| 150 | + return 0; |
| 151 | +} |
| 152 | + |
| 153 | +void qedr_roce_register_device(struct qedr_dev *dev) |
| 154 | +{ |
| 155 | + dev->ibdev.node_type = RDMA_NODE_IB_CA; |
| 156 | + dev->ibdev.query_gid = qedr_query_gid; |
| 157 | + |
| 158 | + dev->ibdev.add_gid = qedr_add_gid; |
| 159 | + dev->ibdev.del_gid = qedr_del_gid; |
| 160 | + |
| 161 | + dev->ibdev.get_port_immutable = qedr_roce_port_immutable; |
| 162 | +} |
| 163 | + |
97 | 164 | static int qedr_register_device(struct qedr_dev *dev)
|
98 | 165 | {
|
| 166 | + int rc; |
| 167 | + |
99 | 168 | strlcpy(dev->ibdev.name, "qedr%d", IB_DEVICE_NAME_MAX);
|
100 | 169 |
|
101 | 170 | dev->ibdev.node_guid = dev->attr.node_guid;
|
@@ -123,18 +192,21 @@ static int qedr_register_device(struct qedr_dev *dev)
|
123 | 192 | QEDR_UVERBS(POST_SEND) |
|
124 | 193 | QEDR_UVERBS(POST_RECV);
|
125 | 194 |
|
| 195 | + if (IS_IWARP(dev)) { |
| 196 | + rc = qedr_iw_register_device(dev); |
| 197 | + if (rc) |
| 198 | + return rc; |
| 199 | + } else { |
| 200 | + qedr_roce_register_device(dev); |
| 201 | + } |
| 202 | + |
126 | 203 | dev->ibdev.phys_port_cnt = 1;
|
127 | 204 | dev->ibdev.num_comp_vectors = dev->num_cnq;
|
128 |
| - dev->ibdev.node_type = RDMA_NODE_IB_CA; |
129 | 205 |
|
130 | 206 | dev->ibdev.query_device = qedr_query_device;
|
131 | 207 | dev->ibdev.query_port = qedr_query_port;
|
132 | 208 | dev->ibdev.modify_port = qedr_modify_port;
|
133 | 209 |
|
134 |
| - dev->ibdev.query_gid = qedr_query_gid; |
135 |
| - dev->ibdev.add_gid = qedr_add_gid; |
136 |
| - dev->ibdev.del_gid = qedr_del_gid; |
137 |
| - |
138 | 210 | dev->ibdev.alloc_ucontext = qedr_alloc_ucontext;
|
139 | 211 | dev->ibdev.dealloc_ucontext = qedr_dealloc_ucontext;
|
140 | 212 | dev->ibdev.mmap = qedr_mmap;
|
@@ -168,7 +240,7 @@ static int qedr_register_device(struct qedr_dev *dev)
|
168 | 240 | dev->ibdev.post_recv = qedr_post_recv;
|
169 | 241 |
|
170 | 242 | dev->ibdev.process_mad = qedr_process_mad;
|
171 |
| - dev->ibdev.get_port_immutable = qedr_port_immutable; |
| 243 | + |
172 | 244 | dev->ibdev.get_netdev = qedr_get_netdev;
|
173 | 245 |
|
174 | 246 | dev->ibdev.dev.parent = &dev->pdev->dev;
|
|
0 commit comments