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> 559eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise#include <rdma/rdma_netlink.h> 569eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise#include <rdma/iw_portmap.h> 57cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 58cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "cxgb4.h" 59cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "cxgb4_uld.h" 60cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "l2t.h" 61cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "user.h" 62cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 63cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define DRV_NAME "iw_cxgb4" 64cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MOD DRV_NAME ":" 65cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 66cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseextern int c4iw_debug; 67cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define PDBG(fmt, args...) \ 68cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisedo { \ 69cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (c4iw_debug) \ 70cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise printk(MOD fmt, ## args); \ 71cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} while (0) 72cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 73cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#include "t4.h" 74cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 75cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define PBL_OFF(rdev_p, a) ((a) - (rdev_p)->lldi.vr->pbl.start) 76cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define RQT_OFF(rdev_p, a) ((a) - (rdev_p)->lldi.vr->rq.start) 77cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 78cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline void *cplhdr(struct sk_buff *skb) 79cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 80cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return skb->data; 81cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 82cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 83ec3eead217181d7360a11317a888ceb30807867cVipul Pandya#define C4IW_ID_TABLE_F_RANDOM 1 /* Pseudo-randomize the id's returned */ 84ec3eead217181d7360a11317a888ceb30807867cVipul Pandya#define C4IW_ID_TABLE_F_EMPTY 2 /* Table is initially empty */ 85ec3eead217181d7360a11317a888ceb30807867cVipul Pandya 86ec3eead217181d7360a11317a888ceb30807867cVipul Pandyastruct c4iw_id_table { 87ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u32 flags; 88ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u32 start; /* logical minimal id */ 89ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u32 last; /* hint for find */ 90ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u32 max; 91ec3eead217181d7360a11317a888ceb30807867cVipul Pandya spinlock_t lock; 92ec3eead217181d7360a11317a888ceb30807867cVipul Pandya unsigned long *table; 93ec3eead217181d7360a11317a888ceb30807867cVipul Pandya}; 94ec3eead217181d7360a11317a888ceb30807867cVipul Pandya 95cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_resource { 96ec3eead217181d7360a11317a888ceb30807867cVipul Pandya struct c4iw_id_table tpt_table; 97ec3eead217181d7360a11317a888ceb30807867cVipul Pandya struct c4iw_id_table qid_table; 98ec3eead217181d7360a11317a888ceb30807867cVipul Pandya struct c4iw_id_table pdid_table; 99cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 100cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 101cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_qid_list { 102cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head entry; 103cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 qid; 104cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 105cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 106cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_dev_ucontext { 107cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head qpids; 108cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head cqids; 109cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct mutex lock; 110cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 111cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 112cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_rdev_flags { 113cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise T4_FATAL_ERROR = (1<<0), 11405eb23893c2cf9502a9cec0c32e7f1d1ed2895c8Steve Wise T4_STATUS_PAGE_DISABLED = (1<<1), 115cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 116cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 1178d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandyastruct c4iw_stat { 1188d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya u64 total; 1198d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya u64 cur; 1208d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya u64 max; 121ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u64 fail; 1228d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya}; 1238d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya 1248d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandyastruct c4iw_stats { 1258d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct mutex lock; 1268d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat qid; 1278d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat pd; 1288d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat stag; 1298d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat pbl; 1308d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat rqt; 1318d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stat ocqp; 1322c97478106880a5fb241a473252e61845a69386eVipul Pandya u64 db_full; 1332c97478106880a5fb241a473252e61845a69386eVipul Pandya u64 db_empty; 1342c97478106880a5fb241a473252e61845a69386eVipul Pandya u64 db_drop; 135422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya u64 db_state_transitions; 13605eb23893c2cf9502a9cec0c32e7f1d1ed2895c8Steve Wise u64 db_fc_interruptions; 1375be78ee924ae8fb2b4a5b8d012a7d003849337eeVipul Pandya u64 tcam_full; 138793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya u64 act_ofld_conn_fails; 139793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya u64 pas_ofld_conn_fails; 1408d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya}; 1418d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya 14204e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenaistruct c4iw_hw_queue { 14304e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenai int t4_eq_status_entries; 14404e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenai int t4_max_eq_size; 14504e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenai int t4_max_iq_size; 14604e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenai int t4_max_rq_size; 14704e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenai int t4_max_sq_size; 14804e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenai int t4_max_qp_depth; 14904e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenai int t4_max_cq_depth; 15004e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenai int t4_stat_len; 15104e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenai}; 15204e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenai 1537730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenaistruct wr_log_entry { 1547730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai struct timespec post_host_ts; 1557730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai struct timespec poll_host_ts; 1567730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai u64 post_sge_ts; 1577730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai u64 cqe_sge_ts; 1587730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai u64 poll_sge_ts; 1597730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai u16 qid; 1607730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai u16 wr_id; 1617730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai u8 opcode; 1627730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai u8 valid; 1637730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai}; 1647730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai 165cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_rdev { 166cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_resource resource; 167cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned long qpshift; 168cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 qpmask; 169cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned long cqshift; 170cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 cqmask; 171cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext uctx; 172cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct gen_pool *pbl_pool; 173cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct gen_pool *rqt_pool; 174c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise struct gen_pool *ocqp_pool; 175cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 flags; 176cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct cxgb4_lld_info lldi; 177fa658a98a2d08352c514758b3394caf91360aa44Steve Wise unsigned long bar2_pa; 178fa658a98a2d08352c514758b3394caf91360aa44Steve Wise void __iomem *bar2_kva; 179c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise unsigned long oc_mw_pa; 180c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wise void __iomem *oc_mw_kva; 1818d81ef34b249109084b2f3c4bb826d0417ef5814Vipul Pandya struct c4iw_stats stats; 18204e10e2164fcfa05e14eff3c2757a5097f11d258Hariprasad Shenai struct c4iw_hw_queue hw_queue; 18305eb23893c2cf9502a9cec0c32e7f1d1ed2895c8Steve Wise struct t4_dev_status_page *status_page; 1847730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai atomic_t wr_log_idx; 1857730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai struct wr_log_entry *wr_log; 1867730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenai int wr_log_size; 187cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 188cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 189cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int c4iw_fatal_error(struct c4iw_rdev *rdev) 190cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 191cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return rdev->flags & T4_FATAL_ERROR; 192cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 193cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 194cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int c4iw_num_stags(struct c4iw_rdev *rdev) 195cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 19691244bbd6b383621fd6833cb1d9409c4ab6caecfHariprasad Shenai return (int)(rdev->lldi.vr->stag.size >> 5); 197cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 198cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 1993b174d942c927a5064c890ed7b326673c8fa1679Vipul Pandya#define C4IW_WR_TO (30*HZ) 200aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 201aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wisestruct c4iw_wr_wait { 202c337374bf23b88620bcc66a7a09f141cc640f548Steve Wise struct completion completion; 203aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise int ret; 204aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise}; 205aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 206aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wisestatic inline void c4iw_init_wr_wait(struct c4iw_wr_wait *wr_waitp) 207aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise{ 208aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise wr_waitp->ret = 0; 209c337374bf23b88620bcc66a7a09f141cc640f548Steve Wise init_completion(&wr_waitp->completion); 210aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise} 211aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 212d9594d990a528d4c444777d0f360bb50c6114825Steve Wisestatic inline void c4iw_wake_up(struct c4iw_wr_wait *wr_waitp, int ret) 213d9594d990a528d4c444777d0f360bb50c6114825Steve Wise{ 214d9594d990a528d4c444777d0f360bb50c6114825Steve Wise wr_waitp->ret = ret; 215c337374bf23b88620bcc66a7a09f141cc640f548Steve Wise complete(&wr_waitp->completion); 216d9594d990a528d4c444777d0f360bb50c6114825Steve Wise} 217d9594d990a528d4c444777d0f360bb50c6114825Steve Wise 218aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wisestatic inline int c4iw_wait_for_reply(struct c4iw_rdev *rdev, 219aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise struct c4iw_wr_wait *wr_waitp, 220aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise u32 hwtid, u32 qpid, 221aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise const char *func) 222aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise{ 223aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise unsigned to = C4IW_WR_TO; 224d9594d990a528d4c444777d0f360bb50c6114825Steve Wise int ret; 225aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 226d9594d990a528d4c444777d0f360bb50c6114825Steve Wise do { 227c337374bf23b88620bcc66a7a09f141cc640f548Steve Wise ret = wait_for_completion_timeout(&wr_waitp->completion, to); 228d9594d990a528d4c444777d0f360bb50c6114825Steve Wise if (!ret) { 229aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise printk(KERN_ERR MOD "%s - Device %s not responding - " 230aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise "tid %u qpid %u\n", func, 231aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise pci_name(rdev->lldi.pdev), hwtid, qpid); 2322f25e9a540951ebd533b9b98d2259deb44b0b476Steve Wise if (c4iw_fatal_error(rdev)) { 2332f25e9a540951ebd533b9b98d2259deb44b0b476Steve Wise wr_waitp->ret = -EIO; 2342f25e9a540951ebd533b9b98d2259deb44b0b476Steve Wise break; 2352f25e9a540951ebd533b9b98d2259deb44b0b476Steve Wise } 236aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise to = to << 2; 237aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise } 238d9594d990a528d4c444777d0f360bb50c6114825Steve Wise } while (!ret); 239aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise if (wr_waitp->ret) 24030c95c2d495c1c8d4d6a97bb9f4e4eacb91ba1d2Steve Wise PDBG("%s: FW reply %d tid %u qpid %u\n", 24130c95c2d495c1c8d4d6a97bb9f4e4eacb91ba1d2Steve Wise pci_name(rdev->lldi.pdev), wr_waitp->ret, hwtid, qpid); 242aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise return wr_waitp->ret; 243aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise} 244aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise 2452c97478106880a5fb241a473252e61845a69386eVipul Pandyaenum db_state { 2462c97478106880a5fb241a473252e61845a69386eVipul Pandya NORMAL = 0, 2472c97478106880a5fb241a473252e61845a69386eVipul Pandya FLOW_CONTROL = 1, 24805eb23893c2cf9502a9cec0c32e7f1d1ed2895c8Steve Wise RECOVERY = 2, 24905eb23893c2cf9502a9cec0c32e7f1d1ed2895c8Steve Wise STOPPED = 3 2502c97478106880a5fb241a473252e61845a69386eVipul Pandya}; 2512c97478106880a5fb241a473252e61845a69386eVipul Pandya 252cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_dev { 253cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_device ibdev; 254cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_rdev rdev; 255cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 device_cap_flags; 256cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct idr cqidr; 257cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct idr qpidr; 258cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct idr mmidr; 259cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t lock; 2602c97478106880a5fb241a473252e61845a69386eVipul Pandya struct mutex db_mutex; 261cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct dentry *debugfs_root; 2622c97478106880a5fb241a473252e61845a69386eVipul Pandya enum db_state db_state; 263793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya struct idr hwtid_idr; 264793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya struct idr atid_idr; 265793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya struct idr stid_idr; 26605eb23893c2cf9502a9cec0c32e7f1d1ed2895c8Steve Wise struct list_head db_fc_list; 2674c2c5763227a14ce111d6f35df708459d2443cc3Hariprasad Shenai u32 avail_ird; 268cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 269cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 270cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_dev *to_c4iw_dev(struct ib_device *ibdev) 271cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 272cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibdev, struct c4iw_dev, ibdev); 273cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 274cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 275cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_dev *rdev_to_c4iw_dev(struct c4iw_rdev *rdev) 276cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 277cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(rdev, struct c4iw_dev, rdev); 278cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 279cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 280cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_cq *get_chp(struct c4iw_dev *rhp, u32 cqid) 281cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 282cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return idr_find(&rhp->cqidr, cqid); 283cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 284cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 285cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_qp *get_qhp(struct c4iw_dev *rhp, u32 qpid) 286cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 287cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return idr_find(&rhp->qpidr, qpid); 288cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 289cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 290cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mr *get_mhp(struct c4iw_dev *rhp, u32 mmid) 291cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 292cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return idr_find(&rhp->mmidr, mmid); 293cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 294cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 2952c97478106880a5fb241a473252e61845a69386eVipul Pandyastatic inline int _insert_handle(struct c4iw_dev *rhp, struct idr *idr, 2962c97478106880a5fb241a473252e61845a69386eVipul Pandya void *handle, u32 id, int lock) 297cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 298cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int ret; 299cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 300e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo if (lock) { 301e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo idr_preload(GFP_KERNEL); 302e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo spin_lock_irq(&rhp->lock); 303e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo } 304e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo 305e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo ret = idr_alloc(idr, handle, id, id + 1, GFP_ATOMIC); 306e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo 307e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo if (lock) { 308e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo spin_unlock_irq(&rhp->lock); 309e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo idr_preload_end(); 310e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo } 311e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo 312e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo BUG_ON(ret == -ENOSPC); 313e8d4dd606bbd45bad2c4b867d5d91c284cd2828eTejun Heo return ret < 0 ? ret : 0; 314cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 315cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 3162c97478106880a5fb241a473252e61845a69386eVipul Pandyastatic inline int insert_handle(struct c4iw_dev *rhp, struct idr *idr, 3172c97478106880a5fb241a473252e61845a69386eVipul Pandya void *handle, u32 id) 3182c97478106880a5fb241a473252e61845a69386eVipul Pandya{ 3192c97478106880a5fb241a473252e61845a69386eVipul Pandya return _insert_handle(rhp, idr, handle, id, 1); 3202c97478106880a5fb241a473252e61845a69386eVipul Pandya} 3212c97478106880a5fb241a473252e61845a69386eVipul Pandya 3222c97478106880a5fb241a473252e61845a69386eVipul Pandyastatic inline int insert_handle_nolock(struct c4iw_dev *rhp, struct idr *idr, 3232c97478106880a5fb241a473252e61845a69386eVipul Pandya void *handle, u32 id) 3242c97478106880a5fb241a473252e61845a69386eVipul Pandya{ 3252c97478106880a5fb241a473252e61845a69386eVipul Pandya return _insert_handle(rhp, idr, handle, id, 0); 3262c97478106880a5fb241a473252e61845a69386eVipul Pandya} 3272c97478106880a5fb241a473252e61845a69386eVipul Pandya 328422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandyastatic inline void _remove_handle(struct c4iw_dev *rhp, struct idr *idr, 329422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya u32 id, int lock) 330cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 331422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya if (lock) 332422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya spin_lock_irq(&rhp->lock); 333cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise idr_remove(idr, id); 334422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya if (lock) 335422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya spin_unlock_irq(&rhp->lock); 336422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya} 337422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya 338422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandyastatic inline void remove_handle(struct c4iw_dev *rhp, struct idr *idr, u32 id) 339422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya{ 340422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya _remove_handle(rhp, idr, id, 1); 341422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya} 342422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya 343422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandyastatic inline void remove_handle_nolock(struct c4iw_dev *rhp, 344422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya struct idr *idr, u32 id) 345422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya{ 346422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya _remove_handle(rhp, idr, id, 0); 347cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 348cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 3494c2c5763227a14ce111d6f35df708459d2443cc3Hariprasad Shenaiextern uint c4iw_max_read_depth; 3504c2c5763227a14ce111d6f35df708459d2443cc3Hariprasad Shenai 3514c2c5763227a14ce111d6f35df708459d2443cc3Hariprasad Shenaistatic inline int cur_max_read_depth(struct c4iw_dev *dev) 3524c2c5763227a14ce111d6f35df708459d2443cc3Hariprasad Shenai{ 3534c2c5763227a14ce111d6f35df708459d2443cc3Hariprasad Shenai return min(dev->rdev.lldi.max_ordird_qp, c4iw_max_read_depth); 3544c2c5763227a14ce111d6f35df708459d2443cc3Hariprasad Shenai} 3554c2c5763227a14ce111d6f35df708459d2443cc3Hariprasad Shenai 356cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_pd { 357cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_pd ibpd; 358cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pdid; 359cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 360cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 361cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 362cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_pd *to_c4iw_pd(struct ib_pd *ibpd) 363cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 364cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibpd, struct c4iw_pd, ibpd); 365cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 366cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 367cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct tpt_attributes { 368cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 len; 369cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 va_fbo; 370cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise enum fw_ri_mem_perms perms; 371cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 stag; 372cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pdid; 373cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 qpid; 374cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pbl_addr; 375cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pbl_size; 376cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 state:1; 377cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 type:2; 378cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rsvd:1; 379cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 remote_invaliate_disable:1; 380cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 zbva:1; 381cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 mw_bind_enable:1; 382cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 page_size:5; 383cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 384cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 385cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mr { 386cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_mr ibmr; 387cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_umem *umem; 388cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 389cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 kva; 390cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct tpt_attributes attr; 391cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 392cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 393cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mr *to_c4iw_mr(struct ib_mr *ibmr) 394cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 395cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibmr, struct c4iw_mr, ibmr); 396cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 397cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 398cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mw { 399cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_mw ibmw; 400cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 401cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 kva; 402cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct tpt_attributes attr; 403cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 404cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 405cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mw *to_c4iw_mw(struct ib_mw *ibmw) 406cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 407cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibmw, struct c4iw_mw, ibmw); 408cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 409cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 410cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_fr_page_list { 411cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_fast_reg_page_list ibpl; 412f38926aa1dc5fbf7dfc5f97a53377b2e796dedc3FUJITA Tomonori DEFINE_DMA_UNMAP_ADDR(mapping); 413cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise dma_addr_t dma_addr; 414cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *dev; 415eda6d1d1b7932f90d55583f8f3835dd7d6b32543Steve Wise int pll_len; 416cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 417cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 418cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_fr_page_list *to_c4iw_fr_page_list( 419cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_fast_reg_page_list *ibpl) 420cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 421cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibpl, struct c4iw_fr_page_list, ibpl); 422cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 423cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 424cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_cq { 425cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_cq ibcq; 426cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 427cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct t4_cq cq; 428cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t lock; 429581bbe2cd0694a935e0c3ccd7f011e10094f1df6Kumar Sanghvi spinlock_t comp_handler_lock; 430cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise atomic_t refcnt; 431cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise wait_queue_head_t wait; 432cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 433cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 434cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_cq *to_c4iw_cq(struct ib_cq *ibcq) 435cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 436cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibcq, struct c4iw_cq, ibcq); 437cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 438cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 439cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mpa_attributes { 440cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 initiator; 441cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 recv_marker_enabled; 442cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 xmit_marker_enabled; 443cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 crc_enabled; 444d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi u8 enhanced_rdma_conn; 445cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 version; 446cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 p2p_type; 447cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 448cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 449cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_qp_attributes { 450cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 scq; 451cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rcq; 452cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 sq_num_entries; 453cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rq_num_entries; 454cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 sq_max_sges; 455cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 sq_max_sges_rdma_write; 456cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rq_max_sges; 457cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 state; 458cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_rdma_read; 459cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_rdma_write; 460cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_bind; 461cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 enable_mmid0_fastreg; 462cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 max_ord; 463cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 max_ird; 464cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 pd; 465cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 next_state; 466cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise char terminate_buffer[52]; 467cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 terminate_msg_len; 468cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 is_terminate_local; 469cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mpa_attributes mpa_attr; 470cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep *llp_stream_handle; 471d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi u8 layer_etype; 472d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi u8 ecode; 4732c97478106880a5fb241a473252e61845a69386eVipul Pandya u16 sq_db_inc; 4742c97478106880a5fb241a473252e61845a69386eVipul Pandya u16 rq_db_inc; 475cc18b939e1efbc2a47f62dbd2b1df53d974df6b7Steve Wise u8 send_term; 476cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 477cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 478cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_qp { 479cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_qp ibqp; 48005eb23893c2cf9502a9cec0c32e7f1d1ed2895c8Steve Wise struct list_head db_fc_entry; 481cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *rhp; 482cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep *ep; 483cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp_attributes attr; 484cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct t4_wq wq; 485cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t lock; 4862f5b48c3ad84fda9efe35122b058ccffc0c2c7cfSteve Wise struct mutex mutex; 487cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise atomic_t refcnt; 488cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise wait_queue_head_t wait; 489cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct timer_list timer; 490ba32de9d8d8173a1d6dd1ed608c519d5d0a623bbSteve Wise int sq_sig_all; 491cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 492cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 493cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_qp *to_c4iw_qp(struct ib_qp *ibqp) 494cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 495cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(ibqp, struct c4iw_qp, ibqp); 496cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 497cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 498cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_ucontext { 499cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_ucontext ibucontext; 500cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext uctx; 501cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 key; 502cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spinlock_t mmap_lock; 503cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head mmaps; 504cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 505cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 506cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_ucontext *to_c4iw_ucontext(struct ib_ucontext *c) 507cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 508cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return container_of(c, struct c4iw_ucontext, ibucontext); 509cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 510cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 511cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_mm_entry { 512cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head entry; 513cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 addr; 514cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 key; 515cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned len; 516cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 517cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 518cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_mm_entry *remove_mmap(struct c4iw_ucontext *ucontext, 519cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 key, unsigned len) 520cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 521cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct list_head *pos, *nxt; 522cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mm_entry *mm; 523cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 524cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_lock(&ucontext->mmap_lock); 525cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise list_for_each_safe(pos, nxt, &ucontext->mmaps) { 526cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 527cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise mm = list_entry(pos, struct c4iw_mm_entry, entry); 528cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise if (mm->key == key && mm->len == len) { 529cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise list_del_init(&mm->entry); 530cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_unlock(&ucontext->mmap_lock); 531cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s key 0x%x addr 0x%llx len %d\n", __func__, 532cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise key, (unsigned long long) mm->addr, mm->len); 533cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return mm; 534cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 535cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 536cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_unlock(&ucontext->mmap_lock); 537cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return NULL; 538cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 539cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 540cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline void insert_mmap(struct c4iw_ucontext *ucontext, 541cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mm_entry *mm) 542cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 543cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_lock(&ucontext->mmap_lock); 544cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("%s key 0x%x addr 0x%llx len %d\n", __func__, 545cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise mm->key, (unsigned long long) mm->addr, mm->len); 546cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise list_add_tail(&mm->entry, &ucontext->mmaps); 547cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise spin_unlock(&ucontext->mmap_lock); 548cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 549cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 550cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_qp_attr_mask { 551cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_NEXT_STATE = 1 << 0, 5522c97478106880a5fb241a473252e61845a69386eVipul Pandya C4IW_QP_ATTR_SQ_DB = 1<<1, 5532c97478106880a5fb241a473252e61845a69386eVipul Pandya C4IW_QP_ATTR_RQ_DB = 1<<2, 554cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_READ = 1 << 7, 555cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_WRITE = 1 << 8, 556cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_BIND = 1 << 9, 557cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_ORD = 1 << 11, 558cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_IRD = 1 << 12, 559cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_LLP_STREAM_HANDLE = 1 << 22, 560cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_STREAM_MSG_BUFFER = 1 << 23, 561cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MPA_ATTR = 1 << 24, 562cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_QP_CONTEXT_ACTIVATE = 1 << 25, 563cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_VALID_MODIFY = (C4IW_QP_ATTR_ENABLE_RDMA_READ | 564cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_ENABLE_RDMA_WRITE | 565cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_ORD | 566cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MAX_IRD | 567cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_LLP_STREAM_HANDLE | 568cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_STREAM_MSG_BUFFER | 569cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_MPA_ATTR | 570cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_ATTR_QP_CONTEXT_ACTIVATE) 571cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 572cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 573cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_modify_qp(struct c4iw_dev *rhp, 574cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp *qhp, 575cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise enum c4iw_qp_attr_mask mask, 576cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp_attributes *attrs, 577cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int internal); 578cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 579cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_qp_state { 580cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_IDLE, 581cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_RTS, 582cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_ERROR, 583cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_TERMINATE, 584cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_CLOSING, 585cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_QP_STATE_TOT 586cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 587cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 588cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int c4iw_convert_state(enum ib_qp_state ib_state) 589cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 590cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise switch (ib_state) { 591cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_RESET: 592cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_INIT: 593cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_IDLE; 594cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_RTS: 595cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_RTS; 596cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_SQD: 597cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_CLOSING; 598cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_SQE: 599cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_TERMINATE; 600cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise case IB_QPS_ERR: 601cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return C4IW_QP_STATE_ERROR; 602cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise default: 603cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return -1; 604cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise } 605cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 606cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 60767bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandyastatic inline int to_ib_qp_state(int c4iw_qp_state) 60867bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya{ 60967bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya switch (c4iw_qp_state) { 61067bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya case C4IW_QP_STATE_IDLE: 61167bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_INIT; 61267bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya case C4IW_QP_STATE_RTS: 61367bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_RTS; 61467bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya case C4IW_QP_STATE_CLOSING: 61567bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_SQD; 61667bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya case C4IW_QP_STATE_TERMINATE: 61767bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_SQE; 61867bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya case C4IW_QP_STATE_ERROR: 61967bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_ERR; 62067bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya } 62167bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya return IB_QPS_ERR; 62267bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya} 62367bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya 624cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline u32 c4iw_ib_to_tpt_access(int a) 625cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 626cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return (a & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) | 627cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (a & IB_ACCESS_REMOTE_READ ? FW_RI_MEM_ACCESS_REM_READ : 0) | 628cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (a & IB_ACCESS_LOCAL_WRITE ? FW_RI_MEM_ACCESS_LOCAL_WRITE : 0) | 629cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise FW_RI_MEM_ACCESS_LOCAL_READ; 630cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 631cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 632cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline u32 c4iw_ib_to_tpt_bind_access(int acc) 633cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 634cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return (acc & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) | 635cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise (acc & IB_ACCESS_REMOTE_READ ? FW_RI_MEM_ACCESS_REM_READ : 0); 636cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 637cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 638cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_mmid_state { 639cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_STAG_STATE_VALID, 640cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise C4IW_STAG_STATE_INVALID 641cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 642cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 643cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define C4IW_NODE_DESC "cxgb4 Chelsio Communications" 644cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 645cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_KEY_REQ "MPA ID Req Frame" 646cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_KEY_REP "MPA ID Rep Frame" 647cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 648cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_MAX_PRIVATE_DATA 256 649d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_ENHANCED_RDMA_CONN 0x10 650cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_REJECT 0x20 651cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_CRC 0x40 652cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_MARKERS 0x80 653cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define MPA_FLAGS_MASK 0xE0 654cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 655d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_V2_PEER2PEER_MODEL 0x8000 656d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_V2_ZERO_LEN_FPDU_RTR 0x4000 657d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_V2_RDMA_WRITE_RTR 0x8000 658d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_V2_RDMA_READ_RTR 0x4000 659d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi#define MPA_V2_IRD_ORD_MASK 0x3FFF 660d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi 661cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define c4iw_put_ep(ep) { \ 662cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("put_ep (via %s:%u) ep %p refcnt %d\n", __func__, __LINE__, \ 663cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ep, atomic_read(&((ep)->kref.refcount))); \ 664cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise WARN_ON(atomic_read(&((ep)->kref.refcount)) < 1); \ 665cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kref_put(&((ep)->kref), _c4iw_free_ep); \ 666cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 667cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 668cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define c4iw_get_ep(ep) { \ 669cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PDBG("get_ep (via %s:%u) ep %p, refcnt %d\n", __func__, __LINE__, \ 670cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ep, atomic_read(&((ep)->kref.refcount))); \ 671cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise kref_get(&((ep)->kref)); \ 672cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 673cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid _c4iw_free_ep(struct kref *kref); 674cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 675cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct mpa_message { 676cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 key[16]; 677cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 flags; 678cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 revision; 679cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise __be16 private_data_size; 680cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 private_data[0]; 681cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 682cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 683d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvistruct mpa_v2_conn_params { 684d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi __be16 ird; 685d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi __be16 ord; 686d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi}; 687d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi 688cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct terminate_message { 689cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 layer_etype; 690cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 ecode; 691cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise __be16 hdrct_rsvd; 692cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 len_hdrs[0]; 693cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 694cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 695cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#define TERM_MAX_LENGTH (sizeof(struct terminate_message) + 2 + 18 + 28) 696cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 697cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_layers_types { 698cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LAYER_RDMAP = 0x00, 699cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LAYER_DDP = 0x10, 700cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LAYER_MPA = 0x20, 701cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_LOCAL_CATA = 0x00, 702cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_REMOTE_PROT = 0x01, 703cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_REMOTE_OP = 0x02, 704cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_LOCAL_CATA = 0x00, 705cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_TAGGED_ERR = 0x01, 706cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_UNTAGGED_ERR = 0x02, 707cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDP_LLP = 0x03 708cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 709cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 710cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_rdma_ecodes { 711cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_INV_STAG = 0x00, 712cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_BASE_BOUNDS = 0x01, 713cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_ACC_VIOL = 0x02, 714cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_STAG_NOT_ASSOC = 0x03, 715cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_TO_WRAP = 0x04, 716cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_INV_VERS = 0x05, 717cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_INV_OPCODE = 0x06, 718cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_STREAM_CATA = 0x07, 719cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_GLOBAL_CATA = 0x08, 720cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_CANT_INV_STAG = 0x09, 721cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RDMAP_UNSPECIFIED = 0xff 722cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 723cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 724cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_ddp_ecodes { 725cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_INV_STAG = 0x00, 726cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_BASE_BOUNDS = 0x01, 727cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_STAG_NOT_ASSOC = 0x02, 728cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_TO_WRAP = 0x03, 729cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPT_INV_VERS = 0x04, 730cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_QN = 0x01, 731cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_MSN_NOBUF = 0x02, 732cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_MSN_RANGE = 0x03, 733cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_MO = 0x04, 734cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_MSG_TOOBIG = 0x05, 735cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DDPU_INV_VERS = 0x06 736cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 737cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 738cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_mpa_ecodes { 739cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_CRC_ERR = 0x02, 740d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi MPA_MARKER_ERR = 0x03, 741d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi MPA_LOCAL_CATA = 0x05, 742d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi MPA_INSUFF_IRD = 0x06, 743d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi MPA_NOMATCH_RTR = 0x07, 744cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 745cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 746cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_ep_state { 747cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise IDLE = 0, 748cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise LISTEN, 749cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise CONNECTING, 750cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REQ_WAIT, 751cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REQ_SENT, 752cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REQ_RCVD, 753cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MPA_REP_SENT, 754cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise FPDU_MODE, 755cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ABORTING, 756cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise CLOSING, 757cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise MORIBUND, 758cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise DEAD, 759cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 760cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 761cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseenum c4iw_ep_flags { 762cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise PEER_ABORT_IN_PROGRESS = 0, 763cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise ABORT_REQ_IN_PROGRESS = 1, 764cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise RELEASE_RESOURCES = 2, 765cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise CLOSE_SENT = 3, 7661ec779cc29238e6f4d315bff53cd36165819bfd5Vipul Pandya TIMEOUT = 4, 767325abead6cc7ef50572c53b1adc4d2442234b50fVipul Pandya QP_REFERENCED = 5, 7689eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise RELEASE_MAPINFO = 6, 769cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 770cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 771793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandyaenum c4iw_ep_history { 772793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_OPEN_REQ = 0, 773793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_OFLD_CONN = 1, 774793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_OPEN_RPL = 2, 775793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_ESTAB = 3, 776793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya PASS_ACCEPT_REQ = 4, 777793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya PASS_ESTAB = 5, 778793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ABORT_UPCALL = 6, 779793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ESTAB_UPCALL = 7, 780793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya CLOSE_UPCALL = 8, 781793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ULP_ACCEPT = 9, 782793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ULP_REJECT = 10, 783793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya TIMEDOUT = 11, 784793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya PEER_ABORT = 12, 785793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya PEER_CLOSE = 13, 786793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya CONNREQ_UPCALL = 14, 787793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ABORT_CONN = 15, 788793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya DISCONN_UPCALL = 16, 789793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya EP_DISC_CLOSE = 17, 790793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya EP_DISC_ABORT = 18, 791793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya CONN_RPL_UPCALL = 19, 792793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_RETRY_NOMEM = 20, 793793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya ACT_RETRY_INUSE = 21 794793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya}; 795793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya 796cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_ep_common { 797cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct iw_cm_id *cm_id; 798cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_qp *qp; 799cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev *dev; 800cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise enum c4iw_ep_state state; 801cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct kref kref; 8022f5b48c3ad84fda9efe35122b058ccffc0c2c7cfSteve Wise struct mutex mutex; 803830662f6f032f2355c7afdfe9afc5ef58ac274e5Vipul Pandya struct sockaddr_storage local_addr; 804830662f6f032f2355c7afdfe9afc5ef58ac274e5Vipul Pandya struct sockaddr_storage remote_addr; 8059eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise struct sockaddr_storage mapped_local_addr; 8069eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise struct sockaddr_storage mapped_remote_addr; 807aadc4df3087a33ca7fc37f91a024e7b7efdafa75Steve Wise struct c4iw_wr_wait wr_wait; 808cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned long flags; 809793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya unsigned long history; 810cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 811cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 812cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_listen_ep { 813cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep_common com; 814cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned int stid; 815cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int backlog; 816cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 817cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 818cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct c4iw_ep { 819cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep_common com; 820cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_ep *parent_ep; 821cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct timer_list timer; 822be4c9bad9d0edb6bc3bd8fffc2f98e0e2112da39Roland Dreier struct list_head entry; 823cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned int atid; 824cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 hwtid; 825cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 snd_seq; 826cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 rcv_seq; 827cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct l2t_entry *l2t; 828cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct dst_entry *dst; 829cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct sk_buff *mpa_skb; 830cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_mpa_attributes mpa_attr; 831cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 mpa_pkt[sizeof(struct mpa_message) + MPA_MAX_PRIVATE_DATA]; 832cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise unsigned int mpa_pkt_len; 833cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 ird; 834cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 ord; 835cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 smac_idx; 836cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 tx_chan; 837cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u32 mtu; 838cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 mss; 839cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 emss; 840cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 plen; 841cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 rss_qid; 842cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u16 txq_idx; 843d4f1a5c6efabccd4b787a8b5907a5df9204ad2f6Steve Wise u16 ctrlq_idx; 844cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u8 tos; 845d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi u8 retry_with_mpa_v1; 846d2fe99e86bb2ccbb87df20b0136d5983b6a4cc09Kumar Sanghvi u8 tried_with_mpa_v1; 847793dad94e7455c113e391bd3d418c7b95a4c2687Vipul Pandya unsigned int retry_count; 848b408ff282dda0ef7a3218dc2e5f1399c665d4c20Hariprasad Shenai int snd_win; 849b408ff282dda0ef7a3218dc2e5f1399c665d4c20Hariprasad Shenai int rcv_win; 850cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise}; 851cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 8529eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wisestatic inline void print_addr(struct c4iw_ep_common *epc, const char *func, 8539eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise const char *msg) 8549eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise{ 8559eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise 8569eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise#define SINA(a) (&(((struct sockaddr_in *)(a))->sin_addr.s_addr)) 8579eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise#define SINP(a) ntohs(((struct sockaddr_in *)(a))->sin_port) 8589eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise#define SIN6A(a) (&(((struct sockaddr_in6 *)(a))->sin6_addr)) 8599eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise#define SIN6P(a) ntohs(((struct sockaddr_in6 *)(a))->sin6_port) 8609eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise 8619eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise if (c4iw_debug) { 8629eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise switch (epc->local_addr.ss_family) { 8639eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise case AF_INET: 8649eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise PDBG("%s %s %pI4:%u/%u <-> %pI4:%u/%u\n", 8659eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise func, msg, SINA(&epc->local_addr), 8669eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise SINP(&epc->local_addr), 8679eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise SINP(&epc->mapped_local_addr), 8689eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise SINA(&epc->remote_addr), 8699eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise SINP(&epc->remote_addr), 8709eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise SINP(&epc->mapped_remote_addr)); 8719eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise break; 8729eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise case AF_INET6: 8739eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise PDBG("%s %s %pI6:%u/%u <-> %pI6:%u/%u\n", 8749eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise func, msg, SIN6A(&epc->local_addr), 8759eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise SIN6P(&epc->local_addr), 8769eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise SIN6P(&epc->mapped_local_addr), 8779eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise SIN6A(&epc->remote_addr), 8789eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise SIN6P(&epc->remote_addr), 8799eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise SIN6P(&epc->mapped_remote_addr)); 8809eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise break; 8819eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise default: 8829eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise break; 8839eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise } 8849eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise } 8859eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise#undef SINA 8869eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise#undef SINP 8879eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise#undef SIN6A 8889eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise#undef SIN6P 8899eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise} 8909eccfe109b276fddf2908d1a70f7f4449b92f08fSteve Wise 891cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_ep *to_ep(struct iw_cm_id *cm_id) 892cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 893cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return cm_id->provider_data; 894cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 895cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 896cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline struct c4iw_listen_ep *to_listen_ep(struct iw_cm_id *cm_id) 897cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 898cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return cm_id->provider_data; 899cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 900cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 901cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestatic inline int compute_wscale(int win) 902cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise{ 903cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int wscale = 0; 904cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 905cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise while (wscale < 14 && (65535<<wscale) < win) 906cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise wscale++; 907cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise return wscale; 908cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise} 909cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 910f079af7a117504b5b307b727858c972261047907Vipul Pandyastatic inline int ocqp_supported(const struct cxgb4_lld_info *infop) 911f079af7a117504b5b307b727858c972261047907Vipul Pandya{ 912f079af7a117504b5b307b727858c972261047907Vipul Pandya#if defined(__i386__) || defined(__x86_64__) || defined(CONFIG_PPC64) 913f079af7a117504b5b307b727858c972261047907Vipul Pandya return infop->vr->ocq.size > 0; 914f079af7a117504b5b307b727858c972261047907Vipul Pandya#else 915f079af7a117504b5b307b727858c972261047907Vipul Pandya return 0; 916f079af7a117504b5b307b727858c972261047907Vipul Pandya#endif 917f079af7a117504b5b307b727858c972261047907Vipul Pandya} 918f079af7a117504b5b307b727858c972261047907Vipul Pandya 919ec3eead217181d7360a11317a888ceb30807867cVipul Pandyau32 c4iw_id_alloc(struct c4iw_id_table *alloc); 920ec3eead217181d7360a11317a888ceb30807867cVipul Pandyavoid c4iw_id_free(struct c4iw_id_table *alloc, u32 obj); 921ec3eead217181d7360a11317a888ceb30807867cVipul Pandyaint c4iw_id_table_alloc(struct c4iw_id_table *alloc, u32 start, u32 num, 922ec3eead217181d7360a11317a888ceb30807867cVipul Pandya u32 reserved, u32 flags); 923ec3eead217181d7360a11317a888ceb30807867cVipul Pandyavoid c4iw_id_table_free(struct c4iw_id_table *alloc); 924ec3eead217181d7360a11317a888ceb30807867cVipul Pandya 925cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisetypedef int (*c4iw_handler_func)(struct c4iw_dev *dev, struct sk_buff *skb); 926cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 927cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ep_redirect(void *ctx, struct dst_entry *old, struct dst_entry *new, 928cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct l2t_entry *l2t); 929cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_put_qpid(struct c4iw_rdev *rdev, u32 qpid, 930cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 931ec3eead217181d7360a11317a888ceb30807867cVipul Pandyau32 c4iw_get_resource(struct c4iw_id_table *id_table); 932ec3eead217181d7360a11317a888ceb30807867cVipul Pandyavoid c4iw_put_resource(struct c4iw_id_table *id_table, u32 entry); 933cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_init_resource(struct c4iw_rdev *rdev, u32 nr_tpt, u32 nr_pdid); 934cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_init_ctrl_qp(struct c4iw_rdev *rdev); 935cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_pblpool_create(struct c4iw_rdev *rdev); 936cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_rqtpool_create(struct c4iw_rdev *rdev); 937c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wiseint c4iw_ocqp_pool_create(struct c4iw_rdev *rdev); 938cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_pblpool_destroy(struct c4iw_rdev *rdev); 939cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_rqtpool_destroy(struct c4iw_rdev *rdev); 940c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wisevoid c4iw_ocqp_pool_destroy(struct c4iw_rdev *rdev); 941cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_destroy_resource(struct c4iw_resource *rscp); 942cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_ctrl_qp(struct c4iw_rdev *rdev); 943cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_register_device(struct c4iw_dev *dev); 944cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_unregister_device(struct c4iw_dev *dev); 945cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint __init c4iw_cm_init(void); 94646c1376db1b85ae412a7917cec148c6e60f79428Steve Wisevoid c4iw_cm_term(void); 947cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_release_dev_ucontext(struct c4iw_rdev *rdev, 948cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 949cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_init_dev_ucontext(struct c4iw_rdev *rdev, 950cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 951cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc); 952cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, 953cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_send_wr **bad_wr); 954cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr, 955cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_recv_wr **bad_wr); 956cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_bind_mw(struct ib_qp *qp, struct ib_mw *mw, 957cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_mw_bind *mw_bind); 958cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param); 959cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_create_listen(struct iw_cm_id *cm_id, int backlog); 960cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_listen(struct iw_cm_id *cm_id); 961cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param); 962cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_reject_cr(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len); 963cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_qp_add_ref(struct ib_qp *qp); 964cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_qp_rem_ref(struct ib_qp *qp); 965cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_free_fastreg_pbl(struct ib_fast_reg_page_list *page_list); 966cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_fast_reg_page_list *c4iw_alloc_fastreg_pbl( 967cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_device *device, 968cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int page_list_len); 969cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_alloc_fast_reg_mr(struct ib_pd *pd, int pbl_depth); 970cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_dealloc_mw(struct ib_mw *mw); 9717083e42ee2ff43a11481e0e7211ec4f9ac68cb79Shani Michaelistruct ib_mw *c4iw_alloc_mw(struct ib_pd *pd, enum ib_mw_type type); 972cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, 973cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 length, u64 virt, int acc, 974cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_udata *udata); 975cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_get_dma_mr(struct ib_pd *pd, int acc); 976cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_mr *c4iw_register_phys_mem(struct ib_pd *pd, 977cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_phys_buf *buffer_list, 978cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int num_phys_buf, 979cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int acc, 980cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise u64 *iova_start); 981cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_reregister_phys_mem(struct ib_mr *mr, 982cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int mr_rereg_mask, 983cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_pd *pd, 984cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_phys_buf *buffer_list, 985cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int num_phys_buf, 986cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int acc, u64 *iova_start); 987cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_dereg_mr(struct ib_mr *ib_mr); 988cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_cq(struct ib_cq *ib_cq); 989cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries, 990cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int vector, 991cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_ucontext *ib_context, 992cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_udata *udata); 993cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_resize_cq(struct ib_cq *cq, int cqe, struct ib_udata *udata); 994cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags); 995cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_destroy_qp(struct ib_qp *ib_qp); 996cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_qp *c4iw_create_qp(struct ib_pd *pd, 997cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_qp_init_attr *attrs, 998cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct ib_udata *udata); 999cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, 1000cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise int attr_mask, struct ib_udata *udata); 100167bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandyaint c4iw_ib_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, 100267bbc05512d8a609e9a2d284dbfda9d2c50f0bf6Vipul Pandya int attr_mask, struct ib_qp_init_attr *init_attr); 1003cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisestruct ib_qp *c4iw_get_qp(struct ib_device *dev, int qpn); 1004cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_rqtpool_alloc(struct c4iw_rdev *rdev, int size); 1005cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_rqtpool_free(struct c4iw_rdev *rdev, u32 addr, int size); 1006cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_pblpool_alloc(struct c4iw_rdev *rdev, int size); 1007cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_pblpool_free(struct c4iw_rdev *rdev, u32 addr, int size); 1008c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wiseu32 c4iw_ocqp_pool_alloc(struct c4iw_rdev *rdev, int size); 1009c6d7b26791a2aefdf97f2af1e93161ed05acd631Steve Wisevoid c4iw_ocqp_pool_free(struct c4iw_rdev *rdev, u32 addr, int size); 1010cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ofld_send(struct c4iw_rdev *rdev, struct sk_buff *skb); 10111cf24dcef4e1dd0c34d8c39b09a9ce9a01accc72Steve Wisevoid c4iw_flush_hw_cq(struct c4iw_cq *chp); 1012cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_count_rcqes(struct t4_cq *cq, struct t4_wq *wq, int *count); 1013cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp); 1014cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_flush_rq(struct t4_wq *wq, struct t4_cq *cq, int count); 10151cf24dcef4e1dd0c34d8c39b09a9ce9a01accc72Steve Wiseint c4iw_flush_sq(struct c4iw_qp *qhp); 1016cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_ev_handler(struct c4iw_dev *rnicp, u32 qid); 1017cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu16 c4iw_rqes_posted(struct c4iw_qp *qhp); 1018cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseint c4iw_post_terminate(struct c4iw_qp *qhp, struct t4_cqe *err_cqe); 1019cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_get_cqid(struct c4iw_rdev *rdev, struct c4iw_dev_ucontext *uctx); 1020cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_put_cqid(struct c4iw_rdev *rdev, u32 qid, 1021cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 1022cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseu32 c4iw_get_qpid(struct c4iw_rdev *rdev, struct c4iw_dev_ucontext *uctx); 1023cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_put_qpid(struct c4iw_rdev *rdev, u32 qid, 1024cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise struct c4iw_dev_ucontext *uctx); 1025cfdda9d764362ab77b11a410bb928400e6520d57Steve Wisevoid c4iw_ev_dispatch(struct c4iw_dev *dev, struct t4_cqe *err_cqe); 1026cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 1027cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseextern struct cxgb4_client t4c_client; 1028cfdda9d764362ab77b11a410bb928400e6520d57Steve Wiseextern c4iw_handler_func c4iw_handlers[NUM_CPL_CMDS]; 10297730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenaiextern void c4iw_log_wr_stats(struct t4_wq *wq, struct t4_cqe *cqe); 10307730b4c7e32c0ab4d7db746a9c3a84cf715161faHariprasad Shenaiextern int c4iw_wr_log; 1031422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandyaextern int db_fc_threshold; 103280ccdd60512fc19fa87bf02876c59aeeb82fe4bcVipul Pandyaextern int db_coalescing_threshold; 103342b6a949903d28f59c95f4c71080aa8b41e3d1d1Vipul Pandyaextern int use_dsgl; 1034422eea0a8cf658bc9564726d74e8384b89a8f4faVipul Pandya 1035cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise 1036cfdda9d764362ab77b11a410bb928400e6520d57Steve Wise#endif 1037