You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of master.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband: (49 commits) IB: Set class_dev->dev in core for nice device symlink IB/ehca: Implement modify_port IB/umad: Clarify documentation of transaction ID IPoIB/cm: spin_lock_irqsave() -> spin_lock_irq() replacements IB/mad: Change SMI to use enums rather than magic return codes IB/umad: Implement GRH handling for sent/received MADs IB/ipoib: Use ib_init_ah_from_path to initialize ah_attr IB/sa: Set src_path_bits correctly in ib_init_ah_from_path() IB/ucm: Simplify ib_ucm_event() RDMA/ucma: Simplify ucma_get_event() IB/mthca: Simplify CQ cleaning in mthca_free_qp() IB/mthca: Fix mthca_write_mtt() on HCAs with hidden memory IB/mthca: Update HCA firmware revisions IB/ipath: Fix WC format drift between user and kernel space IB/ipath: Check that a UD work request's address handle is valid IB/ipath: Remove duplicate stuff from ipath_verbs.h IB/ipath: Check reserved memory keys IB/ipath: Fix unit selection when all CPU affinity bits set IB/ipath: Don't allow QPs 0 and 1 to be opened multiple times IB/ipath: Disable IB link earlier in shutdown sequence ...
This commit is contained in:
@@ -91,6 +91,14 @@ Sending MADs
|
||||
if (ret != sizeof *mad + mad_length)
|
||||
perror("write");
|
||||
|
||||
Transaction IDs
|
||||
|
||||
Users of the umad devices can use the lower 32 bits of the
|
||||
transaction ID field (that is, the least significant half of the
|
||||
field in network byte order) in MADs being sent to match
|
||||
request/response pairs. The upper 32 bits are reserved for use by
|
||||
the kernel and will be overwritten before a MAD is sent.
|
||||
|
||||
Setting IsSM Capability Bit
|
||||
|
||||
To set the IsSM capability bit for a port, simply open the
|
||||
|
||||
@@ -72,7 +72,6 @@ obj-$(CONFIG_CPU_FREQ) += cpufreq/
|
||||
obj-$(CONFIG_MMC) += mmc/
|
||||
obj-$(CONFIG_NEW_LEDS) += leds/
|
||||
obj-$(CONFIG_INFINIBAND) += infiniband/
|
||||
obj-$(CONFIG_IPATH_CORE) += infiniband/
|
||||
obj-$(CONFIG_SGI_SN) += sn/
|
||||
obj-y += firmware/
|
||||
obj-$(CONFIG_CRYPTO) += crypto/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved.
|
||||
* Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved.
|
||||
* Copyright (c) 2005 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Mellanox Technologies Ltd. All rights reserved.
|
||||
*
|
||||
@@ -31,7 +31,6 @@
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* $Id: mad.c 5596 2006-03-03 01:00:07Z sean.hefty $
|
||||
*/
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <rdma/ib_cache.h>
|
||||
@@ -668,7 +667,7 @@ static void build_smp_wc(struct ib_qp *qp,
|
||||
static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
|
||||
struct ib_mad_send_wr_private *mad_send_wr)
|
||||
{
|
||||
int ret;
|
||||
int ret = 0;
|
||||
struct ib_smp *smp = mad_send_wr->send_buf.mad;
|
||||
unsigned long flags;
|
||||
struct ib_mad_local_private *local;
|
||||
@@ -688,14 +687,15 @@ static int handle_outgoing_dr_smp(struct ib_mad_agent_private *mad_agent_priv,
|
||||
*/
|
||||
if ((ib_get_smp_direction(smp) ? smp->dr_dlid : smp->dr_slid) ==
|
||||
IB_LID_PERMISSIVE &&
|
||||
!smi_handle_dr_smp_send(smp, device->node_type, port_num)) {
|
||||
smi_handle_dr_smp_send(smp, device->node_type, port_num) ==
|
||||
IB_SMI_DISCARD) {
|
||||
ret = -EINVAL;
|
||||
printk(KERN_ERR PFX "Invalid directed route\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Check to post send on QP or process locally */
|
||||
ret = smi_check_local_smp(smp, device);
|
||||
if (!ret)
|
||||
if (smi_check_local_smp(smp, device) == IB_SMI_DISCARD)
|
||||
goto out;
|
||||
|
||||
local = kmalloc(sizeof *local, GFP_ATOMIC);
|
||||
@@ -1874,18 +1874,22 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
|
||||
|
||||
if (recv->mad.mad.mad_hdr.mgmt_class ==
|
||||
IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) {
|
||||
if (!smi_handle_dr_smp_recv(&recv->mad.smp,
|
||||
port_priv->device->node_type,
|
||||
port_priv->port_num,
|
||||
port_priv->device->phys_port_cnt))
|
||||
if (smi_handle_dr_smp_recv(&recv->mad.smp,
|
||||
port_priv->device->node_type,
|
||||
port_priv->port_num,
|
||||
port_priv->device->phys_port_cnt) ==
|
||||
IB_SMI_DISCARD)
|
||||
goto out;
|
||||
if (!smi_check_forward_dr_smp(&recv->mad.smp))
|
||||
|
||||
if (smi_check_forward_dr_smp(&recv->mad.smp) == IB_SMI_LOCAL)
|
||||
goto local;
|
||||
if (!smi_handle_dr_smp_send(&recv->mad.smp,
|
||||
port_priv->device->node_type,
|
||||
port_priv->port_num))
|
||||
|
||||
if (smi_handle_dr_smp_send(&recv->mad.smp,
|
||||
port_priv->device->node_type,
|
||||
port_priv->port_num) == IB_SMI_DISCARD)
|
||||
goto out;
|
||||
if (!smi_check_local_smp(&recv->mad.smp, port_priv->device))
|
||||
|
||||
if (smi_check_local_smp(&recv->mad.smp, port_priv->device) == IB_SMI_DISCARD)
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ MODULE_LICENSE("Dual BSD/GPL");
|
||||
struct ib_sa_sm_ah {
|
||||
struct ib_ah *ah;
|
||||
struct kref ref;
|
||||
u8 src_path_mask;
|
||||
};
|
||||
|
||||
struct ib_sa_port {
|
||||
@@ -380,6 +381,7 @@ static void update_sm_ah(struct work_struct *work)
|
||||
}
|
||||
|
||||
kref_init(&new_ah->ref);
|
||||
new_ah->src_path_mask = (1 << port_attr.lmc) - 1;
|
||||
|
||||
memset(&ah_attr, 0, sizeof ah_attr);
|
||||
ah_attr.dlid = port_attr.sm_lid;
|
||||
@@ -460,6 +462,25 @@ void ib_sa_cancel_query(int id, struct ib_sa_query *query)
|
||||
}
|
||||
EXPORT_SYMBOL(ib_sa_cancel_query);
|
||||
|
||||
static u8 get_src_path_mask(struct ib_device *device, u8 port_num)
|
||||
{
|
||||
struct ib_sa_device *sa_dev;
|
||||
struct ib_sa_port *port;
|
||||
unsigned long flags;
|
||||
u8 src_path_mask;
|
||||
|
||||
sa_dev = ib_get_client_data(device, &sa_client);
|
||||
if (!sa_dev)
|
||||
return 0x7f;
|
||||
|
||||
port = &sa_dev->port[port_num - sa_dev->start_port];
|
||||
spin_lock_irqsave(&port->ah_lock, flags);
|
||||
src_path_mask = port->sm_ah ? port->sm_ah->src_path_mask : 0x7f;
|
||||
spin_unlock_irqrestore(&port->ah_lock, flags);
|
||||
|
||||
return src_path_mask;
|
||||
}
|
||||
|
||||
int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
|
||||
struct ib_sa_path_rec *rec, struct ib_ah_attr *ah_attr)
|
||||
{
|
||||
@@ -469,7 +490,8 @@ int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
|
||||
memset(ah_attr, 0, sizeof *ah_attr);
|
||||
ah_attr->dlid = be16_to_cpu(rec->dlid);
|
||||
ah_attr->sl = rec->sl;
|
||||
ah_attr->src_path_bits = be16_to_cpu(rec->slid) & 0x7f;
|
||||
ah_attr->src_path_bits = be16_to_cpu(rec->slid) &
|
||||
get_src_path_mask(device, port_num);
|
||||
ah_attr->port_num = port_num;
|
||||
ah_attr->static_rate = rec->rate;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* Copyright (c) 2004, 2005 Infinicon Corporation. All rights reserved.
|
||||
* Copyright (c) 2004, 2005 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2004, 2005 Topspin Corporation. All rights reserved.
|
||||
* Copyright (c) 2004, 2005 Voltaire Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2007 Voltaire Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
@@ -34,7 +34,6 @@
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* $Id: smi.c 1389 2004-12-27 22:56:47Z roland $
|
||||
*/
|
||||
|
||||
#include <rdma/ib_smi.h>
|
||||
@@ -44,9 +43,8 @@
|
||||
* Fixup a directed route SMP for sending
|
||||
* Return 0 if the SMP should be discarded
|
||||
*/
|
||||
int smi_handle_dr_smp_send(struct ib_smp *smp,
|
||||
u8 node_type,
|
||||
int port_num)
|
||||
enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp,
|
||||
u8 node_type, int port_num)
|
||||
{
|
||||
u8 hop_ptr, hop_cnt;
|
||||
|
||||
@@ -59,18 +57,18 @@ int smi_handle_dr_smp_send(struct ib_smp *smp,
|
||||
if (hop_cnt && hop_ptr == 0) {
|
||||
smp->hop_ptr++;
|
||||
return (smp->initial_path[smp->hop_ptr] ==
|
||||
port_num);
|
||||
port_num ? IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
/* C14-9:2 */
|
||||
if (hop_ptr && hop_ptr < hop_cnt) {
|
||||
if (node_type != RDMA_NODE_IB_SWITCH)
|
||||
return 0;
|
||||
return IB_SMI_DISCARD;
|
||||
|
||||
/* smp->return_path set when received */
|
||||
smp->hop_ptr++;
|
||||
return (smp->initial_path[smp->hop_ptr] ==
|
||||
port_num);
|
||||
port_num ? IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
/* C14-9:3 -- We're at the end of the DR segment of path */
|
||||
@@ -78,29 +76,30 @@ int smi_handle_dr_smp_send(struct ib_smp *smp,
|
||||
/* smp->return_path set when received */
|
||||
smp->hop_ptr++;
|
||||
return (node_type == RDMA_NODE_IB_SWITCH ||
|
||||
smp->dr_dlid == IB_LID_PERMISSIVE);
|
||||
smp->dr_dlid == IB_LID_PERMISSIVE ?
|
||||
IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
/* C14-9:4 -- hop_ptr = hop_cnt + 1 -> give to SMA/SM */
|
||||
/* C14-9:5 -- Fail unreasonable hop pointer */
|
||||
return (hop_ptr == hop_cnt + 1);
|
||||
return (hop_ptr == hop_cnt + 1 ? IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
|
||||
} else {
|
||||
/* C14-13:1 */
|
||||
if (hop_cnt && hop_ptr == hop_cnt + 1) {
|
||||
smp->hop_ptr--;
|
||||
return (smp->return_path[smp->hop_ptr] ==
|
||||
port_num);
|
||||
port_num ? IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
/* C14-13:2 */
|
||||
if (2 <= hop_ptr && hop_ptr <= hop_cnt) {
|
||||
if (node_type != RDMA_NODE_IB_SWITCH)
|
||||
return 0;
|
||||
return IB_SMI_DISCARD;
|
||||
|
||||
smp->hop_ptr--;
|
||||
return (smp->return_path[smp->hop_ptr] ==
|
||||
port_num);
|
||||
port_num ? IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
/* C14-13:3 -- at the end of the DR segment of path */
|
||||
@@ -108,15 +107,16 @@ int smi_handle_dr_smp_send(struct ib_smp *smp,
|
||||
smp->hop_ptr--;
|
||||
/* C14-13:3 -- SMPs destined for SM shouldn't be here */
|
||||
return (node_type == RDMA_NODE_IB_SWITCH ||
|
||||
smp->dr_slid == IB_LID_PERMISSIVE);
|
||||
smp->dr_slid == IB_LID_PERMISSIVE ?
|
||||
IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
/* C14-13:4 -- hop_ptr = 0 -> should have gone to SM */
|
||||
if (hop_ptr == 0)
|
||||
return 1;
|
||||
return IB_SMI_HANDLE;
|
||||
|
||||
/* C14-13:5 -- Check for unreasonable hop pointer */
|
||||
return 0;
|
||||
return IB_SMI_DISCARD;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,10 +124,8 @@ int smi_handle_dr_smp_send(struct ib_smp *smp,
|
||||
* Adjust information for a received SMP
|
||||
* Return 0 if the SMP should be dropped
|
||||
*/
|
||||
int smi_handle_dr_smp_recv(struct ib_smp *smp,
|
||||
u8 node_type,
|
||||
int port_num,
|
||||
int phys_port_cnt)
|
||||
enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, u8 node_type,
|
||||
int port_num, int phys_port_cnt)
|
||||
{
|
||||
u8 hop_ptr, hop_cnt;
|
||||
|
||||
@@ -138,16 +136,17 @@ int smi_handle_dr_smp_recv(struct ib_smp *smp,
|
||||
if (!ib_get_smp_direction(smp)) {
|
||||
/* C14-9:1 -- sender should have incremented hop_ptr */
|
||||
if (hop_cnt && hop_ptr == 0)
|
||||
return 0;
|
||||
return IB_SMI_DISCARD;
|
||||
|
||||
/* C14-9:2 -- intermediate hop */
|
||||
if (hop_ptr && hop_ptr < hop_cnt) {
|
||||
if (node_type != RDMA_NODE_IB_SWITCH)
|
||||
return 0;
|
||||
return IB_SMI_DISCARD;
|
||||
|
||||
smp->return_path[hop_ptr] = port_num;
|
||||
/* smp->hop_ptr updated when sending */
|
||||
return (smp->initial_path[hop_ptr+1] <= phys_port_cnt);
|
||||
return (smp->initial_path[hop_ptr+1] <= phys_port_cnt ?
|
||||
IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
/* C14-9:3 -- We're at the end of the DR segment of path */
|
||||
@@ -157,12 +156,13 @@ int smi_handle_dr_smp_recv(struct ib_smp *smp,
|
||||
/* smp->hop_ptr updated when sending */
|
||||
|
||||
return (node_type == RDMA_NODE_IB_SWITCH ||
|
||||
smp->dr_dlid == IB_LID_PERMISSIVE);
|
||||
smp->dr_dlid == IB_LID_PERMISSIVE ?
|
||||
IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
/* C14-9:4 -- hop_ptr = hop_cnt + 1 -> give to SMA/SM */
|
||||
/* C14-9:5 -- fail unreasonable hop pointer */
|
||||
return (hop_ptr == hop_cnt + 1);
|
||||
return (hop_ptr == hop_cnt + 1 ? IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
|
||||
} else {
|
||||
|
||||
@@ -170,16 +170,17 @@ int smi_handle_dr_smp_recv(struct ib_smp *smp,
|
||||
if (hop_cnt && hop_ptr == hop_cnt + 1) {
|
||||
smp->hop_ptr--;
|
||||
return (smp->return_path[smp->hop_ptr] ==
|
||||
port_num);
|
||||
port_num ? IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
/* C14-13:2 */
|
||||
if (2 <= hop_ptr && hop_ptr <= hop_cnt) {
|
||||
if (node_type != RDMA_NODE_IB_SWITCH)
|
||||
return 0;
|
||||
return IB_SMI_DISCARD;
|
||||
|
||||
/* smp->hop_ptr updated when sending */
|
||||
return (smp->return_path[hop_ptr-1] <= phys_port_cnt);
|
||||
return (smp->return_path[hop_ptr-1] <= phys_port_cnt ?
|
||||
IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
/* C14-13:3 -- We're at the end of the DR segment of path */
|
||||
@@ -187,23 +188,20 @@ int smi_handle_dr_smp_recv(struct ib_smp *smp,
|
||||
if (smp->dr_slid == IB_LID_PERMISSIVE) {
|
||||
/* giving SMP to SM - update hop_ptr */
|
||||
smp->hop_ptr--;
|
||||
return 1;
|
||||
return IB_SMI_HANDLE;
|
||||
}
|
||||
/* smp->hop_ptr updated when sending */
|
||||
return (node_type == RDMA_NODE_IB_SWITCH);
|
||||
return (node_type == RDMA_NODE_IB_SWITCH ?
|
||||
IB_SMI_HANDLE: IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
/* C14-13:4 -- hop_ptr = 0 -> give to SM */
|
||||
/* C14-13:5 -- Check for unreasonable hop pointer */
|
||||
return (hop_ptr == 0);
|
||||
return (hop_ptr == 0 ? IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Return 1 if the received DR SMP should be forwarded to the send queue
|
||||
* Return 0 if the SMP should be completed up the stack
|
||||
*/
|
||||
int smi_check_forward_dr_smp(struct ib_smp *smp)
|
||||
enum smi_forward_action smi_check_forward_dr_smp(struct ib_smp *smp)
|
||||
{
|
||||
u8 hop_ptr, hop_cnt;
|
||||
|
||||
@@ -213,23 +211,25 @@ int smi_check_forward_dr_smp(struct ib_smp *smp)
|
||||
if (!ib_get_smp_direction(smp)) {
|
||||
/* C14-9:2 -- intermediate hop */
|
||||
if (hop_ptr && hop_ptr < hop_cnt)
|
||||
return 1;
|
||||
return IB_SMI_SEND;
|
||||
|
||||
/* C14-9:3 -- at the end of the DR segment of path */
|
||||
if (hop_ptr == hop_cnt)
|
||||
return (smp->dr_dlid == IB_LID_PERMISSIVE);
|
||||
return (smp->dr_dlid == IB_LID_PERMISSIVE ?
|
||||
IB_SMI_SEND : IB_SMI_LOCAL);
|
||||
|
||||
/* C14-9:4 -- hop_ptr = hop_cnt + 1 -> give to SMA/SM */
|
||||
if (hop_ptr == hop_cnt + 1)
|
||||
return 1;
|
||||
return IB_SMI_SEND;
|
||||
} else {
|
||||
/* C14-13:2 */
|
||||
/* C14-13:2 -- intermediate hop */
|
||||
if (2 <= hop_ptr && hop_ptr <= hop_cnt)
|
||||
return 1;
|
||||
return IB_SMI_SEND;
|
||||
|
||||
/* C14-13:3 -- at the end of the DR segment of path */
|
||||
if (hop_ptr == 1)
|
||||
return (smp->dr_slid != IB_LID_PERMISSIVE);
|
||||
return (smp->dr_slid != IB_LID_PERMISSIVE ?
|
||||
IB_SMI_SEND : IB_SMI_LOCAL);
|
||||
}
|
||||
return 0;
|
||||
return IB_SMI_LOCAL;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* Copyright (c) 2004 Infinicon Corporation. All rights reserved.
|
||||
* Copyright (c) 2004 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2004 Topspin Corporation. All rights reserved.
|
||||
* Copyright (c) 2004 Voltaire Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2007 Voltaire Corporation. 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
|
||||
@@ -33,7 +33,6 @@
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* $Id: smi.h 1389 2004-12-27 22:56:47Z roland $
|
||||
*/
|
||||
|
||||
#ifndef __SMI_H_
|
||||
@@ -41,26 +40,33 @@
|
||||
|
||||
#include <rdma/ib_smi.h>
|
||||
|
||||
int smi_handle_dr_smp_recv(struct ib_smp *smp,
|
||||
u8 node_type,
|
||||
int port_num,
|
||||
int phys_port_cnt);
|
||||
extern int smi_check_forward_dr_smp(struct ib_smp *smp);
|
||||
extern int smi_handle_dr_smp_send(struct ib_smp *smp,
|
||||
u8 node_type,
|
||||
int port_num);
|
||||
enum smi_action {
|
||||
IB_SMI_DISCARD,
|
||||
IB_SMI_HANDLE
|
||||
};
|
||||
|
||||
enum smi_forward_action {
|
||||
IB_SMI_LOCAL, /* SMP should be completed up the stack */
|
||||
IB_SMI_SEND, /* received DR SMP should be forwarded to the send queue */
|
||||
};
|
||||
|
||||
enum smi_action smi_handle_dr_smp_recv(struct ib_smp *smp, u8 node_type,
|
||||
int port_num, int phys_port_cnt);
|
||||
extern enum smi_forward_action smi_check_forward_dr_smp(struct ib_smp *smp);
|
||||
extern enum smi_action smi_handle_dr_smp_send(struct ib_smp *smp,
|
||||
u8 node_type, int port_num);
|
||||
|
||||
/*
|
||||
* Return 1 if the SMP should be handled by the local SMA/SM via process_mad
|
||||
*/
|
||||
static inline int smi_check_local_smp(struct ib_smp *smp,
|
||||
struct ib_device *device)
|
||||
static inline enum smi_action smi_check_local_smp(struct ib_smp *smp,
|
||||
struct ib_device *device)
|
||||
{
|
||||
/* C14-9:3 -- We're at the end of the DR segment of path */
|
||||
/* C14-9:4 -- Hop Pointer = Hop Count + 1 -> give to SMA/SM */
|
||||
return ((device->process_mad &&
|
||||
!ib_get_smp_direction(smp) &&
|
||||
(smp->hop_ptr == smp->hop_cnt + 1)));
|
||||
(smp->hop_ptr == smp->hop_cnt + 1)) ?
|
||||
IB_SMI_HANDLE : IB_SMI_DISCARD);
|
||||
}
|
||||
|
||||
#endif /* __SMI_H_ */
|
||||
|
||||
@@ -683,6 +683,7 @@ int ib_device_register_sysfs(struct ib_device *device)
|
||||
|
||||
class_dev->class = &ib_class;
|
||||
class_dev->class_data = device;
|
||||
class_dev->dev = device->dma_device;
|
||||
strlcpy(class_dev->class_id, device->name, BUS_ID_SIZE);
|
||||
|
||||
INIT_LIST_HEAD(&device->port_list);
|
||||
|
||||
@@ -407,29 +407,18 @@ static ssize_t ib_ucm_event(struct ib_ucm_file *file,
|
||||
|
||||
mutex_lock(&file->file_mutex);
|
||||
while (list_empty(&file->events)) {
|
||||
|
||||
if (file->filp->f_flags & O_NONBLOCK) {
|
||||
result = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
if (signal_pending(current)) {
|
||||
result = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
|
||||
prepare_to_wait(&file->poll_wait, &wait, TASK_INTERRUPTIBLE);
|
||||
|
||||
mutex_unlock(&file->file_mutex);
|
||||
schedule();
|
||||
|
||||
if (file->filp->f_flags & O_NONBLOCK)
|
||||
return -EAGAIN;
|
||||
|
||||
if (wait_event_interruptible(file->poll_wait,
|
||||
!list_empty(&file->events)))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
mutex_lock(&file->file_mutex);
|
||||
|
||||
finish_wait(&file->poll_wait, &wait);
|
||||
}
|
||||
|
||||
if (result)
|
||||
goto done;
|
||||
|
||||
uevent = list_entry(file->events.next, struct ib_ucm_event, file_list);
|
||||
|
||||
if (ib_ucm_new_cm_id(uevent->resp.event)) {
|
||||
|
||||
@@ -306,25 +306,17 @@ static ssize_t ucma_get_event(struct ucma_file *file, const char __user *inbuf,
|
||||
|
||||
mutex_lock(&file->mut);
|
||||
while (list_empty(&file->event_list)) {
|
||||
if (file->filp->f_flags & O_NONBLOCK) {
|
||||
ret = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
if (signal_pending(current)) {
|
||||
ret = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
|
||||
prepare_to_wait(&file->poll_wait, &wait, TASK_INTERRUPTIBLE);
|
||||
mutex_unlock(&file->mut);
|
||||
schedule();
|
||||
mutex_lock(&file->mut);
|
||||
finish_wait(&file->poll_wait, &wait);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
goto done;
|
||||
if (file->filp->f_flags & O_NONBLOCK)
|
||||
return -EAGAIN;
|
||||
|
||||
if (wait_event_interruptible(file->poll_wait,
|
||||
!list_empty(&file->event_list)))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
mutex_lock(&file->mut);
|
||||
}
|
||||
|
||||
uevent = list_entry(file->event_list.next, struct ucma_event, list);
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ static const dev_t base_dev = MKDEV(IB_UMAD_MAJOR, IB_UMAD_MINOR_BASE);
|
||||
|
||||
static DEFINE_SPINLOCK(port_lock);
|
||||
static struct ib_umad_port *umad_port[IB_UMAD_MAX_PORTS];
|
||||
static DECLARE_BITMAP(dev_map, IB_UMAD_MAX_PORTS * 2);
|
||||
static DECLARE_BITMAP(dev_map, IB_UMAD_MAX_PORTS);
|
||||
|
||||
static void ib_umad_add_one(struct ib_device *device);
|
||||
static void ib_umad_remove_one(struct ib_device *device);
|
||||
@@ -231,12 +231,17 @@ static void recv_handler(struct ib_mad_agent *agent,
|
||||
packet->mad.hdr.path_bits = mad_recv_wc->wc->dlid_path_bits;
|
||||
packet->mad.hdr.grh_present = !!(mad_recv_wc->wc->wc_flags & IB_WC_GRH);
|
||||
if (packet->mad.hdr.grh_present) {
|
||||
/* XXX parse GRH */
|
||||
packet->mad.hdr.gid_index = 0;
|
||||
packet->mad.hdr.hop_limit = 0;
|
||||
packet->mad.hdr.traffic_class = 0;
|
||||
memset(packet->mad.hdr.gid, 0, 16);
|
||||
packet->mad.hdr.flow_label = 0;
|
||||
struct ib_ah_attr ah_attr;
|
||||
|
||||
ib_init_ah_from_wc(agent->device, agent->port_num,
|
||||
mad_recv_wc->wc, mad_recv_wc->recv_buf.grh,
|
||||
&ah_attr);
|
||||
|
||||
packet->mad.hdr.gid_index = ah_attr.grh.sgid_index;
|
||||
packet->mad.hdr.hop_limit = ah_attr.grh.hop_limit;
|
||||
packet->mad.hdr.traffic_class = ah_attr.grh.traffic_class;
|
||||
memcpy(packet->mad.hdr.gid, &ah_attr.grh.dgid, 16);
|
||||
packet->mad.hdr.flow_label = cpu_to_be32(ah_attr.grh.flow_label);
|
||||
}
|
||||
|
||||
if (queue_packet(file, agent, packet))
|
||||
@@ -473,6 +478,7 @@ static ssize_t ib_umad_write(struct file *filp, const char __user *buf,
|
||||
if (packet->mad.hdr.grh_present) {
|
||||
ah_attr.ah_flags = IB_AH_GRH;
|
||||
memcpy(ah_attr.grh.dgid.raw, packet->mad.hdr.gid, 16);
|
||||
ah_attr.grh.sgid_index = packet->mad.hdr.gid_index;
|
||||
ah_attr.grh.flow_label = be32_to_cpu(packet->mad.hdr.flow_label);
|
||||
ah_attr.grh.hop_limit = packet->mad.hdr.hop_limit;
|
||||
ah_attr.grh.traffic_class = packet->mad.hdr.traffic_class;
|
||||
|
||||
@@ -796,7 +796,6 @@ int c2_register_device(struct c2_dev *dev)
|
||||
memcpy(&dev->ibdev.node_guid, dev->pseudo_netdev->dev_addr, 6);
|
||||
dev->ibdev.phys_port_cnt = 1;
|
||||
dev->ibdev.dma_device = &dev->pcidev->dev;
|
||||
dev->ibdev.class_dev.dev = &dev->pcidev->dev;
|
||||
dev->ibdev.query_device = c2_query_device;
|
||||
dev->ibdev.query_port = c2_query_port;
|
||||
dev->ibdev.modify_port = c2_modify_port;
|
||||
|
||||
@@ -1108,7 +1108,6 @@ int iwch_register_device(struct iwch_dev *dev)
|
||||
memcpy(dev->ibdev.node_desc, IWCH_NODE_DESC, sizeof(IWCH_NODE_DESC));
|
||||
dev->ibdev.phys_port_cnt = dev->rdev.port_info.nports;
|
||||
dev->ibdev.dma_device = &(dev->rdev.rnic_info.pdev->dev);
|
||||
dev->ibdev.class_dev.dev = &(dev->rdev.rnic_info.pdev->dev);
|
||||
dev->ibdev.query_device = iwch_query_device;
|
||||
dev->ibdev.query_port = iwch_query_port;
|
||||
dev->ibdev.modify_port = iwch_modify_port;
|
||||
|
||||
@@ -106,6 +106,7 @@ struct ehca_shca {
|
||||
struct ehca_mr *maxmr;
|
||||
struct ehca_pd *pd;
|
||||
struct h_galpas galpas;
|
||||
struct mutex modify_mutex;
|
||||
};
|
||||
|
||||
struct ehca_pd {
|
||||
|
||||
@@ -147,6 +147,7 @@ int ehca_query_port(struct ib_device *ibdev,
|
||||
break;
|
||||
}
|
||||
|
||||
props->port_cap_flags = rblock->capability_mask;
|
||||
props->gid_tbl_len = rblock->gid_tbl_len;
|
||||
props->max_msg_sz = rblock->max_msg_sz;
|
||||
props->bad_pkey_cntr = rblock->bad_pkey_cntr;
|
||||
@@ -236,10 +237,60 @@ query_gid1:
|
||||
return ret;
|
||||
}
|
||||
|
||||
const u32 allowed_port_caps = (
|
||||
IB_PORT_SM | IB_PORT_LED_INFO_SUP | IB_PORT_CM_SUP |
|
||||
IB_PORT_SNMP_TUNNEL_SUP | IB_PORT_DEVICE_MGMT_SUP |
|
||||
IB_PORT_VENDOR_CLASS_SUP);
|
||||
|
||||
int ehca_modify_port(struct ib_device *ibdev,
|
||||
u8 port, int port_modify_mask,
|
||||
struct ib_port_modify *props)
|
||||
{
|
||||
/* Not implemented yet */
|
||||
return -EFAULT;
|
||||
int ret = 0;
|
||||
struct ehca_shca *shca = container_of(ibdev, struct ehca_shca, ib_device);
|
||||
struct hipz_query_port *rblock;
|
||||
u32 cap;
|
||||
u64 hret;
|
||||
|
||||
if ((props->set_port_cap_mask | props->clr_port_cap_mask)
|
||||
& ~allowed_port_caps) {
|
||||
ehca_err(&shca->ib_device, "Non-changeable bits set in masks "
|
||||
"set=%x clr=%x allowed=%x", props->set_port_cap_mask,
|
||||
props->clr_port_cap_mask, allowed_port_caps);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (mutex_lock_interruptible(&shca->modify_mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
rblock = ehca_alloc_fw_ctrlblock(GFP_KERNEL);
|
||||
if (!rblock) {
|
||||
ehca_err(&shca->ib_device, "Can't allocate rblock memory.");
|
||||
ret = -ENOMEM;
|
||||
goto modify_port1;
|
||||
}
|
||||
|
||||
if (hipz_h_query_port(shca->ipz_hca_handle, port, rblock) != H_SUCCESS) {
|
||||
ehca_err(&shca->ib_device, "Can't query port properties");
|
||||
ret = -EINVAL;
|
||||
goto modify_port2;
|
||||
}
|
||||
|
||||
cap = (rblock->capability_mask | props->set_port_cap_mask)
|
||||
& ~props->clr_port_cap_mask;
|
||||
|
||||
hret = hipz_h_modify_port(shca->ipz_hca_handle, port,
|
||||
cap, props->init_type, port_modify_mask);
|
||||
if (hret != H_SUCCESS) {
|
||||
ehca_err(&shca->ib_device, "Modify port failed hret=%lx", hret);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
modify_port2:
|
||||
ehca_free_fw_ctrlblock(rblock);
|
||||
|
||||
modify_port1:
|
||||
mutex_unlock(&shca->modify_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -587,6 +587,7 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev,
|
||||
ehca_gen_err("Cannot allocate shca memory.");
|
||||
return -ENOMEM;
|
||||
}
|
||||
mutex_init(&shca->modify_mutex);
|
||||
|
||||
shca->ibmebus_dev = dev;
|
||||
shca->ipz_hca_handle.handle = *handle;
|
||||
|
||||
@@ -70,6 +70,10 @@
|
||||
#define H_ALL_RES_QP_SQUEUE_SIZE_PAGES EHCA_BMASK_IBM(0, 31)
|
||||
#define H_ALL_RES_QP_RQUEUE_SIZE_PAGES EHCA_BMASK_IBM(32, 63)
|
||||
|
||||
#define H_MP_INIT_TYPE EHCA_BMASK_IBM(44, 47)
|
||||
#define H_MP_SHUTDOWN EHCA_BMASK_IBM(48, 48)
|
||||
#define H_MP_RESET_QKEY_CTR EHCA_BMASK_IBM(49, 49)
|
||||
|
||||
/* direct access qp controls */
|
||||
#define DAQP_CTRL_ENABLE 0x01
|
||||
#define DAQP_CTRL_SEND_COMP 0x20
|
||||
@@ -364,6 +368,26 @@ u64 hipz_h_query_port(const struct ipz_adapter_handle adapter_handle,
|
||||
return ret;
|
||||
}
|
||||
|
||||
u64 hipz_h_modify_port(const struct ipz_adapter_handle adapter_handle,
|
||||
const u8 port_id, const u32 port_cap,
|
||||
const u8 init_type, const int modify_mask)
|
||||
{
|
||||
u64 port_attributes = port_cap;
|
||||
|
||||
if (modify_mask & IB_PORT_SHUTDOWN)
|
||||
port_attributes |= EHCA_BMASK_SET(H_MP_SHUTDOWN, 1);
|
||||
if (modify_mask & IB_PORT_INIT_TYPE)
|
||||
port_attributes |= EHCA_BMASK_SET(H_MP_INIT_TYPE, init_type);
|
||||
if (modify_mask & IB_PORT_RESET_QKEY_CNTR)
|
||||
port_attributes |= EHCA_BMASK_SET(H_MP_RESET_QKEY_CTR, 1);
|
||||
|
||||
return ehca_plpar_hcall_norets(H_MODIFY_PORT,
|
||||
adapter_handle.handle, /* r4 */
|
||||
port_id, /* r5 */
|
||||
port_attributes, /* r6 */
|
||||
0, 0, 0, 0);
|
||||
}
|
||||
|
||||
u64 hipz_h_query_hca(const struct ipz_adapter_handle adapter_handle,
|
||||
struct hipz_query_hca *query_hca_rblock)
|
||||
{
|
||||
|
||||
@@ -85,6 +85,10 @@ u64 hipz_h_query_port(const struct ipz_adapter_handle adapter_handle,
|
||||
const u8 port_id,
|
||||
struct hipz_query_port *query_port_response_block);
|
||||
|
||||
u64 hipz_h_modify_port(const struct ipz_adapter_handle adapter_handle,
|
||||
const u8 port_id, const u32 port_cap,
|
||||
const u8 init_type, const int modify_mask);
|
||||
|
||||
u64 hipz_h_query_hca(const struct ipz_adapter_handle adapter_handle,
|
||||
struct hipz_query_hca *query_hca_rblock);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 QLogic, Inc. All rights reserved.
|
||||
* Copyright (c) 2006, 2007 QLogic Corporation. All rights reserved.
|
||||
* Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
@@ -78,6 +78,8 @@
|
||||
#define IPATH_IB_LINKINIT 3
|
||||
#define IPATH_IB_LINKDOWN_SLEEP 4
|
||||
#define IPATH_IB_LINKDOWN_DISABLE 5
|
||||
#define IPATH_IB_LINK_LOOPBACK 6 /* enable local loopback */
|
||||
#define IPATH_IB_LINK_EXTERNAL 7 /* normal, disable local loopback */
|
||||
|
||||
/*
|
||||
* stats maintained by the driver. For now, at least, this is global
|
||||
@@ -316,11 +318,17 @@ struct ipath_base_info {
|
||||
/* address of readonly memory copy of the rcvhdrq tail register. */
|
||||
__u64 spi_rcvhdr_tailaddr;
|
||||
|
||||
/* shared memory pages for subports if IPATH_RUNTIME_MASTER is set */
|
||||
/* shared memory pages for subports if port is shared */
|
||||
__u64 spi_subport_uregbase;
|
||||
__u64 spi_subport_rcvegrbuf;
|
||||
__u64 spi_subport_rcvhdr_base;
|
||||
|
||||
/* shared memory page for hardware port if it is shared */
|
||||
__u64 spi_port_uregbase;
|
||||
__u64 spi_port_rcvegrbuf;
|
||||
__u64 spi_port_rcvhdr_base;
|
||||
__u64 spi_port_rcvhdr_tailaddr;
|
||||
|
||||
} __attribute__ ((aligned(8)));
|
||||
|
||||
|
||||
@@ -344,7 +352,7 @@ struct ipath_base_info {
|
||||
* may not be implemented; the user code must deal with this if it
|
||||
* cares, or it must abort after initialization reports the difference.
|
||||
*/
|
||||
#define IPATH_USER_SWMINOR 3
|
||||
#define IPATH_USER_SWMINOR 5
|
||||
|
||||
#define IPATH_USER_SWVERSION ((IPATH_USER_SWMAJOR<<16) | IPATH_USER_SWMINOR)
|
||||
|
||||
@@ -418,11 +426,14 @@ struct ipath_user_info {
|
||||
#define IPATH_CMD_TID_UPDATE 19 /* update expected TID entries */
|
||||
#define IPATH_CMD_TID_FREE 20 /* free expected TID entries */
|
||||
#define IPATH_CMD_SET_PART_KEY 21 /* add partition key */
|
||||
#define IPATH_CMD_SLAVE_INFO 22 /* return info on slave processes */
|
||||
#define __IPATH_CMD_SLAVE_INFO 22 /* return info on slave processes (for old user code) */
|
||||
#define IPATH_CMD_ASSIGN_PORT 23 /* allocate HCA and port */
|
||||
#define IPATH_CMD_USER_INIT 24 /* set up userspace */
|
||||
#define IPATH_CMD_UNUSED_1 25
|
||||
#define IPATH_CMD_UNUSED_2 26
|
||||
#define IPATH_CMD_PIOAVAILUPD 27 /* force an update of PIOAvail reg */
|
||||
|
||||
#define IPATH_CMD_MAX 24
|
||||
#define IPATH_CMD_MAX 27
|
||||
|
||||
struct ipath_port_info {
|
||||
__u32 num_active; /* number of active units */
|
||||
@@ -430,7 +441,7 @@ struct ipath_port_info {
|
||||
__u16 port; /* port on unit assigned to caller */
|
||||
__u16 subport; /* subport on unit assigned to caller */
|
||||
__u16 num_ports; /* number of ports available on unit */
|
||||
__u16 num_subports; /* number of subport slaves opened on port */
|
||||
__u16 num_subports; /* number of subports opened on port */
|
||||
};
|
||||
|
||||
struct ipath_tid_info {
|
||||
|
||||
@@ -76,7 +76,20 @@ void ipath_cq_enter(struct ipath_cq *cq, struct ib_wc *entry, int solicited)
|
||||
}
|
||||
return;
|
||||
}
|
||||
wc->queue[head] = *entry;
|
||||
wc->queue[head].wr_id = entry->wr_id;
|
||||
wc->queue[head].status = entry->status;
|
||||
wc->queue[head].opcode = entry->opcode;
|
||||
wc->queue[head].vendor_err = entry->vendor_err;
|
||||
wc->queue[head].byte_len = entry->byte_len;
|
||||
wc->queue[head].imm_data = (__u32 __force)entry->imm_data;
|
||||
wc->queue[head].qp_num = entry->qp->qp_num;
|
||||
wc->queue[head].src_qp = entry->src_qp;
|
||||
wc->queue[head].wc_flags = entry->wc_flags;
|
||||
wc->queue[head].pkey_index = entry->pkey_index;
|
||||
wc->queue[head].slid = entry->slid;
|
||||
wc->queue[head].sl = entry->sl;
|
||||
wc->queue[head].dlid_path_bits = entry->dlid_path_bits;
|
||||
wc->queue[head].port_num = entry->port_num;
|
||||
wc->head = next;
|
||||
|
||||
if (cq->notify == IB_CQ_NEXT_COMP ||
|
||||
@@ -122,9 +135,30 @@ int ipath_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry)
|
||||
if (tail > (u32) cq->ibcq.cqe)
|
||||
tail = (u32) cq->ibcq.cqe;
|
||||
for (npolled = 0; npolled < num_entries; ++npolled, ++entry) {
|
||||
struct ipath_qp *qp;
|
||||
|
||||
if (tail == wc->head)
|
||||
break;
|
||||
*entry = wc->queue[tail];
|
||||
|
||||
qp = ipath_lookup_qpn(&to_idev(cq->ibcq.device)->qp_table,
|
||||
wc->queue[tail].qp_num);
|
||||
entry->qp = &qp->ibqp;
|
||||
if (atomic_dec_and_test(&qp->refcount))
|
||||
wake_up(&qp->wait);
|
||||
|
||||
entry->wr_id = wc->queue[tail].wr_id;
|
||||
entry->status = wc->queue[tail].status;
|
||||
entry->opcode = wc->queue[tail].opcode;
|
||||
entry->vendor_err = wc->queue[tail].vendor_err;
|
||||
entry->byte_len = wc->queue[tail].byte_len;
|
||||
entry->imm_data = wc->queue[tail].imm_data;
|
||||
entry->src_qp = wc->queue[tail].src_qp;
|
||||
entry->wc_flags = wc->queue[tail].wc_flags;
|
||||
entry->pkey_index = wc->queue[tail].pkey_index;
|
||||
entry->slid = wc->queue[tail].slid;
|
||||
entry->sl = wc->queue[tail].sl;
|
||||
entry->dlid_path_bits = wc->queue[tail].dlid_path_bits;
|
||||
entry->port_num = wc->queue[tail].port_num;
|
||||
if (tail >= cq->ibcq.cqe)
|
||||
tail = 0;
|
||||
else
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#define __IPATH_PROCDBG 0x100
|
||||
/* print mmap/nopage stuff, not using VDBG any more */
|
||||
#define __IPATH_MMDBG 0x200
|
||||
#define __IPATH_ERRPKTDBG 0x400
|
||||
#define __IPATH_USER_SEND 0x1000 /* use user mode send */
|
||||
#define __IPATH_KERNEL_SEND 0x2000 /* use kernel mode send */
|
||||
#define __IPATH_EPKTDBG 0x4000 /* print ethernet packet data */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user