.. | .. |
---|
65 | 65 | static int pvrdma_add_gid(const struct ib_gid_attr *attr, void **context); |
---|
66 | 66 | static int pvrdma_del_gid(const struct ib_gid_attr *attr, void **context); |
---|
67 | 67 | |
---|
68 | | -static ssize_t show_hca(struct device *device, struct device_attribute *attr, |
---|
69 | | - char *buf) |
---|
| 68 | +static ssize_t hca_type_show(struct device *device, |
---|
| 69 | + struct device_attribute *attr, char *buf) |
---|
70 | 70 | { |
---|
71 | 71 | return sprintf(buf, "VMW_PVRDMA-%s\n", DRV_VERSION); |
---|
72 | 72 | } |
---|
| 73 | +static DEVICE_ATTR_RO(hca_type); |
---|
73 | 74 | |
---|
74 | | -static ssize_t show_rev(struct device *device, struct device_attribute *attr, |
---|
75 | | - char *buf) |
---|
| 75 | +static ssize_t hw_rev_show(struct device *device, |
---|
| 76 | + struct device_attribute *attr, char *buf) |
---|
76 | 77 | { |
---|
77 | 78 | return sprintf(buf, "%d\n", PVRDMA_REV_ID); |
---|
78 | 79 | } |
---|
| 80 | +static DEVICE_ATTR_RO(hw_rev); |
---|
79 | 81 | |
---|
80 | | -static ssize_t show_board(struct device *device, struct device_attribute *attr, |
---|
81 | | - char *buf) |
---|
| 82 | +static ssize_t board_id_show(struct device *device, |
---|
| 83 | + struct device_attribute *attr, char *buf) |
---|
82 | 84 | { |
---|
83 | 85 | return sprintf(buf, "%d\n", PVRDMA_BOARD_ID); |
---|
84 | 86 | } |
---|
| 87 | +static DEVICE_ATTR_RO(board_id); |
---|
85 | 88 | |
---|
86 | | -static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL); |
---|
87 | | -static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL); |
---|
88 | | -static DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL); |
---|
| 89 | +static struct attribute *pvrdma_class_attributes[] = { |
---|
| 90 | + &dev_attr_hw_rev.attr, |
---|
| 91 | + &dev_attr_hca_type.attr, |
---|
| 92 | + &dev_attr_board_id.attr, |
---|
| 93 | + NULL, |
---|
| 94 | +}; |
---|
89 | 95 | |
---|
90 | | -static struct device_attribute *pvrdma_class_attributes[] = { |
---|
91 | | - &dev_attr_hw_rev, |
---|
92 | | - &dev_attr_hca_type, |
---|
93 | | - &dev_attr_board_id |
---|
| 96 | +static const struct attribute_group pvrdma_attr_group = { |
---|
| 97 | + .attrs = pvrdma_class_attributes, |
---|
94 | 98 | }; |
---|
95 | 99 | |
---|
96 | 100 | static void pvrdma_get_fw_ver_str(struct ib_device *device, char *str) |
---|
.. | .. |
---|
139 | 143 | return 0; |
---|
140 | 144 | } |
---|
141 | 145 | |
---|
142 | | -static struct net_device *pvrdma_get_netdev(struct ib_device *ibdev, |
---|
143 | | - u8 port_num) |
---|
144 | | -{ |
---|
145 | | - struct net_device *netdev; |
---|
146 | | - struct pvrdma_dev *dev = to_vdev(ibdev); |
---|
| 146 | +static const struct ib_device_ops pvrdma_dev_ops = { |
---|
| 147 | + .owner = THIS_MODULE, |
---|
| 148 | + .driver_id = RDMA_DRIVER_VMW_PVRDMA, |
---|
| 149 | + .uverbs_abi_ver = PVRDMA_UVERBS_ABI_VERSION, |
---|
147 | 150 | |
---|
148 | | - if (port_num != 1) |
---|
149 | | - return NULL; |
---|
| 151 | + .add_gid = pvrdma_add_gid, |
---|
| 152 | + .alloc_mr = pvrdma_alloc_mr, |
---|
| 153 | + .alloc_pd = pvrdma_alloc_pd, |
---|
| 154 | + .alloc_ucontext = pvrdma_alloc_ucontext, |
---|
| 155 | + .create_ah = pvrdma_create_ah, |
---|
| 156 | + .create_cq = pvrdma_create_cq, |
---|
| 157 | + .create_qp = pvrdma_create_qp, |
---|
| 158 | + .dealloc_pd = pvrdma_dealloc_pd, |
---|
| 159 | + .dealloc_ucontext = pvrdma_dealloc_ucontext, |
---|
| 160 | + .del_gid = pvrdma_del_gid, |
---|
| 161 | + .dereg_mr = pvrdma_dereg_mr, |
---|
| 162 | + .destroy_ah = pvrdma_destroy_ah, |
---|
| 163 | + .destroy_cq = pvrdma_destroy_cq, |
---|
| 164 | + .destroy_qp = pvrdma_destroy_qp, |
---|
| 165 | + .get_dev_fw_str = pvrdma_get_fw_ver_str, |
---|
| 166 | + .get_dma_mr = pvrdma_get_dma_mr, |
---|
| 167 | + .get_link_layer = pvrdma_port_link_layer, |
---|
| 168 | + .get_port_immutable = pvrdma_port_immutable, |
---|
| 169 | + .map_mr_sg = pvrdma_map_mr_sg, |
---|
| 170 | + .mmap = pvrdma_mmap, |
---|
| 171 | + .modify_port = pvrdma_modify_port, |
---|
| 172 | + .modify_qp = pvrdma_modify_qp, |
---|
| 173 | + .poll_cq = pvrdma_poll_cq, |
---|
| 174 | + .post_recv = pvrdma_post_recv, |
---|
| 175 | + .post_send = pvrdma_post_send, |
---|
| 176 | + .query_device = pvrdma_query_device, |
---|
| 177 | + .query_gid = pvrdma_query_gid, |
---|
| 178 | + .query_pkey = pvrdma_query_pkey, |
---|
| 179 | + .query_port = pvrdma_query_port, |
---|
| 180 | + .query_qp = pvrdma_query_qp, |
---|
| 181 | + .reg_user_mr = pvrdma_reg_user_mr, |
---|
| 182 | + .req_notify_cq = pvrdma_req_notify_cq, |
---|
150 | 183 | |
---|
151 | | - rcu_read_lock(); |
---|
152 | | - netdev = dev->netdev; |
---|
153 | | - if (netdev) |
---|
154 | | - dev_hold(netdev); |
---|
155 | | - rcu_read_unlock(); |
---|
| 184 | + INIT_RDMA_OBJ_SIZE(ib_ah, pvrdma_ah, ibah), |
---|
| 185 | + INIT_RDMA_OBJ_SIZE(ib_cq, pvrdma_cq, ibcq), |
---|
| 186 | + INIT_RDMA_OBJ_SIZE(ib_pd, pvrdma_pd, ibpd), |
---|
| 187 | + INIT_RDMA_OBJ_SIZE(ib_ucontext, pvrdma_ucontext, ibucontext), |
---|
| 188 | +}; |
---|
156 | 189 | |
---|
157 | | - return netdev; |
---|
158 | | -} |
---|
| 190 | +static const struct ib_device_ops pvrdma_dev_srq_ops = { |
---|
| 191 | + .create_srq = pvrdma_create_srq, |
---|
| 192 | + .destroy_srq = pvrdma_destroy_srq, |
---|
| 193 | + .modify_srq = pvrdma_modify_srq, |
---|
| 194 | + .query_srq = pvrdma_query_srq, |
---|
| 195 | + |
---|
| 196 | + INIT_RDMA_OBJ_SIZE(ib_srq, pvrdma_srq, ibsrq), |
---|
| 197 | +}; |
---|
159 | 198 | |
---|
160 | 199 | static int pvrdma_register_device(struct pvrdma_dev *dev) |
---|
161 | 200 | { |
---|
162 | 201 | int ret = -1; |
---|
163 | | - int i = 0; |
---|
164 | 202 | |
---|
165 | | - strlcpy(dev->ib_dev.name, "vmw_pvrdma%d", IB_DEVICE_NAME_MAX); |
---|
166 | 203 | dev->ib_dev.node_guid = dev->dsr->caps.node_guid; |
---|
167 | 204 | dev->sys_image_guid = dev->dsr->caps.sys_image_guid; |
---|
168 | 205 | dev->flags = 0; |
---|
169 | | - dev->ib_dev.owner = THIS_MODULE; |
---|
170 | 206 | dev->ib_dev.num_comp_vectors = 1; |
---|
171 | 207 | dev->ib_dev.dev.parent = &dev->pdev->dev; |
---|
172 | | - dev->ib_dev.uverbs_abi_ver = PVRDMA_UVERBS_ABI_VERSION; |
---|
173 | 208 | dev->ib_dev.uverbs_cmd_mask = |
---|
174 | 209 | (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) | |
---|
175 | 210 | (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) | |
---|
.. | .. |
---|
195 | 230 | dev->ib_dev.node_type = RDMA_NODE_IB_CA; |
---|
196 | 231 | dev->ib_dev.phys_port_cnt = dev->dsr->caps.phys_port_cnt; |
---|
197 | 232 | |
---|
198 | | - dev->ib_dev.query_device = pvrdma_query_device; |
---|
199 | | - dev->ib_dev.query_port = pvrdma_query_port; |
---|
200 | | - dev->ib_dev.query_gid = pvrdma_query_gid; |
---|
201 | | - dev->ib_dev.query_pkey = pvrdma_query_pkey; |
---|
202 | | - dev->ib_dev.modify_port = pvrdma_modify_port; |
---|
203 | | - dev->ib_dev.alloc_ucontext = pvrdma_alloc_ucontext; |
---|
204 | | - dev->ib_dev.dealloc_ucontext = pvrdma_dealloc_ucontext; |
---|
205 | | - dev->ib_dev.mmap = pvrdma_mmap; |
---|
206 | | - dev->ib_dev.alloc_pd = pvrdma_alloc_pd; |
---|
207 | | - dev->ib_dev.dealloc_pd = pvrdma_dealloc_pd; |
---|
208 | | - dev->ib_dev.create_ah = pvrdma_create_ah; |
---|
209 | | - dev->ib_dev.destroy_ah = pvrdma_destroy_ah; |
---|
210 | | - dev->ib_dev.create_qp = pvrdma_create_qp; |
---|
211 | | - dev->ib_dev.modify_qp = pvrdma_modify_qp; |
---|
212 | | - dev->ib_dev.query_qp = pvrdma_query_qp; |
---|
213 | | - dev->ib_dev.destroy_qp = pvrdma_destroy_qp; |
---|
214 | | - dev->ib_dev.post_send = pvrdma_post_send; |
---|
215 | | - dev->ib_dev.post_recv = pvrdma_post_recv; |
---|
216 | | - dev->ib_dev.create_cq = pvrdma_create_cq; |
---|
217 | | - dev->ib_dev.destroy_cq = pvrdma_destroy_cq; |
---|
218 | | - dev->ib_dev.poll_cq = pvrdma_poll_cq; |
---|
219 | | - dev->ib_dev.req_notify_cq = pvrdma_req_notify_cq; |
---|
220 | | - dev->ib_dev.get_dma_mr = pvrdma_get_dma_mr; |
---|
221 | | - dev->ib_dev.reg_user_mr = pvrdma_reg_user_mr; |
---|
222 | | - dev->ib_dev.dereg_mr = pvrdma_dereg_mr; |
---|
223 | | - dev->ib_dev.alloc_mr = pvrdma_alloc_mr; |
---|
224 | | - dev->ib_dev.map_mr_sg = pvrdma_map_mr_sg; |
---|
225 | | - dev->ib_dev.add_gid = pvrdma_add_gid; |
---|
226 | | - dev->ib_dev.del_gid = pvrdma_del_gid; |
---|
227 | | - dev->ib_dev.get_netdev = pvrdma_get_netdev; |
---|
228 | | - dev->ib_dev.get_port_immutable = pvrdma_port_immutable; |
---|
229 | | - dev->ib_dev.get_link_layer = pvrdma_port_link_layer; |
---|
230 | | - dev->ib_dev.get_dev_fw_str = pvrdma_get_fw_ver_str; |
---|
| 233 | + ib_set_device_ops(&dev->ib_dev, &pvrdma_dev_ops); |
---|
231 | 234 | |
---|
232 | 235 | mutex_init(&dev->port_mutex); |
---|
233 | 236 | spin_lock_init(&dev->desc_lock); |
---|
.. | .. |
---|
253 | 256 | (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) | |
---|
254 | 257 | (1ull << IB_USER_VERBS_CMD_POST_SRQ_RECV); |
---|
255 | 258 | |
---|
256 | | - dev->ib_dev.create_srq = pvrdma_create_srq; |
---|
257 | | - dev->ib_dev.modify_srq = pvrdma_modify_srq; |
---|
258 | | - dev->ib_dev.query_srq = pvrdma_query_srq; |
---|
259 | | - dev->ib_dev.destroy_srq = pvrdma_destroy_srq; |
---|
| 259 | + ib_set_device_ops(&dev->ib_dev, &pvrdma_dev_srq_ops); |
---|
260 | 260 | |
---|
261 | 261 | dev->srq_tbl = kcalloc(dev->dsr->caps.max_srq, |
---|
262 | 262 | sizeof(struct pvrdma_srq *), |
---|
.. | .. |
---|
264 | 264 | if (!dev->srq_tbl) |
---|
265 | 265 | goto err_qp_free; |
---|
266 | 266 | } |
---|
267 | | - dev->ib_dev.driver_id = RDMA_DRIVER_VMW_PVRDMA; |
---|
268 | | - spin_lock_init(&dev->srq_tbl_lock); |
---|
269 | | - |
---|
270 | | - ret = ib_register_device(&dev->ib_dev, NULL); |
---|
| 267 | + ret = ib_device_set_netdev(&dev->ib_dev, dev->netdev, 1); |
---|
271 | 268 | if (ret) |
---|
272 | 269 | goto err_srq_free; |
---|
| 270 | + spin_lock_init(&dev->srq_tbl_lock); |
---|
| 271 | + rdma_set_device_sysfs_group(&dev->ib_dev, &pvrdma_attr_group); |
---|
273 | 272 | |
---|
274 | | - for (i = 0; i < ARRAY_SIZE(pvrdma_class_attributes); ++i) { |
---|
275 | | - ret = device_create_file(&dev->ib_dev.dev, |
---|
276 | | - pvrdma_class_attributes[i]); |
---|
277 | | - if (ret) |
---|
278 | | - goto err_class; |
---|
279 | | - } |
---|
| 273 | + ret = ib_register_device(&dev->ib_dev, "vmw_pvrdma%d", &dev->pdev->dev); |
---|
| 274 | + if (ret) |
---|
| 275 | + goto err_srq_free; |
---|
280 | 276 | |
---|
281 | 277 | dev->ib_active = true; |
---|
282 | 278 | |
---|
283 | 279 | return 0; |
---|
284 | 280 | |
---|
285 | | -err_class: |
---|
286 | | - ib_unregister_device(&dev->ib_dev); |
---|
287 | 281 | err_srq_free: |
---|
288 | 282 | kfree(dev->srq_tbl); |
---|
289 | 283 | err_qp_free: |
---|
.. | .. |
---|
716 | 710 | pvrdma_dispatch_event(dev, 1, IB_EVENT_PORT_ACTIVE); |
---|
717 | 711 | break; |
---|
718 | 712 | case NETDEV_UNREGISTER: |
---|
| 713 | + ib_device_set_netdev(&dev->ib_dev, NULL, 1); |
---|
719 | 714 | dev_put(dev->netdev); |
---|
720 | 715 | dev->netdev = NULL; |
---|
721 | 716 | break; |
---|
.. | .. |
---|
727 | 722 | if ((dev->netdev == NULL) && |
---|
728 | 723 | (pci_get_drvdata(pdev_net) == ndev)) { |
---|
729 | 724 | /* this is our netdev */ |
---|
| 725 | + ib_device_set_netdev(&dev->ib_dev, ndev, 1); |
---|
730 | 726 | dev->netdev = ndev; |
---|
731 | 727 | dev_hold(ndev); |
---|
732 | 728 | } |
---|
.. | .. |
---|
735 | 731 | |
---|
736 | 732 | default: |
---|
737 | 733 | dev_dbg(&dev->pdev->dev, "ignore netdevice event %ld on %s\n", |
---|
738 | | - event, dev->ib_dev.name); |
---|
| 734 | + event, dev_name(&dev->ib_dev.dev)); |
---|
739 | 735 | break; |
---|
740 | 736 | } |
---|
741 | 737 | } |
---|
.. | .. |
---|
793 | 789 | dev_dbg(&pdev->dev, "initializing driver %s\n", pci_name(pdev)); |
---|
794 | 790 | |
---|
795 | 791 | /* Allocate zero-out device */ |
---|
796 | | - dev = (struct pvrdma_dev *)ib_alloc_device(sizeof(*dev)); |
---|
| 792 | + dev = ib_alloc_device(pvrdma_dev, ib_dev); |
---|
797 | 793 | if (!dev) { |
---|
798 | 794 | dev_err(&pdev->dev, "failed to allocate IB device\n"); |
---|
799 | 795 | return -ENOMEM; |
---|
.. | .. |
---|
858 | 854 | goto err_free_resource; |
---|
859 | 855 | } |
---|
860 | 856 | } |
---|
861 | | - |
---|
| 857 | + dma_set_max_seg_size(&pdev->dev, UINT_MAX); |
---|
862 | 858 | pci_set_master(pdev); |
---|
863 | 859 | |
---|
864 | 860 | /* Map register space */ |
---|
.. | .. |
---|
888 | 884 | dev_info(&pdev->dev, "device version %d, driver version %d\n", |
---|
889 | 885 | dev->dsr_version, PVRDMA_VERSION); |
---|
890 | 886 | |
---|
891 | | - dev->dsr = dma_zalloc_coherent(&pdev->dev, sizeof(*dev->dsr), |
---|
892 | | - &dev->dsrbase, GFP_KERNEL); |
---|
| 887 | + dev->dsr = dma_alloc_coherent(&pdev->dev, sizeof(*dev->dsr), |
---|
| 888 | + &dev->dsrbase, GFP_KERNEL); |
---|
893 | 889 | if (!dev->dsr) { |
---|
894 | 890 | dev_err(&pdev->dev, "failed to allocate shared region\n"); |
---|
895 | 891 | ret = -ENOMEM; |
---|
.. | .. |
---|
903 | 899 | PVRDMA_GOS_BITS_64; |
---|
904 | 900 | dev->dsr->gos_info.gos_type = PVRDMA_GOS_TYPE_LINUX; |
---|
905 | 901 | dev->dsr->gos_info.gos_ver = 1; |
---|
906 | | - dev->dsr->uar_pfn = dev->driver_uar.pfn; |
---|
| 902 | + |
---|
| 903 | + if (dev->dsr_version < PVRDMA_PPN64_VERSION) |
---|
| 904 | + dev->dsr->uar_pfn = dev->driver_uar.pfn; |
---|
| 905 | + else |
---|
| 906 | + dev->dsr->uar_pfn64 = dev->driver_uar.pfn; |
---|
907 | 907 | |
---|
908 | 908 | /* Command slot. */ |
---|
909 | 909 | dev->cmd_slot = dma_alloc_coherent(&pdev->dev, PAGE_SIZE, |
---|