/*
---- -------- * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved.
++++ ++++++++ * Copyright (c) 2009-2014 Chelsio, Inc. All rights reserved.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
#include <net/ip6_route.h>
#include <net/addrconf.h>
++ ++++++++++#include <rdma/ib_addr.h>
++ ++++++++++
#include "iw_cxgb4.h"
static char *states[] = {
dst_release(ep->dst);
cxgb4_l2t_release(ep->l2t);
}
++++ ++++++++ if (test_bit(RELEASE_MAPINFO, &ep->com.flags)) {
++++ ++++++++ print_addr(&ep->com, __func__, "remove_mapinfo/mapping");
++++ ++++++++ iwpm_remove_mapinfo(&ep->com.local_addr,
++++ ++++++++ &ep->com.mapped_local_addr);
++++ ++++++++ iwpm_remove_mapping(&ep->com.local_addr, RDMA_NL_C4IW);
++++ ++++++++ }
kfree(ep);
}
static struct net_device *get_real_dev(struct net_device *egress_dev)
{
-- ---------- struct net_device *phys_dev = egress_dev;
-- ---------- if (egress_dev->priv_flags & IFF_802_1Q_VLAN)
-- ---------- phys_dev = vlan_dev_real_dev(egress_dev);
-- ---------- return phys_dev;
++ ++++++++++ return rdma_vlan_dev_real_dev(egress_dev) ? : egress_dev;
}
static int our_interface(struct c4iw_dev *dev, struct net_device *egress_dev)
return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);
}
++++ ++++++++/*
++++ ++++++++ * c4iw_form_pm_msg - Form a port mapper message with mapping info
++++ ++++++++ */
++++ ++++++++static void c4iw_form_pm_msg(struct c4iw_ep *ep,
++++ ++++++++ struct iwpm_sa_data *pm_msg)
++++ ++++++++{
++++ ++++++++ memcpy(&pm_msg->loc_addr, &ep->com.local_addr,
++++ ++++++++ sizeof(ep->com.local_addr));
++++ ++++++++ memcpy(&pm_msg->rem_addr, &ep->com.remote_addr,
++++ ++++++++ sizeof(ep->com.remote_addr));
++++ ++++++++}
++++ ++++++++
++++ ++++++++/*
++++ ++++++++ * c4iw_form_reg_msg - Form a port mapper message with dev info
++++ ++++++++ */
++++ ++++++++static void c4iw_form_reg_msg(struct c4iw_dev *dev,
++++ ++++++++ struct iwpm_dev_data *pm_msg)
++++ ++++++++{
++++ ++++++++ memcpy(pm_msg->dev_name, dev->ibdev.name, IWPM_DEVNAME_SIZE);
++++ ++++++++ memcpy(pm_msg->if_name, dev->rdev.lldi.ports[0]->name,
++++ ++++++++ IWPM_IFNAME_SIZE);
++++ ++++++++}
++++ ++++++++
++++ ++++++++static void c4iw_record_pm_msg(struct c4iw_ep *ep,
++++ ++++++++ struct iwpm_sa_data *pm_msg)
++++ ++++++++{
++++ ++++++++ memcpy(&ep->com.mapped_local_addr, &pm_msg->mapped_loc_addr,
++++ ++++++++ sizeof(ep->com.mapped_local_addr));
++++ ++++++++ memcpy(&ep->com.mapped_remote_addr, &pm_msg->mapped_rem_addr,
++++ ++++++++ sizeof(ep->com.mapped_remote_addr));
++++ ++++++++}
++++ ++++++++
static int send_connect(struct c4iw_ep *ep)
{
struct cpl_act_open_req *req;
int sizev6 = is_t4(ep->com.dev->rdev.lldi.adapter_type) ?
sizeof(struct cpl_act_open_req6) :
sizeof(struct cpl_t5_act_open_req6);
---- -------- struct sockaddr_in *la = (struct sockaddr_in *)&ep->com.local_addr;
---- -------- struct sockaddr_in *ra = (struct sockaddr_in *)&ep->com.remote_addr;
---- -------- struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)&ep->com.local_addr;
---- -------- struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)&ep->com.remote_addr;
++++ ++++++++ struct sockaddr_in *la = (struct sockaddr_in *)
++++ ++++++++ &ep->com.mapped_local_addr;
++++ ++++++++ struct sockaddr_in *ra = (struct sockaddr_in *)
++++ ++++++++ &ep->com.mapped_remote_addr;
++++ ++++++++ struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)
++++ ++++++++ &ep->com.mapped_local_addr;
++++ ++++++++ struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)
++++ ++++++++ &ep->com.mapped_remote_addr;
wrlen = (ep->com.remote_addr.ss_family == AF_INET) ?
roundup(sizev4, 16) :
req->le.filter = cpu_to_be32(cxgb4_select_ntuple(
ep->com.dev->rdev.lldi.ports[0],
ep->l2t));
---- -------- sin = (struct sockaddr_in *)&ep->com.local_addr;
++++ ++++++++ sin = (struct sockaddr_in *)&ep->com.mapped_local_addr;
req->le.lport = sin->sin_port;
req->le.u.ipv4.lip = sin->sin_addr.s_addr;
---- -------- sin = (struct sockaddr_in *)&ep->com.remote_addr;
++++ ++++++++ sin = (struct sockaddr_in *)&ep->com.mapped_remote_addr;
req->le.pport = sin->sin_port;
req->le.u.ipv4.pip = sin->sin_addr.s_addr;
req->tcb.t_state_to_astid =
if (!ep->l2t)
goto out;
ep->mtu = dst_mtu(dst);
-- ---------- ep->tx_chan = cxgb4_port_chan(n->dev);
-- ---------- ep->smac_idx = (cxgb4_port_viid(n->dev) & 0x7F) << 1;
++ ++++++++++ ep->tx_chan = cxgb4_port_chan(pdev);
++ ++++++++++ ep->smac_idx = (cxgb4_port_viid(pdev) & 0x7F) << 1;
step = cdev->rdev.lldi.ntxq /
cdev->rdev.lldi.nchan;
-- ---------- ep->txq_idx = cxgb4_port_idx(n->dev) * step;
-- ---------- ep->ctrlq_idx = cxgb4_port_idx(n->dev);
++ ++++++++++ ep->txq_idx = cxgb4_port_idx(pdev) * step;
++ ++++++++++ ep->ctrlq_idx = cxgb4_port_idx(pdev);
step = cdev->rdev.lldi.nrxq /
cdev->rdev.lldi.nchan;
ep->rss_qid = cdev->rdev.lldi.rxq_ids[
-- ---------- cxgb4_port_idx(n->dev) * step];
++ ++++++++++ cxgb4_port_idx(pdev) * step];
if (clear_mpa_v1) {
ep->retry_with_mpa_v1 = 0;
struct sockaddr_in6 *ra6;
ep = lookup_atid(t, atid);
---- -------- la = (struct sockaddr_in *)&ep->com.local_addr;
---- -------- ra = (struct sockaddr_in *)&ep->com.remote_addr;
---- -------- la6 = (struct sockaddr_in6 *)&ep->com.local_addr;
---- -------- ra6 = (struct sockaddr_in6 *)&ep->com.remote_addr;
++++ ++++++++ la = (struct sockaddr_in *)&ep->com.mapped_local_addr;
++++ ++++++++ ra = (struct sockaddr_in *)&ep->com.mapped_remote_addr;
++++ ++++++++ la6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr;
++++ ++++++++ ra6 = (struct sockaddr_in6 *)&ep->com.mapped_remote_addr;
PDBG("%s ep %p atid %u status %u errno %d\n", __func__, ep, atid,
status, status2errno(status));
struct c4iw_dev *dev = to_c4iw_dev(cm_id->device);
struct c4iw_ep *ep;
int err = 0;
---- -------- struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr;
---- -------- struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr;
---- -------- struct sockaddr_in6 *laddr6 = (struct sockaddr_in6 *)&cm_id->local_addr;
---- -------- struct sockaddr_in6 *raddr6 = (struct sockaddr_in6 *)
---- -------- &cm_id->remote_addr;
++++ ++++++++ struct sockaddr_in *laddr;
++++ ++++++++ struct sockaddr_in *raddr;
++++ ++++++++ struct sockaddr_in6 *laddr6;
++++ ++++++++ struct sockaddr_in6 *raddr6;
++++ ++++++++ struct iwpm_dev_data pm_reg_msg;
++++ ++++++++ struct iwpm_sa_data pm_msg;
__u8 *ra;
int iptype;
++++ ++++++++ int iwpm_err = 0;
if ((conn_param->ord > c4iw_max_read_depth) ||
(conn_param->ird > c4iw_max_read_depth)) {
if (!ep->com.qp) {
PDBG("%s qpn 0x%x not found!\n", __func__, conn_param->qpn);
err = -EINVAL;
---- -------- goto fail2;
++++ ++++++++ goto fail1;
}
ref_qp(ep);
PDBG("%s qpn 0x%x qp %p cm_id %p\n", __func__, conn_param->qpn,
if (ep->atid == -1) {
printk(KERN_ERR MOD "%s - cannot alloc atid.\n", __func__);
err = -ENOMEM;
---- -------- goto fail2;
++++ ++++++++ goto fail1;
}
insert_handle(dev, &dev->atid_idr, ep, ep->atid);
++++ ++++++++ memcpy(&ep->com.local_addr, &cm_id->local_addr,
++++ ++++++++ sizeof(ep->com.local_addr));
++++ ++++++++ memcpy(&ep->com.remote_addr, &cm_id->remote_addr,
++++ ++++++++ sizeof(ep->com.remote_addr));
++++ ++++++++
++++ ++++++++ /* No port mapper available, go with the specified peer information */
++++ ++++++++ memcpy(&ep->com.mapped_local_addr, &cm_id->local_addr,
++++ ++++++++ sizeof(ep->com.mapped_local_addr));
++++ ++++++++ memcpy(&ep->com.mapped_remote_addr, &cm_id->remote_addr,
++++ ++++++++ sizeof(ep->com.mapped_remote_addr));
++++ ++++++++
++++ ++++++++ c4iw_form_reg_msg(dev, &pm_reg_msg);
++++ ++++++++ iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_C4IW);
++++ ++++++++ if (iwpm_err) {
++++ ++++++++ PDBG("%s: Port Mapper reg pid fail (err = %d).\n",
++++ ++++++++ __func__, iwpm_err);
++++ ++++++++ }
++++ ++++++++ if (iwpm_valid_pid() && !iwpm_err) {
++++ ++++++++ c4iw_form_pm_msg(ep, &pm_msg);
++++ ++++++++ iwpm_err = iwpm_add_and_query_mapping(&pm_msg, RDMA_NL_C4IW);
++++ ++++++++ if (iwpm_err)
++++ ++++++++ PDBG("%s: Port Mapper query fail (err = %d).\n",
++++ ++++++++ __func__, iwpm_err);
++++ ++++++++ else
++++ ++++++++ c4iw_record_pm_msg(ep, &pm_msg);
++++ ++++++++ }
++++ ++++++++ if (iwpm_create_mapinfo(&ep->com.local_addr,
++++ ++++++++ &ep->com.mapped_local_addr, RDMA_NL_C4IW)) {
++++ ++++++++ iwpm_remove_mapping(&ep->com.local_addr, RDMA_NL_C4IW);
++++ ++++++++ err = -ENOMEM;
++++ ++++++++ goto fail1;
++++ ++++++++ }
++++ ++++++++ print_addr(&ep->com, __func__, "add_query/create_mapinfo");
++++ ++++++++ set_bit(RELEASE_MAPINFO, &ep->com.flags);
++++ ++++++++
++++ ++++++++ laddr = (struct sockaddr_in *)&ep->com.mapped_local_addr;
++++ ++++++++ raddr = (struct sockaddr_in *)&ep->com.mapped_remote_addr;
++++ ++++++++ laddr6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr;
++++ ++++++++ raddr6 = (struct sockaddr_in6 *) &ep->com.mapped_remote_addr;
++++ ++++++++
if (cm_id->remote_addr.ss_family == AF_INET) {
iptype = 4;
ra = (__u8 *)&raddr->sin_addr;
if ((__force int)raddr->sin_addr.s_addr == INADDR_ANY) {
err = pick_local_ipaddrs(dev, cm_id);
if (err)
---- -------- goto fail2;
++++ ++++++++ goto fail1;
}
/* find a route */
if (ipv6_addr_type(&raddr6->sin6_addr) == IPV6_ADDR_ANY) {
err = pick_local_ip6addrs(dev, cm_id);
if (err)
---- -------- goto fail2;
++++ ++++++++ goto fail1;
}
/* find a route */
if (!ep->dst) {
printk(KERN_ERR MOD "%s - cannot find route.\n", __func__);
err = -EHOSTUNREACH;
---- -------- goto fail3;
++++ ++++++++ goto fail2;
}
err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, true);
if (err) {
printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);
---- -------- goto fail4;
++++ ++++++++ goto fail3;
}
PDBG("%s txq_idx %u tx_chan %u smac_idx %u rss_qid %u l2t_idx %u\n",
state_set(&ep->com, CONNECTING);
ep->tos = 0;
---- -------- memcpy(&ep->com.local_addr, &cm_id->local_addr,
---- -------- sizeof(ep->com.local_addr));
---- -------- memcpy(&ep->com.remote_addr, &cm_id->remote_addr,
---- -------- sizeof(ep->com.remote_addr));
/* send connect request to rnic */
err = send_connect(ep);
goto out;
cxgb4_l2t_release(ep->l2t);
---- --------fail4:
---- -------- dst_release(ep->dst);
fail3:
++++ ++++++++ dst_release(ep->dst);
++++ ++++++++fail2:
remove_handle(ep->com.dev, &ep->com.dev->atid_idr, ep->atid);
cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid);
---- --------fail2:
++++ ++++++++fail1:
cm_id->rem_ref(cm_id);
c4iw_put_ep(&ep->com);
out:
static int create_server6(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)
{
int err;
---- -------- struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&ep->com.local_addr;
++++ ++++++++ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)
++++ ++++++++ &ep->com.mapped_local_addr;
c4iw_init_wr_wait(&ep->com.wr_wait);
err = cxgb4_create_server6(ep->com.dev->rdev.lldi.ports[0],
static int create_server4(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)
{
int err;
---- -------- struct sockaddr_in *sin = (struct sockaddr_in *)&ep->com.local_addr;
++++ ++++++++ struct sockaddr_in *sin = (struct sockaddr_in *)
++++ ++++++++ &ep->com.mapped_local_addr;
if (dev->rdev.lldi.enable_fw_ofld_conn) {
do {
int err = 0;
struct c4iw_dev *dev = to_c4iw_dev(cm_id->device);
struct c4iw_listen_ep *ep;
++++ ++++++++ struct iwpm_dev_data pm_reg_msg;
++++ ++++++++ struct iwpm_sa_data pm_msg;
++++ ++++++++ int iwpm_err = 0;
might_sleep();
goto fail2;
}
insert_handle(dev, &dev->stid_idr, ep, ep->stid);
++++ ++++++++
++++ ++++++++ /* No port mapper available, go with the specified info */
++++ ++++++++ memcpy(&ep->com.mapped_local_addr, &cm_id->local_addr,
++++ ++++++++ sizeof(ep->com.mapped_local_addr));
++++ ++++++++
++++ ++++++++ c4iw_form_reg_msg(dev, &pm_reg_msg);
++++ ++++++++ iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_C4IW);
++++ ++++++++ if (iwpm_err) {
++++ ++++++++ PDBG("%s: Port Mapper reg pid fail (err = %d).\n",
++++ ++++++++ __func__, iwpm_err);
++++ ++++++++ }
++++ ++++++++ if (iwpm_valid_pid() && !iwpm_err) {
++++ ++++++++ memcpy(&pm_msg.loc_addr, &ep->com.local_addr,
++++ ++++++++ sizeof(ep->com.local_addr));
++++ ++++++++ iwpm_err = iwpm_add_mapping(&pm_msg, RDMA_NL_C4IW);
++++ ++++++++ if (iwpm_err)
++++ ++++++++ PDBG("%s: Port Mapper query fail (err = %d).\n",
++++ ++++++++ __func__, iwpm_err);
++++ ++++++++ else
++++ ++++++++ memcpy(&ep->com.mapped_local_addr,
++++ ++++++++ &pm_msg.mapped_loc_addr,
++++ ++++++++ sizeof(ep->com.mapped_local_addr));
++++ ++++++++ }
++++ ++++++++ if (iwpm_create_mapinfo(&ep->com.local_addr,
++++ ++++++++ &ep->com.mapped_local_addr, RDMA_NL_C4IW)) {
++++ ++++++++ err = -ENOMEM;
++++ ++++++++ goto fail3;
++++ ++++++++ }
++++ ++++++++ print_addr(&ep->com, __func__, "add_mapping/create_mapinfo");
++++ ++++++++
++++ ++++++++ set_bit(RELEASE_MAPINFO, &ep->com.flags);
state_set(&ep->com, LISTEN);
if (ep->com.local_addr.ss_family == AF_INET)
err = create_server4(dev, ep);
cm_id->provider_data = ep;
goto out;
}
++++ ++++++++
++++ ++++++++fail3:
cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid,
ep->com.local_addr.ss_family);
fail2:
int pos;
};
++++ ++++++++/* registered cxgb4 netlink callbacks */
++++ ++++++++static struct ibnl_client_cbs c4iw_nl_cb_table[] = {
++++ ++++++++ [RDMA_NL_IWPM_REG_PID] = {.dump = iwpm_register_pid_cb},
++++ ++++++++ [RDMA_NL_IWPM_ADD_MAPPING] = {.dump = iwpm_add_mapping_cb},
++++ ++++++++ [RDMA_NL_IWPM_QUERY_MAPPING] = {.dump = iwpm_add_and_query_mapping_cb},
++++ ++++++++ [RDMA_NL_IWPM_HANDLE_ERR] = {.dump = iwpm_mapping_error_cb},
++++ ++++++++ [RDMA_NL_IWPM_MAPINFO] = {.dump = iwpm_mapping_info_cb},
++++ ++++++++ [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb}
++++ ++++++++};
++++ ++++++++
static int count_idrs(int id, void *p, void *data)
{
int *countp = data;
&qp->ep->com.local_addr;
struct sockaddr_in *rsin = (struct sockaddr_in *)
&qp->ep->com.remote_addr;
++++ ++++++++ struct sockaddr_in *mapped_lsin = (struct sockaddr_in *)
++++ ++++++++ &qp->ep->com.mapped_local_addr;
++++ ++++++++ struct sockaddr_in *mapped_rsin = (struct sockaddr_in *)
++++ ++++++++ &qp->ep->com.mapped_remote_addr;
cc = snprintf(qpd->buf + qpd->pos, space,
"rc qp sq id %u rq id %u state %u "
"onchip %u ep tid %u state %u "
---- -------- "%pI4:%u->%pI4:%u\n",
++++ ++++++++ "%pI4:%u/%u->%pI4:%u/%u\n",
qp->wq.sq.qid, qp->wq.rq.qid,
(int)qp->attr.state,
qp->wq.sq.flags & T4_SQ_ONCHIP,
qp->ep->hwtid, (int)qp->ep->com.state,
&lsin->sin_addr, ntohs(lsin->sin_port),
---- -------- &rsin->sin_addr, ntohs(rsin->sin_port));
++++ ++++++++ ntohs(mapped_lsin->sin_port),
++++ ++++++++ &rsin->sin_addr, ntohs(rsin->sin_port),
++++ ++++++++ ntohs(mapped_rsin->sin_port));
} else {
struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *)
&qp->ep->com.local_addr;
struct sockaddr_in6 *rsin6 = (struct sockaddr_in6 *)
&qp->ep->com.remote_addr;
++++ ++++++++ struct sockaddr_in6 *mapped_lsin6 =
++++ ++++++++ (struct sockaddr_in6 *)
++++ ++++++++ &qp->ep->com.mapped_local_addr;
++++ ++++++++ struct sockaddr_in6 *mapped_rsin6 =
++++ ++++++++ (struct sockaddr_in6 *)
++++ ++++++++ &qp->ep->com.mapped_remote_addr;
cc = snprintf(qpd->buf + qpd->pos, space,
"rc qp sq id %u rq id %u state %u "
"onchip %u ep tid %u state %u "
---- -------- "%pI6:%u->%pI6:%u\n",
++++ ++++++++ "%pI6:%u/%u->%pI6:%u/%u\n",
qp->wq.sq.qid, qp->wq.rq.qid,
(int)qp->attr.state,
qp->wq.sq.flags & T4_SQ_ONCHIP,
qp->ep->hwtid, (int)qp->ep->com.state,
&lsin6->sin6_addr,
ntohs(lsin6->sin6_port),
++++ ++++++++ ntohs(mapped_lsin6->sin6_port),
&rsin6->sin6_addr,
---- -------- ntohs(rsin6->sin6_port));
++++ ++++++++ ntohs(rsin6->sin6_port),
++++ ++++++++ ntohs(mapped_rsin6->sin6_port));
}
} else
cc = snprintf(qpd->buf + qpd->pos, space,
&ep->com.local_addr;
struct sockaddr_in *rsin = (struct sockaddr_in *)
&ep->com.remote_addr;
++++ ++++++++ struct sockaddr_in *mapped_lsin = (struct sockaddr_in *)
++++ ++++++++ &ep->com.mapped_local_addr;
++++ ++++++++ struct sockaddr_in *mapped_rsin = (struct sockaddr_in *)
++++ ++++++++ &ep->com.mapped_remote_addr;
cc = snprintf(epd->buf + epd->pos, space,
"ep %p cm_id %p qp %p state %d flags 0x%lx "
"history 0x%lx hwtid %d atid %d "
---- -------- "%pI4:%d <-> %pI4:%d\n",
++++ ++++++++ "%pI4:%d/%d <-> %pI4:%d/%d\n",
ep, ep->com.cm_id, ep->com.qp,
(int)ep->com.state, ep->com.flags,
ep->com.history, ep->hwtid, ep->atid,
&lsin->sin_addr, ntohs(lsin->sin_port),
---- -------- &rsin->sin_addr, ntohs(rsin->sin_port));
++++ ++++++++ ntohs(mapped_lsin->sin_port),
++++ ++++++++ &rsin->sin_addr, ntohs(rsin->sin_port),
++++ ++++++++ ntohs(mapped_rsin->sin_port));
} else {
struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *)
&ep->com.local_addr;
struct sockaddr_in6 *rsin6 = (struct sockaddr_in6 *)
&ep->com.remote_addr;
++++ ++++++++ struct sockaddr_in6 *mapped_lsin6 = (struct sockaddr_in6 *)
++++ ++++++++ &ep->com.mapped_local_addr;
++++ ++++++++ struct sockaddr_in6 *mapped_rsin6 = (struct sockaddr_in6 *)
++++ ++++++++ &ep->com.mapped_remote_addr;
cc = snprintf(epd->buf + epd->pos, space,
"ep %p cm_id %p qp %p state %d flags 0x%lx "
"history 0x%lx hwtid %d atid %d "
---- -------- "%pI6:%d <-> %pI6:%d\n",
++++ ++++++++ "%pI6:%d/%d <-> %pI6:%d/%d\n",
ep, ep->com.cm_id, ep->com.qp,
(int)ep->com.state, ep->com.flags,
ep->com.history, ep->hwtid, ep->atid,
&lsin6->sin6_addr, ntohs(lsin6->sin6_port),
---- -------- &rsin6->sin6_addr, ntohs(rsin6->sin6_port));
++++ ++++++++ ntohs(mapped_lsin6->sin6_port),
++++ ++++++++ &rsin6->sin6_addr, ntohs(rsin6->sin6_port),
++++ ++++++++ ntohs(mapped_rsin6->sin6_port));
}
if (cc < space)
epd->pos += cc;
if (ep->com.local_addr.ss_family == AF_INET) {
struct sockaddr_in *lsin = (struct sockaddr_in *)
&ep->com.local_addr;
++++ ++++++++ struct sockaddr_in *mapped_lsin = (struct sockaddr_in *)
++++ ++++++++ &ep->com.mapped_local_addr;
cc = snprintf(epd->buf + epd->pos, space,
"ep %p cm_id %p state %d flags 0x%lx stid %d "
---- -------- "backlog %d %pI4:%d\n",
++++ ++++++++ "backlog %d %pI4:%d/%d\n",
ep, ep->com.cm_id, (int)ep->com.state,
ep->com.flags, ep->stid, ep->backlog,
---- -------- &lsin->sin_addr, ntohs(lsin->sin_port));
++++ ++++++++ &lsin->sin_addr, ntohs(lsin->sin_port),
++++ ++++++++ ntohs(mapped_lsin->sin_port));
} else {
struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *)
&ep->com.local_addr;
++++ ++++++++ struct sockaddr_in6 *mapped_lsin6 = (struct sockaddr_in6 *)
++++ ++++++++ &ep->com.mapped_local_addr;
cc = snprintf(epd->buf + epd->pos, space,
"ep %p cm_id %p state %d flags 0x%lx stid %d "
---- -------- "backlog %d %pI6:%d\n",
++++ ++++++++ "backlog %d %pI6:%d/%d\n",
ep, ep->com.cm_id, (int)ep->com.state,
ep->com.flags, ep->stid, ep->backlog,
---- -------- &lsin6->sin6_addr, ntohs(lsin6->sin6_port));
++++ ++++++++ &lsin6->sin6_addr, ntohs(lsin6->sin6_port),
++++ ++++++++ ntohs(mapped_lsin6->sin6_port));
}
if (cc < space)
epd->pos += cc;
if (ctx->dev->rdev.oc_mw_kva)
iounmap(ctx->dev->rdev.oc_mw_kva);
ib_dealloc_device(&ctx->dev->ibdev);
++++ ++++++++ iwpm_exit(RDMA_NL_C4IW);
ctx->dev = NULL;
}
pci_resource_len(devp->rdev.lldi.pdev, 2));
if (!devp->rdev.bar2_kva) {
pr_err(MOD "Unable to ioremap BAR2\n");
++ ++++++++++ ib_dealloc_device(&devp->ibdev);
return ERR_PTR(-EINVAL);
}
} else if (ocqp_supported(infop)) {
devp->rdev.lldi.vr->ocq.size);
if (!devp->rdev.oc_mw_kva) {
pr_err(MOD "Unable to ioremap onchip mem\n");
++ ++++++++++ ib_dealloc_device(&devp->ibdev);
return ERR_PTR(-EINVAL);
}
}
c4iw_debugfs_root);
setup_debugfs(devp);
}
++++ ++++++++
++++ ++++++++ ret = iwpm_init(RDMA_NL_C4IW);
++++ ++++++++ if (ret) {
++++ ++++++++ pr_err("port mapper initialization failed with %d\n", ret);
++++ ++++++++ ib_dealloc_device(&devp->ibdev);
++++ ++++++++ return ERR_PTR(ret);
++++ ++++++++ }
++++ ++++++++
return devp;
}
printk(KERN_WARNING MOD
"could not create debugfs entry, continuing\n");
++++ ++++++++ if (ibnl_add_client(RDMA_NL_C4IW, RDMA_NL_IWPM_NUM_OPS,
++++ ++++++++ c4iw_nl_cb_table))
++++ ++++++++ pr_err("%s[%u]: Failed to add netlink callback\n"
++++ ++++++++ , __func__, __LINE__);
++++ ++++++++
cxgb4_register_uld(CXGB4_ULD_RDMA, &c4iw_uld_info);
return 0;
}
mutex_unlock(&dev_mutex);
cxgb4_unregister_uld(CXGB4_ULD_RDMA);
++++ ++++++++ ibnl_remove_client(RDMA_NL_C4IW);
c4iw_cm_term();
debugfs_remove_recursive(c4iw_debugfs_root);
}
return !attr->srq;
}
++++++ ++++++static int qp0_enabled_vf(struct mlx4_dev *dev, int qpn)
++++++ ++++++{
++++++ ++++++ int i;
++++++ ++++++ for (i = 0; i < dev->caps.num_ports; i++) {
++++++ ++++++ if (qpn == dev->caps.qp0_proxy[i])
++++++ ++++++ return !!dev->caps.qp0_qkey[i];
++++++ ++++++ }
++++++ ++++++ return 0;
++++++ ++++++}
++++++ ++++++
static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
struct ib_qp_init_attr *init_attr,
-------- ---- struct ib_udata *udata, int sqpn, struct mlx4_ib_qp **caller_qp)
++++++++ ++++ struct ib_udata *udata, int sqpn, struct mlx4_ib_qp **caller_qp,
++++++++ ++++ gfp_t gfp)
{
int qpn;
int err;
!(init_attr->create_flags & MLX4_IB_SRIOV_SQP))) {
if (init_attr->qp_type == IB_QPT_GSI)
qp_type = MLX4_IB_QPT_PROXY_GSI;
------ ------ else if (mlx4_is_master(dev->dev))
------ ------ qp_type = MLX4_IB_QPT_PROXY_SMI_OWNER;
------ ------ else
------ ------ qp_type = MLX4_IB_QPT_PROXY_SMI;
++++++ ++++++ else {
++++++ ++++++ if (mlx4_is_master(dev->dev) ||
++++++ ++++++ qp0_enabled_vf(dev->dev, sqpn))
++++++ ++++++ qp_type = MLX4_IB_QPT_PROXY_SMI_OWNER;
++++++ ++++++ else
++++++ ++++++ qp_type = MLX4_IB_QPT_PROXY_SMI;
++++++ ++++++ }
}
qpn = sqpn;
/* add extra sg entry for tunneling */
return -EINVAL;
if (tnl_init->proxy_qp_type == IB_QPT_GSI)
qp_type = MLX4_IB_QPT_TUN_GSI;
------ ------ else if (tnl_init->slave == mlx4_master_func_num(dev->dev))
++++++ ++++++ else if (tnl_init->slave == mlx4_master_func_num(dev->dev) ||
++++++ ++++++ mlx4_vf_smi_enabled(dev->dev, tnl_init->slave,
++++++ ++++++ tnl_init->port))
qp_type = MLX4_IB_QPT_TUN_SMI_OWNER;
else
qp_type = MLX4_IB_QPT_TUN_SMI;
if (qp_type == MLX4_IB_QPT_SMI || qp_type == MLX4_IB_QPT_GSI ||
(qp_type & (MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_SMI_OWNER |
MLX4_IB_QPT_PROXY_GSI | MLX4_IB_QPT_TUN_SMI_OWNER))) {
-------- ---- sqp = kzalloc(sizeof (struct mlx4_ib_sqp), GFP_KERNEL);
++++++++ ++++ sqp = kzalloc(sizeof (struct mlx4_ib_sqp), gfp);
if (!sqp)
return -ENOMEM;
qp = &sqp->qp;
qp->pri.vid = 0xFFFF;
qp->alt.vid = 0xFFFF;
} else {
-------- ---- qp = kzalloc(sizeof (struct mlx4_ib_qp), GFP_KERNEL);
++++++++ ++++ qp = kzalloc(sizeof (struct mlx4_ib_qp), gfp);
if (!qp)
return -ENOMEM;
qp->pri.vid = 0xFFFF;
goto err;
if (qp_has_rq(init_attr)) {
-------- ---- err = mlx4_db_alloc(dev->dev, &qp->db, 0);
++++++++ ++++ err = mlx4_db_alloc(dev->dev, &qp->db, 0, gfp);
if (err)
goto err;
*qp->db.db = 0;
}
-------- ---- if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, &qp->buf)) {
++++++++ ++++ if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, &qp->buf, gfp)) {
err = -ENOMEM;
goto err_db;
}
if (err)
goto err_buf;
-------- ---- err = mlx4_buf_write_mtt(dev->dev, &qp->mtt, &qp->buf);
++++++++ ++++ err = mlx4_buf_write_mtt(dev->dev, &qp->mtt, &qp->buf, gfp);
if (err)
goto err_mtt;
-------- ---- qp->sq.wrid = kmalloc(qp->sq.wqe_cnt * sizeof (u64), GFP_KERNEL);
-------- ---- qp->rq.wrid = kmalloc(qp->rq.wqe_cnt * sizeof (u64), GFP_KERNEL);
-------- ----
++++++++ ++++ qp->sq.wrid = kmalloc(qp->sq.wqe_cnt * sizeof (u64), gfp);
++++++++ ++++ qp->rq.wrid = kmalloc(qp->rq.wqe_cnt * sizeof (u64), gfp);
if (!qp->sq.wrid || !qp->rq.wrid) {
err = -ENOMEM;
goto err_wrid;
goto err_proxy;
}
-------- ---- err = mlx4_qp_alloc(dev->dev, qpn, &qp->mqp);
++++++++ ++++ err = mlx4_qp_alloc(dev->dev, qpn, &qp->mqp, gfp);
if (err)
goto err_qpn;
struct mlx4_ib_qp *qp = NULL;
int err;
u16 xrcdn = 0;
++++++++ ++++ gfp_t gfp;
++++++++ ++++ gfp = (init_attr->create_flags & MLX4_IB_QP_CREATE_USE_GFP_NOIO) ?
++++++++ ++++ GFP_NOIO : GFP_KERNEL;
/*
* We only support LSO, vendor flag1, and multicast loopback blocking,
* and only for kernel UD QPs.
MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK |
MLX4_IB_SRIOV_TUNNEL_QP |
MLX4_IB_SRIOV_SQP |
-------- ---- MLX4_IB_QP_NETIF))
++++++++ ++++ MLX4_IB_QP_NETIF |
++++++++ ++++ MLX4_IB_QP_CREATE_USE_GFP_NOIO))
return ERR_PTR(-EINVAL);
if (init_attr->create_flags & IB_QP_CREATE_NETIF_QP) {
if (init_attr->create_flags &&
(udata ||
-------- ---- ((init_attr->create_flags & ~MLX4_IB_SRIOV_SQP) &&
++++++++ ++++ ((init_attr->create_flags & ~(MLX4_IB_SRIOV_SQP | MLX4_IB_QP_CREATE_USE_GFP_NOIO)) &&
init_attr->qp_type != IB_QPT_UD) ||
((init_attr->create_flags & MLX4_IB_SRIOV_SQP) &&
init_attr->qp_type > IB_QPT_GSI)))
case IB_QPT_RC:
case IB_QPT_UC:
case IB_QPT_RAW_PACKET:
-------- ---- qp = kzalloc(sizeof *qp, GFP_KERNEL);
++++++++ ++++ qp = kzalloc(sizeof *qp, gfp);
if (!qp)
return ERR_PTR(-ENOMEM);
qp->pri.vid = 0xFFFF;
case IB_QPT_UD:
{
err = create_qp_common(to_mdev(pd->device), pd, init_attr,
-------- ---- udata, 0, &qp);
++++++++ ++++ udata, 0, &qp, gfp);
if (err)
return ERR_PTR(err);
err = create_qp_common(to_mdev(pd->device), pd, init_attr, udata,
get_sqp_num(to_mdev(pd->device), init_attr),
-------- ---- &qp);
++++++++ ++++ &qp, gfp);
if (err)
return ERR_PTR(err);
return err;
}
++++++ ++++++static int vf_get_qp0_qkey(struct mlx4_dev *dev, int qpn, u32 *qkey)
++++++ ++++++{
++++++ ++++++ int i;
++++++ ++++++ for (i = 0; i < dev->caps.num_ports; i++) {
++++++ ++++++ if (qpn == dev->caps.qp0_proxy[i] ||
++++++ ++++++ qpn == dev->caps.qp0_tunnel[i]) {
++++++ ++++++ *qkey = dev->caps.qp0_qkey[i];
++++++ ++++++ return 0;
++++++ ++++++ }
++++++ ++++++ }
++++++ ++++++ return -EINVAL;
++++++ ++++++}
++++++ ++++++
static int build_sriov_qp0_header(struct mlx4_ib_sqp *sqp,
struct ib_send_wr *wr,
void *wqe, unsigned *mlx_seg_len)
cpu_to_be32(mdev->dev->caps.qp0_tunnel[sqp->qp.port - 1]);
sqp->ud_header.bth.psn = cpu_to_be32((sqp->send_psn++) & ((1 << 24) - 1));
------ ------ if (mlx4_get_parav_qkey(mdev->dev, sqp->qp.mqp.qpn, &qkey))
------ ------ return -EINVAL;
++++++ ++++++ if (mlx4_is_master(mdev->dev)) {
++++++ ++++++ if (mlx4_get_parav_qkey(mdev->dev, sqp->qp.mqp.qpn, &qkey))
++++++ ++++++ return -EINVAL;
++++++ ++++++ } else {
++++++ ++++++ if (vf_get_qp0_qkey(mdev->dev, sqp->qp.mqp.qpn, &qkey))
++++++ ++++++ return -EINVAL;
++++++ ++++++ }
sqp->ud_header.deth.qkey = cpu_to_be32(qkey);
sqp->ud_header.deth.source_qpn = cpu_to_be32(sqp->qp.mqp.qpn);
static void set_tunnel_datagram_seg(struct mlx4_ib_dev *dev,
struct mlx4_wqe_datagram_seg *dseg,
------ ------ struct ib_send_wr *wr, enum ib_qp_type qpt)
++++++ ++++++ struct ib_send_wr *wr,
++++++ ++++++ enum mlx4_ib_qp_type qpt)
{
union mlx4_ext_av *av = &to_mah(wr->wr.ud.ah)->av;
struct mlx4_av sqp_av = {0};
cpu_to_be32(0xf0000000);
memcpy(dseg->av, &sqp_av, sizeof (struct mlx4_av));
------ ------ /* This function used only for sending on QP1 proxies */
------ ------ dseg->dqpn = cpu_to_be32(dev->dev->caps.qp1_tunnel[port - 1]);
++++++ ++++++ if (qpt == MLX4_IB_QPT_PROXY_GSI)
++++++ ++++++ dseg->dqpn = cpu_to_be32(dev->dev->caps.qp1_tunnel[port - 1]);
++++++ ++++++ else
++++++ ++++++ dseg->dqpn = cpu_to_be32(dev->dev->caps.qp0_tunnel[port - 1]);
/* Use QKEY from the QP context, which is set by master */
dseg->qkey = cpu_to_be32(IB_QP_SET_QKEY);
}
break;
case MLX4_IB_QPT_PROXY_SMI_OWNER:
------ ------ if (unlikely(!mlx4_is_master(to_mdev(ibqp->device)->dev))) {
------ ------ err = -ENOSYS;
------ ------ *bad_wr = wr;
------ ------ goto out;
------ ------ }
err = build_sriov_qp0_header(to_msqp(qp), wr, ctrl, &seglen);
if (unlikely(err)) {
*bad_wr = wr;
size += seglen / 16;
break;
case MLX4_IB_QPT_PROXY_SMI:
------ ------ /* don't allow QP0 sends on guests */
------ ------ err = -ENOSYS;
------ ------ *bad_wr = wr;
------ ------ goto out;
case MLX4_IB_QPT_PROXY_GSI:
/* If we are tunneling special qps, this is a UD qp.
* In this case we first add a UD segment targeting
* the tunnel qp, and then add a header with address
* information */
------ ------ set_tunnel_datagram_seg(to_mdev(ibqp->device), wqe, wr, ibqp->qp_type);
++++++ ++++++ set_tunnel_datagram_seg(to_mdev(ibqp->device), wqe, wr,
++++++ ++++++ qp->mlx4_ib_qp_type);
wqe += sizeof (struct mlx4_wqe_datagram_seg);
size += sizeof (struct mlx4_wqe_datagram_seg) / 16;
build_tunnel_header(wr, wqe, &seglen);
MLX4_COMM_CMD_FLR = 254
};
++++++ ++++++enum {
++++++ ++++++ MLX4_VF_SMI_DISABLED,
++++++ ++++++ MLX4_VF_SMI_ENABLED
++++++ ++++++};
++++++ ++++++
/*The flag indicates that the slave should delay the RESET cmd*/
#define MLX4_DELAY_RESET_SLAVE 0xbbbbbbb
/*indicates how many retries will be done if we are in the middle of FLR*/
struct mlx4_vf_admin_state {
struct mlx4_vport_state vport[MLX4_MAX_PORTS + 1];
++++++ ++++++ u8 enable_smi[MLX4_MAX_PORTS + 1];
};
struct mlx4_vport_oper_state {
int mac_idx;
int vlan_idx;
};
++++++ ++++++
struct mlx4_vf_oper_state {
struct mlx4_vport_oper_state vport[MLX4_MAX_PORTS + 1];
++++++ ++++++ u8 smi_enabled[MLX4_MAX_PORTS + 1];
};
struct slave_list {
void mlx4_cleanup_qp_table(struct mlx4_dev *dev);
void mlx4_cleanup_srq_table(struct mlx4_dev *dev);
void mlx4_cleanup_mcg_table(struct mlx4_dev *dev);
-------- ----int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn);
++++++++ ++++int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn, gfp_t gfp);
void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn);
int __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn);
void __mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn);
void __mlx4_srq_free_icm(struct mlx4_dev *dev, int srqn);
int __mlx4_mpt_reserve(struct mlx4_dev *dev);
void __mlx4_mpt_release(struct mlx4_dev *dev, u32 index);
-------- ----int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index);
++++++++ ++++int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index, gfp_t gfp);
void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index);
u32 __mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order);
void __mlx4_free_mtt_range(struct mlx4_dev *dev, u32 first_seg, int order);
return err;
if (!fw_reserved(dev, qpn)) {
-------- ---- err = __mlx4_qp_alloc_icm(dev, qpn);
++++++++ ++++ err = __mlx4_qp_alloc_icm(dev, qpn, GFP_KERNEL);
if (err) {
res_abort_move(dev, slave, RES_QP, qpn);
return err;
if (err)
return err;
-------- ---- err = __mlx4_mpt_alloc_icm(dev, mpt->key);
++++++++ ++++ err = __mlx4_mpt_alloc_icm(dev, mpt->key, GFP_KERNEL);
if (err) {
res_abort_move(dev, slave, RES_MPT, id);
return err;
}
static int verify_qp_parameters(struct mlx4_dev *dev,
++++++ ++++++ struct mlx4_vhcr *vhcr,
struct mlx4_cmd_mailbox *inbox,
enum qp_transition transition, u8 slave)
{
u32 qp_type;
++++++ ++++++ u32 qpn;
struct mlx4_qp_context *qp_ctx;
enum mlx4_qp_optpar optpar;
int port;
default:
break;
}
++++++ ++++++ break;
++++++ ++++++ case MLX4_QP_ST_MLX:
++++++ ++++++ qpn = vhcr->in_modifier & 0x7fffff;
++++++ ++++++ port = (qp_ctx->pri_path.sched_queue >> 6 & 1) + 1;
++++++ ++++++ if (transition == QP_TRANS_INIT2RTR &&
++++++ ++++++ slave != mlx4_master_func_num(dev) &&
++++++ ++++++ mlx4_is_qp_reserved(dev, qpn) &&
++++++ ++++++ !mlx4_vf_smi_enabled(dev, slave, port)) {
++++++ ++++++ /* only enabled VFs may create MLX proxy QPs */
++++++ ++++++ mlx4_err(dev, "%s: unprivileged slave %d attempting to create an MLX proxy special QP on port %d\n",
++++++ ++++++ __func__, slave, port);
++++++ ++++++ return -EPERM;
++++++ ++++++ }
break;
++++++ ++++++
default:
break;
}
err = adjust_qp_sched_queue(dev, slave, qpc, inbox);
if (err)
return err;
------ ------ err = verify_qp_parameters(dev, inbox, QP_TRANS_INIT2RTR, slave);
++++++ ++++++ err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_INIT2RTR, slave);
if (err)
return err;
err = adjust_qp_sched_queue(dev, slave, context, inbox);
if (err)
return err;
------ ------ err = verify_qp_parameters(dev, inbox, QP_TRANS_RTR2RTS, slave);
++++++ ++++++ err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTR2RTS, slave);
if (err)
return err;
err = adjust_qp_sched_queue(dev, slave, context, inbox);
if (err)
return err;
------ ------ err = verify_qp_parameters(dev, inbox, QP_TRANS_RTS2RTS, slave);
++++++ ++++++ err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTS2RTS, slave);
if (err)
return err;
err = adjust_qp_sched_queue(dev, slave, context, inbox);
if (err)
return err;
------ ------ err = verify_qp_parameters(dev, inbox, QP_TRANS_SQD2SQD, slave);
++++++ ++++++ err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2SQD, slave);
if (err)
return err;
err = adjust_qp_sched_queue(dev, slave, context, inbox);
if (err)
return err;
------ ------ err = verify_qp_parameters(dev, inbox, QP_TRANS_SQD2RTS, slave);
++++++ ++++++ err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2RTS, slave);
if (err)
return err;
int max_rq_desc_sz;
int max_qp_init_rdma;
int max_qp_dest_rdma;
++++++ ++++++ u32 *qp0_qkey;
u32 *qp0_proxy;
u32 *qp1_proxy;
u32 *qp0_tunnel;
}
int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct,
-------- ---- struct mlx4_buf *buf);
++++++++ ++++ struct mlx4_buf *buf, gfp_t gfp);
void mlx4_buf_free(struct mlx4_dev *dev, int size, struct mlx4_buf *buf);
static inline void *mlx4_buf_offset(struct mlx4_buf *buf, int offset)
{
int mlx4_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
int start_index, int npages, u64 *page_list);
int mlx4_buf_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
-------- ---- struct mlx4_buf *buf);
++++++++ ++++ struct mlx4_buf *buf, gfp_t gfp);
-------- ----int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order);
++++++++ ++++int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order,
++++++++ ++++ gfp_t gfp);
void mlx4_db_free(struct mlx4_dev *dev, struct mlx4_db *db);
int mlx4_alloc_hwq_res(struct mlx4_dev *dev, struct mlx4_hwq_resources *wqres,
int mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align, int *base);
void mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt);
-------- ----int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp);
++++++++ ++++int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp,
++++++++ ++++ gfp_t gfp);
void mlx4_qp_free(struct mlx4_dev *dev, struct mlx4_qp *qp);
int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcdn,
int mlx4_get_base_gid_ix(struct mlx4_dev *dev, int slave, int port);
int mlx4_config_vxlan_port(struct mlx4_dev *dev, __be16 udp_port);
++++++ ++++++int mlx4_vf_smi_enabled(struct mlx4_dev *dev, int slave, int port);
++++++ ++++++int mlx4_vf_get_enable_smi_admin(struct mlx4_dev *dev, int slave, int port);
++++++ ++++++int mlx4_vf_set_enable_smi_admin(struct mlx4_dev *dev, int slave, int port,
++++++ ++++++ int enable);
#endif /* MLX4_DEVICE_H */
RDMA_TRANSPORT_USNIC_UDP
};
----- -------enum rdma_transport_type
----- -------rdma_node_get_transport(enum rdma_node_type node_type) __attribute_const__;
+++++ +++++++__attribute_const__ enum rdma_transport_type
+++++ +++++++rdma_node_get_transport(enum rdma_node_type node_type);
enum rdma_link_layer {
IB_LINK_LAYER_UNSPECIFIED,
* converted to 2, since 5 Gbit/sec is 2 * 2.5 Gbit/sec.
* @rate: rate to convert.
*/
----- -------int ib_rate_to_mult(enum ib_rate rate) __attribute_const__;
+++++ +++++++__attribute_const__ int ib_rate_to_mult(enum ib_rate rate);
/**
* ib_rate_to_mbps - Convert the IB rate enum to Mbps.
* For example, IB_RATE_2_5_GBPS will be converted to 2500.
* @rate: rate to convert.
*/
----- -------int ib_rate_to_mbps(enum ib_rate rate) __attribute_const__;
+++++ +++++++__attribute_const__ int ib_rate_to_mbps(enum ib_rate rate);
enum ib_mr_create_flags {
IB_MR_SIGNATURE_EN = 1,
* enum.
* @mult: multiple to convert.
*/
----- -------enum ib_rate mult_to_ib_rate(int mult) __attribute_const__;
+++++ +++++++__attribute_const__ enum ib_rate mult_to_ib_rate(int mult);
struct ib_ah_attr {
struct ib_global_route grh;
IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = 1 << 1,
IB_QP_CREATE_NETIF_QP = 1 << 5,
IB_QP_CREATE_SIGNATURE_EN = 1 << 6,
++++++++ ++++ IB_QP_CREATE_USE_GFP_NOIO = 1 << 7,
/* reserve bits 26-31 for low level drivers' internal use */
IB_QP_CREATE_RESERVED_START = 1 << 26,
IB_QP_CREATE_RESERVED_END = 1 << 31,