Commit e4f3b1e7 authored by Linus Torvalds's avatar Linus Torvalds

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()
parents 5bc705e9 fe11cb6b
...@@ -78,7 +78,7 @@ ib_get_agent_port(struct ib_device *device, int port_num) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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); ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca) ...@@ -211,6 +211,7 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
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); ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 { ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment