1cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise/* 2cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved. 3cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * 4cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * This software is available to you under a choice of one of two 5cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * licenses. You may choose to be licensed under the terms of the GNU 6cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * General Public License (GPL) Version 2, available from the file 7cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * COPYING in the main directory of this source tree, or the 8cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * OpenIB.org BSD license below: 9cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * 10cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * Redistribution and use in source and binary forms, with or 11cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * without modification, are permitted provided that the following 12cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * conditions are met: 13cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * 14cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * - Redistributions of source code must retain the above 15cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * copyright notice, this list of conditions and the following 16cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * disclaimer. 17cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * 18cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * - Redistributions in binary form must reproduce the above 19cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * copyright notice, this list of conditions and the following 20cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * disclaimer in the documentation and/or other materials 21cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * provided with the distribution. 22cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * 23cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * SOFTWARE. 31cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise */ 32cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/module.h> 33cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/moduleparam.h> 34cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/device.h> 35cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/netdevice.h> 36cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/etherdevice.h> 37cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/delay.h> 38cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/errno.h> 39cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/list.h> 40cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/spinlock.h> 41cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/ethtool.h> 42cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/rtnetlink.h> 43cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/inetdevice.h> 44cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/io.h> 45cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 46cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <asm/irq.h> 47cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <asm/byteorder.h> 48cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 49cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <rdma/iw_cm.h> 50cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <rdma/ib_verbs.h> 51cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <rdma/ib_smi.h> 52cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <rdma/ib_umem.h> 53cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <rdma/ib_user_verbs.h> 54cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 55cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "iw_cxgb4.h" 56cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 5740dbf6ee381008e471d3c4a332971247b7799744Steve Wisestatic int fastreg_support = 1; 58cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisemodule_param(fastreg_support, int, 0644); 5940dbf6ee381008e471d3c4a332971247b7799744Steve WiseMODULE_PARM_DESC(fastreg_support, "Advertise fastreg support (default=1)"); 60cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 61cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic struct ib_ah *c4iw_ah_create(struct ib_pd *pd, 62cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_ah_attr *ah_attr) 63cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 64cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return ERR_PTR(-ENOSYS); 65cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 66cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 67cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_ah_destroy(struct ib_ah *ah) 68cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 69cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return -ENOSYS; 70cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 71cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 72cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) 73cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 74cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return -ENOSYS; 75cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 76cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 77cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) 78cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 79cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return -ENOSYS; 80cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 81cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 82cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_process_mad(struct ib_device *ibdev, int mad_flags, 83cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 port_num, struct ib_wc *in_wc, 84cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_grh *in_grh, struct ib_mad *in_mad, 85cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_mad *out_mad) 86cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 87cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return -ENOSYS; 88cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 89cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 90cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_dealloc_ucontext(struct ib_ucontext *context) 91cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 92cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp = to_c4iw_dev(context->device); 93cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ucontext *ucontext = to_c4iw_ucontext(context); 94cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mm_entry *mm, *tmp; 95cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 96cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s context %p\n", __func__, context); 97cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise list_for_each_entry_safe(mm, tmp, &ucontext->mmaps, entry) 98cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kfree(mm); 99cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise c4iw_release_dev_ucontext(&rhp->rdev, &ucontext->uctx); 100cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kfree(ucontext); 101cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return 0; 102cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 103cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 104cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic struct ib_ucontext *c4iw_alloc_ucontext(struct ib_device *ibdev, 105cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_udata *udata) 106cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 107cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ucontext *context; 108cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp = to_c4iw_dev(ibdev); 109cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 110cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s ibdev %p\n", __func__, ibdev); 111cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise context = kzalloc(sizeof(*context), GFP_KERNEL); 112cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (!context) 113cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return ERR_PTR(-ENOMEM); 114cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise c4iw_init_dev_ucontext(&rhp->rdev, &context->uctx); 115cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise INIT_LIST_HEAD(&context->mmaps); 116cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_lock_init(&context->mmap_lock); 117cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return &context->ibucontext; 118cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 119cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 120cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_mmap(struct ib_ucontext *context, struct vm_area_struct *vma) 121cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 122cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int len = vma->vm_end - vma->vm_start; 123cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 key = vma->vm_pgoff << PAGE_SHIFT; 124cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_rdev *rdev; 125cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int ret = 0; 126cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mm_entry *mm; 127cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ucontext *ucontext; 128cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 addr; 129cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 130cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s pgoff 0x%lx key 0x%x len %d\n", __func__, vma->vm_pgoff, 131cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise key, len); 132cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 133cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (vma->vm_start & (PAGE_SIZE-1)) 134cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return -EINVAL; 135cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 136cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise rdev = &(to_c4iw_dev(context->device)->rdev); 137cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ucontext = to_c4iw_ucontext(context); 138cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 139cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise mm = remove_mmap(ucontext, key, len); 140cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (!mm) 141cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return -EINVAL; 142cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise addr = mm->addr; 143cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kfree(mm); 144cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 145c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise if ((addr >= pci_resource_start(rdev->lldi.pdev, 0)) && 146c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise (addr < (pci_resource_start(rdev->lldi.pdev, 0) + 147c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise pci_resource_len(rdev->lldi.pdev, 0)))) { 148cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 149cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise /* 150c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise * MA_SYNC register... 151cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise */ 152cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 153c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise ret = io_remap_pfn_range(vma, vma->vm_start, 154c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise addr >> PAGE_SHIFT, 155c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise len, vma->vm_page_prot); 156c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise } else if ((addr >= pci_resource_start(rdev->lldi.pdev, 2)) && 157c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise (addr < (pci_resource_start(rdev->lldi.pdev, 2) + 158c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise pci_resource_len(rdev->lldi.pdev, 2)))) { 159c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise 160c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise /* 161c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise * Map user DB or OCQP memory... 162c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise */ 163c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise if (addr >= rdev->oc_mw_pa) 164c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise vma->vm_page_prot = t4_pgprot_wc(vma->vm_page_prot); 165c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise else 166c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 167cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ret = io_remap_pfn_range(vma, vma->vm_start, 168cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise addr >> PAGE_SHIFT, 169cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise len, vma->vm_page_prot); 170cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } else { 171cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 172cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise /* 173cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * Map WQ or CQ contig dma memory... 174cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise */ 175cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ret = remap_pfn_range(vma, vma->vm_start, 176cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise addr >> PAGE_SHIFT, 177cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise len, vma->vm_page_prot); 178cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 179cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 180cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return ret; 181cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 182cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 183cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_deallocate_pd(struct ib_pd *pd) 184cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 185cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 186cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_pd *php; 187cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 188cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise php = to_c4iw_pd(pd); 189cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise rhp = php->rhp; 190cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s ibpd %p pdid 0x%x\n", __func__, pd, php->pdid); 191cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise c4iw_put_resource(&rhp->rdev.resource.pdid_fifo, php->pdid, 192cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise &rhp->rdev.resource.pdid_fifo_lock); 193cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kfree(php); 194cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return 0; 195cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 196cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 197cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic struct ib_pd *c4iw_allocate_pd(struct ib_device *ibdev, 198cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_ucontext *context, 199cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_udata *udata) 200cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 201cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_pd *php; 202cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pdid; 203cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 204cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 205cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s ibdev %p\n", __func__, ibdev); 206cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise rhp = (struct c4iw_dev *) ibdev; 207cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise pdid = c4iw_get_resource(&rhp->rdev.resource.pdid_fifo, 208cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise &rhp->rdev.resource.pdid_fifo_lock); 209cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (!pdid) 210cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return ERR_PTR(-EINVAL); 211cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise php = kzalloc(sizeof(*php), GFP_KERNEL); 212cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (!php) { 213cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise c4iw_put_resource(&rhp->rdev.resource.pdid_fifo, pdid, 214cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise &rhp->rdev.resource.pdid_fifo_lock); 215cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return ERR_PTR(-ENOMEM); 216cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 217cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise php->pdid = pdid; 218cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise php->rhp = rhp; 219cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (context) { 220cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (ib_copy_to_udata(udata, &php->pdid, sizeof(u32))) { 221cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise c4iw_deallocate_pd(&php->ibpd); 222cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return ERR_PTR(-EFAULT); 223cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 224cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 225cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s pdid 0x%0x ptr 0x%p\n", __func__, pdid, php); 226cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return &php->ibpd; 227cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 228cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 229cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_query_pkey(struct ib_device *ibdev, u8 port, u16 index, 230cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 *pkey) 231cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 232cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s ibdev %p\n", __func__, ibdev); 233cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise *pkey = 0; 234cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return 0; 235cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 236cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 237cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_query_gid(struct ib_device *ibdev, u8 port, int index, 238cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise union ib_gid *gid) 239cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 240cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *dev; 241cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 242cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s ibdev %p, port %d, index %d, gid %p\n", 243cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise __func__, ibdev, port, index, gid); 244cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev = to_c4iw_dev(ibdev); 245cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise BUG_ON(port == 0); 246cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise memset(&(gid->raw[0]), 0, sizeof(gid->raw)); 247cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise memcpy(&(gid->raw[0]), dev->rdev.lldi.ports[port-1]->dev_addr, 6); 248cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return 0; 249cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 250cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 251cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_query_device(struct ib_device *ibdev, 252cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_device_attr *props) 253cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 254cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 255cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *dev; 256cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s ibdev %p\n", __func__, ibdev); 257cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 258cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev = to_c4iw_dev(ibdev); 259cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise memset(props, 0, sizeof *props); 260cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise memcpy(&props->sys_image_guid, dev->rdev.lldi.ports[0]->dev_addr, 6); 261cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->hw_ver = dev->rdev.lldi.adapter_type; 262cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->fw_ver = dev->rdev.lldi.fw_vers; 263cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->device_cap_flags = dev->device_cap_flags; 264cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->page_size_cap = T4_PAGESIZE_MASK; 265cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->vendor_id = (u32)dev->rdev.lldi.pdev->vendor; 266cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->vendor_part_id = (u32)dev->rdev.lldi.pdev->device; 267cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_mr_size = T4_MAX_MR_SIZE; 268cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_qp = T4_MAX_NUM_QP; 269cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_qp_wr = T4_MAX_QP_DEPTH; 270cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_sge = T4_MAX_RECV_SGE; 271cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_sge_rd = 1; 272be4c9bad9d0edb6bc3bd8fffc2f98e0e2112da39Roland Dreier props->max_qp_rd_atom = c4iw_max_read_depth; 273be4c9bad9d0edb6bc3bd8fffc2f98e0e2112da39Roland Dreier props->max_qp_init_rd_atom = c4iw_max_read_depth; 274cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_cq = T4_MAX_NUM_CQ; 275cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_cqe = T4_MAX_CQ_DEPTH; 276cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_mr = c4iw_num_stags(&dev->rdev); 277cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_pd = T4_MAX_NUM_PD; 278cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->local_ca_ack_delay = 0; 279cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_fast_reg_page_list_len = T4_MAX_FR_DEPTH; 280cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 281cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return 0; 282cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 283cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 284cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_query_port(struct ib_device *ibdev, u8 port, 285cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_port_attr *props) 286cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 287cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *dev; 288cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct net_device *netdev; 289cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct in_device *inetdev; 290cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 291cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s ibdev %p\n", __func__, ibdev); 292cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 293cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev = to_c4iw_dev(ibdev); 294cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise netdev = dev->rdev.lldi.ports[port-1]; 295cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 296cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise memset(props, 0, sizeof(struct ib_port_attr)); 297cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_mtu = IB_MTU_4096; 298cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (netdev->mtu >= 4096) 299cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->active_mtu = IB_MTU_4096; 300cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise else if (netdev->mtu >= 2048) 301cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->active_mtu = IB_MTU_2048; 302cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise else if (netdev->mtu >= 1024) 303cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->active_mtu = IB_MTU_1024; 304cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise else if (netdev->mtu >= 512) 305cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->active_mtu = IB_MTU_512; 306cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise else 307cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->active_mtu = IB_MTU_256; 308cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 309cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (!netif_carrier_ok(netdev)) 310cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->state = IB_PORT_DOWN; 311cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise else { 312cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise inetdev = in_dev_get(netdev); 313cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (inetdev) { 314cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (inetdev->ifa_list) 315cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->state = IB_PORT_ACTIVE; 316cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise else 317cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->state = IB_PORT_INIT; 318cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise in_dev_put(inetdev); 319cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } else 320cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->state = IB_PORT_INIT; 321cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 322cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 323cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->port_cap_flags = 324cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise IB_PORT_CM_SUP | 325cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise IB_PORT_SNMP_TUNNEL_SUP | 326cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise IB_PORT_REINIT_SUP | 327cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise IB_PORT_DEVICE_MGMT_SUP | 328cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise IB_PORT_VENDOR_CLASS_SUP | IB_PORT_BOOT_MGMT_SUP; 329cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->gid_tbl_len = 1; 330cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->pkey_tbl_len = 1; 331cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->active_width = 2; 3322e96691c31ecf749f48aa94ea837b95dd656f5c2Or Gerlitz props->active_speed = IB_SPEED_DDR; 333cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise props->max_msg_sz = -1; 334cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 335cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return 0; 336cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 337cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 338cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic ssize_t show_rev(struct device *dev, struct device_attribute *attr, 339cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise char *buf) 340cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 341cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *c4iw_dev = container_of(dev, struct c4iw_dev, 342cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ibdev.dev); 343cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s dev 0x%p\n", __func__, dev); 344cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return sprintf(buf, "%d\n", c4iw_dev->rdev.lldi.adapter_type); 345cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 346cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 347cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic ssize_t show_fw_ver(struct device *dev, struct device_attribute *attr, 348cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise char *buf) 349cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 350cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *c4iw_dev = container_of(dev, struct c4iw_dev, 351cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ibdev.dev); 352cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s dev 0x%p\n", __func__, dev); 353cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 354cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return sprintf(buf, "%u.%u.%u.%u\n", 355cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise FW_HDR_FW_VER_MAJOR_GET(c4iw_dev->rdev.lldi.fw_vers), 356cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise FW_HDR_FW_VER_MINOR_GET(c4iw_dev->rdev.lldi.fw_vers), 357cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise FW_HDR_FW_VER_MICRO_GET(c4iw_dev->rdev.lldi.fw_vers), 358cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise FW_HDR_FW_VER_BUILD_GET(c4iw_dev->rdev.lldi.fw_vers)); 359cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 360cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 361cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic ssize_t show_hca(struct device *dev, struct device_attribute *attr, 362cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise char *buf) 363cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 364cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *c4iw_dev = container_of(dev, struct c4iw_dev, 365cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ibdev.dev); 366cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ethtool_drvinfo info; 367cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct net_device *lldev = c4iw_dev->rdev.lldi.ports[0]; 368cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 369cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s dev 0x%p\n", __func__, dev); 370cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise lldev->ethtool_ops->get_drvinfo(lldev, &info); 371cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return sprintf(buf, "%s\n", info.driver); 372cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 373cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 374cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic ssize_t show_board(struct device *dev, struct device_attribute *attr, 375cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise char *buf) 376cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 377cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *c4iw_dev = container_of(dev, struct c4iw_dev, 378cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ibdev.dev); 379cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s dev 0x%p\n", __func__, dev); 380cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return sprintf(buf, "%x.%x\n", c4iw_dev->rdev.lldi.pdev->vendor, 381cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise c4iw_dev->rdev.lldi.pdev->device); 382cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 383cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 384cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic int c4iw_get_mib(struct ib_device *ibdev, 385cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise union rdma_protocol_stats *stats) 386cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 387de5dd81b49c27c7818492be0746bfed6ac3b1c8dSteve Wise struct tp_tcp_stats v4, v6; 388de5dd81b49c27c7818492be0746bfed6ac3b1c8dSteve Wise struct c4iw_dev *c4iw_dev = to_c4iw_dev(ibdev); 389de5dd81b49c27c7818492be0746bfed6ac3b1c8dSteve Wise 390de5dd81b49c27c7818492be0746bfed6ac3b1c8dSteve Wise cxgb4_get_tcp_stats(c4iw_dev->rdev.lldi.pdev, &v4, &v6); 391de5dd81b49c27c7818492be0746bfed6ac3b1c8dSteve Wise memset(stats, 0, sizeof *stats); 392de5dd81b49c27c7818492be0746bfed6ac3b1c8dSteve Wise stats->iw.tcpInSegs = v4.tcpInSegs + v6.tcpInSegs; 393de5dd81b49c27c7818492be0746bfed6ac3b1c8dSteve Wise stats->iw.tcpOutSegs = v4.tcpOutSegs + v6.tcpOutSegs; 394de5dd81b49c27c7818492be0746bfed6ac3b1c8dSteve Wise stats->iw.tcpRetransSegs = v4.tcpRetransSegs + v6.tcpRetransSegs; 395de5dd81b49c27c7818492be0746bfed6ac3b1c8dSteve Wise stats->iw.tcpOutRsts = v4.tcpOutRsts + v6.tcpOutSegs; 396de5dd81b49c27c7818492be0746bfed6ac3b1c8dSteve Wise 397de5dd81b49c27c7818492be0746bfed6ac3b1c8dSteve Wise return 0; 398cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 399cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 400cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL); 401cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL); 402cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL); 403cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL); 404cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 405cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic struct device_attribute *c4iw_class_attributes[] = { 406cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise &dev_attr_hw_rev, 407cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise &dev_attr_fw_ver, 408cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise &dev_attr_hca_type, 409cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise &dev_attr_board_id, 410cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 411cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 412cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_register_device(struct c4iw_dev *dev) 413cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 414cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int ret; 415cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int i; 416cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 417cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s c4iw_dev %p\n", __func__, dev); 418cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise BUG_ON(!dev->rdev.lldi.ports[0]); 419cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise strlcpy(dev->ibdev.name, "cxgb4_%d", IB_DEVICE_NAME_MAX); 420cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid)); 421cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise memcpy(&dev->ibdev.node_guid, dev->rdev.lldi.ports[0]->dev_addr, 6); 422cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.owner = THIS_MODULE; 423cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->device_cap_flags = IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_WINDOW; 424cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (fastreg_support) 425cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS; 426cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.local_dma_lkey = 0; 427cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.uverbs_cmd_mask = 428cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) | 429cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) | 430cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_QUERY_PORT) | 431cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_ALLOC_PD) | 432cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_DEALLOC_PD) | 433cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_REG_MR) | 434cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_DEREG_MR) | 435cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL) | 436cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_CREATE_CQ) | 437cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_DESTROY_CQ) | 438cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_REQ_NOTIFY_CQ) | 439cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_CREATE_QP) | 440cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_MODIFY_QP) | 441cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_POLL_CQ) | 442cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_DESTROY_QP) | 443cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_POST_SEND) | 444cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (1ull << IB_USER_VERBS_CMD_POST_RECV); 445cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.node_type = RDMA_NODE_RNIC; 446cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise memcpy(dev->ibdev.node_desc, C4IW_NODE_DESC, sizeof(C4IW_NODE_DESC)); 447cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.phys_port_cnt = dev->rdev.lldi.nports; 448cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.num_comp_vectors = 1; 449cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.dma_device = &(dev->rdev.lldi.pdev->dev); 450cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.query_device = c4iw_query_device; 451cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.query_port = c4iw_query_port; 452cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.query_pkey = c4iw_query_pkey; 453cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.query_gid = c4iw_query_gid; 454cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.alloc_ucontext = c4iw_alloc_ucontext; 455cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.dealloc_ucontext = c4iw_dealloc_ucontext; 456cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.mmap = c4iw_mmap; 457cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.alloc_pd = c4iw_allocate_pd; 458cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.dealloc_pd = c4iw_deallocate_pd; 459cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.create_ah = c4iw_ah_create; 460cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.destroy_ah = c4iw_ah_destroy; 461cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.create_qp = c4iw_create_qp; 462cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.modify_qp = c4iw_ib_modify_qp; 463cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.destroy_qp = c4iw_destroy_qp; 464cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.create_cq = c4iw_create_cq; 465cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.destroy_cq = c4iw_destroy_cq; 466cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.resize_cq = c4iw_resize_cq; 467cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.poll_cq = c4iw_poll_cq; 468cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.get_dma_mr = c4iw_get_dma_mr; 469cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.reg_phys_mr = c4iw_register_phys_mem; 470cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.rereg_phys_mr = c4iw_reregister_phys_mem; 471cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.reg_user_mr = c4iw_reg_user_mr; 472cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.dereg_mr = c4iw_dereg_mr; 473cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.alloc_mw = c4iw_alloc_mw; 474cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.bind_mw = c4iw_bind_mw; 475cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.dealloc_mw = c4iw_dealloc_mw; 476cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.alloc_fast_reg_mr = c4iw_alloc_fast_reg_mr; 477cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.alloc_fast_reg_page_list = c4iw_alloc_fastreg_pbl; 478cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.free_fast_reg_page_list = c4iw_free_fastreg_pbl; 479cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.attach_mcast = c4iw_multicast_attach; 480cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.detach_mcast = c4iw_multicast_detach; 481cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.process_mad = c4iw_process_mad; 482cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.req_notify_cq = c4iw_arm_cq; 483cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.post_send = c4iw_post_send; 484cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.post_recv = c4iw_post_receive; 485cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.get_protocol_stats = c4iw_get_mib; 486c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise dev->ibdev.uverbs_abi_ver = C4IW_UVERBS_ABI_VERSION; 487cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 488cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.iwcm = kmalloc(sizeof(struct iw_cm_verbs), GFP_KERNEL); 489cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (!dev->ibdev.iwcm) 490cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return -ENOMEM; 491cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 492cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.iwcm->connect = c4iw_connect; 493cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.iwcm->accept = c4iw_accept_cr; 494cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.iwcm->reject = c4iw_reject_cr; 495cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.iwcm->create_listen = c4iw_create_listen; 496cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.iwcm->destroy_listen = c4iw_destroy_listen; 497cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.iwcm->add_ref = c4iw_qp_add_ref; 498cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.iwcm->rem_ref = c4iw_qp_rem_ref; 499cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dev->ibdev.iwcm->get_qp = c4iw_get_qp; 500cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 5019a6edb60ec10d86b1025a0cdad68fd89f1ddaf02Ralph Campbell ret = ib_register_device(&dev->ibdev, NULL); 502cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (ret) 503cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise goto bail1; 504cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 505cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise for (i = 0; i < ARRAY_SIZE(c4iw_class_attributes); ++i) { 506cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ret = device_create_file(&dev->ibdev.dev, 507cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise c4iw_class_attributes[i]); 508cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (ret) 509cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise goto bail2; 510cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 511cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return 0; 512cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisebail2: 513cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ib_unregister_device(&dev->ibdev); 514cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisebail1: 515cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kfree(dev->ibdev.iwcm); 516cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return ret; 517cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 518cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 519cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_unregister_device(struct c4iw_dev *dev) 520cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 521cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int i; 522cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 523cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s c4iw_dev %p\n", __func__, dev); 524cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise for (i = 0; i < ARRAY_SIZE(c4iw_class_attributes); ++i) 525cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise device_remove_file(&dev->ibdev.dev, 526cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise c4iw_class_attributes[i]); 527cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ib_unregister_device(&dev->ibdev); 528cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kfree(dev->ibdev.iwcm); 529cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return; 530cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 531