iw_cxgb4.h revision 42b6a949903d28f59c95f4c71080aa8b41e3d1d1
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> 38c337374bf23b88620bcc66a7a09f141cc640f548Steve Wise#include <linux/completion.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 49cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <asm/byteorder.h> 50cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 51cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <net/net_namespace.h> 52cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 53cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <rdma/ib_verbs.h> 54cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include <rdma/iw_cm.h> 55cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 56cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "cxgb4.h" 57cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "cxgb4_uld.h" 58cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "l2t.h" 59cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "user.h" 60cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 61cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define DRV_NAME "iw_cxgb4" 62cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MOD DRV_NAME ":" 63cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 64cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseextern int c4iw_debug; 65cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define PDBG(fmt, args...) \ 66cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisedo { \ 67cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (c4iw_debug) \ 68cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise printk(MOD fmt, ## args); \ 69cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} while (0) 70cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 71cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "t4.h" 72cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 73cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define PBL_OFF(rdev_p, a) ((a) - (rdev_p)->lldi.vr->pbl.start) 74cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define RQT_OFF(rdev_p, a) ((a) - (rdev_p)->lldi.vr->rq.start) 75cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 76cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline void *cplhdr(struct sk_buff *skb) 77cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 78cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return skb->data; 79cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 80cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 81ec3eead217181d7360a11317a888ceb30807867cVipul Pandya#define C4IW_ID_TABLE_F_RANDOM 1 /* Pseudo-randomize the id's returned */ 82ec3eead217181d7360a11317a888ceb30807867cVipul Pandya#define C4IW_ID_TABLE_F_EMPTY 2 /* Table is initially empty */ 83ec3eead217181d7360a11317a888ceb30807867cVipul Pandya 84ec3eead217181d7360a11317a888ceb30807867cVipul Pandyastruct c4iw_id_table { 85ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u32 flags; 86ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u32 start; /* logical minimal id */ 87ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u32 last; /* hint for find */ 88ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u32 max; 89ec3eead217181d7360a11317a888ceb30807867cVipul Pandya spinlock_t lock; 90ec3eead217181d7360a11317a888ceb30807867cVipul Pandya unsigned long *table; 91ec3eead217181d7360a11317a888ceb30807867cVipul Pandya}; 92ec3eead217181d7360a11317a888ceb30807867cVipul Pandya 93cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_resource { 94ec3eead217181d7360a11317a888ceb30807867cVipul Pandya struct c4iw_id_table tpt_table; 95ec3eead217181d7360a11317a888ceb30807867cVipul Pandya struct c4iw_id_table qid_table; 96ec3eead217181d7360a11317a888ceb30807867cVipul Pandya struct c4iw_id_table pdid_table; 97cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 98cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 99cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_qid_list { 100cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head entry; 101cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 qid; 102cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 103cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 104cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_dev_ucontext { 105cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head qpids; 106cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head cqids; 107cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct mutex lock; 108cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 109cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 110cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_rdev_flags { 111cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise T4_FATAL_ERROR = (1<<0), 112cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 113cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 1148d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandyastruct c4iw_stat { 1158d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya u64 total; 1168d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya u64 cur; 1178d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya u64 max; 118ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u64 fail; 1198d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya}; 1208d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya 1218d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandyastruct c4iw_stats { 1228d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct mutex lock; 1238d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat qid; 1248d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat pd; 1258d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat stag; 1268d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat pbl; 1278d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat rqt; 1288d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat ocqp; 1292c97478106880a5fb241a473252e61845a69386eVipul Pandya u64 db_full; 1302c97478106880a5fb241a473252e61845a69386eVipul Pandya u64 db_empty; 1312c97478106880a5fb241a473252e61845a69386eVipul Pandya u64 db_drop; 132422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya u64 db_state_transitions; 1335be78ee924ae8fb2b4a5b8d012a7d003849337eeVipul Pandya u64 tcam_full; 134793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya u64 act_ofld_conn_fails; 135793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya u64 pas_ofld_conn_fails; 1368d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya}; 1378d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya 138cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_rdev { 139cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_resource resource; 140cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned long qpshift; 141cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 qpmask; 142cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned long cqshift; 143cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 cqmask; 144cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext uctx; 145cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct gen_pool *pbl_pool; 146cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct gen_pool *rqt_pool; 147c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise struct gen_pool *ocqp_pool; 148cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 flags; 149cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct cxgb4_lld_info lldi; 150c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise unsigned long oc_mw_pa; 151c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise void __iomem *oc_mw_kva; 1528d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stats stats; 153cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 154cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 155cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int c4iw_fatal_error(struct c4iw_rdev *rdev) 156cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 157cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return rdev->flags & T4_FATAL_ERROR; 158cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 159cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 160cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int c4iw_num_stags(struct c4iw_rdev *rdev) 161cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 162cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return min((int)T4_MAX_NUM_STAG, (int)(rdev->lldi.vr->stag.size >> 5)); 163cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 164cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 165aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise#define C4IW_WR_TO (10*HZ) 166aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 167aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wisestruct c4iw_wr_wait { 168c337374bf23b88620bcc66a7a09f141cc640f548Steve Wise struct completion completion; 169aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise int ret; 170aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise}; 171aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 172aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wisestatic inline void c4iw_init_wr_wait(struct c4iw_wr_wait *wr_waitp) 173aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise{ 174aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise wr_waitp->ret = 0; 175c337374bf23b88620bcc66a7a09f141cc640f548Steve Wise init_completion(&wr_waitp->completion); 176aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise} 177aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 178d9594d990a528d4c444777d0f360bb50c6114825Steve Wisestatic inline void c4iw_wake_up(struct c4iw_wr_wait *wr_waitp, int ret) 179d9594d990a528d4c444777d0f360bb50c6114825Steve Wise{ 180d9594d990a528d4c444777d0f360bb50c6114825Steve Wise wr_waitp->ret = ret; 181c337374bf23b88620bcc66a7a09f141cc640f548Steve Wise complete(&wr_waitp->completion); 182d9594d990a528d4c444777d0f360bb50c6114825Steve Wise} 183d9594d990a528d4c444777d0f360bb50c6114825Steve Wise 184aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wisestatic inline int c4iw_wait_for_reply(struct c4iw_rdev *rdev, 185aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise struct c4iw_wr_wait *wr_waitp, 186aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise u32 hwtid, u32 qpid, 187aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise const char *func) 188aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise{ 189aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise unsigned to = C4IW_WR_TO; 190d9594d990a528d4c444777d0f360bb50c6114825Steve Wise int ret; 191aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 192d9594d990a528d4c444777d0f360bb50c6114825Steve Wise do { 193c337374bf23b88620bcc66a7a09f141cc640f548Steve Wise ret = wait_for_completion_timeout(&wr_waitp->completion, to); 194d9594d990a528d4c444777d0f360bb50c6114825Steve Wise if (!ret) { 195aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise printk(KERN_ERR MOD "%s - Device %s not responding - " 196aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise "tid %u qpid %u\n", func, 197aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise pci_name(rdev->lldi.pdev), hwtid, qpid); 1982f25e9a540951ebd533b9b98d2259deb44b0b476Steve Wise if (c4iw_fatal_error(rdev)) { 1992f25e9a540951ebd533b9b98d2259deb44b0b476Steve Wise wr_waitp->ret = -EIO; 2002f25e9a540951ebd533b9b98d2259deb44b0b476Steve Wise break; 2012f25e9a540951ebd533b9b98d2259deb44b0b476Steve Wise } 202aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise to = to << 2; 203aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise } 204d9594d990a528d4c444777d0f360bb50c6114825Steve Wise } while (!ret); 205aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise if (wr_waitp->ret) 20630c95c2d495c1c8d4d6a97bb9f4e4eacb91ba1d2Steve Wise PDBG("%s: FW reply %d tid %u qpid %u\n", 20730c95c2d495c1c8d4d6a97bb9f4e4eacb91ba1d2Steve Wise pci_name(rdev->lldi.pdev), wr_waitp->ret, hwtid, qpid); 208aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise return wr_waitp->ret; 209aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise} 210aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 2112c97478106880a5fb241a473252e61845a69386eVipul Pandyaenum db_state { 2122c97478106880a5fb241a473252e61845a69386eVipul Pandya NORMAL = 0, 2132c97478106880a5fb241a473252e61845a69386eVipul Pandya FLOW_CONTROL = 1, 2142c97478106880a5fb241a473252e61845a69386eVipul Pandya RECOVERY = 2 2152c97478106880a5fb241a473252e61845a69386eVipul Pandya}; 2162c97478106880a5fb241a473252e61845a69386eVipul Pandya 217cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_dev { 218cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_device ibdev; 219cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_rdev rdev; 220cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 device_cap_flags; 221cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct idr cqidr; 222cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct idr qpidr; 223cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct idr mmidr; 224cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t lock; 2252c97478106880a5fb241a473252e61845a69386eVipul Pandya struct mutex db_mutex; 226cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct dentry *debugfs_root; 2272c97478106880a5fb241a473252e61845a69386eVipul Pandya enum db_state db_state; 228422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya int qpcnt; 229793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya struct idr hwtid_idr; 230793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya struct idr atid_idr; 231793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya struct idr stid_idr; 232cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 233cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 234cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_dev *to_c4iw_dev(struct ib_device *ibdev) 235cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 236cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibdev, struct c4iw_dev, ibdev); 237cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 238cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 239cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_dev *rdev_to_c4iw_dev(struct c4iw_rdev *rdev) 240cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 241cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(rdev, struct c4iw_dev, rdev); 242cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 243cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 244cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_cq *get_chp(struct c4iw_dev *rhp, u32 cqid) 245cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 246cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return idr_find(&rhp->cqidr, cqid); 247cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 248cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 249cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_qp *get_qhp(struct c4iw_dev *rhp, u32 qpid) 250cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 251cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return idr_find(&rhp->qpidr, qpid); 252cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 253cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 254cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mr *get_mhp(struct c4iw_dev *rhp, u32 mmid) 255cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 256cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return idr_find(&rhp->mmidr, mmid); 257cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 258cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 2592c97478106880a5fb241a473252e61845a69386eVipul Pandyastatic inline int _insert_handle(struct c4iw_dev *rhp, struct idr *idr, 2602c97478106880a5fb241a473252e61845a69386eVipul Pandya void *handle, u32 id, int lock) 261cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 262cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int ret; 263cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 264e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo if (lock) { 265e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo idr_preload(GFP_KERNEL); 266e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo spin_lock_irq(&rhp->lock); 267e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo } 268e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo 269e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo ret = idr_alloc(idr, handle, id, id + 1, GFP_ATOMIC); 270e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo 271e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo if (lock) { 272e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo spin_unlock_irq(&rhp->lock); 273e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo idr_preload_end(); 274e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo } 275e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo 276e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo BUG_ON(ret == -ENOSPC); 277e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo return ret < 0 ? ret : 0; 278cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 279cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 2802c97478106880a5fb241a473252e61845a69386eVipul Pandyastatic inline int insert_handle(struct c4iw_dev *rhp, struct idr *idr, 2812c97478106880a5fb241a473252e61845a69386eVipul Pandya void *handle, u32 id) 2822c97478106880a5fb241a473252e61845a69386eVipul Pandya{ 2832c97478106880a5fb241a473252e61845a69386eVipul Pandya return _insert_handle(rhp, idr, handle, id, 1); 2842c97478106880a5fb241a473252e61845a69386eVipul Pandya} 2852c97478106880a5fb241a473252e61845a69386eVipul Pandya 2862c97478106880a5fb241a473252e61845a69386eVipul Pandyastatic inline int insert_handle_nolock(struct c4iw_dev *rhp, struct idr *idr, 2872c97478106880a5fb241a473252e61845a69386eVipul Pandya void *handle, u32 id) 2882c97478106880a5fb241a473252e61845a69386eVipul Pandya{ 2892c97478106880a5fb241a473252e61845a69386eVipul Pandya return _insert_handle(rhp, idr, handle, id, 0); 2902c97478106880a5fb241a473252e61845a69386eVipul Pandya} 2912c97478106880a5fb241a473252e61845a69386eVipul Pandya 292422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandyastatic inline void _remove_handle(struct c4iw_dev *rhp, struct idr *idr, 293422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya u32 id, int lock) 294cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 295422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya if (lock) 296422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya spin_lock_irq(&rhp->lock); 297cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise idr_remove(idr, id); 298422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya if (lock) 299422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya spin_unlock_irq(&rhp->lock); 300422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya} 301422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya 302422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandyastatic inline void remove_handle(struct c4iw_dev *rhp, struct idr *idr, u32 id) 303422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya{ 304422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya _remove_handle(rhp, idr, id, 1); 305422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya} 306422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya 307422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandyastatic inline void remove_handle_nolock(struct c4iw_dev *rhp, 308422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya struct idr *idr, u32 id) 309422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya{ 310422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya _remove_handle(rhp, idr, id, 0); 311cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 312cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 313cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_pd { 314cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_pd ibpd; 315cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pdid; 316cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 317cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 318cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 319cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_pd *to_c4iw_pd(struct ib_pd *ibpd) 320cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 321cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibpd, struct c4iw_pd, ibpd); 322cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 323cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 324cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct tpt_attributes { 325cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 len; 326cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 va_fbo; 327cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise enum fw_ri_mem_perms perms; 328cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 stag; 329cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pdid; 330cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 qpid; 331cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pbl_addr; 332cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pbl_size; 333cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 state:1; 334cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 type:2; 335cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rsvd:1; 336cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 remote_invaliate_disable:1; 337cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 zbva:1; 338cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 mw_bind_enable:1; 339cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 page_size:5; 340cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 341cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 342cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mr { 343cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_mr ibmr; 344cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_umem *umem; 345cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 346cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 kva; 347cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct tpt_attributes attr; 348cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 349cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 350cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mr *to_c4iw_mr(struct ib_mr *ibmr) 351cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 352cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibmr, struct c4iw_mr, ibmr); 353cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 354cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 355cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mw { 356cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_mw ibmw; 357cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 358cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 kva; 359cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct tpt_attributes attr; 360cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 361cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 362cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mw *to_c4iw_mw(struct ib_mw *ibmw) 363cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 364cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibmw, struct c4iw_mw, ibmw); 365cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 366cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 367cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_fr_page_list { 368cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_fast_reg_page_list ibpl; 369f38926aa1dc5fbf7dfc5f97a53377b2e796dedc3FUJITA Tomonori DEFINE_DMA_UNMAP_ADDR(mapping); 370cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dma_addr_t dma_addr; 371cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *dev; 372cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 373cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 374cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_fr_page_list *to_c4iw_fr_page_list( 375cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_fast_reg_page_list *ibpl) 376cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 377cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibpl, struct c4iw_fr_page_list, ibpl); 378cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 379cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 380cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_cq { 381cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_cq ibcq; 382cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 383cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct t4_cq cq; 384cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t lock; 385581bbe2cd0694a935e0c3ccd7f011e10094f1df6Kumar Sanghvi spinlock_t comp_handler_lock; 386cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise atomic_t refcnt; 387cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise wait_queue_head_t wait; 388cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 389cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 390cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_cq *to_c4iw_cq(struct ib_cq *ibcq) 391cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 392cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibcq, struct c4iw_cq, ibcq); 393cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 394cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 395cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mpa_attributes { 396cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 initiator; 397cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 recv_marker_enabled; 398cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 xmit_marker_enabled; 399cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 crc_enabled; 400d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi u8 enhanced_rdma_conn; 401cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 version; 402cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 p2p_type; 403cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 404cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 405cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_qp_attributes { 406cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 scq; 407cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rcq; 408cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 sq_num_entries; 409cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rq_num_entries; 410cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 sq_max_sges; 411cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 sq_max_sges_rdma_write; 412cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rq_max_sges; 413cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 state; 414cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_rdma_read; 415cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_rdma_write; 416cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_bind; 417cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_mmid0_fastreg; 418cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 max_ord; 419cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 max_ird; 420cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pd; 421cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 next_state; 422cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise char terminate_buffer[52]; 423cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 terminate_msg_len; 424cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 is_terminate_local; 425cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mpa_attributes mpa_attr; 426cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep *llp_stream_handle; 427d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi u8 layer_etype; 428d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi u8 ecode; 4292c97478106880a5fb241a473252e61845a69386eVipul Pandya u16 sq_db_inc; 4302c97478106880a5fb241a473252e61845a69386eVipul Pandya u16 rq_db_inc; 431cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 432cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 433cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_qp { 434cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_qp ibqp; 435cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 436cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep *ep; 437cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp_attributes attr; 438cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct t4_wq wq; 439cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t lock; 4402f5b48c3ad84fda9efe35122b058ccffc0c2c7cfSteve Wise struct mutex mutex; 441cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise atomic_t refcnt; 442cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise wait_queue_head_t wait; 443cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct timer_list timer; 444cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 445cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 446cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_qp *to_c4iw_qp(struct ib_qp *ibqp) 447cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 448cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibqp, struct c4iw_qp, ibqp); 449cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 450cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 451cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_ucontext { 452cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_ucontext ibucontext; 453cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext uctx; 454cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 key; 455cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t mmap_lock; 456cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head mmaps; 457cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 458cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 459cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_ucontext *to_c4iw_ucontext(struct ib_ucontext *c) 460cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 461cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(c, struct c4iw_ucontext, ibucontext); 462cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 463cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 464cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mm_entry { 465cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head entry; 466cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 addr; 467cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 key; 468cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned len; 469cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 470cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 471cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mm_entry *remove_mmap(struct c4iw_ucontext *ucontext, 472cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 key, unsigned len) 473cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 474cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head *pos, *nxt; 475cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mm_entry *mm; 476cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 477cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_lock(&ucontext->mmap_lock); 478cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise list_for_each_safe(pos, nxt, &ucontext->mmaps) { 479cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 480cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise mm = list_entry(pos, struct c4iw_mm_entry, entry); 481cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (mm->key == key && mm->len == len) { 482cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise list_del_init(&mm->entry); 483cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_unlock(&ucontext->mmap_lock); 484cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s key 0x%x addr 0x%llx len %d\n", __func__, 485cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise key, (unsigned long long) mm->addr, mm->len); 486cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return mm; 487cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 488cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 489cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_unlock(&ucontext->mmap_lock); 490cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return NULL; 491cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 492cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 493cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline void insert_mmap(struct c4iw_ucontext *ucontext, 494cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mm_entry *mm) 495cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 496cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_lock(&ucontext->mmap_lock); 497cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s key 0x%x addr 0x%llx len %d\n", __func__, 498cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise mm->key, (unsigned long long) mm->addr, mm->len); 499cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise list_add_tail(&mm->entry, &ucontext->mmaps); 500cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_unlock(&ucontext->mmap_lock); 501cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 502cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 503cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_qp_attr_mask { 504cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_NEXT_STATE = 1 << 0, 5052c97478106880a5fb241a473252e61845a69386eVipul Pandya C4IW_QP_ATTR_SQ_DB = 1<<1, 5062c97478106880a5fb241a473252e61845a69386eVipul Pandya C4IW_QP_ATTR_RQ_DB = 1<<2, 507cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_READ = 1 << 7, 508cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_WRITE = 1 << 8, 509cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_BIND = 1 << 9, 510cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_ORD = 1 << 11, 511cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_IRD = 1 << 12, 512cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_LLP_STREAM_HANDLE = 1 << 22, 513cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_STREAM_MSG_BUFFER = 1 << 23, 514cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MPA_ATTR = 1 << 24, 515cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_QP_CONTEXT_ACTIVATE = 1 << 25, 516cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_VALID_MODIFY = (C4IW_QP_ATTR_ENABLE_RDMA_READ | 517cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_WRITE | 518cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_ORD | 519cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_IRD | 520cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_LLP_STREAM_HANDLE | 521cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_STREAM_MSG_BUFFER | 522cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MPA_ATTR | 523cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_QP_CONTEXT_ACTIVATE) 524cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 525cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 526cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_modify_qp(struct c4iw_dev *rhp, 527cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp *qhp, 528cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise enum c4iw_qp_attr_mask mask, 529cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp_attributes *attrs, 530cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int internal); 531cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 532cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_qp_state { 533cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_IDLE, 534cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_RTS, 535cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_ERROR, 536cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_TERMINATE, 537cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_CLOSING, 538cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_TOT 539cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 540cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 541cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int c4iw_convert_state(enum ib_qp_state ib_state) 542cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 543cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise switch (ib_state) { 544cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_RESET: 545cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_INIT: 546cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_IDLE; 547cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_RTS: 548cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_RTS; 549cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_SQD: 550cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_CLOSING; 551cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_SQE: 552cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_TERMINATE; 553cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_ERR: 554cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_ERROR; 555cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise default: 556cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return -1; 557cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 558cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 559cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 56067bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandyastatic inline int to_ib_qp_state(int c4iw_qp_state) 56167bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya{ 56267bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya switch (c4iw_qp_state) { 56367bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya case C4IW_QP_STATE_IDLE: 56467bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_INIT; 56567bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya case C4IW_QP_STATE_RTS: 56667bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_RTS; 56767bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya case C4IW_QP_STATE_CLOSING: 56867bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_SQD; 56967bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya case C4IW_QP_STATE_TERMINATE: 57067bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_SQE; 57167bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya case C4IW_QP_STATE_ERROR: 57267bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_ERR; 57367bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya } 57467bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_ERR; 57567bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya} 57667bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya 577cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline u32 c4iw_ib_to_tpt_access(int a) 578cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 579cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return (a & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) | 580cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (a & IB_ACCESS_REMOTE_READ ? FW_RI_MEM_ACCESS_REM_READ : 0) | 581cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (a & IB_ACCESS_LOCAL_WRITE ? FW_RI_MEM_ACCESS_LOCAL_WRITE : 0) | 582cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise FW_RI_MEM_ACCESS_LOCAL_READ; 583cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 584cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 585cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline u32 c4iw_ib_to_tpt_bind_access(int acc) 586cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 587cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return (acc & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) | 588cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (acc & IB_ACCESS_REMOTE_READ ? FW_RI_MEM_ACCESS_REM_READ : 0); 589cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 590cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 591cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_mmid_state { 592cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_STAG_STATE_VALID, 593cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_STAG_STATE_INVALID 594cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 595cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 596cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define C4IW_NODE_DESC "cxgb4 Chelsio Communications" 597cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 598cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_KEY_REQ "MPA ID Req Frame" 599cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_KEY_REP "MPA ID Rep Frame" 600cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 601cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_MAX_PRIVATE_DATA 256 602d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_ENHANCED_RDMA_CONN 0x10 603cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_REJECT 0x20 604cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_CRC 0x40 605cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_MARKERS 0x80 606cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_FLAGS_MASK 0xE0 607cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 608d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_V2_PEER2PEER_MODEL 0x8000 609d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_V2_ZERO_LEN_FPDU_RTR 0x4000 610d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_V2_RDMA_WRITE_RTR 0x8000 611d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_V2_RDMA_READ_RTR 0x4000 612d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_V2_IRD_ORD_MASK 0x3FFF 613d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi 614cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define c4iw_put_ep(ep) { \ 615cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("put_ep (via %s:%u) ep %p refcnt %d\n", __func__, __LINE__, \ 616cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ep, atomic_read(&((ep)->kref.refcount))); \ 617cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise WARN_ON(atomic_read(&((ep)->kref.refcount)) < 1); \ 618cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kref_put(&((ep)->kref), _c4iw_free_ep); \ 619cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 620cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 621cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define c4iw_get_ep(ep) { \ 622cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("get_ep (via %s:%u) ep %p, refcnt %d\n", __func__, __LINE__, \ 623cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ep, atomic_read(&((ep)->kref.refcount))); \ 624cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kref_get(&((ep)->kref)); \ 625cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 626cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid _c4iw_free_ep(struct kref *kref); 627cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 628cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct mpa_message { 629cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 key[16]; 630cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 flags; 631cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 revision; 632cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise __be16 private_data_size; 633cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 private_data[0]; 634cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 635cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 636d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvistruct mpa_v2_conn_params { 637d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi __be16 ird; 638d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi __be16 ord; 639d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi}; 640d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi 641cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct terminate_message { 642cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 layer_etype; 643cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 ecode; 644cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise __be16 hdrct_rsvd; 645cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 len_hdrs[0]; 646cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 647cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 648cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define TERM_MAX_LENGTH (sizeof(struct terminate_message) + 2 + 18 + 28) 649cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 650cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_layers_types { 651cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LAYER_RDMAP = 0x00, 652cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LAYER_DDP = 0x10, 653cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LAYER_MPA = 0x20, 654cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_LOCAL_CATA = 0x00, 655cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_REMOTE_PROT = 0x01, 656cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_REMOTE_OP = 0x02, 657cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_LOCAL_CATA = 0x00, 658cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_TAGGED_ERR = 0x01, 659cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_UNTAGGED_ERR = 0x02, 660cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_LLP = 0x03 661cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 662cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 663cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_rdma_ecodes { 664cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_INV_STAG = 0x00, 665cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_BASE_BOUNDS = 0x01, 666cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_ACC_VIOL = 0x02, 667cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_STAG_NOT_ASSOC = 0x03, 668cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_TO_WRAP = 0x04, 669cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_INV_VERS = 0x05, 670cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_INV_OPCODE = 0x06, 671cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_STREAM_CATA = 0x07, 672cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_GLOBAL_CATA = 0x08, 673cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_CANT_INV_STAG = 0x09, 674cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_UNSPECIFIED = 0xff 675cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 676cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 677cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_ddp_ecodes { 678cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_INV_STAG = 0x00, 679cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_BASE_BOUNDS = 0x01, 680cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_STAG_NOT_ASSOC = 0x02, 681cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_TO_WRAP = 0x03, 682cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_INV_VERS = 0x04, 683cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_QN = 0x01, 684cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_MSN_NOBUF = 0x02, 685cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_MSN_RANGE = 0x03, 686cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_MO = 0x04, 687cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_MSG_TOOBIG = 0x05, 688cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_VERS = 0x06 689cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 690cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 691cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_mpa_ecodes { 692cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_CRC_ERR = 0x02, 693d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi MPA_MARKER_ERR = 0x03, 694d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi MPA_LOCAL_CATA = 0x05, 695d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi MPA_INSUFF_IRD = 0x06, 696d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi MPA_NOMATCH_RTR = 0x07, 697cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 698cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 699cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_ep_state { 700cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise IDLE = 0, 701cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LISTEN, 702cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise CONNECTING, 703cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REQ_WAIT, 704cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REQ_SENT, 705cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REQ_RCVD, 706cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REP_SENT, 707cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise FPDU_MODE, 708cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ABORTING, 709cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise CLOSING, 710cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MORIBUND, 711cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DEAD, 712cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 713cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 714cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_ep_flags { 715cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PEER_ABORT_IN_PROGRESS = 0, 716cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ABORT_REQ_IN_PROGRESS = 1, 717cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RELEASE_RESOURCES = 2, 718cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise CLOSE_SENT = 3, 7191ec779cc29238e6f4d315bff53cd36165819bfd5Vipul Pandya TIMEOUT = 4, 720325abead6cc7ef50572c53b1adc4d2442234b50fVipul Pandya QP_REFERENCED = 5, 721cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 722cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 723793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandyaenum c4iw_ep_history { 724793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_OPEN_REQ = 0, 725793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_OFLD_CONN = 1, 726793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_OPEN_RPL = 2, 727793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_ESTAB = 3, 728793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya PASS_ACCEPT_REQ = 4, 729793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya PASS_ESTAB = 5, 730793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ABORT_UPCALL = 6, 731793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ESTAB_UPCALL = 7, 732793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya CLOSE_UPCALL = 8, 733793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ULP_ACCEPT = 9, 734793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ULP_REJECT = 10, 735793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya TIMEDOUT = 11, 736793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya PEER_ABORT = 12, 737793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya PEER_CLOSE = 13, 738793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya CONNREQ_UPCALL = 14, 739793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ABORT_CONN = 15, 740793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya DISCONN_UPCALL = 16, 741793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya EP_DISC_CLOSE = 17, 742793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya EP_DISC_ABORT = 18, 743793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya CONN_RPL_UPCALL = 19, 744793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_RETRY_NOMEM = 20, 745793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_RETRY_INUSE = 21 746793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya}; 747793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya 748cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_ep_common { 749cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct iw_cm_id *cm_id; 750cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp *qp; 751cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *dev; 752cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise enum c4iw_ep_state state; 753cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct kref kref; 7542f5b48c3ad84fda9efe35122b058ccffc0c2c7cfSteve Wise struct mutex mutex; 755cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct sockaddr_in local_addr; 756cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct sockaddr_in remote_addr; 757aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise struct c4iw_wr_wait wr_wait; 758cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned long flags; 759793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya unsigned long history; 760cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 761cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 762cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_listen_ep { 763cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep_common com; 764cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned int stid; 765cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int backlog; 766cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 767cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 768cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_ep { 769cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep_common com; 770cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep *parent_ep; 771cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct timer_list timer; 772be4c9bad9d0edb6bc3bd8fffc2f98e0e2112da39Roland Dreier struct list_head entry; 773cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned int atid; 774cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 hwtid; 775cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 snd_seq; 776cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rcv_seq; 777cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct l2t_entry *l2t; 778cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct dst_entry *dst; 779cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct sk_buff *mpa_skb; 780cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mpa_attributes mpa_attr; 781cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 mpa_pkt[sizeof(struct mpa_message) + MPA_MAX_PRIVATE_DATA]; 782cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned int mpa_pkt_len; 783cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 ird; 784cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 ord; 785cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 smac_idx; 786cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 tx_chan; 787cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 mtu; 788cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 mss; 789cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 emss; 790cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 plen; 791cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 rss_qid; 792cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 txq_idx; 793d4f1a5c6efabccd4b787a8b5907a5df9204ad2f6Steve Wise u16 ctrlq_idx; 794cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 tos; 795d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi u8 retry_with_mpa_v1; 796d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi u8 tried_with_mpa_v1; 797793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya unsigned int retry_count; 798cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 799cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 800cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_ep *to_ep(struct iw_cm_id *cm_id) 801cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 802cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return cm_id->provider_data; 803cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 804cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 805cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_listen_ep *to_listen_ep(struct iw_cm_id *cm_id) 806cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 807cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return cm_id->provider_data; 808cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 809cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 810cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int compute_wscale(int win) 811cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 812cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int wscale = 0; 813cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 814cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise while (wscale < 14 && (65535<<wscale) < win) 815cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise wscale++; 816cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return wscale; 817cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 818cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 819f079af7a117504b5b307b727858c972261047907Vipul Pandyastatic inline int ocqp_supported(const struct cxgb4_lld_info *infop) 820f079af7a117504b5b307b727858c972261047907Vipul Pandya{ 821f079af7a117504b5b307b727858c972261047907Vipul Pandya#if defined(__i386__) || defined(__x86_64__) || defined(CONFIG_PPC64) 822f079af7a117504b5b307b727858c972261047907Vipul Pandya return infop->vr->ocq.size > 0; 823f079af7a117504b5b307b727858c972261047907Vipul Pandya#else 824f079af7a117504b5b307b727858c972261047907Vipul Pandya return 0; 825f079af7a117504b5b307b727858c972261047907Vipul Pandya#endif 826f079af7a117504b5b307b727858c972261047907Vipul Pandya} 827f079af7a117504b5b307b727858c972261047907Vipul Pandya 828ec3eead217181d7360a11317a888ceb30807867cVipul Pandyau32 c4iw_id_alloc(struct c4iw_id_table *alloc); 829ec3eead217181d7360a11317a888ceb30807867cVipul Pandyavoid c4iw_id_free(struct c4iw_id_table *alloc, u32 obj); 830ec3eead217181d7360a11317a888ceb30807867cVipul Pandyaint c4iw_id_table_alloc(struct c4iw_id_table *alloc, u32 start, u32 num, 831ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u32 reserved, u32 flags); 832ec3eead217181d7360a11317a888ceb30807867cVipul Pandyavoid c4iw_id_table_free(struct c4iw_id_table *alloc); 833ec3eead217181d7360a11317a888ceb30807867cVipul Pandya 834cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisetypedef int (*c4iw_handler_func)(struct c4iw_dev *dev, struct sk_buff *skb); 835cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 836cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ep_redirect(void *ctx, struct dst_entry *old, struct dst_entry *new, 837cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct l2t_entry *l2t); 838cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_put_qpid(struct c4iw_rdev *rdev, u32 qpid, 839cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 840ec3eead217181d7360a11317a888ceb30807867cVipul Pandyau32 c4iw_get_resource(struct c4iw_id_table *id_table); 841ec3eead217181d7360a11317a888ceb30807867cVipul Pandyavoid c4iw_put_resource(struct c4iw_id_table *id_table, u32 entry); 842cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_init_resource(struct c4iw_rdev *rdev, u32 nr_tpt, u32 nr_pdid); 843cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_init_ctrl_qp(struct c4iw_rdev *rdev); 844cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_pblpool_create(struct c4iw_rdev *rdev); 845cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_rqtpool_create(struct c4iw_rdev *rdev); 846c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wiseint c4iw_ocqp_pool_create(struct c4iw_rdev *rdev); 847cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_pblpool_destroy(struct c4iw_rdev *rdev); 848cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_rqtpool_destroy(struct c4iw_rdev *rdev); 849c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wisevoid c4iw_ocqp_pool_destroy(struct c4iw_rdev *rdev); 850cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_destroy_resource(struct c4iw_resource *rscp); 851cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_ctrl_qp(struct c4iw_rdev *rdev); 852cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_register_device(struct c4iw_dev *dev); 853cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_unregister_device(struct c4iw_dev *dev); 854cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint __init c4iw_cm_init(void); 855cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid __exit c4iw_cm_term(void); 856cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_release_dev_ucontext(struct c4iw_rdev *rdev, 857cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 858cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_init_dev_ucontext(struct c4iw_rdev *rdev, 859cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 860cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc); 861cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, 862cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_send_wr **bad_wr); 863cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr, 864cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_recv_wr **bad_wr); 865cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_bind_mw(struct ib_qp *qp, struct ib_mw *mw, 866cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_mw_bind *mw_bind); 867cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param); 868cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_create_listen(struct iw_cm_id *cm_id, int backlog); 869cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_listen(struct iw_cm_id *cm_id); 870cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param); 871cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_reject_cr(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len); 872cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_qp_add_ref(struct ib_qp *qp); 873cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_qp_rem_ref(struct ib_qp *qp); 874cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_free_fastreg_pbl(struct ib_fast_reg_page_list *page_list); 875cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_fast_reg_page_list *c4iw_alloc_fastreg_pbl( 876cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_device *device, 877cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int page_list_len); 878cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_alloc_fast_reg_mr(struct ib_pd *pd, int pbl_depth); 879cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_dealloc_mw(struct ib_mw *mw); 8807083e42ee2ff43a11481e0e7211ec4f9ac68cb79Shani Michaelistruct ib_mw *c4iw_alloc_mw(struct ib_pd *pd, enum ib_mw_type type); 881cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, 882cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 length, u64 virt, int acc, 883cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_udata *udata); 884cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_get_dma_mr(struct ib_pd *pd, int acc); 885cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_register_phys_mem(struct ib_pd *pd, 886cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_phys_buf *buffer_list, 887cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int num_phys_buf, 888cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int acc, 889cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 *iova_start); 890cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_reregister_phys_mem(struct ib_mr *mr, 891cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int mr_rereg_mask, 892cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_pd *pd, 893cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_phys_buf *buffer_list, 894cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int num_phys_buf, 895cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int acc, u64 *iova_start); 896cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_dereg_mr(struct ib_mr *ib_mr); 897cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_cq(struct ib_cq *ib_cq); 898cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries, 899cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int vector, 900cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_ucontext *ib_context, 901cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_udata *udata); 902cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_resize_cq(struct ib_cq *cq, int cqe, struct ib_udata *udata); 903cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags); 904cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_qp(struct ib_qp *ib_qp); 905cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_qp *c4iw_create_qp(struct ib_pd *pd, 906cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_qp_init_attr *attrs, 907cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_udata *udata); 908cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, 909cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int attr_mask, struct ib_udata *udata); 91067bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandyaint c4iw_ib_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, 91167bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya int attr_mask, struct ib_qp_init_attr *init_attr); 912cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_qp *c4iw_get_qp(struct ib_device *dev, int qpn); 913cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_rqtpool_alloc(struct c4iw_rdev *rdev, int size); 914cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_rqtpool_free(struct c4iw_rdev *rdev, u32 addr, int size); 915cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_pblpool_alloc(struct c4iw_rdev *rdev, int size); 916cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_pblpool_free(struct c4iw_rdev *rdev, u32 addr, int size); 917c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wiseu32 c4iw_ocqp_pool_alloc(struct c4iw_rdev *rdev, int size); 918c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wisevoid c4iw_ocqp_pool_free(struct c4iw_rdev *rdev, u32 addr, int size); 919cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ofld_send(struct c4iw_rdev *rdev, struct sk_buff *skb); 920cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_flush_hw_cq(struct t4_cq *cq); 921cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_count_rcqes(struct t4_cq *cq, struct t4_wq *wq, int *count); 922cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_count_scqes(struct t4_cq *cq, struct t4_wq *wq, int *count); 923cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp); 924cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_flush_rq(struct t4_wq *wq, struct t4_cq *cq, int count); 925cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_flush_sq(struct t4_wq *wq, struct t4_cq *cq, int count); 926cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ev_handler(struct c4iw_dev *rnicp, u32 qid); 927cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu16 c4iw_rqes_posted(struct c4iw_qp *qhp); 928cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_post_terminate(struct c4iw_qp *qhp, struct t4_cqe *err_cqe); 929cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_get_cqid(struct c4iw_rdev *rdev, struct c4iw_dev_ucontext *uctx); 930cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_put_cqid(struct c4iw_rdev *rdev, u32 qid, 931cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 932cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_get_qpid(struct c4iw_rdev *rdev, struct c4iw_dev_ucontext *uctx); 933cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_put_qpid(struct c4iw_rdev *rdev, u32 qid, 934cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 935cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_ev_dispatch(struct c4iw_dev *dev, struct t4_cqe *err_cqe); 936cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 937cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseextern struct cxgb4_client t4c_client; 938cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseextern c4iw_handler_func c4iw_handlers[NUM_CPL_CMDS]; 939be4c9bad9d0edb6bc3bd8fffc2f98e0e2112da39Roland Dreierextern int c4iw_max_read_depth; 940422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandyaextern int db_fc_threshold; 94180ccdd60512fc19fa87bf02876c59aeeb82fe4bcVipul Pandyaextern int db_coalescing_threshold; 94242b6a949903d28f59c95f4c71080aa8b41e3d1d1Vipul Pandyaextern int use_dsgl; 943422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya 944cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 945cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#endif 946