iw_cxgb4.h revision 30c95c2d495c1c8d4d6a97bb9f4e4eacb91ba1d2
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 * - Redistributions in binary form must reproduce the above 18cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * copyright notice, this list of conditions and the following 19cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * disclaimer in the documentation and/or other materials 20cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * provided with the distribution. 21cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * 22cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 23cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 24cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 25cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 26cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 27cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 28cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 29cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise * SOFTWARE. 30cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise */ 31cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#ifndef __IW_CXGB4_H__ 32cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define __IW_CXGB4_H__ 33cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 34cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/mutex.h> 35cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/list.h> 36cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/spinlock.h> 37cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/idr.h> 38cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/workqueue.h> 39cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/netdevice.h> 40cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/sched.h> 41cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/pci.h> 42cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/dma-mapping.h> 43cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/inet.h> 44cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/wait.h> 45cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/kref.h> 46cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/timer.h> 47cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/io.h> 48cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <linux/kfifo.h> 49cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 50cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <asm/byteorder.h> 51cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 52cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <net/net_namespace.h> 53cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 54cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <rdma/ib_verbs.h> 55cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <rdma/iw_cm.h> 56cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 57cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "cxgb4.h" 58cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "cxgb4_uld.h" 59cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "l2t.h" 60cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "user.h" 61cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 62cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define DRV_NAME "iw_cxgb4" 63cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MOD DRV_NAME ":" 64cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 65cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseextern int c4iw_debug; 66cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define PDBG(fmt, args...) \ 67cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisedo { \ 68cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (c4iw_debug) \ 69cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise printk(MOD fmt, ## args); \ 70cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} while (0) 71cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 72cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "t4.h" 73cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 74cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define PBL_OFF(rdev_p, a) ((a) - (rdev_p)->lldi.vr->pbl.start) 75cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define RQT_OFF(rdev_p, a) ((a) - (rdev_p)->lldi.vr->rq.start) 76cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 77cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline void *cplhdr(struct sk_buff *skb) 78cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 79cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return skb->data; 80cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 81cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 82cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_resource { 83cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct kfifo tpt_fifo; 84cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t tpt_fifo_lock; 85cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct kfifo qid_fifo; 86cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t qid_fifo_lock; 87cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct kfifo pdid_fifo; 88cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t pdid_fifo_lock; 89cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 90cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 91cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_qid_list { 92cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head entry; 93cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 qid; 94cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 95cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 96cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_dev_ucontext { 97cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head qpids; 98cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head cqids; 99cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct mutex lock; 100cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 101cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 102cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_rdev_flags { 103cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise T4_FATAL_ERROR = (1<<0), 104cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 105cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 106cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_rdev { 107cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_resource resource; 108cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned long qpshift; 109cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 qpmask; 110cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned long cqshift; 111cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 cqmask; 112cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext uctx; 113cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct gen_pool *pbl_pool; 114cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct gen_pool *rqt_pool; 115c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise struct gen_pool *ocqp_pool; 116cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 flags; 117cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct cxgb4_lld_info lldi; 118c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise unsigned long oc_mw_pa; 119c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise void __iomem *oc_mw_kva; 120cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 121cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 122cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int c4iw_fatal_error(struct c4iw_rdev *rdev) 123cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 124cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return rdev->flags & T4_FATAL_ERROR; 125cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 126cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 127cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int c4iw_num_stags(struct c4iw_rdev *rdev) 128cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 129cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return min((int)T4_MAX_NUM_STAG, (int)(rdev->lldi.vr->stag.size >> 5)); 130cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 131cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 132aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise#define C4IW_WR_TO (10*HZ) 133aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 134aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wisestruct c4iw_wr_wait { 135aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise wait_queue_head_t wait; 136aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise int done; 137aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise int ret; 138aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise}; 139aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 140aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wisestatic inline void c4iw_init_wr_wait(struct c4iw_wr_wait *wr_waitp) 141aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise{ 142aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise wr_waitp->ret = 0; 143aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise wr_waitp->done = 0; 144aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise init_waitqueue_head(&wr_waitp->wait); 145aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise} 146aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 147aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wisestatic inline int c4iw_wait_for_reply(struct c4iw_rdev *rdev, 148aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise struct c4iw_wr_wait *wr_waitp, 149aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise u32 hwtid, u32 qpid, 150aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise const char *func) 151aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise{ 152aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise unsigned to = C4IW_WR_TO; 153aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise do { 154aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 155aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise wait_event_timeout(wr_waitp->wait, wr_waitp->done, to); 156aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise if (!wr_waitp->done) { 157aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise printk(KERN_ERR MOD "%s - Device %s not responding - " 158aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise "tid %u qpid %u\n", func, 159aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise pci_name(rdev->lldi.pdev), hwtid, qpid); 160aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise to = to << 2; 161aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise } 162aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise } while (!wr_waitp->done); 163aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise if (wr_waitp->ret) 16430c95c2d495c1c8d4d6a97bb9f4e4eacb91ba1d2Steve Wise PDBG("%s: FW reply %d tid %u qpid %u\n", 16530c95c2d495c1c8d4d6a97bb9f4e4eacb91ba1d2Steve Wise pci_name(rdev->lldi.pdev), wr_waitp->ret, hwtid, qpid); 166aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise return wr_waitp->ret; 167aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise} 168aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 169aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 170cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_dev { 171cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_device ibdev; 172cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_rdev rdev; 173cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 device_cap_flags; 174cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct idr cqidr; 175cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct idr qpidr; 176cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct idr mmidr; 177cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t lock; 178cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head entry; 179cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct dentry *debugfs_root; 1801c01c5388306a4c2245b71da0cba22d521e897aeSteve Wise u8 registered; 181cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 182cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 183cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_dev *to_c4iw_dev(struct ib_device *ibdev) 184cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 185cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibdev, struct c4iw_dev, ibdev); 186cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 187cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 188cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_dev *rdev_to_c4iw_dev(struct c4iw_rdev *rdev) 189cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 190cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(rdev, struct c4iw_dev, rdev); 191cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 192cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 193cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_cq *get_chp(struct c4iw_dev *rhp, u32 cqid) 194cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 195cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return idr_find(&rhp->cqidr, cqid); 196cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 197cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 198cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_qp *get_qhp(struct c4iw_dev *rhp, u32 qpid) 199cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 200cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return idr_find(&rhp->qpidr, qpid); 201cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 202cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 203cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mr *get_mhp(struct c4iw_dev *rhp, u32 mmid) 204cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 205cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return idr_find(&rhp->mmidr, mmid); 206cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 207cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 208cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int insert_handle(struct c4iw_dev *rhp, struct idr *idr, 209cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise void *handle, u32 id) 210cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 211cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int ret; 212cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int newid; 213cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 214cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise do { 215cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (!idr_pre_get(idr, GFP_KERNEL)) 216cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return -ENOMEM; 217cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_lock_irq(&rhp->lock); 218cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ret = idr_get_new_above(idr, handle, id, &newid); 219cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise BUG_ON(newid != id); 220cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_unlock_irq(&rhp->lock); 221cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } while (ret == -EAGAIN); 222cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 223cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return ret; 224cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 225cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 226cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline void remove_handle(struct c4iw_dev *rhp, struct idr *idr, u32 id) 227cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 228cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_lock_irq(&rhp->lock); 229cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise idr_remove(idr, id); 230cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_unlock_irq(&rhp->lock); 231cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 232cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 233cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_pd { 234cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_pd ibpd; 235cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pdid; 236cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 237cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 238cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 239cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_pd *to_c4iw_pd(struct ib_pd *ibpd) 240cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 241cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibpd, struct c4iw_pd, ibpd); 242cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 243cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 244cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct tpt_attributes { 245cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 len; 246cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 va_fbo; 247cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise enum fw_ri_mem_perms perms; 248cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 stag; 249cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pdid; 250cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 qpid; 251cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pbl_addr; 252cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pbl_size; 253cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 state:1; 254cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 type:2; 255cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rsvd:1; 256cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 remote_invaliate_disable:1; 257cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 zbva:1; 258cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 mw_bind_enable:1; 259cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 page_size:5; 260cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 261cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 262cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mr { 263cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_mr ibmr; 264cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_umem *umem; 265cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 266cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 kva; 267cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct tpt_attributes attr; 268cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 269cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 270cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mr *to_c4iw_mr(struct ib_mr *ibmr) 271cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 272cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibmr, struct c4iw_mr, ibmr); 273cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 274cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 275cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mw { 276cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_mw ibmw; 277cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 278cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 kva; 279cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct tpt_attributes attr; 280cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 281cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 282cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mw *to_c4iw_mw(struct ib_mw *ibmw) 283cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 284cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibmw, struct c4iw_mw, ibmw); 285cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 286cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 287cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_fr_page_list { 288cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_fast_reg_page_list ibpl; 289f38926aa1dc5fbf7dfc5f97a53377b2e796dedc3FUJITA Tomonori DEFINE_DMA_UNMAP_ADDR(mapping); 290cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dma_addr_t dma_addr; 291cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *dev; 292cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int size; 293cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 294cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 295cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_fr_page_list *to_c4iw_fr_page_list( 296cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_fast_reg_page_list *ibpl) 297cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 298cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibpl, struct c4iw_fr_page_list, ibpl); 299cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 300cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 301cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_cq { 302cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_cq ibcq; 303cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 304cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct t4_cq cq; 305cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t lock; 306cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise atomic_t refcnt; 307cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise wait_queue_head_t wait; 308cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 309cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 310cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_cq *to_c4iw_cq(struct ib_cq *ibcq) 311cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 312cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibcq, struct c4iw_cq, ibcq); 313cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 314cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 315cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mpa_attributes { 316cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 initiator; 317cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 recv_marker_enabled; 318cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 xmit_marker_enabled; 319cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 crc_enabled; 320cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 version; 321cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 p2p_type; 322cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 323cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 324cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_qp_attributes { 325cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 scq; 326cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rcq; 327cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 sq_num_entries; 328cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rq_num_entries; 329cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 sq_max_sges; 330cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 sq_max_sges_rdma_write; 331cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rq_max_sges; 332cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 state; 333cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_rdma_read; 334cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_rdma_write; 335cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_bind; 336cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_mmid0_fastreg; 337cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 max_ord; 338cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 max_ird; 339cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pd; 340cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 next_state; 341cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise char terminate_buffer[52]; 342cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 terminate_msg_len; 343cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 is_terminate_local; 344cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mpa_attributes mpa_attr; 345cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep *llp_stream_handle; 346cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 347cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 348cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_qp { 349cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_qp ibqp; 350cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 351cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep *ep; 352cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp_attributes attr; 353cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct t4_wq wq; 354cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t lock; 3552f5b48c3ad84fda9efe35122b058ccffc0c2c7cfSteve Wise struct mutex mutex; 356cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise atomic_t refcnt; 357cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise wait_queue_head_t wait; 358cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct timer_list timer; 359cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 360cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 361cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_qp *to_c4iw_qp(struct ib_qp *ibqp) 362cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 363cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibqp, struct c4iw_qp, ibqp); 364cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 365cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 366cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_ucontext { 367cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_ucontext ibucontext; 368cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext uctx; 369cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 key; 370cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t mmap_lock; 371cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head mmaps; 372cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 373cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 374cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_ucontext *to_c4iw_ucontext(struct ib_ucontext *c) 375cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 376cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(c, struct c4iw_ucontext, ibucontext); 377cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 378cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 379cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mm_entry { 380cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head entry; 381cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 addr; 382cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 key; 383cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned len; 384cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 385cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 386cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mm_entry *remove_mmap(struct c4iw_ucontext *ucontext, 387cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 key, unsigned len) 388cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 389cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head *pos, *nxt; 390cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mm_entry *mm; 391cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 392cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_lock(&ucontext->mmap_lock); 393cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise list_for_each_safe(pos, nxt, &ucontext->mmaps) { 394cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 395cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise mm = list_entry(pos, struct c4iw_mm_entry, entry); 396cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (mm->key == key && mm->len == len) { 397cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise list_del_init(&mm->entry); 398cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_unlock(&ucontext->mmap_lock); 399cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s key 0x%x addr 0x%llx len %d\n", __func__, 400cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise key, (unsigned long long) mm->addr, mm->len); 401cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return mm; 402cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 403cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 404cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_unlock(&ucontext->mmap_lock); 405cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return NULL; 406cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 407cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 408cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline void insert_mmap(struct c4iw_ucontext *ucontext, 409cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mm_entry *mm) 410cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 411cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_lock(&ucontext->mmap_lock); 412cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s key 0x%x addr 0x%llx len %d\n", __func__, 413cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise mm->key, (unsigned long long) mm->addr, mm->len); 414cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise list_add_tail(&mm->entry, &ucontext->mmaps); 415cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_unlock(&ucontext->mmap_lock); 416cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 417cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 418cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_qp_attr_mask { 419cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_NEXT_STATE = 1 << 0, 420cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_READ = 1 << 7, 421cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_WRITE = 1 << 8, 422cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_BIND = 1 << 9, 423cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_ORD = 1 << 11, 424cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_IRD = 1 << 12, 425cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_LLP_STREAM_HANDLE = 1 << 22, 426cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_STREAM_MSG_BUFFER = 1 << 23, 427cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MPA_ATTR = 1 << 24, 428cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_QP_CONTEXT_ACTIVATE = 1 << 25, 429cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_VALID_MODIFY = (C4IW_QP_ATTR_ENABLE_RDMA_READ | 430cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_WRITE | 431cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_ORD | 432cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_IRD | 433cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_LLP_STREAM_HANDLE | 434cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_STREAM_MSG_BUFFER | 435cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MPA_ATTR | 436cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_QP_CONTEXT_ACTIVATE) 437cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 438cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 439cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_modify_qp(struct c4iw_dev *rhp, 440cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp *qhp, 441cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise enum c4iw_qp_attr_mask mask, 442cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp_attributes *attrs, 443cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int internal); 444cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 445cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_qp_state { 446cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_IDLE, 447cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_RTS, 448cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_ERROR, 449cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_TERMINATE, 450cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_CLOSING, 451cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_TOT 452cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 453cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 454cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int c4iw_convert_state(enum ib_qp_state ib_state) 455cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 456cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise switch (ib_state) { 457cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_RESET: 458cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_INIT: 459cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_IDLE; 460cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_RTS: 461cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_RTS; 462cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_SQD: 463cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_CLOSING; 464cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_SQE: 465cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_TERMINATE; 466cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_ERR: 467cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_ERROR; 468cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise default: 469cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return -1; 470cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 471cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 472cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 473cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline u32 c4iw_ib_to_tpt_access(int a) 474cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 475cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return (a & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) | 476cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (a & IB_ACCESS_REMOTE_READ ? FW_RI_MEM_ACCESS_REM_READ : 0) | 477cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (a & IB_ACCESS_LOCAL_WRITE ? FW_RI_MEM_ACCESS_LOCAL_WRITE : 0) | 478cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise FW_RI_MEM_ACCESS_LOCAL_READ; 479cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 480cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 481cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline u32 c4iw_ib_to_tpt_bind_access(int acc) 482cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 483cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return (acc & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) | 484cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (acc & IB_ACCESS_REMOTE_READ ? FW_RI_MEM_ACCESS_REM_READ : 0); 485cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 486cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 487cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_mmid_state { 488cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_STAG_STATE_VALID, 489cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_STAG_STATE_INVALID 490cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 491cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 492cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define C4IW_NODE_DESC "cxgb4 Chelsio Communications" 493cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 494cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_KEY_REQ "MPA ID Req Frame" 495cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_KEY_REP "MPA ID Rep Frame" 496cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 497cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_MAX_PRIVATE_DATA 256 498cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_REJECT 0x20 499cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_CRC 0x40 500cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_MARKERS 0x80 501cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_FLAGS_MASK 0xE0 502cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 503cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define c4iw_put_ep(ep) { \ 504cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("put_ep (via %s:%u) ep %p refcnt %d\n", __func__, __LINE__, \ 505cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ep, atomic_read(&((ep)->kref.refcount))); \ 506cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise WARN_ON(atomic_read(&((ep)->kref.refcount)) < 1); \ 507cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kref_put(&((ep)->kref), _c4iw_free_ep); \ 508cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 509cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 510cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define c4iw_get_ep(ep) { \ 511cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("get_ep (via %s:%u) ep %p, refcnt %d\n", __func__, __LINE__, \ 512cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ep, atomic_read(&((ep)->kref.refcount))); \ 513cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kref_get(&((ep)->kref)); \ 514cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 515cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid _c4iw_free_ep(struct kref *kref); 516cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 517cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct mpa_message { 518cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 key[16]; 519cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 flags; 520cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 revision; 521cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise __be16 private_data_size; 522cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 private_data[0]; 523cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 524cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 525cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct terminate_message { 526cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 layer_etype; 527cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 ecode; 528cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise __be16 hdrct_rsvd; 529cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 len_hdrs[0]; 530cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 531cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 532cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define TERM_MAX_LENGTH (sizeof(struct terminate_message) + 2 + 18 + 28) 533cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 534cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_layers_types { 535cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LAYER_RDMAP = 0x00, 536cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LAYER_DDP = 0x10, 537cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LAYER_MPA = 0x20, 538cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_LOCAL_CATA = 0x00, 539cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_REMOTE_PROT = 0x01, 540cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_REMOTE_OP = 0x02, 541cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_LOCAL_CATA = 0x00, 542cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_TAGGED_ERR = 0x01, 543cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_UNTAGGED_ERR = 0x02, 544cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_LLP = 0x03 545cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 546cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 547cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_rdma_ecodes { 548cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_INV_STAG = 0x00, 549cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_BASE_BOUNDS = 0x01, 550cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_ACC_VIOL = 0x02, 551cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_STAG_NOT_ASSOC = 0x03, 552cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_TO_WRAP = 0x04, 553cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_INV_VERS = 0x05, 554cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_INV_OPCODE = 0x06, 555cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_STREAM_CATA = 0x07, 556cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_GLOBAL_CATA = 0x08, 557cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_CANT_INV_STAG = 0x09, 558cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_UNSPECIFIED = 0xff 559cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 560cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 561cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_ddp_ecodes { 562cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_INV_STAG = 0x00, 563cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_BASE_BOUNDS = 0x01, 564cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_STAG_NOT_ASSOC = 0x02, 565cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_TO_WRAP = 0x03, 566cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_INV_VERS = 0x04, 567cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_QN = 0x01, 568cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_MSN_NOBUF = 0x02, 569cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_MSN_RANGE = 0x03, 570cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_MO = 0x04, 571cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_MSG_TOOBIG = 0x05, 572cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_VERS = 0x06 573cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 574cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 575cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_mpa_ecodes { 576cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_CRC_ERR = 0x02, 577cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_MARKER_ERR = 0x03 578cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 579cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 580cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_ep_state { 581cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise IDLE = 0, 582cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LISTEN, 583cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise CONNECTING, 584cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REQ_WAIT, 585cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REQ_SENT, 586cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REQ_RCVD, 587cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REP_SENT, 588cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise FPDU_MODE, 589cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ABORTING, 590cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise CLOSING, 591cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MORIBUND, 592cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DEAD, 593cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 594cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 595cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_ep_flags { 596cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PEER_ABORT_IN_PROGRESS = 0, 597cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ABORT_REQ_IN_PROGRESS = 1, 598cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RELEASE_RESOURCES = 2, 599cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise CLOSE_SENT = 3, 600cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 601cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 602cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_ep_common { 603cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct iw_cm_id *cm_id; 604cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp *qp; 605cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *dev; 606cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise enum c4iw_ep_state state; 607cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct kref kref; 6082f5b48c3ad84fda9efe35122b058ccffc0c2c7cfSteve Wise struct mutex mutex; 609cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct sockaddr_in local_addr; 610cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct sockaddr_in remote_addr; 611aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise struct c4iw_wr_wait wr_wait; 612cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned long flags; 613cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 614cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 615cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_listen_ep { 616cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep_common com; 617cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned int stid; 618cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int backlog; 619cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 620cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 621cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_ep { 622cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep_common com; 623cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep *parent_ep; 624cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct timer_list timer; 625be4c9bad9d0edb6bc3bd8fffc2f98e0e2112da39Roland Dreier struct list_head entry; 626cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned int atid; 627cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 hwtid; 628cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 snd_seq; 629cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rcv_seq; 630cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct l2t_entry *l2t; 631cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct dst_entry *dst; 632cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct sk_buff *mpa_skb; 633cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mpa_attributes mpa_attr; 634cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 mpa_pkt[sizeof(struct mpa_message) + MPA_MAX_PRIVATE_DATA]; 635cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned int mpa_pkt_len; 636cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 ird; 637cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 ord; 638cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 smac_idx; 639cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 tx_chan; 640cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 mtu; 641cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 mss; 642cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 emss; 643cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 plen; 644cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 rss_qid; 645cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 txq_idx; 646d4f1a5c6efabccd4b787a8b5907a5df9204ad2f6Steve Wise u16 ctrlq_idx; 647cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 tos; 648cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 649cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 650cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_ep *to_ep(struct iw_cm_id *cm_id) 651cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 652cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return cm_id->provider_data; 653cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 654cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 655cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_listen_ep *to_listen_ep(struct iw_cm_id *cm_id) 656cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 657cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return cm_id->provider_data; 658cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 659cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 660cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int compute_wscale(int win) 661cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 662cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int wscale = 0; 663cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 664cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise while (wscale < 14 && (65535<<wscale) < win) 665cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise wscale++; 666cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return wscale; 667cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 668cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 669cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisetypedef int (*c4iw_handler_func)(struct c4iw_dev *dev, struct sk_buff *skb); 670cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 671cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ep_redirect(void *ctx, struct dst_entry *old, struct dst_entry *new, 672cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct l2t_entry *l2t); 673cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_put_qpid(struct c4iw_rdev *rdev, u32 qpid, 674cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 675cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_get_resource(struct kfifo *fifo, spinlock_t *lock); 676cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_put_resource(struct kfifo *fifo, u32 entry, spinlock_t *lock); 677cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_init_resource(struct c4iw_rdev *rdev, u32 nr_tpt, u32 nr_pdid); 678cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_init_ctrl_qp(struct c4iw_rdev *rdev); 679cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_pblpool_create(struct c4iw_rdev *rdev); 680cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_rqtpool_create(struct c4iw_rdev *rdev); 681c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wiseint c4iw_ocqp_pool_create(struct c4iw_rdev *rdev); 682cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_pblpool_destroy(struct c4iw_rdev *rdev); 683cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_rqtpool_destroy(struct c4iw_rdev *rdev); 684c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wisevoid c4iw_ocqp_pool_destroy(struct c4iw_rdev *rdev); 685cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_destroy_resource(struct c4iw_resource *rscp); 686cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_ctrl_qp(struct c4iw_rdev *rdev); 687cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_register_device(struct c4iw_dev *dev); 688cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_unregister_device(struct c4iw_dev *dev); 689cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint __init c4iw_cm_init(void); 690cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid __exit c4iw_cm_term(void); 691cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_release_dev_ucontext(struct c4iw_rdev *rdev, 692cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 693cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_init_dev_ucontext(struct c4iw_rdev *rdev, 694cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 695cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc); 696cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, 697cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_send_wr **bad_wr); 698cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr, 699cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_recv_wr **bad_wr); 700cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_bind_mw(struct ib_qp *qp, struct ib_mw *mw, 701cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_mw_bind *mw_bind); 702cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param); 703cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_create_listen(struct iw_cm_id *cm_id, int backlog); 704cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_listen(struct iw_cm_id *cm_id); 705cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param); 706cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_reject_cr(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len); 707cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_qp_add_ref(struct ib_qp *qp); 708cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_qp_rem_ref(struct ib_qp *qp); 709cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_free_fastreg_pbl(struct ib_fast_reg_page_list *page_list); 710cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_fast_reg_page_list *c4iw_alloc_fastreg_pbl( 711cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_device *device, 712cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int page_list_len); 713cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_alloc_fast_reg_mr(struct ib_pd *pd, int pbl_depth); 714cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_dealloc_mw(struct ib_mw *mw); 715cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mw *c4iw_alloc_mw(struct ib_pd *pd); 716cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, 717cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 length, u64 virt, int acc, 718cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_udata *udata); 719cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_get_dma_mr(struct ib_pd *pd, int acc); 720cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_register_phys_mem(struct ib_pd *pd, 721cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_phys_buf *buffer_list, 722cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int num_phys_buf, 723cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int acc, 724cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 *iova_start); 725cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_reregister_phys_mem(struct ib_mr *mr, 726cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int mr_rereg_mask, 727cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_pd *pd, 728cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_phys_buf *buffer_list, 729cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int num_phys_buf, 730cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int acc, u64 *iova_start); 731cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_dereg_mr(struct ib_mr *ib_mr); 732cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_cq(struct ib_cq *ib_cq); 733cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries, 734cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int vector, 735cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_ucontext *ib_context, 736cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_udata *udata); 737cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_resize_cq(struct ib_cq *cq, int cqe, struct ib_udata *udata); 738cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags); 739cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_qp(struct ib_qp *ib_qp); 740cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_qp *c4iw_create_qp(struct ib_pd *pd, 741cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_qp_init_attr *attrs, 742cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_udata *udata); 743cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, 744cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int attr_mask, struct ib_udata *udata); 745cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_qp *c4iw_get_qp(struct ib_device *dev, int qpn); 746cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_rqtpool_alloc(struct c4iw_rdev *rdev, int size); 747cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_rqtpool_free(struct c4iw_rdev *rdev, u32 addr, int size); 748cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_pblpool_alloc(struct c4iw_rdev *rdev, int size); 749cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_pblpool_free(struct c4iw_rdev *rdev, u32 addr, int size); 750c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wiseu32 c4iw_ocqp_pool_alloc(struct c4iw_rdev *rdev, int size); 751c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wisevoid c4iw_ocqp_pool_free(struct c4iw_rdev *rdev, u32 addr, int size); 752cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ofld_send(struct c4iw_rdev *rdev, struct sk_buff *skb); 753cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_flush_hw_cq(struct t4_cq *cq); 754cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_count_rcqes(struct t4_cq *cq, struct t4_wq *wq, int *count); 755cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_count_scqes(struct t4_cq *cq, struct t4_wq *wq, int *count); 756cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp); 757cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_flush_rq(struct t4_wq *wq, struct t4_cq *cq, int count); 758cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_flush_sq(struct t4_wq *wq, struct t4_cq *cq, int count); 759cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ev_handler(struct c4iw_dev *rnicp, u32 qid); 760cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu16 c4iw_rqes_posted(struct c4iw_qp *qhp); 761cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_post_terminate(struct c4iw_qp *qhp, struct t4_cqe *err_cqe); 762cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_get_cqid(struct c4iw_rdev *rdev, struct c4iw_dev_ucontext *uctx); 763cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_put_cqid(struct c4iw_rdev *rdev, u32 qid, 764cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 765cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_get_qpid(struct c4iw_rdev *rdev, struct c4iw_dev_ucontext *uctx); 766cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_put_qpid(struct c4iw_rdev *rdev, u32 qid, 767cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 768cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_ev_dispatch(struct c4iw_dev *dev, struct t4_cqe *err_cqe); 769cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 770cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseextern struct cxgb4_client t4c_client; 771cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseextern c4iw_handler_func c4iw_handlers[NUM_CPL_CMDS]; 772be4c9bad9d0edb6bc3bd8fffc2f98e0e2112da39Roland Dreierextern int c4iw_max_read_depth; 773cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 774cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#endif 775