Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: IB/mlx4: Incorrect semicolon after if statement mlx4_core: Wait 1 second after reset before accessing device IPoIB: Fix leak in ipoib_transport_dev_init() error path IB/mlx4: Fix opcode returned in RDMA read completion IB/srp: Add OUI for new Cisco targets IB/srp: Wrap OUI checking for workarounds in helper functions RDMA/cxgb3: Always call low level send function via cxgb3_ofld_send() IB: Move the macro IB_UMEM_MAX_PAGE_CHUNK() to umem.c IB: Include <linux/list.h> and <linux/rwsem.h> from <rdma/ib_verbs.h> IB: Include <linux/list.h> from <rdma/ib_mad.h> IB/mad: Fix address handle leak in mad_rmpp IB/mad: agent_send_response() should be void IB/mad: Fix memory leak in switch handling in ib_mad_recv_done_handler() IB/mad: Fix error path if response alloc fails in ib_mad_recv_done_handler() IB/sa: Don't need to check for default P_Key twice IB/core: Ignore membership bit in ib_find_pkey()
This commit is contained in:
commit
e4f3b1e74b
15 changed files with 77 additions and 61 deletions
|
@ -78,7 +78,7 @@ ib_get_agent_port(struct ib_device *device, int port_num)
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
|
void agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
|
||||||
struct ib_wc *wc, struct ib_device *device,
|
struct ib_wc *wc, struct ib_device *device,
|
||||||
int port_num, int qpn)
|
int port_num, int qpn)
|
||||||
{
|
{
|
||||||
|
@ -86,7 +86,6 @@ int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
|
||||||
struct ib_mad_agent *agent;
|
struct ib_mad_agent *agent;
|
||||||
struct ib_mad_send_buf *send_buf;
|
struct ib_mad_send_buf *send_buf;
|
||||||
struct ib_ah *ah;
|
struct ib_ah *ah;
|
||||||
int ret;
|
|
||||||
struct ib_mad_send_wr_private *mad_send_wr;
|
struct ib_mad_send_wr_private *mad_send_wr;
|
||||||
|
|
||||||
if (device->node_type == RDMA_NODE_IB_SWITCH)
|
if (device->node_type == RDMA_NODE_IB_SWITCH)
|
||||||
|
@ -96,23 +95,21 @@ int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
|
||||||
|
|
||||||
if (!port_priv) {
|
if (!port_priv) {
|
||||||
printk(KERN_ERR SPFX "Unable to find port agent\n");
|
printk(KERN_ERR SPFX "Unable to find port agent\n");
|
||||||
return -ENODEV;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
agent = port_priv->agent[qpn];
|
agent = port_priv->agent[qpn];
|
||||||
ah = ib_create_ah_from_wc(agent->qp->pd, wc, grh, port_num);
|
ah = ib_create_ah_from_wc(agent->qp->pd, wc, grh, port_num);
|
||||||
if (IS_ERR(ah)) {
|
if (IS_ERR(ah)) {
|
||||||
ret = PTR_ERR(ah);
|
printk(KERN_ERR SPFX "ib_create_ah_from_wc error\n");
|
||||||
printk(KERN_ERR SPFX "ib_create_ah_from_wc error:%d\n", ret);
|
return;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
send_buf = ib_create_send_mad(agent, wc->src_qp, wc->pkey_index, 0,
|
send_buf = ib_create_send_mad(agent, wc->src_qp, wc->pkey_index, 0,
|
||||||
IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA,
|
IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (IS_ERR(send_buf)) {
|
if (IS_ERR(send_buf)) {
|
||||||
ret = PTR_ERR(send_buf);
|
printk(KERN_ERR SPFX "ib_create_send_mad error\n");
|
||||||
printk(KERN_ERR SPFX "ib_create_send_mad error:%d\n", ret);
|
|
||||||
goto err1;
|
goto err1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,16 +123,15 @@ int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
|
||||||
mad_send_wr->send_wr.wr.ud.port_num = port_num;
|
mad_send_wr->send_wr.wr.ud.port_num = port_num;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = ib_post_send_mad(send_buf, NULL))) {
|
if (ib_post_send_mad(send_buf, NULL)) {
|
||||||
printk(KERN_ERR SPFX "ib_post_send_mad error:%d\n", ret);
|
printk(KERN_ERR SPFX "ib_post_send_mad error\n");
|
||||||
goto err2;
|
goto err2;
|
||||||
}
|
}
|
||||||
return 0;
|
return;
|
||||||
err2:
|
err2:
|
||||||
ib_free_send_mad(send_buf);
|
ib_free_send_mad(send_buf);
|
||||||
err1:
|
err1:
|
||||||
ib_destroy_ah(ah);
|
ib_destroy_ah(ah);
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void agent_send_handler(struct ib_mad_agent *mad_agent,
|
static void agent_send_handler(struct ib_mad_agent *mad_agent,
|
||||||
|
|
|
@ -46,7 +46,7 @@ extern int ib_agent_port_open(struct ib_device *device, int port_num);
|
||||||
|
|
||||||
extern int ib_agent_port_close(struct ib_device *device, int port_num);
|
extern int ib_agent_port_close(struct ib_device *device, int port_num);
|
||||||
|
|
||||||
extern int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
|
extern void agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
|
||||||
struct ib_wc *wc, struct ib_device *device,
|
struct ib_wc *wc, struct ib_device *device,
|
||||||
int port_num, int qpn);
|
int port_num, int qpn);
|
||||||
|
|
||||||
|
|
|
@ -702,7 +702,7 @@ int ib_find_pkey(struct ib_device *device,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (pkey == tmp_pkey) {
|
if ((pkey & 0x7fff) == (tmp_pkey & 0x7fff)) {
|
||||||
*index = i;
|
*index = i;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1842,16 +1842,11 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
|
||||||
{
|
{
|
||||||
struct ib_mad_qp_info *qp_info;
|
struct ib_mad_qp_info *qp_info;
|
||||||
struct ib_mad_private_header *mad_priv_hdr;
|
struct ib_mad_private_header *mad_priv_hdr;
|
||||||
struct ib_mad_private *recv, *response;
|
struct ib_mad_private *recv, *response = NULL;
|
||||||
struct ib_mad_list_head *mad_list;
|
struct ib_mad_list_head *mad_list;
|
||||||
struct ib_mad_agent_private *mad_agent;
|
struct ib_mad_agent_private *mad_agent;
|
||||||
int port_num;
|
int port_num;
|
||||||
|
|
||||||
response = kmem_cache_alloc(ib_mad_cache, GFP_KERNEL);
|
|
||||||
if (!response)
|
|
||||||
printk(KERN_ERR PFX "ib_mad_recv_done_handler no memory "
|
|
||||||
"for response buffer\n");
|
|
||||||
|
|
||||||
mad_list = (struct ib_mad_list_head *)(unsigned long)wc->wr_id;
|
mad_list = (struct ib_mad_list_head *)(unsigned long)wc->wr_id;
|
||||||
qp_info = mad_list->mad_queue->qp_info;
|
qp_info = mad_list->mad_queue->qp_info;
|
||||||
dequeue_mad(mad_list);
|
dequeue_mad(mad_list);
|
||||||
|
@ -1879,6 +1874,13 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
|
||||||
if (!validate_mad(&recv->mad.mad, qp_info->qp->qp_num))
|
if (!validate_mad(&recv->mad.mad, qp_info->qp->qp_num))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
response = kmem_cache_alloc(ib_mad_cache, GFP_KERNEL);
|
||||||
|
if (!response) {
|
||||||
|
printk(KERN_ERR PFX "ib_mad_recv_done_handler no memory "
|
||||||
|
"for response buffer\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (port_priv->device->node_type == RDMA_NODE_IB_SWITCH)
|
if (port_priv->device->node_type == RDMA_NODE_IB_SWITCH)
|
||||||
port_num = wc->port_num;
|
port_num = wc->port_num;
|
||||||
else
|
else
|
||||||
|
@ -1914,12 +1916,11 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
|
||||||
response->header.recv_wc.recv_buf.mad = &response->mad.mad;
|
response->header.recv_wc.recv_buf.mad = &response->mad.mad;
|
||||||
response->header.recv_wc.recv_buf.grh = &response->grh;
|
response->header.recv_wc.recv_buf.grh = &response->grh;
|
||||||
|
|
||||||
if (!agent_send_response(&response->mad.mad,
|
agent_send_response(&response->mad.mad,
|
||||||
&response->grh, wc,
|
&response->grh, wc,
|
||||||
port_priv->device,
|
port_priv->device,
|
||||||
smi_get_fwd_port(&recv->mad.smp),
|
smi_get_fwd_port(&recv->mad.smp),
|
||||||
qp_info->qp->qp_num))
|
qp_info->qp->qp_num);
|
||||||
response = NULL;
|
|
||||||
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,8 +163,10 @@ static struct ib_mad_send_buf *alloc_response_msg(struct ib_mad_agent *agent,
|
||||||
hdr_len, 0, GFP_KERNEL);
|
hdr_len, 0, GFP_KERNEL);
|
||||||
if (IS_ERR(msg))
|
if (IS_ERR(msg))
|
||||||
ib_destroy_ah(ah);
|
ib_destroy_ah(ah);
|
||||||
else
|
else {
|
||||||
msg->ah = ah;
|
msg->ah = ah;
|
||||||
|
msg->context[0] = ah;
|
||||||
|
}
|
||||||
|
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
@ -197,9 +199,7 @@ static void ack_ds_ack(struct ib_mad_agent_private *agent,
|
||||||
|
|
||||||
void ib_rmpp_send_handler(struct ib_mad_send_wc *mad_send_wc)
|
void ib_rmpp_send_handler(struct ib_mad_send_wc *mad_send_wc)
|
||||||
{
|
{
|
||||||
struct ib_rmpp_mad *rmpp_mad = mad_send_wc->send_buf->mad;
|
if (mad_send_wc->send_buf->context[0] == mad_send_wc->send_buf->ah)
|
||||||
|
|
||||||
if (rmpp_mad->rmpp_hdr.rmpp_type != IB_MGMT_RMPP_TYPE_ACK)
|
|
||||||
ib_destroy_ah(mad_send_wc->send_buf->ah);
|
ib_destroy_ah(mad_send_wc->send_buf->ah);
|
||||||
ib_free_send_mad(mad_send_wc->send_buf);
|
ib_free_send_mad(mad_send_wc->send_buf);
|
||||||
}
|
}
|
||||||
|
|
|
@ -385,9 +385,7 @@ static void update_sm_ah(struct work_struct *work)
|
||||||
|
|
||||||
new_ah->pkey_index = 0;
|
new_ah->pkey_index = 0;
|
||||||
if (ib_find_pkey(port->agent->device, port->port_num,
|
if (ib_find_pkey(port->agent->device, port->port_num,
|
||||||
IB_DEFAULT_PKEY_FULL, &new_ah->pkey_index) &&
|
IB_DEFAULT_PKEY_FULL, &new_ah->pkey_index))
|
||||||
ib_find_pkey(port->agent->device, port->port_num,
|
|
||||||
IB_DEFAULT_PKEY_PARTIAL, &new_ah->pkey_index))
|
|
||||||
printk(KERN_ERR "Couldn't find index for default PKey\n");
|
printk(KERN_ERR "Couldn't find index for default PKey\n");
|
||||||
|
|
||||||
memset(&ah_attr, 0, sizeof ah_attr);
|
memset(&ah_attr, 0, sizeof ah_attr);
|
||||||
|
|
|
@ -40,6 +40,11 @@
|
||||||
|
|
||||||
#include "uverbs.h"
|
#include "uverbs.h"
|
||||||
|
|
||||||
|
#define IB_UMEM_MAX_PAGE_CHUNK \
|
||||||
|
((PAGE_SIZE - offsetof(struct ib_umem_chunk, page_list)) / \
|
||||||
|
((void *) &((struct ib_umem_chunk *) 0)->page_list[1] - \
|
||||||
|
(void *) &((struct ib_umem_chunk *) 0)->page_list[0]))
|
||||||
|
|
||||||
static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int dirty)
|
static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int dirty)
|
||||||
{
|
{
|
||||||
struct ib_umem_chunk *chunk, *tmp;
|
struct ib_umem_chunk *chunk, *tmp;
|
||||||
|
|
|
@ -139,7 +139,7 @@ static void release_tid(struct t3cdev *tdev, u32 hwtid, struct sk_buff *skb)
|
||||||
req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
|
req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
|
||||||
OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_TID_RELEASE, hwtid));
|
OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_TID_RELEASE, hwtid));
|
||||||
skb->priority = CPL_PRIORITY_SETUP;
|
skb->priority = CPL_PRIORITY_SETUP;
|
||||||
tdev->send(tdev, skb);
|
cxgb3_ofld_send(tdev, skb);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ int iwch_quiesce_tid(struct iwch_ep *ep)
|
||||||
req->val = cpu_to_be64(1 << S_TCB_RX_QUIESCE);
|
req->val = cpu_to_be64(1 << S_TCB_RX_QUIESCE);
|
||||||
|
|
||||||
skb->priority = CPL_PRIORITY_DATA;
|
skb->priority = CPL_PRIORITY_DATA;
|
||||||
ep->com.tdev->send(ep->com.tdev, skb);
|
cxgb3_ofld_send(ep->com.tdev, skb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ int iwch_resume_tid(struct iwch_ep *ep)
|
||||||
req->val = 0;
|
req->val = 0;
|
||||||
|
|
||||||
skb->priority = CPL_PRIORITY_DATA;
|
skb->priority = CPL_PRIORITY_DATA;
|
||||||
ep->com.tdev->send(ep->com.tdev, skb);
|
cxgb3_ofld_send(ep->com.tdev, skb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -784,7 +784,7 @@ static int update_rx_credits(struct iwch_ep *ep, u32 credits)
|
||||||
OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RX_DATA_ACK, ep->hwtid));
|
OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RX_DATA_ACK, ep->hwtid));
|
||||||
req->credit_dack = htonl(V_RX_CREDITS(credits) | V_RX_FORCE_ACK(1));
|
req->credit_dack = htonl(V_RX_CREDITS(credits) | V_RX_FORCE_ACK(1));
|
||||||
skb->priority = CPL_PRIORITY_ACK;
|
skb->priority = CPL_PRIORITY_ACK;
|
||||||
ep->com.tdev->send(ep->com.tdev, skb);
|
cxgb3_ofld_send(ep->com.tdev, skb);
|
||||||
return credits;
|
return credits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1152,7 +1152,7 @@ static int listen_start(struct iwch_listen_ep *ep)
|
||||||
req->opt1 = htonl(V_CONN_POLICY(CPL_CONN_POLICY_ASK));
|
req->opt1 = htonl(V_CONN_POLICY(CPL_CONN_POLICY_ASK));
|
||||||
|
|
||||||
skb->priority = 1;
|
skb->priority = 1;
|
||||||
ep->com.tdev->send(ep->com.tdev, skb);
|
cxgb3_ofld_send(ep->com.tdev, skb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1186,7 +1186,7 @@ static int listen_stop(struct iwch_listen_ep *ep)
|
||||||
req->cpu_idx = 0;
|
req->cpu_idx = 0;
|
||||||
OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_LISTSRV_REQ, ep->stid));
|
OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_LISTSRV_REQ, ep->stid));
|
||||||
skb->priority = 1;
|
skb->priority = 1;
|
||||||
ep->com.tdev->send(ep->com.tdev, skb);
|
cxgb3_ofld_send(ep->com.tdev, skb);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1264,7 +1264,7 @@ static void reject_cr(struct t3cdev *tdev, u32 hwtid, __be32 peer_ip,
|
||||||
rpl->opt0l_status = htonl(CPL_PASS_OPEN_REJECT);
|
rpl->opt0l_status = htonl(CPL_PASS_OPEN_REJECT);
|
||||||
rpl->opt2 = 0;
|
rpl->opt2 = 0;
|
||||||
rpl->rsvd = rpl->opt2;
|
rpl->rsvd = rpl->opt2;
|
||||||
tdev->send(tdev, skb);
|
cxgb3_ofld_send(tdev, skb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1557,7 +1557,7 @@ static int peer_abort(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
|
||||||
rpl->wr.wr_lo = htonl(V_WR_TID(ep->hwtid));
|
rpl->wr.wr_lo = htonl(V_WR_TID(ep->hwtid));
|
||||||
OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_ABORT_RPL, ep->hwtid));
|
OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_ABORT_RPL, ep->hwtid));
|
||||||
rpl->cmd = CPL_ABORT_NO_RST;
|
rpl->cmd = CPL_ABORT_NO_RST;
|
||||||
ep->com.tdev->send(ep->com.tdev, rpl_skb);
|
cxgb3_ofld_send(ep->com.tdev, rpl_skb);
|
||||||
if (state != ABORTING) {
|
if (state != ABORTING) {
|
||||||
state_set(&ep->com, DEAD);
|
state_set(&ep->com, DEAD);
|
||||||
release_ep_resources(ep);
|
release_ep_resources(ep);
|
||||||
|
|
|
@ -389,7 +389,7 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq,
|
||||||
wc->opcode = IB_WC_SEND;
|
wc->opcode = IB_WC_SEND;
|
||||||
break;
|
break;
|
||||||
case MLX4_OPCODE_RDMA_READ:
|
case MLX4_OPCODE_RDMA_READ:
|
||||||
wc->opcode = IB_WC_SEND;
|
wc->opcode = IB_WC_RDMA_READ;
|
||||||
wc->byte_len = be32_to_cpu(cqe->byte_cnt);
|
wc->byte_len = be32_to_cpu(cqe->byte_cnt);
|
||||||
break;
|
break;
|
||||||
case MLX4_OPCODE_ATOMIC_CS:
|
case MLX4_OPCODE_ATOMIC_CS:
|
||||||
|
|
|
@ -109,7 +109,7 @@ int mlx4_MAD_IFC(struct mlx4_ib_dev *dev, int ignore_mkey, int ignore_bkey,
|
||||||
in_modifier, op_modifier,
|
in_modifier, op_modifier,
|
||||||
MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C);
|
MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C);
|
||||||
|
|
||||||
if (!err);
|
if (!err)
|
||||||
memcpy(response_mad, outmailbox->buf, 256);
|
memcpy(response_mad, outmailbox->buf, 256);
|
||||||
|
|
||||||
mlx4_free_cmd_mailbox(dev->dev, inmailbox);
|
mlx4_free_cmd_mailbox(dev->dev, inmailbox);
|
||||||
|
|
|
@ -211,6 +211,7 @@ out_free_cq:
|
||||||
|
|
||||||
out_free_mr:
|
out_free_mr:
|
||||||
ib_dereg_mr(priv->mr);
|
ib_dereg_mr(priv->mr);
|
||||||
|
ipoib_cm_dev_cleanup(dev);
|
||||||
|
|
||||||
out_free_pd:
|
out_free_pd:
|
||||||
ib_dealloc_pd(priv->pd);
|
ib_dealloc_pd(priv->pd);
|
||||||
|
|
|
@ -75,16 +75,12 @@ module_param(topspin_workarounds, int, 0444);
|
||||||
MODULE_PARM_DESC(topspin_workarounds,
|
MODULE_PARM_DESC(topspin_workarounds,
|
||||||
"Enable workarounds for Topspin/Cisco SRP target bugs if != 0");
|
"Enable workarounds for Topspin/Cisco SRP target bugs if != 0");
|
||||||
|
|
||||||
static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad };
|
|
||||||
|
|
||||||
static int mellanox_workarounds = 1;
|
static int mellanox_workarounds = 1;
|
||||||
|
|
||||||
module_param(mellanox_workarounds, int, 0444);
|
module_param(mellanox_workarounds, int, 0444);
|
||||||
MODULE_PARM_DESC(mellanox_workarounds,
|
MODULE_PARM_DESC(mellanox_workarounds,
|
||||||
"Enable workarounds for Mellanox SRP target bugs if != 0");
|
"Enable workarounds for Mellanox SRP target bugs if != 0");
|
||||||
|
|
||||||
static const u8 mellanox_oui[3] = { 0x00, 0x02, 0xc9 };
|
|
||||||
|
|
||||||
static void srp_add_one(struct ib_device *device);
|
static void srp_add_one(struct ib_device *device);
|
||||||
static void srp_remove_one(struct ib_device *device);
|
static void srp_remove_one(struct ib_device *device);
|
||||||
static void srp_completion(struct ib_cq *cq, void *target_ptr);
|
static void srp_completion(struct ib_cq *cq, void *target_ptr);
|
||||||
|
@ -108,6 +104,24 @@ static const char *srp_target_info(struct Scsi_Host *host)
|
||||||
return host_to_target(host)->target_name;
|
return host_to_target(host)->target_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int srp_target_is_topspin(struct srp_target_port *target)
|
||||||
|
{
|
||||||
|
static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad };
|
||||||
|
static const u8 cisco_oui[3] = { 0x00, 0x1b, 0x0d };
|
||||||
|
|
||||||
|
return topspin_workarounds &&
|
||||||
|
(!memcmp(&target->ioc_guid, topspin_oui, sizeof topspin_oui) ||
|
||||||
|
!memcmp(&target->ioc_guid, cisco_oui, sizeof cisco_oui));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int srp_target_is_mellanox(struct srp_target_port *target)
|
||||||
|
{
|
||||||
|
static const u8 mellanox_oui[3] = { 0x00, 0x02, 0xc9 };
|
||||||
|
|
||||||
|
return mellanox_workarounds &&
|
||||||
|
!memcmp(&target->ioc_guid, mellanox_oui, sizeof mellanox_oui);
|
||||||
|
}
|
||||||
|
|
||||||
static struct srp_iu *srp_alloc_iu(struct srp_host *host, size_t size,
|
static struct srp_iu *srp_alloc_iu(struct srp_host *host, size_t size,
|
||||||
gfp_t gfp_mask,
|
gfp_t gfp_mask,
|
||||||
enum dma_data_direction direction)
|
enum dma_data_direction direction)
|
||||||
|
@ -360,7 +374,7 @@ static int srp_send_req(struct srp_target_port *target)
|
||||||
* zero out the first 8 bytes of our initiator port ID and set
|
* zero out the first 8 bytes of our initiator port ID and set
|
||||||
* the second 8 bytes to the local node GUID.
|
* the second 8 bytes to the local node GUID.
|
||||||
*/
|
*/
|
||||||
if (topspin_workarounds && !memcmp(&target->ioc_guid, topspin_oui, 3)) {
|
if (srp_target_is_topspin(target)) {
|
||||||
printk(KERN_DEBUG PFX "Topspin/Cisco initiator port ID workaround "
|
printk(KERN_DEBUG PFX "Topspin/Cisco initiator port ID workaround "
|
||||||
"activated for target GUID %016llx\n",
|
"activated for target GUID %016llx\n",
|
||||||
(unsigned long long) be64_to_cpu(target->ioc_guid));
|
(unsigned long long) be64_to_cpu(target->ioc_guid));
|
||||||
|
@ -585,8 +599,8 @@ static int srp_map_fmr(struct srp_target_port *target, struct scatterlist *scat,
|
||||||
if (!dev->fmr_pool)
|
if (!dev->fmr_pool)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if ((ib_sg_dma_address(ibdev, &scat[0]) & ~dev->fmr_page_mask) &&
|
if (srp_target_is_mellanox(target) &&
|
||||||
mellanox_workarounds && !memcmp(&target->ioc_guid, mellanox_oui, 3))
|
(ib_sg_dma_address(ibdev, &scat[0]) & ~dev->fmr_page_mask))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
len = page_cnt = 0;
|
len = page_cnt = 0;
|
||||||
|
@ -1087,8 +1101,7 @@ static void srp_cm_rej_handler(struct ib_cm_id *cm_id,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IB_CM_REJ_PORT_REDIRECT:
|
case IB_CM_REJ_PORT_REDIRECT:
|
||||||
if (topspin_workarounds &&
|
if (srp_target_is_topspin(target)) {
|
||||||
!memcmp(&target->ioc_guid, topspin_oui, 3)) {
|
|
||||||
/*
|
/*
|
||||||
* Topspin/Cisco SRP gateways incorrectly send
|
* Topspin/Cisco SRP gateways incorrectly send
|
||||||
* reject reason code 25 when they mean 24
|
* reject reason code 25 when they mean 24
|
||||||
|
|
|
@ -119,6 +119,9 @@ int mlx4_reset(struct mlx4_dev *dev)
|
||||||
writel(MLX4_RESET_VALUE, reset + MLX4_RESET_OFFSET);
|
writel(MLX4_RESET_VALUE, reset + MLX4_RESET_OFFSET);
|
||||||
iounmap(reset);
|
iounmap(reset);
|
||||||
|
|
||||||
|
/* Docs say to wait one second before accessing device */
|
||||||
|
msleep(1000);
|
||||||
|
|
||||||
end = jiffies + MLX4_RESET_TIMEOUT_JIFFIES;
|
end = jiffies + MLX4_RESET_TIMEOUT_JIFFIES;
|
||||||
do {
|
do {
|
||||||
if (!pci_read_config_word(dev->pdev, PCI_VENDOR_ID, &vendor) &&
|
if (!pci_read_config_word(dev->pdev, PCI_VENDOR_ID, &vendor) &&
|
||||||
|
|
|
@ -39,6 +39,8 @@
|
||||||
#if !defined( IB_MAD_H )
|
#if !defined( IB_MAD_H )
|
||||||
#define IB_MAD_H
|
#define IB_MAD_H
|
||||||
|
|
||||||
|
#include <linux/list.h>
|
||||||
|
|
||||||
#include <rdma/ib_verbs.h>
|
#include <rdma/ib_verbs.h>
|
||||||
|
|
||||||
/* Management base version */
|
/* Management base version */
|
||||||
|
|
|
@ -46,6 +46,8 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/kref.h>
|
#include <linux/kref.h>
|
||||||
|
#include <linux/list.h>
|
||||||
|
#include <linux/rwsem.h>
|
||||||
|
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
#include <asm/scatterlist.h>
|
#include <asm/scatterlist.h>
|
||||||
|
@ -731,11 +733,6 @@ struct ib_udata {
|
||||||
size_t outlen;
|
size_t outlen;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IB_UMEM_MAX_PAGE_CHUNK \
|
|
||||||
((PAGE_SIZE - offsetof(struct ib_umem_chunk, page_list)) / \
|
|
||||||
((void *) &((struct ib_umem_chunk *) 0)->page_list[1] - \
|
|
||||||
(void *) &((struct ib_umem_chunk *) 0)->page_list[0]))
|
|
||||||
|
|
||||||
struct ib_pd {
|
struct ib_pd {
|
||||||
struct ib_device *device;
|
struct ib_device *device;
|
||||||
struct ib_uobject *uobject;
|
struct ib_uobject *uobject;
|
||||||
|
|
Loading…
Add table
Reference in a new issue