226 lines · c
1/*2 * Copyright (c) 2004, 2005, Voltaire, Inc. All rights reserved.3 * Copyright (c) 2005 Intel Corporation. All rights reserved.4 * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.5 * Copyright (c) 2009 HNR Consulting. All rights reserved.6 *7 * This software is available to you under a choice of one of two8 * licenses. You may choose to be licensed under the terms of the GNU9 * General Public License (GPL) Version 2, available from the file10 * COPYING in the main directory of this source tree, or the11 * OpenIB.org BSD license below:12 *13 * Redistribution and use in source and binary forms, with or14 * without modification, are permitted provided that the following15 * conditions are met:16 *17 * - Redistributions of source code must retain the above18 * copyright notice, this list of conditions and the following19 * disclaimer.20 *21 * - Redistributions in binary form must reproduce the above22 * copyright notice, this list of conditions and the following23 * disclaimer in the documentation and/or other materials24 * provided with the distribution.25 *26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS30 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN31 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN32 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE33 * SOFTWARE.34 */35 36#ifndef __IB_MAD_PRIV_H__37#define __IB_MAD_PRIV_H__38 39#include <linux/completion.h>40#include <linux/err.h>41#include <linux/workqueue.h>42#include <rdma/ib_mad.h>43#include <rdma/ib_smi.h>44#include <rdma/opa_smi.h>45 46#define IB_MAD_QPS_CORE 2 /* Always QP0 and QP1 as a minimum */47 48/* QP and CQ parameters */49#define IB_MAD_QP_SEND_SIZE 12850#define IB_MAD_QP_RECV_SIZE 51251#define IB_MAD_QP_MIN_SIZE 6452#define IB_MAD_QP_MAX_SIZE 819253#define IB_MAD_SEND_REQ_MAX_SG 254#define IB_MAD_RECV_REQ_MAX_SG 155 56#define IB_MAD_SEND_Q_PSN 057 58/* Registration table sizes */59#define MAX_MGMT_CLASS 8060#define MAX_MGMT_VERSION 0x8361#define MAX_MGMT_OUI 862#define MAX_MGMT_VENDOR_RANGE2 (IB_MGMT_CLASS_VENDOR_RANGE2_END - \63 IB_MGMT_CLASS_VENDOR_RANGE2_START + 1)64 65struct ib_mad_list_head {66 struct list_head list;67 struct ib_cqe cqe;68 struct ib_mad_queue *mad_queue;69};70 71struct ib_mad_private_header {72 struct ib_mad_list_head mad_list;73 struct ib_mad_recv_wc recv_wc;74 struct ib_wc wc;75 u64 mapping;76} __packed;77 78struct ib_mad_private {79 struct ib_mad_private_header header;80 size_t mad_size;81 struct ib_grh grh;82 u8 mad[];83} __packed;84 85struct ib_rmpp_segment {86 struct list_head list;87 u32 num;88 u8 data[];89};90 91struct ib_mad_agent_private {92 struct ib_mad_agent agent;93 struct ib_mad_reg_req *reg_req;94 struct ib_mad_qp_info *qp_info;95 96 spinlock_t lock;97 struct list_head send_list;98 struct list_head wait_list;99 struct list_head done_list;100 struct delayed_work timed_work;101 unsigned long timeout;102 struct list_head local_list;103 struct work_struct local_work;104 struct list_head rmpp_list;105 106 refcount_t refcount;107 union {108 struct completion comp;109 struct rcu_head rcu;110 };111};112 113struct ib_mad_snoop_private {114 struct ib_mad_agent agent;115 struct ib_mad_qp_info *qp_info;116 int snoop_index;117 int mad_snoop_flags;118 struct completion comp;119};120 121struct ib_mad_send_wr_private {122 struct ib_mad_list_head mad_list;123 struct list_head agent_list;124 struct ib_mad_agent_private *mad_agent_priv;125 struct ib_mad_send_buf send_buf;126 u64 header_mapping;127 u64 payload_mapping;128 struct ib_ud_wr send_wr;129 struct ib_sge sg_list[IB_MAD_SEND_REQ_MAX_SG];130 __be64 tid;131 unsigned long timeout;132 int max_retries;133 int retries_left;134 int retry;135 int refcount;136 enum ib_wc_status status;137 138 /* RMPP control */139 struct list_head rmpp_list;140 struct ib_rmpp_segment *last_ack_seg;141 struct ib_rmpp_segment *cur_seg;142 int last_ack;143 int seg_num;144 int newwin;145 int pad;146};147 148struct ib_mad_local_private {149 struct list_head completion_list;150 struct ib_mad_private *mad_priv;151 struct ib_mad_agent_private *recv_mad_agent;152 struct ib_mad_send_wr_private *mad_send_wr;153 size_t return_wc_byte_len;154};155 156struct ib_mad_mgmt_method_table {157 struct ib_mad_agent_private *agent[IB_MGMT_MAX_METHODS];158};159 160struct ib_mad_mgmt_class_table {161 struct ib_mad_mgmt_method_table *method_table[MAX_MGMT_CLASS];162};163 164struct ib_mad_mgmt_vendor_class {165 u8 oui[MAX_MGMT_OUI][3];166 struct ib_mad_mgmt_method_table *method_table[MAX_MGMT_OUI];167};168 169struct ib_mad_mgmt_vendor_class_table {170 struct ib_mad_mgmt_vendor_class *vendor_class[MAX_MGMT_VENDOR_RANGE2];171};172 173struct ib_mad_mgmt_version_table {174 struct ib_mad_mgmt_class_table *class;175 struct ib_mad_mgmt_vendor_class_table *vendor;176};177 178struct ib_mad_queue {179 spinlock_t lock;180 struct list_head list;181 int count;182 int max_active;183 struct ib_mad_qp_info *qp_info;184};185 186struct ib_mad_qp_info {187 struct ib_mad_port_private *port_priv;188 struct ib_qp *qp;189 struct ib_mad_queue send_queue;190 struct ib_mad_queue recv_queue;191 struct list_head overflow_list;192 spinlock_t snoop_lock;193 struct ib_mad_snoop_private **snoop_table;194 int snoop_table_size;195 atomic_t snoop_count;196};197 198struct ib_mad_port_private {199 struct list_head port_list;200 struct ib_device *device;201 int port_num;202 struct ib_cq *cq;203 struct ib_pd *pd;204 205 spinlock_t reg_lock;206 struct ib_mad_mgmt_version_table version[MAX_MGMT_VERSION];207 struct workqueue_struct *wq;208 struct ib_mad_qp_info qp_info[IB_MAD_QPS_CORE];209};210 211int ib_send_mad(struct ib_mad_send_wr_private *mad_send_wr);212 213struct ib_mad_send_wr_private *214ib_find_send_mad(const struct ib_mad_agent_private *mad_agent_priv,215 const struct ib_mad_recv_wc *mad_recv_wc);216 217void ib_mad_complete_send_wr(struct ib_mad_send_wr_private *mad_send_wr,218 struct ib_mad_send_wc *mad_send_wc);219 220void ib_mark_mad_done(struct ib_mad_send_wr_private *mad_send_wr);221 222void ib_reset_mad_timeout(struct ib_mad_send_wr_private *mad_send_wr,223 unsigned long timeout_ms);224 225#endif /* __IB_MAD_PRIV_H__ */226