Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
082eaa50
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
082eaa50
编写于
3月 16, 2016
作者:
D
Doug Ledford
浏览文件
操作
浏览文件
下载
差异文件
Merge branches 'nes', 'cxgb4' and 'iwpm' into k.o/for-4.6
上级
d2ad9cc7
a82268b3
3021376d
dafb5587
变更
23
展开全部
隐藏空白更改
内联
并排
Showing
23 changed file
with
442 addition
and
753 deletion
+442
-753
drivers/infiniband/core/iwcm.c
drivers/infiniband/core/iwcm.c
+164
-26
drivers/infiniband/core/iwpm_msg.c
drivers/infiniband/core/iwpm_msg.c
+6
-6
drivers/infiniband/core/iwpm_util.c
drivers/infiniband/core/iwpm_util.c
+7
-7
drivers/infiniband/core/iwpm_util.h
drivers/infiniband/core/iwpm_util.h
+1
-1
drivers/infiniband/hw/cxgb3/iwch_cm.c
drivers/infiniband/hw/cxgb3/iwch_cm.c
+8
-8
drivers/infiniband/hw/cxgb4/cm.c
drivers/infiniband/hw/cxgb4/cm.c
+80
-194
drivers/infiniband/hw/cxgb4/device.c
drivers/infiniband/hw/cxgb4/device.c
+22
-50
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
+0
-42
drivers/infiniband/hw/cxgb4/mem.c
drivers/infiniband/hw/cxgb4/mem.c
+5
-3
drivers/infiniband/hw/cxgb4/provider.c
drivers/infiniband/hw/cxgb4/provider.c
+2
-1
drivers/infiniband/hw/cxgb4/qp.c
drivers/infiniband/hw/cxgb4/qp.c
+46
-45
drivers/infiniband/hw/nes/Kconfig
drivers/infiniband/hw/nes/Kconfig
+0
-1
drivers/infiniband/hw/nes/nes.c
drivers/infiniband/hw/nes/nes.c
+0
-25
drivers/infiniband/hw/nes/nes_cm.c
drivers/infiniband/hw/nes/nes_cm.c
+86
-275
drivers/infiniband/hw/nes/nes_cm.h
drivers/infiniband/hw/nes/nes_cm.h
+2
-9
drivers/infiniband/hw/nes/nes_hw.c
drivers/infiniband/hw/nes/nes_hw.c
+1
-43
drivers/infiniband/hw/nes/nes_hw.h
drivers/infiniband/hw/nes/nes_hw.h
+0
-7
drivers/infiniband/hw/nes/nes_nic.c
drivers/infiniband/hw/nes/nes_nic.c
+0
-7
drivers/infiniband/hw/nes/nes_verbs.c
drivers/infiniband/hw/nes/nes_verbs.c
+2
-0
drivers/net/ethernet/chelsio/cxgb4/t4_msg.h
drivers/net/ethernet/chelsio/cxgb4/t4_msg.h
+2
-0
drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
+1
-0
include/rdma/iw_cm.h
include/rdma/iw_cm.h
+5
-1
include/uapi/rdma/rdma_netlink.h
include/uapi/rdma/rdma_netlink.h
+2
-2
未找到文件。
drivers/infiniband/core/iwcm.c
浏览文件 @
082eaa50
...
@@ -50,6 +50,8 @@
...
@@ -50,6 +50,8 @@
#include <rdma/iw_cm.h>
#include <rdma/iw_cm.h>
#include <rdma/ib_addr.h>
#include <rdma/ib_addr.h>
#include <rdma/iw_portmap.h>
#include <rdma/rdma_netlink.h>
#include "iwcm.h"
#include "iwcm.h"
...
@@ -57,6 +59,16 @@ MODULE_AUTHOR("Tom Tucker");
...
@@ -57,6 +59,16 @@ MODULE_AUTHOR("Tom Tucker");
MODULE_DESCRIPTION
(
"iWARP CM"
);
MODULE_DESCRIPTION
(
"iWARP CM"
);
MODULE_LICENSE
(
"Dual BSD/GPL"
);
MODULE_LICENSE
(
"Dual BSD/GPL"
);
static
struct
ibnl_client_cbs
iwcm_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_REMOTE_INFO
]
=
{.
dump
=
iwpm_remote_info_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
struct
workqueue_struct
*
iwcm_wq
;
static
struct
workqueue_struct
*
iwcm_wq
;
struct
iwcm_work
{
struct
iwcm_work
{
struct
work_struct
work
;
struct
work_struct
work
;
...
@@ -402,6 +414,11 @@ static void destroy_cm_id(struct iw_cm_id *cm_id)
...
@@ -402,6 +414,11 @@ static void destroy_cm_id(struct iw_cm_id *cm_id)
}
}
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
if
(
cm_id
->
mapped
)
{
iwpm_remove_mapinfo
(
&
cm_id
->
local_addr
,
&
cm_id
->
m_local_addr
);
iwpm_remove_mapping
(
&
cm_id
->
local_addr
,
RDMA_NL_IWCM
);
}
(
void
)
iwcm_deref_id
(
cm_id_priv
);
(
void
)
iwcm_deref_id
(
cm_id_priv
);
}
}
...
@@ -426,6 +443,97 @@ void iw_destroy_cm_id(struct iw_cm_id *cm_id)
...
@@ -426,6 +443,97 @@ void iw_destroy_cm_id(struct iw_cm_id *cm_id)
}
}
EXPORT_SYMBOL
(
iw_destroy_cm_id
);
EXPORT_SYMBOL
(
iw_destroy_cm_id
);
/**
* iw_cm_check_wildcard - If IP address is 0 then use original
* @pm_addr: sockaddr containing the ip to check for wildcard
* @cm_addr: sockaddr containing the actual IP address
* @cm_outaddr: sockaddr to set IP addr which leaving port
*
* Checks the pm_addr for wildcard and then sets cm_outaddr's
* IP to the actual (cm_addr).
*/
static
void
iw_cm_check_wildcard
(
struct
sockaddr_storage
*
pm_addr
,
struct
sockaddr_storage
*
cm_addr
,
struct
sockaddr_storage
*
cm_outaddr
)
{
if
(
pm_addr
->
ss_family
==
AF_INET
)
{
struct
sockaddr_in
*
pm4_addr
=
(
struct
sockaddr_in
*
)
pm_addr
;
if
(
pm4_addr
->
sin_addr
.
s_addr
==
INADDR_ANY
)
{
struct
sockaddr_in
*
cm4_addr
=
(
struct
sockaddr_in
*
)
cm_addr
;
struct
sockaddr_in
*
cm4_outaddr
=
(
struct
sockaddr_in
*
)
cm_outaddr
;
cm4_outaddr
->
sin_addr
=
cm4_addr
->
sin_addr
;
}
}
else
{
struct
sockaddr_in6
*
pm6_addr
=
(
struct
sockaddr_in6
*
)
pm_addr
;
if
(
ipv6_addr_type
(
&
pm6_addr
->
sin6_addr
)
==
IPV6_ADDR_ANY
)
{
struct
sockaddr_in6
*
cm6_addr
=
(
struct
sockaddr_in6
*
)
cm_addr
;
struct
sockaddr_in6
*
cm6_outaddr
=
(
struct
sockaddr_in6
*
)
cm_outaddr
;
cm6_outaddr
->
sin6_addr
=
cm6_addr
->
sin6_addr
;
}
}
}
/**
* iw_cm_map - Use portmapper to map the ports
* @cm_id: connection manager pointer
* @active: Indicates the active side when true
* returns nonzero for error only if iwpm_create_mapinfo() fails
*
* Tries to add a mapping for a port using the Portmapper. If
* successful in mapping the IP/Port it will check the remote
* mapped IP address for a wildcard IP address and replace the
* zero IP address with the remote_addr.
*/
static
int
iw_cm_map
(
struct
iw_cm_id
*
cm_id
,
bool
active
)
{
struct
iwpm_dev_data
pm_reg_msg
;
struct
iwpm_sa_data
pm_msg
;
int
status
;
cm_id
->
m_local_addr
=
cm_id
->
local_addr
;
cm_id
->
m_remote_addr
=
cm_id
->
remote_addr
;
memcpy
(
pm_reg_msg
.
dev_name
,
cm_id
->
device
->
name
,
sizeof
(
pm_reg_msg
.
dev_name
));
memcpy
(
pm_reg_msg
.
if_name
,
cm_id
->
device
->
iwcm
->
ifname
,
sizeof
(
pm_reg_msg
.
if_name
));
if
(
iwpm_register_pid
(
&
pm_reg_msg
,
RDMA_NL_IWCM
)
||
!
iwpm_valid_pid
())
return
0
;
cm_id
->
mapped
=
true
;
pm_msg
.
loc_addr
=
cm_id
->
local_addr
;
pm_msg
.
rem_addr
=
cm_id
->
remote_addr
;
if
(
active
)
status
=
iwpm_add_and_query_mapping
(
&
pm_msg
,
RDMA_NL_IWCM
);
else
status
=
iwpm_add_mapping
(
&
pm_msg
,
RDMA_NL_IWCM
);
if
(
!
status
)
{
cm_id
->
m_local_addr
=
pm_msg
.
mapped_loc_addr
;
if
(
active
)
{
cm_id
->
m_remote_addr
=
pm_msg
.
mapped_rem_addr
;
iw_cm_check_wildcard
(
&
pm_msg
.
mapped_rem_addr
,
&
cm_id
->
remote_addr
,
&
cm_id
->
m_remote_addr
);
}
}
return
iwpm_create_mapinfo
(
&
cm_id
->
local_addr
,
&
cm_id
->
m_local_addr
,
RDMA_NL_IWCM
);
}
/*
/*
* CM_ID <-- LISTEN
* CM_ID <-- LISTEN
*
*
...
@@ -452,7 +560,9 @@ int iw_cm_listen(struct iw_cm_id *cm_id, int backlog)
...
@@ -452,7 +560,9 @@ int iw_cm_listen(struct iw_cm_id *cm_id, int backlog)
case
IW_CM_STATE_IDLE
:
case
IW_CM_STATE_IDLE
:
cm_id_priv
->
state
=
IW_CM_STATE_LISTEN
;
cm_id_priv
->
state
=
IW_CM_STATE_LISTEN
;
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
ret
=
cm_id
->
device
->
iwcm
->
create_listen
(
cm_id
,
backlog
);
ret
=
iw_cm_map
(
cm_id
,
false
);
if
(
!
ret
)
ret
=
cm_id
->
device
->
iwcm
->
create_listen
(
cm_id
,
backlog
);
if
(
ret
)
if
(
ret
)
cm_id_priv
->
state
=
IW_CM_STATE_IDLE
;
cm_id_priv
->
state
=
IW_CM_STATE_IDLE
;
spin_lock_irqsave
(
&
cm_id_priv
->
lock
,
flags
);
spin_lock_irqsave
(
&
cm_id_priv
->
lock
,
flags
);
...
@@ -582,39 +692,37 @@ int iw_cm_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param)
...
@@ -582,39 +692,37 @@ int iw_cm_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *iw_param)
spin_lock_irqsave
(
&
cm_id_priv
->
lock
,
flags
);
spin_lock_irqsave
(
&
cm_id_priv
->
lock
,
flags
);
if
(
cm_id_priv
->
state
!=
IW_CM_STATE_IDLE
)
{
if
(
cm_id_priv
->
state
!=
IW_CM_STATE_IDLE
)
{
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
ret
=
-
EINVAL
;
clear_bit
(
IWCM_F_CONNECT_WAIT
,
&
cm_id_priv
->
flags
);
goto
err
;
wake_up_all
(
&
cm_id_priv
->
connect_wait
);
return
-
EINVAL
;
}
}
/* Get the ib_qp given the QPN */
/* Get the ib_qp given the QPN */
qp
=
cm_id
->
device
->
iwcm
->
get_qp
(
cm_id
->
device
,
iw_param
->
qpn
);
qp
=
cm_id
->
device
->
iwcm
->
get_qp
(
cm_id
->
device
,
iw_param
->
qpn
);
if
(
!
qp
)
{
if
(
!
qp
)
{
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
ret
=
-
EINVAL
;
clear_bit
(
IWCM_F_CONNECT_WAIT
,
&
cm_id_priv
->
flags
);
goto
err
;
wake_up_all
(
&
cm_id_priv
->
connect_wait
);
return
-
EINVAL
;
}
}
cm_id
->
device
->
iwcm
->
add_ref
(
qp
);
cm_id
->
device
->
iwcm
->
add_ref
(
qp
);
cm_id_priv
->
qp
=
qp
;
cm_id_priv
->
qp
=
qp
;
cm_id_priv
->
state
=
IW_CM_STATE_CONN_SENT
;
cm_id_priv
->
state
=
IW_CM_STATE_CONN_SENT
;
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
ret
=
cm_id
->
device
->
iwcm
->
connect
(
cm_id
,
iw_param
);
ret
=
iw_cm_map
(
cm_id
,
true
);
if
(
ret
)
{
if
(
!
ret
)
spin_lock_irqsave
(
&
cm_id_priv
->
lock
,
flags
);
ret
=
cm_id
->
device
->
iwcm
->
connect
(
cm_id
,
iw_param
);
if
(
cm_id_priv
->
qp
)
{
if
(
!
ret
)
cm_id
->
device
->
iwcm
->
rem_ref
(
qp
);
return
0
;
/* success */
cm_id_priv
->
qp
=
NULL
;
}
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
BUG_ON
(
cm_id_priv
->
state
!=
IW_CM_STATE_CONN_SENT
);
cm_id_priv
->
state
=
IW_CM_STATE_IDLE
;
clear_bit
(
IWCM_F_CONNECT_WAIT
,
&
cm_id_priv
->
flags
);
wake_up_all
(
&
cm_id_priv
->
connect_wait
);
}
spin_lock_irqsave
(
&
cm_id_priv
->
lock
,
flags
);
if
(
cm_id_priv
->
qp
)
{
cm_id
->
device
->
iwcm
->
rem_ref
(
qp
);
cm_id_priv
->
qp
=
NULL
;
}
cm_id_priv
->
state
=
IW_CM_STATE_IDLE
;
err:
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
clear_bit
(
IWCM_F_CONNECT_WAIT
,
&
cm_id_priv
->
flags
);
wake_up_all
(
&
cm_id_priv
->
connect_wait
);
return
ret
;
return
ret
;
}
}
EXPORT_SYMBOL
(
iw_cm_connect
);
EXPORT_SYMBOL
(
iw_cm_connect
);
...
@@ -656,8 +764,23 @@ static void cm_conn_req_handler(struct iwcm_id_private *listen_id_priv,
...
@@ -656,8 +764,23 @@ static void cm_conn_req_handler(struct iwcm_id_private *listen_id_priv,
goto
out
;
goto
out
;
cm_id
->
provider_data
=
iw_event
->
provider_data
;
cm_id
->
provider_data
=
iw_event
->
provider_data
;
cm_id
->
local_addr
=
iw_event
->
local_addr
;
cm_id
->
m_local_addr
=
iw_event
->
local_addr
;
cm_id
->
remote_addr
=
iw_event
->
remote_addr
;
cm_id
->
m_remote_addr
=
iw_event
->
remote_addr
;
cm_id
->
local_addr
=
listen_id_priv
->
id
.
local_addr
;
ret
=
iwpm_get_remote_info
(
&
listen_id_priv
->
id
.
m_local_addr
,
&
iw_event
->
remote_addr
,
&
cm_id
->
remote_addr
,
RDMA_NL_IWCM
);
if
(
ret
)
{
cm_id
->
remote_addr
=
iw_event
->
remote_addr
;
}
else
{
iw_cm_check_wildcard
(
&
listen_id_priv
->
id
.
m_local_addr
,
&
iw_event
->
local_addr
,
&
cm_id
->
local_addr
);
iw_event
->
local_addr
=
cm_id
->
local_addr
;
iw_event
->
remote_addr
=
cm_id
->
remote_addr
;
}
cm_id_priv
=
container_of
(
cm_id
,
struct
iwcm_id_private
,
id
);
cm_id_priv
=
container_of
(
cm_id
,
struct
iwcm_id_private
,
id
);
cm_id_priv
->
state
=
IW_CM_STATE_CONN_RECV
;
cm_id_priv
->
state
=
IW_CM_STATE_CONN_RECV
;
...
@@ -753,8 +876,10 @@ static int cm_conn_rep_handler(struct iwcm_id_private *cm_id_priv,
...
@@ -753,8 +876,10 @@ static int cm_conn_rep_handler(struct iwcm_id_private *cm_id_priv,
clear_bit
(
IWCM_F_CONNECT_WAIT
,
&
cm_id_priv
->
flags
);
clear_bit
(
IWCM_F_CONNECT_WAIT
,
&
cm_id_priv
->
flags
);
BUG_ON
(
cm_id_priv
->
state
!=
IW_CM_STATE_CONN_SENT
);
BUG_ON
(
cm_id_priv
->
state
!=
IW_CM_STATE_CONN_SENT
);
if
(
iw_event
->
status
==
0
)
{
if
(
iw_event
->
status
==
0
)
{
cm_id_priv
->
id
.
local_addr
=
iw_event
->
local_addr
;
cm_id_priv
->
id
.
m_local_addr
=
iw_event
->
local_addr
;
cm_id_priv
->
id
.
remote_addr
=
iw_event
->
remote_addr
;
cm_id_priv
->
id
.
m_remote_addr
=
iw_event
->
remote_addr
;
iw_event
->
local_addr
=
cm_id_priv
->
id
.
local_addr
;
iw_event
->
remote_addr
=
cm_id_priv
->
id
.
remote_addr
;
cm_id_priv
->
state
=
IW_CM_STATE_ESTABLISHED
;
cm_id_priv
->
state
=
IW_CM_STATE_ESTABLISHED
;
}
else
{
}
else
{
/* REJECTED or RESET */
/* REJECTED or RESET */
...
@@ -1044,6 +1169,17 @@ EXPORT_SYMBOL(iw_cm_init_qp_attr);
...
@@ -1044,6 +1169,17 @@ EXPORT_SYMBOL(iw_cm_init_qp_attr);
static
int
__init
iw_cm_init
(
void
)
static
int
__init
iw_cm_init
(
void
)
{
{
int
ret
;
ret
=
iwpm_init
(
RDMA_NL_IWCM
);
if
(
ret
)
pr_err
(
"iw_cm: couldn't init iwpm
\n
"
);
ret
=
ibnl_add_client
(
RDMA_NL_IWCM
,
RDMA_NL_IWPM_NUM_OPS
,
iwcm_nl_cb_table
);
if
(
ret
)
pr_err
(
"iw_cm: couldn't register netlink callbacks
\n
"
);
iwcm_wq
=
create_singlethread_workqueue
(
"iw_cm_wq"
);
iwcm_wq
=
create_singlethread_workqueue
(
"iw_cm_wq"
);
if
(
!
iwcm_wq
)
if
(
!
iwcm_wq
)
return
-
ENOMEM
;
return
-
ENOMEM
;
...
@@ -1063,6 +1199,8 @@ static void __exit iw_cm_cleanup(void)
...
@@ -1063,6 +1199,8 @@ static void __exit iw_cm_cleanup(void)
{
{
unregister_net_sysctl_table
(
iwcm_ctl_table_hdr
);
unregister_net_sysctl_table
(
iwcm_ctl_table_hdr
);
destroy_workqueue
(
iwcm_wq
);
destroy_workqueue
(
iwcm_wq
);
ibnl_remove_client
(
RDMA_NL_IWCM
);
iwpm_exit
(
RDMA_NL_IWCM
);
}
}
module_init
(
iw_cm_init
);
module_init
(
iw_cm_init
);
...
...
drivers/infiniband/core/iwpm_msg.c
浏览文件 @
082eaa50
...
@@ -88,8 +88,8 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client)
...
@@ -88,8 +88,8 @@ int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client)
ret
=
ibnl_put_attr
(
skb
,
nlh
,
sizeof
(
u32
),
&
msg_seq
,
IWPM_NLA_REG_PID_SEQ
);
ret
=
ibnl_put_attr
(
skb
,
nlh
,
sizeof
(
u32
),
&
msg_seq
,
IWPM_NLA_REG_PID_SEQ
);
if
(
ret
)
if
(
ret
)
goto
pid_query_error
;
goto
pid_query_error
;
ret
=
ibnl_put_attr
(
skb
,
nlh
,
I
WPM_IFNAME_SIZE
,
ret
=
ibnl_put_attr
(
skb
,
nlh
,
I
FNAMSIZ
,
pm_msg
->
if_name
,
IWPM_NLA_REG_IF_NAME
);
pm_msg
->
if_name
,
IWPM_NLA_REG_IF_NAME
);
if
(
ret
)
if
(
ret
)
goto
pid_query_error
;
goto
pid_query_error
;
ret
=
ibnl_put_attr
(
skb
,
nlh
,
IWPM_DEVNAME_SIZE
,
ret
=
ibnl_put_attr
(
skb
,
nlh
,
IWPM_DEVNAME_SIZE
,
...
@@ -394,7 +394,7 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb)
...
@@ -394,7 +394,7 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb)
/* always for found nlmsg_request */
/* always for found nlmsg_request */
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
barrier
();
barrier
();
wake_up
(
&
nlmsg_request
->
waitq
);
up
(
&
nlmsg_request
->
sem
);
return
0
;
return
0
;
}
}
EXPORT_SYMBOL
(
iwpm_register_pid_cb
);
EXPORT_SYMBOL
(
iwpm_register_pid_cb
);
...
@@ -463,7 +463,7 @@ int iwpm_add_mapping_cb(struct sk_buff *skb, struct netlink_callback *cb)
...
@@ -463,7 +463,7 @@ int iwpm_add_mapping_cb(struct sk_buff *skb, struct netlink_callback *cb)
/* always for found request */
/* always for found request */
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
barrier
();
barrier
();
wake_up
(
&
nlmsg_request
->
waitq
);
up
(
&
nlmsg_request
->
sem
);
return
0
;
return
0
;
}
}
EXPORT_SYMBOL
(
iwpm_add_mapping_cb
);
EXPORT_SYMBOL
(
iwpm_add_mapping_cb
);
...
@@ -555,7 +555,7 @@ int iwpm_add_and_query_mapping_cb(struct sk_buff *skb,
...
@@ -555,7 +555,7 @@ int iwpm_add_and_query_mapping_cb(struct sk_buff *skb,
/* always for found request */
/* always for found request */
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
barrier
();
barrier
();
wake_up
(
&
nlmsg_request
->
waitq
);
up
(
&
nlmsg_request
->
sem
);
return
0
;
return
0
;
}
}
EXPORT_SYMBOL
(
iwpm_add_and_query_mapping_cb
);
EXPORT_SYMBOL
(
iwpm_add_and_query_mapping_cb
);
...
@@ -749,7 +749,7 @@ int iwpm_mapping_error_cb(struct sk_buff *skb, struct netlink_callback *cb)
...
@@ -749,7 +749,7 @@ int iwpm_mapping_error_cb(struct sk_buff *skb, struct netlink_callback *cb)
/* always for found request */
/* always for found request */
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
barrier
();
barrier
();
wake_up
(
&
nlmsg_request
->
waitq
);
up
(
&
nlmsg_request
->
sem
);
return
0
;
return
0
;
}
}
EXPORT_SYMBOL
(
iwpm_mapping_error_cb
);
EXPORT_SYMBOL
(
iwpm_mapping_error_cb
);
drivers/infiniband/core/iwpm_util.c
浏览文件 @
082eaa50
...
@@ -254,9 +254,9 @@ void iwpm_add_remote_info(struct iwpm_remote_info *rem_info)
...
@@ -254,9 +254,9 @@ void iwpm_add_remote_info(struct iwpm_remote_info *rem_info)
}
}
int
iwpm_get_remote_info
(
struct
sockaddr_storage
*
mapped_loc_addr
,
int
iwpm_get_remote_info
(
struct
sockaddr_storage
*
mapped_loc_addr
,
struct
sockaddr_storage
*
mapped_rem_addr
,
struct
sockaddr_storage
*
mapped_rem_addr
,
struct
sockaddr_storage
*
remote_addr
,
struct
sockaddr_storage
*
remote_addr
,
u8
nl_client
)
u8
nl_client
)
{
{
struct
hlist_node
*
tmp_hlist_node
;
struct
hlist_node
*
tmp_hlist_node
;
struct
hlist_head
*
hash_bucket_head
;
struct
hlist_head
*
hash_bucket_head
;
...
@@ -322,6 +322,8 @@ struct iwpm_nlmsg_request *iwpm_get_nlmsg_request(__u32 nlmsg_seq,
...
@@ -322,6 +322,8 @@ struct iwpm_nlmsg_request *iwpm_get_nlmsg_request(__u32 nlmsg_seq,
nlmsg_request
->
nl_client
=
nl_client
;
nlmsg_request
->
nl_client
=
nl_client
;
nlmsg_request
->
request_done
=
0
;
nlmsg_request
->
request_done
=
0
;
nlmsg_request
->
err_code
=
0
;
nlmsg_request
->
err_code
=
0
;
sema_init
(
&
nlmsg_request
->
sem
,
1
);
down
(
&
nlmsg_request
->
sem
);
return
nlmsg_request
;
return
nlmsg_request
;
}
}
...
@@ -364,11 +366,9 @@ struct iwpm_nlmsg_request *iwpm_find_nlmsg_request(__u32 echo_seq)
...
@@ -364,11 +366,9 @@ struct iwpm_nlmsg_request *iwpm_find_nlmsg_request(__u32 echo_seq)
int
iwpm_wait_complete_req
(
struct
iwpm_nlmsg_request
*
nlmsg_request
)
int
iwpm_wait_complete_req
(
struct
iwpm_nlmsg_request
*
nlmsg_request
)
{
{
int
ret
;
int
ret
;
init_waitqueue_head
(
&
nlmsg_request
->
waitq
);
ret
=
wait_event_timeout
(
nlmsg_request
->
waitq
,
ret
=
down_timeout
(
&
nlmsg_request
->
sem
,
IWPM_NL_TIMEOUT
);
(
nlmsg_request
->
request_done
!=
0
),
IWPM_NL_TIMEOUT
);
if
(
ret
)
{
if
(
!
ret
)
{
ret
=
-
EINVAL
;
ret
=
-
EINVAL
;
pr_info
(
"%s: Timeout %d sec for netlink request (seq = %u)
\n
"
,
pr_info
(
"%s: Timeout %d sec for netlink request (seq = %u)
\n
"
,
__func__
,
(
IWPM_NL_TIMEOUT
/
HZ
),
nlmsg_request
->
nlmsg_seq
);
__func__
,
(
IWPM_NL_TIMEOUT
/
HZ
),
nlmsg_request
->
nlmsg_seq
);
...
...
drivers/infiniband/core/iwpm_util.h
浏览文件 @
082eaa50
...
@@ -69,7 +69,7 @@ struct iwpm_nlmsg_request {
...
@@ -69,7 +69,7 @@ struct iwpm_nlmsg_request {
u8
nl_client
;
u8
nl_client
;
u8
request_done
;
u8
request_done
;
u16
err_code
;
u16
err_code
;
wait_queue_head_t
waitq
;
struct
semaphore
sem
;
struct
kref
kref
;
struct
kref
kref
;
};
};
...
...
drivers/infiniband/hw/cxgb3/iwch_cm.c
浏览文件 @
082eaa50
...
@@ -1877,7 +1877,7 @@ int iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
...
@@ -1877,7 +1877,7 @@ int iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
static
int
is_loopback_dst
(
struct
iw_cm_id
*
cm_id
)
static
int
is_loopback_dst
(
struct
iw_cm_id
*
cm_id
)
{
{
struct
net_device
*
dev
;
struct
net_device
*
dev
;
struct
sockaddr_in
*
raddr
=
(
struct
sockaddr_in
*
)
&
cm_id
->
remote_addr
;
struct
sockaddr_in
*
raddr
=
(
struct
sockaddr_in
*
)
&
cm_id
->
m_
remote_addr
;
dev
=
ip_dev_find
(
&
init_net
,
raddr
->
sin_addr
.
s_addr
);
dev
=
ip_dev_find
(
&
init_net
,
raddr
->
sin_addr
.
s_addr
);
if
(
!
dev
)
if
(
!
dev
)
...
@@ -1892,10 +1892,10 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
...
@@ -1892,10 +1892,10 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
struct
iwch_ep
*
ep
;
struct
iwch_ep
*
ep
;
struct
rtable
*
rt
;
struct
rtable
*
rt
;
int
err
=
0
;
int
err
=
0
;
struct
sockaddr_in
*
laddr
=
(
struct
sockaddr_in
*
)
&
cm_id
->
local_addr
;
struct
sockaddr_in
*
laddr
=
(
struct
sockaddr_in
*
)
&
cm_id
->
m_
local_addr
;
struct
sockaddr_in
*
raddr
=
(
struct
sockaddr_in
*
)
&
cm_id
->
remote_addr
;
struct
sockaddr_in
*
raddr
=
(
struct
sockaddr_in
*
)
&
cm_id
->
m_
remote_addr
;
if
(
cm_id
->
remote_addr
.
ss_family
!=
PF_INET
)
{
if
(
cm_id
->
m_
remote_addr
.
ss_family
!=
PF_INET
)
{
err
=
-
ENOSYS
;
err
=
-
ENOSYS
;
goto
out
;
goto
out
;
}
}
...
@@ -1961,9 +1961,9 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
...
@@ -1961,9 +1961,9 @@ int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
state_set
(
&
ep
->
com
,
CONNECTING
);
state_set
(
&
ep
->
com
,
CONNECTING
);
ep
->
tos
=
IPTOS_LOWDELAY
;
ep
->
tos
=
IPTOS_LOWDELAY
;
memcpy
(
&
ep
->
com
.
local_addr
,
&
cm_id
->
local_addr
,
memcpy
(
&
ep
->
com
.
local_addr
,
&
cm_id
->
m_
local_addr
,
sizeof
(
ep
->
com
.
local_addr
));
sizeof
(
ep
->
com
.
local_addr
));
memcpy
(
&
ep
->
com
.
remote_addr
,
&
cm_id
->
remote_addr
,
memcpy
(
&
ep
->
com
.
remote_addr
,
&
cm_id
->
m_
remote_addr
,
sizeof
(
ep
->
com
.
remote_addr
));
sizeof
(
ep
->
com
.
remote_addr
));
/* send connect request to rnic */
/* send connect request to rnic */
...
@@ -1992,7 +1992,7 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog)
...
@@ -1992,7 +1992,7 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog)
might_sleep
();
might_sleep
();
if
(
cm_id
->
local_addr
.
ss_family
!=
PF_INET
)
{
if
(
cm_id
->
m_
local_addr
.
ss_family
!=
PF_INET
)
{
err
=
-
ENOSYS
;
err
=
-
ENOSYS
;
goto
fail1
;
goto
fail1
;
}
}
...
@@ -2008,7 +2008,7 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog)
...
@@ -2008,7 +2008,7 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog)
cm_id
->
add_ref
(
cm_id
);
cm_id
->
add_ref
(
cm_id
);
ep
->
com
.
cm_id
=
cm_id
;
ep
->
com
.
cm_id
=
cm_id
;
ep
->
backlog
=
backlog
;
ep
->
backlog
=
backlog
;
memcpy
(
&
ep
->
com
.
local_addr
,
&
cm_id
->
local_addr
,
memcpy
(
&
ep
->
com
.
local_addr
,
&
cm_id
->
m_
local_addr
,
sizeof
(
ep
->
com
.
local_addr
));
sizeof
(
ep
->
com
.
local_addr
));
/*
/*
...
...
drivers/infiniband/hw/cxgb4/cm.c
浏览文件 @
082eaa50
此差异已折叠。
点击以展开。
drivers/infiniband/hw/cxgb4/device.c
浏览文件 @
082eaa50
...
@@ -87,17 +87,6 @@ struct c4iw_debugfs_data {
...
@@ -87,17 +87,6 @@ struct c4iw_debugfs_data {
int
pos
;
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_REMOTE_INFO
]
=
{.
dump
=
iwpm_remote_info_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
)
static
int
count_idrs
(
int
id
,
void
*
p
,
void
*
data
)
{
{
int
*
countp
=
data
;
int
*
countp
=
data
;
...
@@ -242,13 +231,13 @@ static int dump_qp(int id, void *p, void *data)
...
@@ -242,13 +231,13 @@ static int dump_qp(int id, void *p, void *data)
if
(
qp
->
ep
)
{
if
(
qp
->
ep
)
{
if
(
qp
->
ep
->
com
.
local_addr
.
ss_family
==
AF_INET
)
{
if
(
qp
->
ep
->
com
.
local_addr
.
ss_family
==
AF_INET
)
{
struct
sockaddr_in
*
lsin
=
(
struct
sockaddr_in
*
)
struct
sockaddr_in
*
lsin
=
(
struct
sockaddr_in
*
)
&
qp
->
ep
->
com
.
local_addr
;
&
qp
->
ep
->
com
.
cm_id
->
local_addr
;
struct
sockaddr_in
*
rsin
=
(
struct
sockaddr_in
*
)
struct
sockaddr_in
*
rsin
=
(
struct
sockaddr_in
*
)
&
qp
->
ep
->
com
.
remote_addr
;
&
qp
->
ep
->
com
.
cm_id
->
remote_addr
;
struct
sockaddr_in
*
mapped_lsin
=
(
struct
sockaddr_in
*
)
struct
sockaddr_in
*
mapped_lsin
=
(
struct
sockaddr_in
*
)
&
qp
->
ep
->
com
.
mapped
_local_addr
;
&
qp
->
ep
->
com
.
cm_id
->
m
_local_addr
;
struct
sockaddr_in
*
mapped_rsin
=
(
struct
sockaddr_in
*
)
struct
sockaddr_in
*
mapped_rsin
=
(
struct
sockaddr_in
*
)
&
qp
->
ep
->
com
.
mapped
_remote_addr
;
&
qp
->
ep
->
com
.
cm_id
->
m
_remote_addr
;
cc
=
snprintf
(
qpd
->
buf
+
qpd
->
pos
,
space
,
cc
=
snprintf
(
qpd
->
buf
+
qpd
->
pos
,
space
,
"rc qp sq id %u rq id %u state %u "
"rc qp sq id %u rq id %u state %u "
...
@@ -264,15 +253,15 @@ static int dump_qp(int id, void *p, void *data)
...
@@ -264,15 +253,15 @@ static int dump_qp(int id, void *p, void *data)
ntohs
(
mapped_rsin
->
sin_port
));
ntohs
(
mapped_rsin
->
sin_port
));
}
else
{
}
else
{
struct
sockaddr_in6
*
lsin6
=
(
struct
sockaddr_in6
*
)
struct
sockaddr_in6
*
lsin6
=
(
struct
sockaddr_in6
*
)
&
qp
->
ep
->
com
.
local_addr
;
&
qp
->
ep
->
com
.
cm_id
->
local_addr
;
struct
sockaddr_in6
*
rsin6
=
(
struct
sockaddr_in6
*
)
struct
sockaddr_in6
*
rsin6
=
(
struct
sockaddr_in6
*
)
&
qp
->
ep
->
com
.
remote_addr
;
&
qp
->
ep
->
com
.
cm_id
->
remote_addr
;
struct
sockaddr_in6
*
mapped_lsin6
=
struct
sockaddr_in6
*
mapped_lsin6
=
(
struct
sockaddr_in6
*
)
(
struct
sockaddr_in6
*
)
&
qp
->
ep
->
com
.
mapped
_local_addr
;
&
qp
->
ep
->
com
.
cm_id
->
m
_local_addr
;
struct
sockaddr_in6
*
mapped_rsin6
=
struct
sockaddr_in6
*
mapped_rsin6
=
(
struct
sockaddr_in6
*
)
(
struct
sockaddr_in6
*
)
&
qp
->
ep
->
com
.
mapped
_remote_addr
;
&
qp
->
ep
->
com
.
cm_id
->
m
_remote_addr
;
cc
=
snprintf
(
qpd
->
buf
+
qpd
->
pos
,
space
,
cc
=
snprintf
(
qpd
->
buf
+
qpd
->
pos
,
space
,
"rc qp sq id %u rq id %u state %u "
"rc qp sq id %u rq id %u state %u "
...
@@ -545,13 +534,13 @@ static int dump_ep(int id, void *p, void *data)
...
@@ -545,13 +534,13 @@ static int dump_ep(int id, void *p, void *data)
if
(
ep
->
com
.
local_addr
.
ss_family
==
AF_INET
)
{
if
(
ep
->
com
.
local_addr
.
ss_family
==
AF_INET
)
{
struct
sockaddr_in
*
lsin
=
(
struct
sockaddr_in
*
)
struct
sockaddr_in
*
lsin
=
(
struct
sockaddr_in
*
)
&
ep
->
com
.
local_addr
;
&
ep
->
com
.
cm_id
->
local_addr
;
struct
sockaddr_in
*
rsin
=
(
struct
sockaddr_in
*
)
struct
sockaddr_in
*
rsin
=
(
struct
sockaddr_in
*
)
&
ep
->
com
.
remote_addr
;
&
ep
->
com
.
cm_id
->
remote_addr
;
struct
sockaddr_in
*
mapped_lsin
=
(
struct
sockaddr_in
*
)
struct
sockaddr_in
*
mapped_lsin
=
(
struct
sockaddr_in
*
)
&
ep
->
com
.
mapped
_local_addr
;
&
ep
->
com
.
cm_id
->
m
_local_addr
;
struct
sockaddr_in
*
mapped_rsin
=
(
struct
sockaddr_in
*
)
struct
sockaddr_in
*
mapped_rsin
=
(
struct
sockaddr_in
*
)
&
ep
->
com
.
mapped
_remote_addr
;
&
ep
->
com
.
cm_id
->
m
_remote_addr
;
cc
=
snprintf
(
epd
->
buf
+
epd
->
pos
,
space
,
cc
=
snprintf
(
epd
->
buf
+
epd
->
pos
,
space
,
"ep %p cm_id %p qp %p state %d flags 0x%lx "
"ep %p cm_id %p qp %p state %d flags 0x%lx "
...
@@ -569,13 +558,13 @@ static int dump_ep(int id, void *p, void *data)
...
@@ -569,13 +558,13 @@ static int dump_ep(int id, void *p, void *data)
ntohs
(
mapped_rsin
->
sin_port
));
ntohs
(
mapped_rsin
->
sin_port
));
}
else
{
}
else
{
struct
sockaddr_in6
*
lsin6
=
(
struct
sockaddr_in6
*
)
struct
sockaddr_in6
*
lsin6
=
(
struct
sockaddr_in6
*
)
&
ep
->
com
.
local_addr
;
&
ep
->
com
.
cm_id
->
local_addr
;
struct
sockaddr_in6
*
rsin6
=
(
struct
sockaddr_in6
*
)
struct
sockaddr_in6
*
rsin6
=
(
struct
sockaddr_in6
*
)
&
ep
->
com
.
remote_addr
;
&
ep
->
com
.
cm_id
->
remote_addr
;
struct
sockaddr_in6
*
mapped_lsin6
=
(
struct
sockaddr_in6
*
)
struct
sockaddr_in6
*
mapped_lsin6
=
(
struct
sockaddr_in6
*
)
&
ep
->
com
.
mapped
_local_addr
;
&
ep
->
com
.
cm_id
->
m
_local_addr
;
struct
sockaddr_in6
*
mapped_rsin6
=
(
struct
sockaddr_in6
*
)
struct
sockaddr_in6
*
mapped_rsin6
=
(
struct
sockaddr_in6
*
)
&
ep
->
com
.
mapped
_remote_addr
;
&
ep
->
com
.
cm_id
->
m
_remote_addr
;
cc
=
snprintf
(
epd
->
buf
+
epd
->
pos
,
space
,
cc
=
snprintf
(
epd
->
buf
+
epd
->
pos
,
space
,
"ep %p cm_id %p qp %p state %d flags 0x%lx "
"ep %p cm_id %p qp %p state %d flags 0x%lx "
...
@@ -610,9 +599,9 @@ static int dump_listen_ep(int id, void *p, void *data)
...
@@ -610,9 +599,9 @@ static int dump_listen_ep(int id, void *p, void *data)
if
(
ep
->
com
.
local_addr
.
ss_family
==
AF_INET
)
{
if
(
ep
->
com
.
local_addr
.
ss_family
==
AF_INET
)
{
struct
sockaddr_in
*
lsin
=
(
struct
sockaddr_in
*
)
struct
sockaddr_in
*
lsin
=
(
struct
sockaddr_in
*
)
&
ep
->
com
.
local_addr
;
&
ep
->
com
.
cm_id
->
local_addr
;
struct
sockaddr_in
*
mapped_lsin
=
(
struct
sockaddr_in
*
)
struct
sockaddr_in
*
mapped_lsin
=
(
struct
sockaddr_in
*
)
&
ep
->
com
.
mapped
_local_addr
;
&
ep
->
com
.
cm_id
->
m
_local_addr
;
cc
=
snprintf
(
epd
->
buf
+
epd
->
pos
,
space
,
cc
=
snprintf
(
epd
->
buf
+
epd
->
pos
,
space
,
"ep %p cm_id %p state %d flags 0x%lx stid %d "
"ep %p cm_id %p state %d flags 0x%lx stid %d "
...
@@ -623,9 +612,9 @@ static int dump_listen_ep(int id, void *p, void *data)
...
@@ -623,9 +612,9 @@ static int dump_listen_ep(int id, void *p, void *data)
ntohs
(
mapped_lsin
->
sin_port
));
ntohs
(
mapped_lsin
->
sin_port
));
}
else
{
}
else
{
struct
sockaddr_in6
*
lsin6
=
(
struct
sockaddr_in6
*
)
struct
sockaddr_in6
*
lsin6
=
(
struct
sockaddr_in6
*
)
&
ep
->
com
.
local_addr
;
&
ep
->
com
.
cm_id
->
local_addr
;
struct
sockaddr_in6
*
mapped_lsin6
=
(
struct
sockaddr_in6
*
)
struct
sockaddr_in6
*
mapped_lsin6
=
(
struct
sockaddr_in6
*
)
&
ep
->
com
.
mapped
_local_addr
;
&
ep
->
com
.
cm_id
->
m
_local_addr
;
cc
=
snprintf
(
epd
->
buf
+
epd
->
pos
,
space
,
cc
=
snprintf
(
epd
->
buf
+
epd
->
pos
,
space
,
"ep %p cm_id %p state %d flags 0x%lx stid %d "
"ep %p cm_id %p state %d flags 0x%lx stid %d "
...
@@ -801,10 +790,9 @@ static int c4iw_rdev_open(struct c4iw_rdev *rdev)
...
@@ -801,10 +790,9 @@ static int c4iw_rdev_open(struct c4iw_rdev *rdev)
rdev
->
lldi
.
vr
->
qp
.
size
,
rdev
->
lldi
.
vr
->
qp
.
size
,
rdev
->
lldi
.
vr
->
cq
.
start
,
rdev
->
lldi
.
vr
->
cq
.
start
,
rdev
->
lldi
.
vr
->
cq
.
size
);
rdev
->
lldi
.
vr
->
cq
.
size
);
PDBG
(
"udb
len 0x%x udb base %p
db_reg %p gts_reg %p "
PDBG
(
"udb
%pR
db_reg %p gts_reg %p "
"qpmask 0x%x cqmask 0x%x
\n
"
,
"qpmask 0x%x cqmask 0x%x
\n
"
,
(
unsigned
)
pci_resource_len
(
rdev
->
lldi
.
pdev
,
2
),
&
rdev
->
lldi
.
pdev
->
resource
[
2
],
(
void
*
)
pci_resource_start
(
rdev
->
lldi
.
pdev
,
2
),
rdev
->
lldi
.
db_reg
,
rdev
->
lldi
.
gts_reg
,
rdev
->
lldi
.
db_reg
,
rdev
->
lldi
.
gts_reg
,
rdev
->
qpmask
,
rdev
->
cqmask
);
rdev
->
qpmask
,
rdev
->
cqmask
);
...
@@ -1506,20 +1494,6 @@ static int __init c4iw_init_module(void)
...
@@ -1506,20 +1494,6 @@ static int __init c4iw_init_module(void)
printk
(
KERN_WARNING
MOD
printk
(
KERN_WARNING
MOD
"could not create debugfs entry, continuing
\n
"
);
"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__
);
err
=
iwpm_init
(
RDMA_NL_C4IW
);
if
(
err
)
{
pr_err
(
"port mapper initialization failed with %d
\n
"
,
err
);
ibnl_remove_client
(
RDMA_NL_C4IW
);
c4iw_cm_term
();
debugfs_remove_recursive
(
c4iw_debugfs_root
);
return
err
;
}
cxgb4_register_uld
(
CXGB4_ULD_RDMA
,
&
c4iw_uld_info
);
cxgb4_register_uld
(
CXGB4_ULD_RDMA
,
&
c4iw_uld_info
);
return
0
;
return
0
;
...
@@ -1537,8 +1511,6 @@ static void __exit c4iw_exit_module(void)
...
@@ -1537,8 +1511,6 @@ static void __exit c4iw_exit_module(void)
}
}
mutex_unlock
(
&
dev_mutex
);
mutex_unlock
(
&
dev_mutex
);
cxgb4_unregister_uld
(
CXGB4_ULD_RDMA
);
cxgb4_unregister_uld
(
CXGB4_ULD_RDMA
);
iwpm_exit
(
RDMA_NL_C4IW
);
ibnl_remove_client
(
RDMA_NL_C4IW
);
c4iw_cm_term
();
c4iw_cm_term
();
debugfs_remove_recursive
(
c4iw_debugfs_root
);
debugfs_remove_recursive
(
c4iw_debugfs_root
);
}
}
...
...
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
浏览文件 @
082eaa50
...
@@ -755,7 +755,6 @@ enum c4iw_ep_flags {
...
@@ -755,7 +755,6 @@ enum c4iw_ep_flags {
CLOSE_SENT
=
3
,
CLOSE_SENT
=
3
,
TIMEOUT
=
4
,
TIMEOUT
=
4
,
QP_REFERENCED
=
5
,
QP_REFERENCED
=
5
,
RELEASE_MAPINFO
=
6
,
};
};
enum
c4iw_ep_history
{
enum
c4iw_ep_history
{
...
@@ -792,8 +791,6 @@ struct c4iw_ep_common {
...
@@ -792,8 +791,6 @@ struct c4iw_ep_common {
struct
mutex
mutex
;
struct
mutex
mutex
;
struct
sockaddr_storage
local_addr
;
struct
sockaddr_storage
local_addr
;
struct
sockaddr_storage
remote_addr
;
struct
sockaddr_storage
remote_addr
;
struct
sockaddr_storage
mapped_local_addr
;
struct
sockaddr_storage
mapped_remote_addr
;
struct
c4iw_wr_wait
wr_wait
;
struct
c4iw_wr_wait
wr_wait
;
unsigned
long
flags
;
unsigned
long
flags
;
unsigned
long
history
;
unsigned
long
history
;
...
@@ -845,45 +842,6 @@ struct c4iw_ep {
...
@@ -845,45 +842,6 @@ struct c4iw_ep {
struct
c4iw_ep_stats
stats
;
struct
c4iw_ep_stats
stats
;
};
};
static
inline
void
print_addr
(
struct
c4iw_ep_common
*
epc
,
const
char
*
func
,
const
char
*
msg
)
{
#define SINA(a) (&(((struct sockaddr_in *)(a))->sin_addr.s_addr))
#define SINP(a) ntohs(((struct sockaddr_in *)(a))->sin_port)
#define SIN6A(a) (&(((struct sockaddr_in6 *)(a))->sin6_addr))
#define SIN6P(a) ntohs(((struct sockaddr_in6 *)(a))->sin6_port)
if
(
c4iw_debug
)
{
switch
(
epc
->
local_addr
.
ss_family
)
{
case
AF_INET
:
PDBG
(
"%s %s %pI4:%u/%u <-> %pI4:%u/%u
\n
"
,
func
,
msg
,
SINA
(
&
epc
->
local_addr
),
SINP
(
&
epc
->
local_addr
),
SINP
(
&
epc
->
mapped_local_addr
),
SINA
(
&
epc
->
remote_addr
),
SINP
(
&
epc
->
remote_addr
),
SINP
(
&
epc
->
mapped_remote_addr
));
break
;
case
AF_INET6
:
PDBG
(
"%s %s %pI6:%u/%u <-> %pI6:%u/%u
\n
"
,
func
,
msg
,
SIN6A
(
&
epc
->
local_addr
),
SIN6P
(
&
epc
->
local_addr
),
SIN6P
(
&
epc
->
mapped_local_addr
),
SIN6A
(
&
epc
->
remote_addr
),
SIN6P
(
&
epc
->
remote_addr
),
SIN6P
(
&
epc
->
mapped_remote_addr
));
break
;
default:
break
;
}
}
#undef SINA
#undef SINP
#undef SIN6A
#undef SIN6P
}
static
inline
struct
c4iw_ep
*
to_ep
(
struct
iw_cm_id
*
cm_id
)
static
inline
struct
c4iw_ep
*
to_ep
(
struct
iw_cm_id
*
cm_id
)
{
{
return
cm_id
->
provider_data
;
return
cm_id
->
provider_data
;
...
...
drivers/infiniband/hw/cxgb4/mem.c
浏览文件 @
082eaa50
...
@@ -619,12 +619,14 @@ struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd,
...
@@ -619,12 +619,14 @@ struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd,
int
ret
=
0
;
int
ret
=
0
;
int
length
=
roundup
(
max_num_sg
*
sizeof
(
u64
),
32
);
int
length
=
roundup
(
max_num_sg
*
sizeof
(
u64
),
32
);
php
=
to_c4iw_pd
(
pd
);
rhp
=
php
->
rhp
;
if
(
mr_type
!=
IB_MR_TYPE_MEM_REG
||
if
(
mr_type
!=
IB_MR_TYPE_MEM_REG
||
max_num_sg
>
t4_max_fr_depth
(
use_dsgl
))
max_num_sg
>
t4_max_fr_depth
(
&
rhp
->
rdev
.
lldi
.
ulptx_memwrite_dsgl
&&
use_dsgl
))
return
ERR_PTR
(
-
EINVAL
);
return
ERR_PTR
(
-
EINVAL
);
php
=
to_c4iw_pd
(
pd
);
rhp
=
php
->
rhp
;
mhp
=
kzalloc
(
sizeof
(
*
mhp
),
GFP_KERNEL
);
mhp
=
kzalloc
(
sizeof
(
*
mhp
),
GFP_KERNEL
);
if
(
!
mhp
)
{
if
(
!
mhp
)
{
ret
=
-
ENOMEM
;
ret
=
-
ENOMEM
;
...
...
drivers/infiniband/hw/cxgb4/provider.c
浏览文件 @
082eaa50
...
@@ -339,7 +339,8 @@ static int c4iw_query_device(struct ib_device *ibdev, struct ib_device_attr *pro
...
@@ -339,7 +339,8 @@ static int c4iw_query_device(struct ib_device *ibdev, struct ib_device_attr *pro
props
->
max_mr
=
c4iw_num_stags
(
&
dev
->
rdev
);
props
->
max_mr
=
c4iw_num_stags
(
&
dev
->
rdev
);
props
->
max_pd
=
T4_MAX_NUM_PD
;
props
->
max_pd
=
T4_MAX_NUM_PD
;
props
->
local_ca_ack_delay
=
0
;
props
->
local_ca_ack_delay
=
0
;
props
->
max_fast_reg_page_list_len
=
t4_max_fr_depth
(
use_dsgl
);
props
->
max_fast_reg_page_list_len
=
t4_max_fr_depth
(
dev
->
rdev
.
lldi
.
ulptx_memwrite_dsgl
&&
use_dsgl
);
return
0
;
return
0
;
}
}
...
...
drivers/infiniband/hw/cxgb4/qp.c
浏览文件 @
082eaa50
...
@@ -606,7 +606,7 @@ static int build_rdma_recv(struct c4iw_qp *qhp, union t4_recv_wr *wqe,
...
@@ -606,7 +606,7 @@ static int build_rdma_recv(struct c4iw_qp *qhp, union t4_recv_wr *wqe,
}
}
static
int
build_memreg
(
struct
t4_sq
*
sq
,
union
t4_wr
*
wqe
,
static
int
build_memreg
(
struct
t4_sq
*
sq
,
union
t4_wr
*
wqe
,
struct
ib_reg_wr
*
wr
,
u8
*
len16
,
u8
t5dev
)
struct
ib_reg_wr
*
wr
,
u8
*
len16
,
bool
dsgl_supported
)
{
{
struct
c4iw_mr
*
mhp
=
to_c4iw_mr
(
wr
->
mr
);
struct
c4iw_mr
*
mhp
=
to_c4iw_mr
(
wr
->
mr
);
struct
fw_ri_immd
*
imdp
;
struct
fw_ri_immd
*
imdp
;
...
@@ -615,7 +615,7 @@ static int build_memreg(struct t4_sq *sq, union t4_wr *wqe,
...
@@ -615,7 +615,7 @@ static int build_memreg(struct t4_sq *sq, union t4_wr *wqe,
int
pbllen
=
roundup
(
mhp
->
mpl_len
*
sizeof
(
u64
),
32
);
int
pbllen
=
roundup
(
mhp
->
mpl_len
*
sizeof
(
u64
),
32
);
int
rem
;
int
rem
;
if
(
mhp
->
mpl_len
>
t4_max_fr_depth
(
use_dsgl
))
if
(
mhp
->
mpl_len
>
t4_max_fr_depth
(
dsgl_supported
&&
use_dsgl
))
return
-
EINVAL
;
return
-
EINVAL
;
wqe
->
fr
.
qpbinde_to_dcacpu
=
0
;
wqe
->
fr
.
qpbinde_to_dcacpu
=
0
;
...
@@ -629,7 +629,7 @@ static int build_memreg(struct t4_sq *sq, union t4_wr *wqe,
...
@@ -629,7 +629,7 @@ static int build_memreg(struct t4_sq *sq, union t4_wr *wqe,
wqe
->
fr
.
va_lo_fbo
=
cpu_to_be32
(
mhp
->
ibmr
.
iova
&
wqe
->
fr
.
va_lo_fbo
=
cpu_to_be32
(
mhp
->
ibmr
.
iova
&
0xffffffff
);
0xffffffff
);
if
(
t5dev
&&
use_dsgl
&&
(
pbllen
>
max_fr_immd
))
{
if
(
dsgl_supported
&&
use_dsgl
&&
(
pbllen
>
max_fr_immd
))
{
struct
fw_ri_dsgl
*
sglp
;
struct
fw_ri_dsgl
*
sglp
;
for
(
i
=
0
;
i
<
mhp
->
mpl_len
;
i
++
)
for
(
i
=
0
;
i
<
mhp
->
mpl_len
;
i
++
)
...
@@ -808,9 +808,7 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
...
@@ -808,9 +808,7 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
fw_opcode
=
FW_RI_FR_NSMR_WR
;
fw_opcode
=
FW_RI_FR_NSMR_WR
;
swsqe
->
opcode
=
FW_RI_FAST_REGISTER
;
swsqe
->
opcode
=
FW_RI_FAST_REGISTER
;
err
=
build_memreg
(
&
qhp
->
wq
.
sq
,
wqe
,
reg_wr
(
wr
),
&
len16
,
err
=
build_memreg
(
&
qhp
->
wq
.
sq
,
wqe
,
reg_wr
(
wr
),
&
len16
,
is_t5
(
qhp
->
rhp
->
rdev
.
lldi
.
ulptx_memwrite_dsgl
);
qhp
->
rhp
->
rdev
.
lldi
.
adapter_type
)
?
1
:
0
);
break
;
break
;
case
IB_WR_LOCAL_INV
:
case
IB_WR_LOCAL_INV
:
if
(
wr
->
send_flags
&
IB_SEND_FENCE
)
if
(
wr
->
send_flags
&
IB_SEND_FENCE
)
...
@@ -1621,7 +1619,8 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
...
@@ -1621,7 +1619,8 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
unsigned
int
sqsize
,
rqsize
;
unsigned
int
sqsize
,
rqsize
;
struct
c4iw_ucontext
*
ucontext
;
struct
c4iw_ucontext
*
ucontext
;
int
ret
;
int
ret
;
struct
c4iw_mm_entry
*
mm1
,
*
mm2
,
*
mm3
,
*
mm4
,
*
mm5
=
NULL
;
struct
c4iw_mm_entry
*
sq_key_mm
,
*
rq_key_mm
=
NULL
,
*
sq_db_key_mm
;
struct
c4iw_mm_entry
*
rq_db_key_mm
=
NULL
,
*
ma_sync_key_mm
=
NULL
;
PDBG
(
"%s ib_pd %p
\n
"
,
__func__
,
pd
);
PDBG
(
"%s ib_pd %p
\n
"
,
__func__
,
pd
);
...
@@ -1708,29 +1707,30 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
...
@@ -1708,29 +1707,30 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
goto
err2
;
goto
err2
;
if
(
udata
)
{
if
(
udata
)
{
mm1
=
kmalloc
(
sizeof
*
mm1
,
GFP_KERNEL
);
sq_key_mm
=
kmalloc
(
sizeof
(
*
sq_key_mm
)
,
GFP_KERNEL
);
if
(
!
mm1
)
{
if
(
!
sq_key_mm
)
{
ret
=
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
err3
;
goto
err3
;
}
}
mm2
=
kmalloc
(
sizeof
*
mm2
,
GFP_KERNEL
);
rq_key_mm
=
kmalloc
(
sizeof
(
*
rq_key_mm
)
,
GFP_KERNEL
);
if
(
!
mm2
)
{
if
(
!
rq_key_mm
)
{
ret
=
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
err4
;
goto
err4
;
}
}
mm3
=
kmalloc
(
sizeof
*
mm3
,
GFP_KERNEL
);
sq_db_key_mm
=
kmalloc
(
sizeof
(
*
sq_db_key_mm
)
,
GFP_KERNEL
);
if
(
!
mm3
)
{
if
(
!
sq_db_key_mm
)
{
ret
=
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
err5
;
goto
err5
;
}
}
mm4
=
kmalloc
(
sizeof
*
mm4
,
GFP_KERNEL
);
rq_db_key_mm
=
kmalloc
(
sizeof
(
*
rq_db_key_mm
)
,
GFP_KERNEL
);
if
(
!
mm4
)
{
if
(
!
rq_db_key_mm
)
{
ret
=
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
err6
;
goto
err6
;
}
}
if
(
t4_sq_onchip
(
&
qhp
->
wq
.
sq
))
{
if
(
t4_sq_onchip
(
&
qhp
->
wq
.
sq
))
{
mm5
=
kmalloc
(
sizeof
*
mm5
,
GFP_KERNEL
);
ma_sync_key_mm
=
kmalloc
(
sizeof
(
*
ma_sync_key_mm
),
if
(
!
mm5
)
{
GFP_KERNEL
);
if
(
!
ma_sync_key_mm
)
{
ret
=
-
ENOMEM
;
ret
=
-
ENOMEM
;
goto
err7
;
goto
err7
;
}
}
...
@@ -1745,7 +1745,7 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
...
@@ -1745,7 +1745,7 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
uresp
.
rq_size
=
qhp
->
wq
.
rq
.
size
;
uresp
.
rq_size
=
qhp
->
wq
.
rq
.
size
;
uresp
.
rq_memsize
=
qhp
->
wq
.
rq
.
memsize
;
uresp
.
rq_memsize
=
qhp
->
wq
.
rq
.
memsize
;
spin_lock
(
&
ucontext
->
mmap_lock
);
spin_lock
(
&
ucontext
->
mmap_lock
);
if
(
m
m5
)
{
if
(
m
a_sync_key_mm
)
{
uresp
.
ma_sync_key
=
ucontext
->
key
;
uresp
.
ma_sync_key
=
ucontext
->
key
;
ucontext
->
key
+=
PAGE_SIZE
;
ucontext
->
key
+=
PAGE_SIZE
;
}
else
{
}
else
{
...
@@ -1763,28 +1763,29 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
...
@@ -1763,28 +1763,29 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
ret
=
ib_copy_to_udata
(
udata
,
&
uresp
,
sizeof
uresp
);
ret
=
ib_copy_to_udata
(
udata
,
&
uresp
,
sizeof
uresp
);
if
(
ret
)
if
(
ret
)
goto
err8
;
goto
err8
;
mm1
->
key
=
uresp
.
sq_key
;
sq_key_mm
->
key
=
uresp
.
sq_key
;
mm1
->
addr
=
qhp
->
wq
.
sq
.
phys_addr
;
sq_key_mm
->
addr
=
qhp
->
wq
.
sq
.
phys_addr
;
mm1
->
len
=
PAGE_ALIGN
(
qhp
->
wq
.
sq
.
memsize
);
sq_key_mm
->
len
=
PAGE_ALIGN
(
qhp
->
wq
.
sq
.
memsize
);
insert_mmap
(
ucontext
,
mm1
);
insert_mmap
(
ucontext
,
sq_key_mm
);
mm2
->
key
=
uresp
.
rq_key
;
rq_key_mm
->
key
=
uresp
.
rq_key
;
mm2
->
addr
=
virt_to_phys
(
qhp
->
wq
.
rq
.
queue
);
rq_key_mm
->
addr
=
virt_to_phys
(
qhp
->
wq
.
rq
.
queue
);
mm2
->
len
=
PAGE_ALIGN
(
qhp
->
wq
.
rq
.
memsize
);
rq_key_mm
->
len
=
PAGE_ALIGN
(
qhp
->
wq
.
rq
.
memsize
);
insert_mmap
(
ucontext
,
mm2
);
insert_mmap
(
ucontext
,
rq_key_mm
);
mm3
->
key
=
uresp
.
sq_db_gts_key
;
sq_db_key_mm
->
key
=
uresp
.
sq_db_gts_key
;
mm3
->
addr
=
(
__force
unsigned
long
)
qhp
->
wq
.
sq
.
bar2_pa
;
sq_db_key_mm
->
addr
=
(
u64
)(
unsigned
long
)
qhp
->
wq
.
sq
.
bar2_pa
;
mm3
->
len
=
PAGE_SIZE
;
sq_db_key_mm
->
len
=
PAGE_SIZE
;
insert_mmap
(
ucontext
,
mm3
);
insert_mmap
(
ucontext
,
sq_db_key_mm
);
mm4
->
key
=
uresp
.
rq_db_gts_key
;
rq_db_key_mm
->
key
=
uresp
.
rq_db_gts_key
;
mm4
->
addr
=
(
__force
unsigned
long
)
qhp
->
wq
.
rq
.
bar2_pa
;
rq_db_key_mm
->
addr
=
(
u64
)(
unsigned
long
)
qhp
->
wq
.
rq
.
bar2_pa
;
mm4
->
len
=
PAGE_SIZE
;
rq_db_key_mm
->
len
=
PAGE_SIZE
;
insert_mmap
(
ucontext
,
mm4
);
insert_mmap
(
ucontext
,
rq_db_key_mm
);
if
(
mm5
)
{
if
(
ma_sync_key_mm
)
{
mm5
->
key
=
uresp
.
ma_sync_key
;
ma_sync_key_mm
->
key
=
uresp
.
ma_sync_key
;
mm5
->
addr
=
(
pci_resource_start
(
rhp
->
rdev
.
lldi
.
pdev
,
0
)
ma_sync_key_mm
->
addr
=
+
PCIE_MA_SYNC_A
)
&
PAGE_MASK
;
(
pci_resource_start
(
rhp
->
rdev
.
lldi
.
pdev
,
0
)
+
mm5
->
len
=
PAGE_SIZE
;
PCIE_MA_SYNC_A
)
&
PAGE_MASK
;
insert_mmap
(
ucontext
,
mm5
);
ma_sync_key_mm
->
len
=
PAGE_SIZE
;
insert_mmap
(
ucontext
,
ma_sync_key_mm
);
}
}
}
}
qhp
->
ibqp
.
qp_num
=
qhp
->
wq
.
sq
.
qid
;
qhp
->
ibqp
.
qp_num
=
qhp
->
wq
.
sq
.
qid
;
...
@@ -1797,15 +1798,15 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
...
@@ -1797,15 +1798,15 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
qhp
->
wq
.
rq
.
memsize
,
attrs
->
cap
.
max_recv_wr
);
qhp
->
wq
.
rq
.
memsize
,
attrs
->
cap
.
max_recv_wr
);
return
&
qhp
->
ibqp
;
return
&
qhp
->
ibqp
;
err8:
err8:
kfree
(
m
m5
);
kfree
(
m
a_sync_key_mm
);
err7:
err7:
kfree
(
mm4
);
kfree
(
rq_db_key_mm
);
err6:
err6:
kfree
(
mm3
);
kfree
(
sq_db_key_mm
);
err5:
err5:
kfree
(
mm2
);
kfree
(
rq_key_mm
);
err4:
err4:
kfree
(
mm1
);
kfree
(
sq_key_mm
);
err3:
err3:
remove_handle
(
rhp
,
&
rhp
->
qpidr
,
qhp
->
wq
.
sq
.
qid
);
remove_handle
(
rhp
,
&
rhp
->
qpidr
,
qhp
->
wq
.
sq
.
qid
);
err2:
err2:
...
...
drivers/infiniband/hw/nes/Kconfig
浏览文件 @
082eaa50
...
@@ -2,7 +2,6 @@ config INFINIBAND_NES
...
@@ -2,7 +2,6 @@ config INFINIBAND_NES
tristate "NetEffect RNIC Driver"
tristate "NetEffect RNIC Driver"
depends on PCI && INET && INFINIBAND
depends on PCI && INET && INFINIBAND
select LIBCRC32C
select LIBCRC32C
select INET_LRO
---help---
---help---
This is the RDMA Network Interface Card (RNIC) driver for
This is the RDMA Network Interface Card (RNIC) driver for
NetEffect Ethernet Cluster Server Adapters.
NetEffect Ethernet Cluster Server Adapters.
...
...
drivers/infiniband/hw/nes/nes.c
浏览文件 @
082eaa50
...
@@ -111,17 +111,6 @@ static struct pci_device_id nes_pci_table[] = {
...
@@ -111,17 +111,6 @@ static struct pci_device_id nes_pci_table[] = {
MODULE_DEVICE_TABLE
(
pci
,
nes_pci_table
);
MODULE_DEVICE_TABLE
(
pci
,
nes_pci_table
);
/* registered nes netlink callbacks */
static
struct
ibnl_client_cbs
nes_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_REMOTE_INFO
]
=
{.
dump
=
iwpm_remote_info_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
nes_inetaddr_event
(
struct
notifier_block
*
,
unsigned
long
,
void
*
);
static
int
nes_inetaddr_event
(
struct
notifier_block
*
,
unsigned
long
,
void
*
);
static
int
nes_net_event
(
struct
notifier_block
*
,
unsigned
long
,
void
*
);
static
int
nes_net_event
(
struct
notifier_block
*
,
unsigned
long
,
void
*
);
static
int
nes_notifiers_registered
;
static
int
nes_notifiers_registered
;
...
@@ -682,17 +671,6 @@ static int nes_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
...
@@ -682,17 +671,6 @@ static int nes_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
}
}
nes_notifiers_registered
++
;
nes_notifiers_registered
++
;
if
(
ibnl_add_client
(
RDMA_NL_NES
,
RDMA_NL_IWPM_NUM_OPS
,
nes_nl_cb_table
))
printk
(
KERN_ERR
PFX
"%s[%u]: Failed to add netlink callback
\n
"
,
__func__
,
__LINE__
);
ret
=
iwpm_init
(
RDMA_NL_NES
);
if
(
ret
)
{
printk
(
KERN_ERR
PFX
"%s: port mapper initialization failed
\n
"
,
pci_name
(
pcidev
));
goto
bail7
;
}
INIT_DELAYED_WORK
(
&
nesdev
->
work
,
nes_recheck_link_status
);
INIT_DELAYED_WORK
(
&
nesdev
->
work
,
nes_recheck_link_status
);
/* Initialize network devices */
/* Initialize network devices */
...
@@ -731,7 +709,6 @@ static int nes_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
...
@@ -731,7 +709,6 @@ static int nes_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
nes_debug
(
NES_DBG_INIT
,
"netdev_count=%d, nesadapter->netdev_count=%d
\n
"
,
nes_debug
(
NES_DBG_INIT
,
"netdev_count=%d, nesadapter->netdev_count=%d
\n
"
,
nesdev
->
netdev_count
,
nesdev
->
nesadapter
->
netdev_count
);
nesdev
->
netdev_count
,
nesdev
->
nesadapter
->
netdev_count
);
ibnl_remove_client
(
RDMA_NL_NES
);
nes_notifiers_registered
--
;
nes_notifiers_registered
--
;
if
(
nes_notifiers_registered
==
0
)
{
if
(
nes_notifiers_registered
==
0
)
{
...
@@ -795,8 +772,6 @@ static void nes_remove(struct pci_dev *pcidev)
...
@@ -795,8 +772,6 @@ static void nes_remove(struct pci_dev *pcidev)
nesdev
->
nesadapter
->
netdev_count
--
;
nesdev
->
nesadapter
->
netdev_count
--
;
}
}
}
}
ibnl_remove_client
(
RDMA_NL_NES
);
iwpm_exit
(
RDMA_NL_NES
);
nes_notifiers_registered
--
;
nes_notifiers_registered
--
;
if
(
nes_notifiers_registered
==
0
)
{
if
(
nes_notifiers_registered
==
0
)
{
...
...
drivers/infiniband/hw/nes/nes_cm.c
浏览文件 @
082eaa50
此差异已折叠。
点击以展开。
drivers/infiniband/hw/nes/nes_cm.h
浏览文件 @
082eaa50
...
@@ -293,8 +293,8 @@ struct nes_cm_listener {
...
@@ -293,8 +293,8 @@ struct nes_cm_listener {
struct
list_head
list
;
struct
list_head
list
;
struct
nes_cm_core
*
cm_core
;
struct
nes_cm_core
*
cm_core
;
u8
loc_mac
[
ETH_ALEN
];
u8
loc_mac
[
ETH_ALEN
];
nes_addr_t
loc_addr
,
mapped_loc_addr
;
nes_addr_t
loc_addr
;
u16
loc_port
,
mapped_loc_port
;
u16
loc_port
;
struct
iw_cm_id
*
cm_id
;
struct
iw_cm_id
*
cm_id
;
enum
nes_cm_conn_type
conn_type
;
enum
nes_cm_conn_type
conn_type
;
atomic_t
ref_count
;
atomic_t
ref_count
;
...
@@ -309,9 +309,7 @@ struct nes_cm_listener {
...
@@ -309,9 +309,7 @@ struct nes_cm_listener {
/* per connection node and node state information */
/* per connection node and node state information */
struct
nes_cm_node
{
struct
nes_cm_node
{
nes_addr_t
loc_addr
,
rem_addr
;
nes_addr_t
loc_addr
,
rem_addr
;
nes_addr_t
mapped_loc_addr
,
mapped_rem_addr
;
u16
loc_port
,
rem_port
;
u16
loc_port
,
rem_port
;
u16
mapped_loc_port
,
mapped_rem_port
;
u8
loc_mac
[
ETH_ALEN
];
u8
loc_mac
[
ETH_ALEN
];
u8
rem_mac
[
ETH_ALEN
];
u8
rem_mac
[
ETH_ALEN
];
...
@@ -368,11 +366,6 @@ struct nes_cm_info {
...
@@ -368,11 +366,6 @@ struct nes_cm_info {
u16
rem_port
;
u16
rem_port
;
nes_addr_t
loc_addr
;
nes_addr_t
loc_addr
;
nes_addr_t
rem_addr
;
nes_addr_t
rem_addr
;
u16
mapped_loc_port
;
u16
mapped_rem_port
;
nes_addr_t
mapped_loc_addr
;
nes_addr_t
mapped_rem_addr
;
enum
nes_cm_conn_type
conn_type
;
enum
nes_cm_conn_type
conn_type
;
int
backlog
;
int
backlog
;
};
};
...
...
drivers/infiniband/hw/nes/nes_hw.c
浏览文件 @
082eaa50
...
@@ -35,18 +35,11 @@
...
@@ -35,18 +35,11 @@
#include <linux/moduleparam.h>
#include <linux/moduleparam.h>
#include <linux/netdevice.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/etherdevice.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/if_vlan.h>
#include <linux/if_vlan.h>
#include <linux/inet_lro.h>
#include <linux/slab.h>
#include <linux/slab.h>
#include "nes.h"
#include "nes.h"
static
unsigned
int
nes_lro_max_aggr
=
NES_LRO_MAX_AGGR
;
module_param
(
nes_lro_max_aggr
,
uint
,
0444
);
MODULE_PARM_DESC
(
nes_lro_max_aggr
,
"NIC LRO max packet aggregation"
);
static
int
wide_ppm_offset
;
static
int
wide_ppm_offset
;
module_param
(
wide_ppm_offset
,
int
,
0644
);
module_param
(
wide_ppm_offset
,
int
,
0644
);
MODULE_PARM_DESC
(
wide_ppm_offset
,
"Increase CX4 interface clock ppm offset, 0=100ppm (default), 1=300ppm"
);
MODULE_PARM_DESC
(
wide_ppm_offset
,
"Increase CX4 interface clock ppm offset, 0=100ppm (default), 1=300ppm"
);
...
@@ -1642,25 +1635,6 @@ static void nes_rq_wqes_timeout(unsigned long parm)
...
@@ -1642,25 +1635,6 @@ static void nes_rq_wqes_timeout(unsigned long parm)
}
}
static
int
nes_lro_get_skb_hdr
(
struct
sk_buff
*
skb
,
void
**
iphdr
,
void
**
tcph
,
u64
*
hdr_flags
,
void
*
priv
)
{
unsigned
int
ip_len
;
struct
iphdr
*
iph
;
skb_reset_network_header
(
skb
);
iph
=
ip_hdr
(
skb
);
if
(
iph
->
protocol
!=
IPPROTO_TCP
)
return
-
1
;
ip_len
=
ip_hdrlen
(
skb
);
skb_set_transport_header
(
skb
,
ip_len
);
*
tcph
=
tcp_hdr
(
skb
);
*
hdr_flags
=
LRO_IPV4
|
LRO_TCP
;
*
iphdr
=
iph
;
return
0
;
}
/**
/**
* nes_init_nic_qp
* nes_init_nic_qp
*/
*/
...
@@ -1895,14 +1869,6 @@ int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev)
...
@@ -1895,14 +1869,6 @@ int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev)
return
-
ENOMEM
;
return
-
ENOMEM
;
}
}
nesvnic
->
lro_mgr
.
max_aggr
=
nes_lro_max_aggr
;
nesvnic
->
lro_mgr
.
max_desc
=
NES_MAX_LRO_DESCRIPTORS
;
nesvnic
->
lro_mgr
.
lro_arr
=
nesvnic
->
lro_desc
;
nesvnic
->
lro_mgr
.
get_skb_header
=
nes_lro_get_skb_hdr
;
nesvnic
->
lro_mgr
.
features
=
LRO_F_NAPI
|
LRO_F_EXTRACT_VLAN_ID
;
nesvnic
->
lro_mgr
.
dev
=
netdev
;
nesvnic
->
lro_mgr
.
ip_summed
=
CHECKSUM_UNNECESSARY
;
nesvnic
->
lro_mgr
.
ip_summed_aggr
=
CHECKSUM_UNNECESSARY
;
return
0
;
return
0
;
}
}
...
@@ -2809,13 +2775,10 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
...
@@ -2809,13 +2775,10 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
u16
pkt_type
;
u16
pkt_type
;
u16
rqes_processed
=
0
;
u16
rqes_processed
=
0
;
u8
sq_cqes
=
0
;
u8
sq_cqes
=
0
;
u8
nes_use_lro
=
0
;
head
=
cq
->
cq_head
;
head
=
cq
->
cq_head
;
cq_size
=
cq
->
cq_size
;
cq_size
=
cq
->
cq_size
;
cq
->
cqes_pending
=
1
;
cq
->
cqes_pending
=
1
;
if
(
nesvnic
->
netdev
->
features
&
NETIF_F_LRO
)
nes_use_lro
=
1
;
do
{
do
{
if
(
le32_to_cpu
(
cq
->
cq_vbase
[
head
].
cqe_words
[
NES_NIC_CQE_MISC_IDX
])
&
if
(
le32_to_cpu
(
cq
->
cq_vbase
[
head
].
cqe_words
[
NES_NIC_CQE_MISC_IDX
])
&
NES_NIC_CQE_VALID
)
{
NES_NIC_CQE_VALID
)
{
...
@@ -2950,10 +2913,7 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
...
@@ -2950,10 +2913,7 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
__vlan_hwaccel_put_tag
(
rx_skb
,
htons
(
ETH_P_8021Q
),
vlan_tag
);
__vlan_hwaccel_put_tag
(
rx_skb
,
htons
(
ETH_P_8021Q
),
vlan_tag
);
}
}
if
(
nes_use_lro
)
napi_gro_receive
(
&
nesvnic
->
napi
,
rx_skb
);
lro_receive_skb
(
&
nesvnic
->
lro_mgr
,
rx_skb
,
NULL
);
else
netif_receive_skb
(
rx_skb
);
skip_rx_indicate0:
skip_rx_indicate0:
;
;
...
@@ -2984,8 +2944,6 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
...
@@ -2984,8 +2944,6 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
}
while
(
1
);
}
while
(
1
);
if
(
nes_use_lro
)
lro_flush_all
(
&
nesvnic
->
lro_mgr
);
if
(
sq_cqes
)
{
if
(
sq_cqes
)
{
barrier
();
barrier
();
/* restart the queue if it had been stopped */
/* restart the queue if it had been stopped */
...
...
drivers/infiniband/hw/nes/nes_hw.h
浏览文件 @
082eaa50
...
@@ -33,8 +33,6 @@
...
@@ -33,8 +33,6 @@
#ifndef __NES_HW_H
#ifndef __NES_HW_H
#define __NES_HW_H
#define __NES_HW_H
#include <linux/inet_lro.h>
#define NES_PHY_TYPE_CX4 1
#define NES_PHY_TYPE_CX4 1
#define NES_PHY_TYPE_1G 2
#define NES_PHY_TYPE_1G 2
#define NES_PHY_TYPE_ARGUS 4
#define NES_PHY_TYPE_ARGUS 4
...
@@ -1049,8 +1047,6 @@ struct nes_hw_tune_timer {
...
@@ -1049,8 +1047,6 @@ struct nes_hw_tune_timer {
#define NES_TIMER_ENABLE_LIMIT 4
#define NES_TIMER_ENABLE_LIMIT 4
#define NES_MAX_LINK_INTERRUPTS 128
#define NES_MAX_LINK_INTERRUPTS 128
#define NES_MAX_LINK_CHECK 200
#define NES_MAX_LINK_CHECK 200
#define NES_MAX_LRO_DESCRIPTORS 32
#define NES_LRO_MAX_AGGR 64
struct
nes_adapter
{
struct
nes_adapter
{
u64
fw_ver
;
u64
fw_ver
;
...
@@ -1263,9 +1259,6 @@ struct nes_vnic {
...
@@ -1263,9 +1259,6 @@ struct nes_vnic {
u8
next_qp_nic_index
;
u8
next_qp_nic_index
;
u8
of_device_registered
;
u8
of_device_registered
;
u8
rdma_enabled
;
u8
rdma_enabled
;
u32
lro_max_aggr
;
struct
net_lro_mgr
lro_mgr
;
struct
net_lro_desc
lro_desc
[
NES_MAX_LRO_DESCRIPTORS
];
struct
timer_list
event_timer
;
struct
timer_list
event_timer
;
enum
ib_event_type
delayed_event
;
enum
ib_event_type
delayed_event
;
enum
ib_event_type
last_dispatched_event
;
enum
ib_event_type
last_dispatched_event
;
...
...
drivers/infiniband/hw/nes/nes_nic.c
浏览文件 @
082eaa50
...
@@ -1085,9 +1085,6 @@ static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = {
...
@@ -1085,9 +1085,6 @@ static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = {
"Free 4Kpbls"
,
"Free 4Kpbls"
,
"Free 256pbls"
,
"Free 256pbls"
,
"Timer Inits"
,
"Timer Inits"
,
"LRO aggregated"
,
"LRO flushed"
,
"LRO no_desc"
,
"PAU CreateQPs"
,
"PAU CreateQPs"
,
"PAU DestroyQPs"
,
"PAU DestroyQPs"
,
};
};
...
@@ -1302,9 +1299,6 @@ static void nes_netdev_get_ethtool_stats(struct net_device *netdev,
...
@@ -1302,9 +1299,6 @@ static void nes_netdev_get_ethtool_stats(struct net_device *netdev,
target_stat_values
[
++
index
]
=
nesadapter
->
free_4kpbl
;
target_stat_values
[
++
index
]
=
nesadapter
->
free_4kpbl
;
target_stat_values
[
++
index
]
=
nesadapter
->
free_256pbl
;
target_stat_values
[
++
index
]
=
nesadapter
->
free_256pbl
;
target_stat_values
[
++
index
]
=
int_mod_timer_init
;
target_stat_values
[
++
index
]
=
int_mod_timer_init
;
target_stat_values
[
++
index
]
=
nesvnic
->
lro_mgr
.
stats
.
aggregated
;
target_stat_values
[
++
index
]
=
nesvnic
->
lro_mgr
.
stats
.
flushed
;
target_stat_values
[
++
index
]
=
nesvnic
->
lro_mgr
.
stats
.
no_desc
;
target_stat_values
[
++
index
]
=
atomic_read
(
&
pau_qps_created
);
target_stat_values
[
++
index
]
=
atomic_read
(
&
pau_qps_created
);
target_stat_values
[
++
index
]
=
atomic_read
(
&
pau_qps_destroyed
);
target_stat_values
[
++
index
]
=
atomic_read
(
&
pau_qps_destroyed
);
}
}
...
@@ -1709,7 +1703,6 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
...
@@ -1709,7 +1703,6 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
netdev
->
hw_features
|=
NETIF_F_TSO
;
netdev
->
hw_features
|=
NETIF_F_TSO
;
netdev
->
features
=
netdev
->
hw_features
|
NETIF_F_HIGHDMA
|
NETIF_F_HW_VLAN_CTAG_TX
;
netdev
->
features
=
netdev
->
hw_features
|
NETIF_F_HIGHDMA
|
NETIF_F_HW_VLAN_CTAG_TX
;
netdev
->
hw_features
|=
NETIF_F_LRO
;
nes_debug
(
NES_DBG_INIT
,
"nesvnic = %p, reported features = 0x%lX, QPid = %d,"
nes_debug
(
NES_DBG_INIT
,
"nesvnic = %p, reported features = 0x%lX, QPid = %d,"
" nic_index = %d, logical_port = %d, mac_index = %d.
\n
"
,
" nic_index = %d, logical_port = %d, mac_index = %d.
\n
"
,
...
...
drivers/infiniband/hw/nes/nes_verbs.c
浏览文件 @
082eaa50
...
@@ -3769,6 +3769,8 @@ struct nes_ib_device *nes_init_ofa_device(struct net_device *netdev)
...
@@ -3769,6 +3769,8 @@ struct nes_ib_device *nes_init_ofa_device(struct net_device *netdev)
nesibdev
->
ibdev
.
iwcm
->
create_listen
=
nes_create_listen
;
nesibdev
->
ibdev
.
iwcm
->
create_listen
=
nes_create_listen
;
nesibdev
->
ibdev
.
iwcm
->
destroy_listen
=
nes_destroy_listen
;
nesibdev
->
ibdev
.
iwcm
->
destroy_listen
=
nes_destroy_listen
;
nesibdev
->
ibdev
.
get_port_immutable
=
nes_port_immutable
;
nesibdev
->
ibdev
.
get_port_immutable
=
nes_port_immutable
;
memcpy
(
nesibdev
->
ibdev
.
iwcm
->
ifname
,
netdev
->
name
,
sizeof
(
nesibdev
->
ibdev
.
iwcm
->
ifname
));
return
nesibdev
;
return
nesibdev
;
}
}
...
...
drivers/net/ethernet/chelsio/cxgb4/t4_msg.h
浏览文件 @
082eaa50
...
@@ -1021,6 +1021,8 @@ struct cpl_l2t_write_req {
...
@@ -1021,6 +1021,8 @@ struct cpl_l2t_write_req {
#define L2T_W_NOREPLY_V(x) ((x) << L2T_W_NOREPLY_S)
#define L2T_W_NOREPLY_V(x) ((x) << L2T_W_NOREPLY_S)
#define L2T_W_NOREPLY_F L2T_W_NOREPLY_V(1U)
#define L2T_W_NOREPLY_F L2T_W_NOREPLY_V(1U)
#define CPL_L2T_VLAN_NONE 0xfff
struct
cpl_l2t_write_rpl
{
struct
cpl_l2t_write_rpl
{
union
opcode_tid
ot
;
union
opcode_tid
ot
;
u8
status
;
u8
status
;
...
...
drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
浏览文件 @
082eaa50
...
@@ -561,6 +561,7 @@ enum fw_flowc_mnem {
...
@@ -561,6 +561,7 @@ enum fw_flowc_mnem {
FW_FLOWC_MNEM_SNDBUF
,
FW_FLOWC_MNEM_SNDBUF
,
FW_FLOWC_MNEM_MSS
,
FW_FLOWC_MNEM_MSS
,
FW_FLOWC_MNEM_TXDATAPLEN_MAX
,
FW_FLOWC_MNEM_TXDATAPLEN_MAX
,
FW_FLOWC_MNEM_SCHEDCLASS
=
11
,
};
};
struct
fw_flowc_mnemval
{
struct
fw_flowc_mnemval
{
...
...
include/rdma/iw_cm.h
浏览文件 @
082eaa50
...
@@ -83,8 +83,10 @@ struct iw_cm_id {
...
@@ -83,8 +83,10 @@ struct iw_cm_id {
iw_cm_handler
cm_handler
;
/* client callback function */
iw_cm_handler
cm_handler
;
/* client callback function */
void
*
context
;
/* client cb context */
void
*
context
;
/* client cb context */
struct
ib_device
*
device
;
struct
ib_device
*
device
;
struct
sockaddr_storage
local_addr
;
struct
sockaddr_storage
local_addr
;
/* local addr */
struct
sockaddr_storage
remote_addr
;
struct
sockaddr_storage
remote_addr
;
struct
sockaddr_storage
m_local_addr
;
/* nmapped local addr */
struct
sockaddr_storage
m_remote_addr
;
/* nmapped rem addr */
void
*
provider_data
;
/* provider private data */
void
*
provider_data
;
/* provider private data */
iw_event_handler
event_handler
;
/* cb for provider
iw_event_handler
event_handler
;
/* cb for provider
events */
events */
...
@@ -92,6 +94,7 @@ struct iw_cm_id {
...
@@ -92,6 +94,7 @@ struct iw_cm_id {
void
(
*
add_ref
)(
struct
iw_cm_id
*
);
void
(
*
add_ref
)(
struct
iw_cm_id
*
);
void
(
*
rem_ref
)(
struct
iw_cm_id
*
);
void
(
*
rem_ref
)(
struct
iw_cm_id
*
);
u8
tos
;
u8
tos
;
bool
mapped
;
};
};
struct
iw_cm_conn_param
{
struct
iw_cm_conn_param
{
...
@@ -123,6 +126,7 @@ struct iw_cm_verbs {
...
@@ -123,6 +126,7 @@ struct iw_cm_verbs {
int
backlog
);
int
backlog
);
int
(
*
destroy_listen
)(
struct
iw_cm_id
*
cm_id
);
int
(
*
destroy_listen
)(
struct
iw_cm_id
*
cm_id
);
char
ifname
[
IFNAMSIZ
];
};
};
/**
/**
...
...
include/uapi/rdma/rdma_netlink.h
浏览文件 @
082eaa50
...
@@ -5,8 +5,8 @@
...
@@ -5,8 +5,8 @@
enum
{
enum
{
RDMA_NL_RDMA_CM
=
1
,
RDMA_NL_RDMA_CM
=
1
,
RDMA_NL_
NES
,
RDMA_NL_
IWCM
,
RDMA_NL_
C4IW
,
RDMA_NL_
RSVD
,
RDMA_NL_LS
,
/* RDMA Local Services */
RDMA_NL_LS
,
/* RDMA Local Services */
RDMA_NL_NUM_CLIENTS
RDMA_NL_NUM_CLIENTS
};
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录