Path: blob/master/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
15112 views
/*1* Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved.2*3* This software is available to you under a choice of one of two4* licenses. You may choose to be licensed under the terms of the GNU5* General Public License (GPL) Version 2, available from the file6* COPYING in the main directory of this source tree, or the7* OpenIB.org BSD license below:8*9* Redistribution and use in source and binary forms, with or10* without modification, are permitted provided that the following11* conditions are met:12*13* - Redistributions of source code must retain the above14* copyright notice, this list of conditions and the following15* disclaimer.16* - Redistributions in binary form must reproduce the above17* copyright notice, this list of conditions and the following18* disclaimer in the documentation and/or other materials19* provided with the distribution.20*21* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,22* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF23* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND24* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS25* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN26* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN27* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE28* SOFTWARE.29*/30#ifndef __IW_CXGB4_H__31#define __IW_CXGB4_H__3233#include <linux/mutex.h>34#include <linux/list.h>35#include <linux/spinlock.h>36#include <linux/idr.h>37#include <linux/completion.h>38#include <linux/netdevice.h>39#include <linux/sched.h>40#include <linux/pci.h>41#include <linux/dma-mapping.h>42#include <linux/inet.h>43#include <linux/wait.h>44#include <linux/kref.h>45#include <linux/timer.h>46#include <linux/io.h>47#include <linux/kfifo.h>4849#include <asm/byteorder.h>5051#include <net/net_namespace.h>5253#include <rdma/ib_verbs.h>54#include <rdma/iw_cm.h>5556#include "cxgb4.h"57#include "cxgb4_uld.h"58#include "l2t.h"59#include "user.h"6061#define DRV_NAME "iw_cxgb4"62#define MOD DRV_NAME ":"6364extern int c4iw_debug;65#define PDBG(fmt, args...) \66do { \67if (c4iw_debug) \68printk(MOD fmt, ## args); \69} while (0)7071#include "t4.h"7273#define PBL_OFF(rdev_p, a) ((a) - (rdev_p)->lldi.vr->pbl.start)74#define RQT_OFF(rdev_p, a) ((a) - (rdev_p)->lldi.vr->rq.start)7576static inline void *cplhdr(struct sk_buff *skb)77{78return skb->data;79}8081struct c4iw_resource {82struct kfifo tpt_fifo;83spinlock_t tpt_fifo_lock;84struct kfifo qid_fifo;85spinlock_t qid_fifo_lock;86struct kfifo pdid_fifo;87spinlock_t pdid_fifo_lock;88};8990struct c4iw_qid_list {91struct list_head entry;92u32 qid;93};9495struct c4iw_dev_ucontext {96struct list_head qpids;97struct list_head cqids;98struct mutex lock;99};100101enum c4iw_rdev_flags {102T4_FATAL_ERROR = (1<<0),103};104105struct c4iw_rdev {106struct c4iw_resource resource;107unsigned long qpshift;108u32 qpmask;109unsigned long cqshift;110u32 cqmask;111struct c4iw_dev_ucontext uctx;112struct gen_pool *pbl_pool;113struct gen_pool *rqt_pool;114struct gen_pool *ocqp_pool;115u32 flags;116struct cxgb4_lld_info lldi;117unsigned long oc_mw_pa;118void __iomem *oc_mw_kva;119};120121static inline int c4iw_fatal_error(struct c4iw_rdev *rdev)122{123return rdev->flags & T4_FATAL_ERROR;124}125126static inline int c4iw_num_stags(struct c4iw_rdev *rdev)127{128return min((int)T4_MAX_NUM_STAG, (int)(rdev->lldi.vr->stag.size >> 5));129}130131#define C4IW_WR_TO (10*HZ)132133struct c4iw_wr_wait {134struct completion completion;135int ret;136};137138static inline void c4iw_init_wr_wait(struct c4iw_wr_wait *wr_waitp)139{140wr_waitp->ret = 0;141init_completion(&wr_waitp->completion);142}143144static inline void c4iw_wake_up(struct c4iw_wr_wait *wr_waitp, int ret)145{146wr_waitp->ret = ret;147complete(&wr_waitp->completion);148}149150static inline int c4iw_wait_for_reply(struct c4iw_rdev *rdev,151struct c4iw_wr_wait *wr_waitp,152u32 hwtid, u32 qpid,153const char *func)154{155unsigned to = C4IW_WR_TO;156int ret;157158do {159ret = wait_for_completion_timeout(&wr_waitp->completion, to);160if (!ret) {161printk(KERN_ERR MOD "%s - Device %s not responding - "162"tid %u qpid %u\n", func,163pci_name(rdev->lldi.pdev), hwtid, qpid);164if (c4iw_fatal_error(rdev)) {165wr_waitp->ret = -EIO;166break;167}168to = to << 2;169}170} while (!ret);171if (wr_waitp->ret)172PDBG("%s: FW reply %d tid %u qpid %u\n",173pci_name(rdev->lldi.pdev), wr_waitp->ret, hwtid, qpid);174return wr_waitp->ret;175}176177struct c4iw_dev {178struct ib_device ibdev;179struct c4iw_rdev rdev;180u32 device_cap_flags;181struct idr cqidr;182struct idr qpidr;183struct idr mmidr;184spinlock_t lock;185struct dentry *debugfs_root;186};187188static inline struct c4iw_dev *to_c4iw_dev(struct ib_device *ibdev)189{190return container_of(ibdev, struct c4iw_dev, ibdev);191}192193static inline struct c4iw_dev *rdev_to_c4iw_dev(struct c4iw_rdev *rdev)194{195return container_of(rdev, struct c4iw_dev, rdev);196}197198static inline struct c4iw_cq *get_chp(struct c4iw_dev *rhp, u32 cqid)199{200return idr_find(&rhp->cqidr, cqid);201}202203static inline struct c4iw_qp *get_qhp(struct c4iw_dev *rhp, u32 qpid)204{205return idr_find(&rhp->qpidr, qpid);206}207208static inline struct c4iw_mr *get_mhp(struct c4iw_dev *rhp, u32 mmid)209{210return idr_find(&rhp->mmidr, mmid);211}212213static inline int insert_handle(struct c4iw_dev *rhp, struct idr *idr,214void *handle, u32 id)215{216int ret;217int newid;218219do {220if (!idr_pre_get(idr, GFP_KERNEL))221return -ENOMEM;222spin_lock_irq(&rhp->lock);223ret = idr_get_new_above(idr, handle, id, &newid);224BUG_ON(newid != id);225spin_unlock_irq(&rhp->lock);226} while (ret == -EAGAIN);227228return ret;229}230231static inline void remove_handle(struct c4iw_dev *rhp, struct idr *idr, u32 id)232{233spin_lock_irq(&rhp->lock);234idr_remove(idr, id);235spin_unlock_irq(&rhp->lock);236}237238struct c4iw_pd {239struct ib_pd ibpd;240u32 pdid;241struct c4iw_dev *rhp;242};243244static inline struct c4iw_pd *to_c4iw_pd(struct ib_pd *ibpd)245{246return container_of(ibpd, struct c4iw_pd, ibpd);247}248249struct tpt_attributes {250u64 len;251u64 va_fbo;252enum fw_ri_mem_perms perms;253u32 stag;254u32 pdid;255u32 qpid;256u32 pbl_addr;257u32 pbl_size;258u32 state:1;259u32 type:2;260u32 rsvd:1;261u32 remote_invaliate_disable:1;262u32 zbva:1;263u32 mw_bind_enable:1;264u32 page_size:5;265};266267struct c4iw_mr {268struct ib_mr ibmr;269struct ib_umem *umem;270struct c4iw_dev *rhp;271u64 kva;272struct tpt_attributes attr;273};274275static inline struct c4iw_mr *to_c4iw_mr(struct ib_mr *ibmr)276{277return container_of(ibmr, struct c4iw_mr, ibmr);278}279280struct c4iw_mw {281struct ib_mw ibmw;282struct c4iw_dev *rhp;283u64 kva;284struct tpt_attributes attr;285};286287static inline struct c4iw_mw *to_c4iw_mw(struct ib_mw *ibmw)288{289return container_of(ibmw, struct c4iw_mw, ibmw);290}291292struct c4iw_fr_page_list {293struct ib_fast_reg_page_list ibpl;294DEFINE_DMA_UNMAP_ADDR(mapping);295dma_addr_t dma_addr;296struct c4iw_dev *dev;297int size;298};299300static inline struct c4iw_fr_page_list *to_c4iw_fr_page_list(301struct ib_fast_reg_page_list *ibpl)302{303return container_of(ibpl, struct c4iw_fr_page_list, ibpl);304}305306struct c4iw_cq {307struct ib_cq ibcq;308struct c4iw_dev *rhp;309struct t4_cq cq;310spinlock_t lock;311atomic_t refcnt;312wait_queue_head_t wait;313};314315static inline struct c4iw_cq *to_c4iw_cq(struct ib_cq *ibcq)316{317return container_of(ibcq, struct c4iw_cq, ibcq);318}319320struct c4iw_mpa_attributes {321u8 initiator;322u8 recv_marker_enabled;323u8 xmit_marker_enabled;324u8 crc_enabled;325u8 version;326u8 p2p_type;327};328329struct c4iw_qp_attributes {330u32 scq;331u32 rcq;332u32 sq_num_entries;333u32 rq_num_entries;334u32 sq_max_sges;335u32 sq_max_sges_rdma_write;336u32 rq_max_sges;337u32 state;338u8 enable_rdma_read;339u8 enable_rdma_write;340u8 enable_bind;341u8 enable_mmid0_fastreg;342u32 max_ord;343u32 max_ird;344u32 pd;345u32 next_state;346char terminate_buffer[52];347u32 terminate_msg_len;348u8 is_terminate_local;349struct c4iw_mpa_attributes mpa_attr;350struct c4iw_ep *llp_stream_handle;351};352353struct c4iw_qp {354struct ib_qp ibqp;355struct c4iw_dev *rhp;356struct c4iw_ep *ep;357struct c4iw_qp_attributes attr;358struct t4_wq wq;359spinlock_t lock;360struct mutex mutex;361atomic_t refcnt;362wait_queue_head_t wait;363struct timer_list timer;364};365366static inline struct c4iw_qp *to_c4iw_qp(struct ib_qp *ibqp)367{368return container_of(ibqp, struct c4iw_qp, ibqp);369}370371struct c4iw_ucontext {372struct ib_ucontext ibucontext;373struct c4iw_dev_ucontext uctx;374u32 key;375spinlock_t mmap_lock;376struct list_head mmaps;377};378379static inline struct c4iw_ucontext *to_c4iw_ucontext(struct ib_ucontext *c)380{381return container_of(c, struct c4iw_ucontext, ibucontext);382}383384struct c4iw_mm_entry {385struct list_head entry;386u64 addr;387u32 key;388unsigned len;389};390391static inline struct c4iw_mm_entry *remove_mmap(struct c4iw_ucontext *ucontext,392u32 key, unsigned len)393{394struct list_head *pos, *nxt;395struct c4iw_mm_entry *mm;396397spin_lock(&ucontext->mmap_lock);398list_for_each_safe(pos, nxt, &ucontext->mmaps) {399400mm = list_entry(pos, struct c4iw_mm_entry, entry);401if (mm->key == key && mm->len == len) {402list_del_init(&mm->entry);403spin_unlock(&ucontext->mmap_lock);404PDBG("%s key 0x%x addr 0x%llx len %d\n", __func__,405key, (unsigned long long) mm->addr, mm->len);406return mm;407}408}409spin_unlock(&ucontext->mmap_lock);410return NULL;411}412413static inline void insert_mmap(struct c4iw_ucontext *ucontext,414struct c4iw_mm_entry *mm)415{416spin_lock(&ucontext->mmap_lock);417PDBG("%s key 0x%x addr 0x%llx len %d\n", __func__,418mm->key, (unsigned long long) mm->addr, mm->len);419list_add_tail(&mm->entry, &ucontext->mmaps);420spin_unlock(&ucontext->mmap_lock);421}422423enum c4iw_qp_attr_mask {424C4IW_QP_ATTR_NEXT_STATE = 1 << 0,425C4IW_QP_ATTR_ENABLE_RDMA_READ = 1 << 7,426C4IW_QP_ATTR_ENABLE_RDMA_WRITE = 1 << 8,427C4IW_QP_ATTR_ENABLE_RDMA_BIND = 1 << 9,428C4IW_QP_ATTR_MAX_ORD = 1 << 11,429C4IW_QP_ATTR_MAX_IRD = 1 << 12,430C4IW_QP_ATTR_LLP_STREAM_HANDLE = 1 << 22,431C4IW_QP_ATTR_STREAM_MSG_BUFFER = 1 << 23,432C4IW_QP_ATTR_MPA_ATTR = 1 << 24,433C4IW_QP_ATTR_QP_CONTEXT_ACTIVATE = 1 << 25,434C4IW_QP_ATTR_VALID_MODIFY = (C4IW_QP_ATTR_ENABLE_RDMA_READ |435C4IW_QP_ATTR_ENABLE_RDMA_WRITE |436C4IW_QP_ATTR_MAX_ORD |437C4IW_QP_ATTR_MAX_IRD |438C4IW_QP_ATTR_LLP_STREAM_HANDLE |439C4IW_QP_ATTR_STREAM_MSG_BUFFER |440C4IW_QP_ATTR_MPA_ATTR |441C4IW_QP_ATTR_QP_CONTEXT_ACTIVATE)442};443444int c4iw_modify_qp(struct c4iw_dev *rhp,445struct c4iw_qp *qhp,446enum c4iw_qp_attr_mask mask,447struct c4iw_qp_attributes *attrs,448int internal);449450enum c4iw_qp_state {451C4IW_QP_STATE_IDLE,452C4IW_QP_STATE_RTS,453C4IW_QP_STATE_ERROR,454C4IW_QP_STATE_TERMINATE,455C4IW_QP_STATE_CLOSING,456C4IW_QP_STATE_TOT457};458459static inline int c4iw_convert_state(enum ib_qp_state ib_state)460{461switch (ib_state) {462case IB_QPS_RESET:463case IB_QPS_INIT:464return C4IW_QP_STATE_IDLE;465case IB_QPS_RTS:466return C4IW_QP_STATE_RTS;467case IB_QPS_SQD:468return C4IW_QP_STATE_CLOSING;469case IB_QPS_SQE:470return C4IW_QP_STATE_TERMINATE;471case IB_QPS_ERR:472return C4IW_QP_STATE_ERROR;473default:474return -1;475}476}477478static inline u32 c4iw_ib_to_tpt_access(int a)479{480return (a & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) |481(a & IB_ACCESS_REMOTE_READ ? FW_RI_MEM_ACCESS_REM_READ : 0) |482(a & IB_ACCESS_LOCAL_WRITE ? FW_RI_MEM_ACCESS_LOCAL_WRITE : 0) |483FW_RI_MEM_ACCESS_LOCAL_READ;484}485486static inline u32 c4iw_ib_to_tpt_bind_access(int acc)487{488return (acc & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) |489(acc & IB_ACCESS_REMOTE_READ ? FW_RI_MEM_ACCESS_REM_READ : 0);490}491492enum c4iw_mmid_state {493C4IW_STAG_STATE_VALID,494C4IW_STAG_STATE_INVALID495};496497#define C4IW_NODE_DESC "cxgb4 Chelsio Communications"498499#define MPA_KEY_REQ "MPA ID Req Frame"500#define MPA_KEY_REP "MPA ID Rep Frame"501502#define MPA_MAX_PRIVATE_DATA 256503#define MPA_REJECT 0x20504#define MPA_CRC 0x40505#define MPA_MARKERS 0x80506#define MPA_FLAGS_MASK 0xE0507508#define c4iw_put_ep(ep) { \509PDBG("put_ep (via %s:%u) ep %p refcnt %d\n", __func__, __LINE__, \510ep, atomic_read(&((ep)->kref.refcount))); \511WARN_ON(atomic_read(&((ep)->kref.refcount)) < 1); \512kref_put(&((ep)->kref), _c4iw_free_ep); \513}514515#define c4iw_get_ep(ep) { \516PDBG("get_ep (via %s:%u) ep %p, refcnt %d\n", __func__, __LINE__, \517ep, atomic_read(&((ep)->kref.refcount))); \518kref_get(&((ep)->kref)); \519}520void _c4iw_free_ep(struct kref *kref);521522struct mpa_message {523u8 key[16];524u8 flags;525u8 revision;526__be16 private_data_size;527u8 private_data[0];528};529530struct terminate_message {531u8 layer_etype;532u8 ecode;533__be16 hdrct_rsvd;534u8 len_hdrs[0];535};536537#define TERM_MAX_LENGTH (sizeof(struct terminate_message) + 2 + 18 + 28)538539enum c4iw_layers_types {540LAYER_RDMAP = 0x00,541LAYER_DDP = 0x10,542LAYER_MPA = 0x20,543RDMAP_LOCAL_CATA = 0x00,544RDMAP_REMOTE_PROT = 0x01,545RDMAP_REMOTE_OP = 0x02,546DDP_LOCAL_CATA = 0x00,547DDP_TAGGED_ERR = 0x01,548DDP_UNTAGGED_ERR = 0x02,549DDP_LLP = 0x03550};551552enum c4iw_rdma_ecodes {553RDMAP_INV_STAG = 0x00,554RDMAP_BASE_BOUNDS = 0x01,555RDMAP_ACC_VIOL = 0x02,556RDMAP_STAG_NOT_ASSOC = 0x03,557RDMAP_TO_WRAP = 0x04,558RDMAP_INV_VERS = 0x05,559RDMAP_INV_OPCODE = 0x06,560RDMAP_STREAM_CATA = 0x07,561RDMAP_GLOBAL_CATA = 0x08,562RDMAP_CANT_INV_STAG = 0x09,563RDMAP_UNSPECIFIED = 0xff564};565566enum c4iw_ddp_ecodes {567DDPT_INV_STAG = 0x00,568DDPT_BASE_BOUNDS = 0x01,569DDPT_STAG_NOT_ASSOC = 0x02,570DDPT_TO_WRAP = 0x03,571DDPT_INV_VERS = 0x04,572DDPU_INV_QN = 0x01,573DDPU_INV_MSN_NOBUF = 0x02,574DDPU_INV_MSN_RANGE = 0x03,575DDPU_INV_MO = 0x04,576DDPU_MSG_TOOBIG = 0x05,577DDPU_INV_VERS = 0x06578};579580enum c4iw_mpa_ecodes {581MPA_CRC_ERR = 0x02,582MPA_MARKER_ERR = 0x03583};584585enum c4iw_ep_state {586IDLE = 0,587LISTEN,588CONNECTING,589MPA_REQ_WAIT,590MPA_REQ_SENT,591MPA_REQ_RCVD,592MPA_REP_SENT,593FPDU_MODE,594ABORTING,595CLOSING,596MORIBUND,597DEAD,598};599600enum c4iw_ep_flags {601PEER_ABORT_IN_PROGRESS = 0,602ABORT_REQ_IN_PROGRESS = 1,603RELEASE_RESOURCES = 2,604CLOSE_SENT = 3,605};606607struct c4iw_ep_common {608struct iw_cm_id *cm_id;609struct c4iw_qp *qp;610struct c4iw_dev *dev;611enum c4iw_ep_state state;612struct kref kref;613struct mutex mutex;614struct sockaddr_in local_addr;615struct sockaddr_in remote_addr;616struct c4iw_wr_wait wr_wait;617unsigned long flags;618};619620struct c4iw_listen_ep {621struct c4iw_ep_common com;622unsigned int stid;623int backlog;624};625626struct c4iw_ep {627struct c4iw_ep_common com;628struct c4iw_ep *parent_ep;629struct timer_list timer;630struct list_head entry;631unsigned int atid;632u32 hwtid;633u32 snd_seq;634u32 rcv_seq;635struct l2t_entry *l2t;636struct dst_entry *dst;637struct sk_buff *mpa_skb;638struct c4iw_mpa_attributes mpa_attr;639u8 mpa_pkt[sizeof(struct mpa_message) + MPA_MAX_PRIVATE_DATA];640unsigned int mpa_pkt_len;641u32 ird;642u32 ord;643u32 smac_idx;644u32 tx_chan;645u32 mtu;646u16 mss;647u16 emss;648u16 plen;649u16 rss_qid;650u16 txq_idx;651u16 ctrlq_idx;652u8 tos;653};654655static inline struct c4iw_ep *to_ep(struct iw_cm_id *cm_id)656{657return cm_id->provider_data;658}659660static inline struct c4iw_listen_ep *to_listen_ep(struct iw_cm_id *cm_id)661{662return cm_id->provider_data;663}664665static inline int compute_wscale(int win)666{667int wscale = 0;668669while (wscale < 14 && (65535<<wscale) < win)670wscale++;671return wscale;672}673674typedef int (*c4iw_handler_func)(struct c4iw_dev *dev, struct sk_buff *skb);675676int c4iw_ep_redirect(void *ctx, struct dst_entry *old, struct dst_entry *new,677struct l2t_entry *l2t);678void c4iw_put_qpid(struct c4iw_rdev *rdev, u32 qpid,679struct c4iw_dev_ucontext *uctx);680u32 c4iw_get_resource(struct kfifo *fifo, spinlock_t *lock);681void c4iw_put_resource(struct kfifo *fifo, u32 entry, spinlock_t *lock);682int c4iw_init_resource(struct c4iw_rdev *rdev, u32 nr_tpt, u32 nr_pdid);683int c4iw_init_ctrl_qp(struct c4iw_rdev *rdev);684int c4iw_pblpool_create(struct c4iw_rdev *rdev);685int c4iw_rqtpool_create(struct c4iw_rdev *rdev);686int c4iw_ocqp_pool_create(struct c4iw_rdev *rdev);687void c4iw_pblpool_destroy(struct c4iw_rdev *rdev);688void c4iw_rqtpool_destroy(struct c4iw_rdev *rdev);689void c4iw_ocqp_pool_destroy(struct c4iw_rdev *rdev);690void c4iw_destroy_resource(struct c4iw_resource *rscp);691int c4iw_destroy_ctrl_qp(struct c4iw_rdev *rdev);692int c4iw_register_device(struct c4iw_dev *dev);693void c4iw_unregister_device(struct c4iw_dev *dev);694int __init c4iw_cm_init(void);695void __exit c4iw_cm_term(void);696void c4iw_release_dev_ucontext(struct c4iw_rdev *rdev,697struct c4iw_dev_ucontext *uctx);698void c4iw_init_dev_ucontext(struct c4iw_rdev *rdev,699struct c4iw_dev_ucontext *uctx);700int c4iw_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc);701int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,702struct ib_send_wr **bad_wr);703int c4iw_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,704struct ib_recv_wr **bad_wr);705int c4iw_bind_mw(struct ib_qp *qp, struct ib_mw *mw,706struct ib_mw_bind *mw_bind);707int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);708int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog);709int c4iw_destroy_listen(struct iw_cm_id *cm_id);710int c4iw_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);711int c4iw_reject_cr(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len);712void c4iw_qp_add_ref(struct ib_qp *qp);713void c4iw_qp_rem_ref(struct ib_qp *qp);714void c4iw_free_fastreg_pbl(struct ib_fast_reg_page_list *page_list);715struct ib_fast_reg_page_list *c4iw_alloc_fastreg_pbl(716struct ib_device *device,717int page_list_len);718struct ib_mr *c4iw_alloc_fast_reg_mr(struct ib_pd *pd, int pbl_depth);719int c4iw_dealloc_mw(struct ib_mw *mw);720struct ib_mw *c4iw_alloc_mw(struct ib_pd *pd);721struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start,722u64 length, u64 virt, int acc,723struct ib_udata *udata);724struct ib_mr *c4iw_get_dma_mr(struct ib_pd *pd, int acc);725struct ib_mr *c4iw_register_phys_mem(struct ib_pd *pd,726struct ib_phys_buf *buffer_list,727int num_phys_buf,728int acc,729u64 *iova_start);730int c4iw_reregister_phys_mem(struct ib_mr *mr,731int mr_rereg_mask,732struct ib_pd *pd,733struct ib_phys_buf *buffer_list,734int num_phys_buf,735int acc, u64 *iova_start);736int c4iw_dereg_mr(struct ib_mr *ib_mr);737int c4iw_destroy_cq(struct ib_cq *ib_cq);738struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries,739int vector,740struct ib_ucontext *ib_context,741struct ib_udata *udata);742int c4iw_resize_cq(struct ib_cq *cq, int cqe, struct ib_udata *udata);743int c4iw_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags);744int c4iw_destroy_qp(struct ib_qp *ib_qp);745struct ib_qp *c4iw_create_qp(struct ib_pd *pd,746struct ib_qp_init_attr *attrs,747struct ib_udata *udata);748int c4iw_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,749int attr_mask, struct ib_udata *udata);750struct ib_qp *c4iw_get_qp(struct ib_device *dev, int qpn);751u32 c4iw_rqtpool_alloc(struct c4iw_rdev *rdev, int size);752void c4iw_rqtpool_free(struct c4iw_rdev *rdev, u32 addr, int size);753u32 c4iw_pblpool_alloc(struct c4iw_rdev *rdev, int size);754void c4iw_pblpool_free(struct c4iw_rdev *rdev, u32 addr, int size);755u32 c4iw_ocqp_pool_alloc(struct c4iw_rdev *rdev, int size);756void c4iw_ocqp_pool_free(struct c4iw_rdev *rdev, u32 addr, int size);757int c4iw_ofld_send(struct c4iw_rdev *rdev, struct sk_buff *skb);758void c4iw_flush_hw_cq(struct t4_cq *cq);759void c4iw_count_rcqes(struct t4_cq *cq, struct t4_wq *wq, int *count);760void c4iw_count_scqes(struct t4_cq *cq, struct t4_wq *wq, int *count);761int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp);762int c4iw_flush_rq(struct t4_wq *wq, struct t4_cq *cq, int count);763int c4iw_flush_sq(struct t4_wq *wq, struct t4_cq *cq, int count);764int c4iw_ev_handler(struct c4iw_dev *rnicp, u32 qid);765u16 c4iw_rqes_posted(struct c4iw_qp *qhp);766int c4iw_post_terminate(struct c4iw_qp *qhp, struct t4_cqe *err_cqe);767u32 c4iw_get_cqid(struct c4iw_rdev *rdev, struct c4iw_dev_ucontext *uctx);768void c4iw_put_cqid(struct c4iw_rdev *rdev, u32 qid,769struct c4iw_dev_ucontext *uctx);770u32 c4iw_get_qpid(struct c4iw_rdev *rdev, struct c4iw_dev_ucontext *uctx);771void c4iw_put_qpid(struct c4iw_rdev *rdev, u32 qid,772struct c4iw_dev_ucontext *uctx);773void c4iw_ev_dispatch(struct c4iw_dev *dev, struct t4_cqe *err_cqe);774775extern struct cxgb4_client t4c_client;776extern c4iw_handler_func c4iw_handlers[NUM_CPL_CMDS];777extern int c4iw_max_read_depth;778779#endif780781782