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 @@
#include <rdma/iw_cm.h>
#include <rdma/ib_addr.h>
#include <rdma/iw_portmap.h>
#include <rdma/rdma_netlink.h>
#include "iwcm.h"
...
...
@@ -57,6 +59,16 @@ MODULE_AUTHOR("Tom Tucker");
MODULE_DESCRIPTION
(
"iWARP CM"
);
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
;
struct
iwcm_work
{
struct
work_struct
work
;
...
...
@@ -402,6 +414,11 @@ static void destroy_cm_id(struct iw_cm_id *cm_id)
}
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
);
}
...
...
@@ -426,6 +443,97 @@ void iw_destroy_cm_id(struct iw_cm_id *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
*
...
...
@@ -452,6 +560,8 @@ int iw_cm_listen(struct iw_cm_id *cm_id, int backlog)
case
IW_CM_STATE_IDLE
:
cm_id_priv
->
state
=
IW_CM_STATE_LISTEN
;
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
ret
=
iw_cm_map
(
cm_id
,
false
);
if
(
!
ret
)
ret
=
cm_id
->
device
->
iwcm
->
create_listen
(
cm_id
,
backlog
);
if
(
ret
)
cm_id_priv
->
state
=
IW_CM_STATE_IDLE
;
...
...
@@ -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
);
if
(
cm_id_priv
->
state
!=
IW_CM_STATE_IDLE
)
{
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
-
EINVAL
;
ret
=
-
EINVAL
;
goto
err
;
}
/* Get the ib_qp given the QPN */
qp
=
cm_id
->
device
->
iwcm
->
get_qp
(
cm_id
->
device
,
iw_param
->
qpn
);
if
(
!
qp
)
{
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
-
EINVAL
;
ret
=
-
EINVAL
;
goto
err
;
}
cm_id
->
device
->
iwcm
->
add_ref
(
qp
);
cm_id_priv
->
qp
=
qp
;
cm_id_priv
->
state
=
IW_CM_STATE_CONN_SENT
;
spin_unlock_irqrestore
(
&
cm_id_priv
->
lock
,
flags
);
ret
=
iw_cm_map
(
cm_id
,
true
);
if
(
!
ret
)
ret
=
cm_id
->
device
->
iwcm
->
connect
(
cm_id
,
iw_param
);
if
(
ret
)
{
if
(
!
ret
)
return
0
;
/* success */
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
;
}
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
;
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
;
}
EXPORT_SYMBOL
(
iw_cm_connect
);
...
...
@@ -656,8 +764,23 @@ static void cm_conn_req_handler(struct iwcm_id_private *listen_id_priv,
goto
out
;
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
->
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
->
state
=
IW_CM_STATE_CONN_RECV
;
...
...
@@ -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
);
BUG_ON
(
cm_id_priv
->
state
!=
IW_CM_STATE_CONN_SENT
);
if
(
iw_event
->
status
==
0
)
{
cm_id_priv
->
id
.
local_addr
=
iw_event
->
local_addr
;
cm_id_priv
->
id
.
remote_addr
=
iw_event
->
remote_addr
;
cm_id_priv
->
id
.
m_local_addr
=
iw_event
->
local_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
;
}
else
{
/* REJECTED or RESET */
...
...
@@ -1044,6 +1169,17 @@ EXPORT_SYMBOL(iw_cm_init_qp_attr);
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"
);
if
(
!
iwcm_wq
)
return
-
ENOMEM
;
...
...
@@ -1063,6 +1199,8 @@ static void __exit iw_cm_cleanup(void)
{
unregister_net_sysctl_table
(
iwcm_ctl_table_hdr
);
destroy_workqueue
(
iwcm_wq
);
ibnl_remove_client
(
RDMA_NL_IWCM
);
iwpm_exit
(
RDMA_NL_IWCM
);
}
module_init
(
iw_cm_init
);
...
...
drivers/infiniband/core/iwpm_msg.c
浏览文件 @
082eaa50
...
...
@@ -88,7 +88,7 @@ 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
);
if
(
ret
)
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
);
if
(
ret
)
goto
pid_query_error
;
...
...
@@ -394,7 +394,7 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb)
/* always for found nlmsg_request */
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
barrier
();
wake_up
(
&
nlmsg_request
->
waitq
);
up
(
&
nlmsg_request
->
sem
);
return
0
;
}
EXPORT_SYMBOL
(
iwpm_register_pid_cb
);
...
...
@@ -463,7 +463,7 @@ int iwpm_add_mapping_cb(struct sk_buff *skb, struct netlink_callback *cb)
/* always for found request */
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
barrier
();
wake_up
(
&
nlmsg_request
->
waitq
);
up
(
&
nlmsg_request
->
sem
);
return
0
;
}
EXPORT_SYMBOL
(
iwpm_add_mapping_cb
);
...
...
@@ -555,7 +555,7 @@ int iwpm_add_and_query_mapping_cb(struct sk_buff *skb,
/* always for found request */
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
barrier
();
wake_up
(
&
nlmsg_request
->
waitq
);
up
(
&
nlmsg_request
->
sem
);
return
0
;
}
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)
/* always for found request */
kref_put
(
&
nlmsg_request
->
kref
,
iwpm_free_nlmsg_request
);
barrier
();
wake_up
(
&
nlmsg_request
->
waitq
);
up
(
&
nlmsg_request
->
sem
);
return
0
;
}
EXPORT_SYMBOL
(
iwpm_mapping_error_cb
);
drivers/infiniband/core/iwpm_util.c
浏览文件 @
082eaa50
...
...
@@ -322,6 +322,8 @@ struct iwpm_nlmsg_request *iwpm_get_nlmsg_request(__u32 nlmsg_seq,
nlmsg_request
->
nl_client
=
nl_client
;
nlmsg_request
->
request_done
=
0
;
nlmsg_request
->
err_code
=
0
;
sema_init
(
&
nlmsg_request
->
sem
,
1
);
down
(
&
nlmsg_request
->
sem
);
return
nlmsg_request
;
}
...
...
@@ -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
ret
;
init_waitqueue_head
(
&
nlmsg_request
->
waitq
);
ret
=
wait_event_timeout
(
nlmsg_request
->
waitq
,
(
nlmsg_request
->
request_done
!=
0
),
IWPM_NL_TIMEOUT
);
if
(
!
ret
)
{
ret
=
down_timeout
(
&
nlmsg_request
->
sem
,
IWPM_NL_TIMEOUT
);
if
(
ret
)
{
ret
=
-
EINVAL
;
pr_info
(
"%s: Timeout %d sec for netlink request (seq = %u)
\n
"
,
__func__
,
(
IWPM_NL_TIMEOUT
/
HZ
),
nlmsg_request
->
nlmsg_seq
);
...
...
drivers/infiniband/core/iwpm_util.h
浏览文件 @
082eaa50
...
...
@@ -69,7 +69,7 @@ struct iwpm_nlmsg_request {
u8
nl_client
;
u8
request_done
;
u16
err_code
;
wait_queue_head_t
waitq
;
struct
semaphore
sem
;
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)
static
int
is_loopback_dst
(
struct
iw_cm_id
*
cm_id
)
{
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
);
if
(
!
dev
)
...
...
@@ -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
rtable
*
rt
;
int
err
=
0
;
struct
sockaddr_in
*
laddr
=
(
struct
sockaddr_in
*
)
&
cm_id
->
local_addr
;
struct
sockaddr_in
*
raddr
=
(
struct
sockaddr_in
*
)
&
cm_id
->
remote_addr
;
struct
sockaddr_in
*
laddr
=
(
struct
sockaddr_in
*
)
&
cm_id
->
m_
local_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
;
goto
out
;
}
...
...
@@ -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
);
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
));
memcpy
(
&
ep
->
com
.
remote_addr
,
&
cm_id
->
remote_addr
,
memcpy
(
&
ep
->
com
.
remote_addr
,
&
cm_id
->
m_
remote_addr
,
sizeof
(
ep
->
com
.
remote_addr
));
/* send connect request to rnic */
...
...
@@ -1992,7 +1992,7 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog)
might_sleep
();
if
(
cm_id
->
local_addr
.
ss_family
!=
PF_INET
)
{
if
(
cm_id
->
m_
local_addr
.
ss_family
!=
PF_INET
)
{
err
=
-
ENOSYS
;
goto
fail1
;
}
...
...
@@ -2008,7 +2008,7 @@ int iwch_create_listen(struct iw_cm_id *cm_id, int backlog)
cm_id
->
add_ref
(
cm_id
);
ep
->
com
.
cm_id
=
cm_id
;
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
));
/*
...
...
drivers/infiniband/hw/cxgb4/cm.c
浏览文件 @
082eaa50
此差异已折叠。
点击以展开。
drivers/infiniband/hw/cxgb4/device.c
浏览文件 @
082eaa50
...
...
@@ -87,17 +87,6 @@ struct c4iw_debugfs_data {
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
)
{
int
*
countp
=
data
;
...
...
@@ -242,13 +231,13 @@ static int dump_qp(int id, void *p, void *data)
if
(
qp
->
ep
)
{
if
(
qp
->
ep
->
com
.
local_addr
.
ss_family
==
AF_INET
)
{
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
*
)
&
qp
->
ep
->
com
.
remote_addr
;
&
qp
->
ep
->
com
.
cm_id
->
remote_addr
;
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
*
)
&
qp
->
ep
->
com
.
mapped
_remote_addr
;
&
qp
->
ep
->
com
.
cm_id
->
m
_remote_addr
;
cc
=
snprintf
(
qpd
->
buf
+
qpd
->
pos
,
space
,
"rc qp sq id %u rq id %u state %u "
...
...
@@ -264,15 +253,15 @@ static int dump_qp(int id, void *p, void *data)
ntohs
(
mapped_rsin
->
sin_port
));
}
else
{
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
*
)
&
qp
->
ep
->
com
.
remote_addr
;
&
qp
->
ep
->
com
.
cm_id
->
remote_addr
;
struct
sockaddr_in6
*
mapped_lsin6
=
(
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
*
)
&
qp
->
ep
->
com
.
mapped
_remote_addr
;
&
qp
->
ep
->
com
.
cm_id
->
m
_remote_addr
;
cc
=
snprintf
(
qpd
->
buf
+
qpd
->
pos
,
space
,
"rc qp sq id %u rq id %u state %u "
...
...
@@ -545,13 +534,13 @@ static int dump_ep(int id, void *p, void *data)
if
(
ep
->
com
.
local_addr
.
ss_family
==
AF_INET
)
{
struct
sockaddr_in
*
lsin
=
(
struct
sockaddr_in
*
)
&
ep
->
com
.
local_addr
;
&
ep
->
com
.
cm_id
->
local_addr
;
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
*
)
&
ep
->
com
.
mapped
_local_addr
;
&
ep
->
com
.
cm_id
->
m
_local_addr
;
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
,
"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)
ntohs
(
mapped_rsin
->
sin_port
));
}
else
{
struct
sockaddr_in6
*
lsin6
=
(
struct
sockaddr_in6
*
)
&
ep
->
com
.
local_addr
;
&
ep
->
com
.
cm_id
->
local_addr
;
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
*
)
&
ep
->
com
.
mapped
_local_addr
;
&
ep
->
com
.
cm_id
->
m
_local_addr
;
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
,
"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)
if
(
ep
->
com
.
local_addr
.
ss_family
==
AF_INET
)
{
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
*
)
&
ep
->
com
.
mapped
_local_addr
;
&
ep
->
com
.
cm_id
->
m
_local_addr
;
cc
=
snprintf
(
epd
->
buf
+
epd
->
pos
,
space
,
"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)
ntohs
(
mapped_lsin
->
sin_port
));
}
else
{
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
*
)
&
ep
->
com
.
mapped
_local_addr
;
&
ep
->
com
.
cm_id
->
m
_local_addr
;
cc
=
snprintf
(
epd
->
buf
+
epd
->
pos
,
space
,
"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)
rdev
->
lldi
.
vr
->
qp
.
size
,
rdev
->
lldi
.
vr
->
cq
.
start
,
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
"
,
(
unsigned
)
pci_resource_len
(
rdev
->
lldi
.
pdev
,
2
),
(
void
*
)
pci_resource_start
(
rdev
->
lldi
.
pdev
,
2
),
&
rdev
->
lldi
.
pdev
->
resource
[
2
],
rdev
->
lldi
.
db_reg
,
rdev
->
lldi
.
gts_reg
,
rdev
->
qpmask
,
rdev
->
cqmask
);
...
...
@@ -1506,20 +1494,6 @@ static int __init c4iw_init_module(void)
printk
(
KERN_WARNING
MOD
"could not create debugfs entry, continuing
\n
"
);
if
(
ibnl_add_client
(
RDMA_NL_C4IW
,
RDMA_NL_IWPM_NUM_OPS
,
c4iw_nl_cb_table
))
pr_err
(
"%s[%u]: Failed to add netlink callback
\n
"
,
__func__
,
__LINE__
);
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
);
return
0
;
...
...
@@ -1537,8 +1511,6 @@ static void __exit c4iw_exit_module(void)
}
mutex_unlock
(
&
dev_mutex
);
cxgb4_unregister_uld
(
CXGB4_ULD_RDMA
);
iwpm_exit
(
RDMA_NL_C4IW
);
ibnl_remove_client
(
RDMA_NL_C4IW
);
c4iw_cm_term
();
debugfs_remove_recursive
(
c4iw_debugfs_root
);
}
...
...
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
浏览文件 @
082eaa50
...
...
@@ -755,7 +755,6 @@ enum c4iw_ep_flags {
CLOSE_SENT
=
3
,
TIMEOUT
=
4
,
QP_REFERENCED
=
5
,
RELEASE_MAPINFO
=
6
,
};
enum
c4iw_ep_history
{
...
...
@@ -792,8 +791,6 @@ struct c4iw_ep_common {
struct
mutex
mutex
;
struct
sockaddr_storage
local_addr
;
struct
sockaddr_storage
remote_addr
;
struct
sockaddr_storage
mapped_local_addr
;
struct
sockaddr_storage
mapped_remote_addr
;
struct
c4iw_wr_wait
wr_wait
;
unsigned
long
flags
;
unsigned
long
history
;
...
...
@@ -845,45 +842,6 @@ struct c4iw_ep {
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
)
{
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,
int
ret
=
0
;
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
||
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
);
php
=
to_c4iw_pd
(
pd
);
rhp
=
php
->
rhp
;
mhp
=
kzalloc
(
sizeof
(
*
mhp
),
GFP_KERNEL
);
if
(
!
mhp
)
{
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
props
->
max_mr
=
c4iw_num_stags
(
&
dev
->
rdev
);
props
->
max_pd
=
T4_MAX_NUM_PD
;
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
;
}
...
...
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,
}
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
fw_ri_immd
*
imdp
;
...
...
@@ -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
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
;
wqe
->
fr
.
qpbinde_to_dcacpu
=
0
;
...
...
@@ -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
&
0xffffffff
);
if
(
t5dev
&&
use_dsgl
&&
(
pbllen
>
max_fr_immd
))
{
if
(
dsgl_supported
&&
use_dsgl
&&
(
pbllen
>
max_fr_immd
))
{
struct
fw_ri_dsgl
*
sglp
;
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,
fw_opcode
=
FW_RI_FR_NSMR_WR
;
swsqe
->
opcode
=
FW_RI_FAST_REGISTER
;
err
=
build_memreg
(
&
qhp
->
wq
.
sq
,
wqe
,
reg_wr
(
wr
),
&
len16
,
is_t5
(
qhp
->
rhp
->
rdev
.
lldi
.
adapter_type
)
?
1
:
0
);
qhp
->
rhp
->
rdev
.
lldi
.
ulptx_memwrite_dsgl
);
break
;
case
IB_WR_LOCAL_INV
:
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,
unsigned
int
sqsize
,
rqsize
;
struct
c4iw_ucontext
*
ucontext
;
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
);
...
...
@@ -1708,29 +1707,30 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
goto
err2
;
if
(
udata
)
{
mm1
=
kmalloc
(
sizeof
*
mm1
,
GFP_KERNEL
);
if
(
!
mm1
)
{
sq_key_mm
=
kmalloc
(
sizeof
(
*
sq_key_mm
)
,
GFP_KERNEL
);
if
(
!
sq_key_mm
)
{
ret
=
-
ENOMEM
;
goto
err3
;
}
mm2
=
kmalloc
(
sizeof
*
mm2
,
GFP_KERNEL
);
if
(
!
mm2
)
{
rq_key_mm
=
kmalloc
(
sizeof
(
*
rq_key_mm
)
,
GFP_KERNEL
);
if
(
!
rq_key_mm
)
{
ret
=
-
ENOMEM
;
goto
err4
;
}
mm3
=
kmalloc
(
sizeof
*
mm3
,
GFP_KERNEL
);
if
(
!
mm3
)
{
sq_db_key_mm
=
kmalloc
(
sizeof
(
*
sq_db_key_mm
)
,
GFP_KERNEL
);
if
(
!
sq_db_key_mm
)
{
ret
=
-
ENOMEM
;
goto
err5
;
}
mm4
=
kmalloc
(
sizeof
*
mm4
,
GFP_KERNEL
);
if
(
!
mm4
)
{
rq_db_key_mm
=
kmalloc
(
sizeof
(
*
rq_db_key_mm
)
,
GFP_KERNEL
);
if
(
!
rq_db_key_mm
)
{
ret
=
-
ENOMEM
;
goto
err6
;
}
if
(
t4_sq_onchip
(
&
qhp
->
wq
.
sq
))
{
mm5
=
kmalloc
(
sizeof
*
mm5
,
GFP_KERNEL
);
if
(
!
mm5
)
{
ma_sync_key_mm
=
kmalloc
(
sizeof
(
*
ma_sync_key_mm
),
GFP_KERNEL
);
if
(
!
ma_sync_key_mm
)
{
ret
=
-
ENOMEM
;
goto
err7
;
}
...
...
@@ -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_memsize
=
qhp
->
wq
.
rq
.
memsize
;
spin_lock
(
&
ucontext
->
mmap_lock
);
if
(
m
m5
)
{
if
(
m
a_sync_key_mm
)
{
uresp
.
ma_sync_key
=
ucontext
->
key
;
ucontext
->
key
+=
PAGE_SIZE
;
}
else
{
...
...
@@ -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
);
if
(
ret
)
goto
err8
;
mm1
->
key
=
uresp
.
sq_key
;
mm1
->
addr
=
qhp
->
wq
.
sq
.
phys_addr
;
mm1
->
len
=
PAGE_ALIGN
(
qhp
->
wq
.
sq
.
memsize
);
insert_mmap
(
ucontext
,
mm1
);
mm2
->
key
=
uresp
.
rq_key
;
mm2
->
addr
=
virt_to_phys
(
qhp
->
wq
.
rq
.
queue
);
mm2
->
len
=
PAGE_ALIGN
(
qhp
->
wq
.
rq
.
memsize
);
insert_mmap
(
ucontext
,
mm2
);
mm3
->
key
=
uresp
.
sq_db_gts_key
;
mm3
->
addr
=
(
__force
unsigned
long
)
qhp
->
wq
.
sq
.
bar2_pa
;
mm3
->
len
=
PAGE_SIZE
;
insert_mmap
(
ucontext
,
mm3
);
mm4
->
key
=
uresp
.
rq_db_gts_key
;
mm4
->
addr
=
(
__force
unsigned
long
)
qhp
->
wq
.
rq
.
bar2_pa
;
mm4
->
len
=
PAGE_SIZE
;
insert_mmap
(
ucontext
,
mm4
);
if
(
mm5
)
{
mm5
->
key
=
uresp
.
ma_sync_key
;
mm5
->
addr
=
(
pci_resource_start
(
rhp
->
rdev
.
lldi
.
pdev
,
0
)
+
PCIE_MA_SYNC_A
)
&
PAGE_MASK
;
mm5
->
len
=
PAGE_SIZE
;
insert_mmap
(
ucontext
,
mm5
);
sq_key_mm
->
key
=
uresp
.
sq_key
;
sq_key_mm
->
addr
=
qhp
->
wq
.
sq
.
phys_addr
;
sq_key_mm
->
len
=
PAGE_ALIGN
(
qhp
->
wq
.
sq
.
memsize
);
insert_mmap
(
ucontext
,
sq_key_mm
);
rq_key_mm
->
key
=
uresp
.
rq_key
;
rq_key_mm
->
addr
=
virt_to_phys
(
qhp
->
wq
.
rq
.
queue
);
rq_key_mm
->
len
=
PAGE_ALIGN
(
qhp
->
wq
.
rq
.
memsize
);
insert_mmap
(
ucontext
,
rq_key_mm
);
sq_db_key_mm
->
key
=
uresp
.
sq_db_gts_key
;
sq_db_key_mm
->
addr
=
(
u64
)(
unsigned
long
)
qhp
->
wq
.
sq
.
bar2_pa
;
sq_db_key_mm
->
len
=
PAGE_SIZE
;
insert_mmap
(
ucontext
,
sq_db_key_mm
);
rq_db_key_mm
->
key
=
uresp
.
rq_db_gts_key
;
rq_db_key_mm
->
addr
=
(
u64
)(
unsigned
long
)
qhp
->
wq
.
rq
.
bar2_pa
;
rq_db_key_mm
->
len
=
PAGE_SIZE
;
insert_mmap
(
ucontext
,
rq_db_key_mm
);
if
(
ma_sync_key_mm
)
{
ma_sync_key_mm
->
key
=
uresp
.
ma_sync_key
;
ma_sync_key_mm
->
addr
=
(
pci_resource_start
(
rhp
->
rdev
.
lldi
.
pdev
,
0
)
+
PCIE_MA_SYNC_A
)
&
PAGE_MASK
;
ma_sync_key_mm
->
len
=
PAGE_SIZE
;
insert_mmap
(
ucontext
,
ma_sync_key_mm
);
}
}
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,
qhp
->
wq
.
rq
.
memsize
,
attrs
->
cap
.
max_recv_wr
);
return
&
qhp
->
ibqp
;
err8:
kfree
(
m
m5
);
kfree
(
m
a_sync_key_mm
);
err7:
kfree
(
mm4
);
kfree
(
rq_db_key_mm
);
err6:
kfree
(
mm3
);
kfree
(
sq_db_key_mm
);
err5:
kfree
(
mm2
);
kfree
(
rq_key_mm
);
err4:
kfree
(
mm1
);
kfree
(
sq_key_mm
);
err3:
remove_handle
(
rhp
,
&
rhp
->
qpidr
,
qhp
->
wq
.
sq
.
qid
);
err2:
...
...
drivers/infiniband/hw/nes/Kconfig
浏览文件 @
082eaa50
...
...
@@ -2,7 +2,6 @@ config INFINIBAND_NES
tristate "NetEffect RNIC Driver"
depends on PCI && INET && INFINIBAND
select LIBCRC32C
select INET_LRO
---help---
This is the RDMA Network Interface Card (RNIC) driver for
NetEffect Ethernet Cluster Server Adapters.
...
...
drivers/infiniband/hw/nes/nes.c
浏览文件 @
082eaa50
...
...
@@ -111,17 +111,6 @@ static struct pci_device_id 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_net_event
(
struct
notifier_block
*
,
unsigned
long
,
void
*
);
static
int
nes_notifiers_registered
;
...
...
@@ -682,17 +671,6 @@ static int nes_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
}
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
);
/* Initialize network devices */
...
...
@@ -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
"
,
nesdev
->
netdev_count
,
nesdev
->
nesadapter
->
netdev_count
);
ibnl_remove_client
(
RDMA_NL_NES
);
nes_notifiers_registered
--
;
if
(
nes_notifiers_registered
==
0
)
{
...
...
@@ -795,8 +772,6 @@ static void nes_remove(struct pci_dev *pcidev)
nesdev
->
nesadapter
->
netdev_count
--
;
}
}
ibnl_remove_client
(
RDMA_NL_NES
);
iwpm_exit
(
RDMA_NL_NES
);
nes_notifiers_registered
--
;
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 {
struct
list_head
list
;
struct
nes_cm_core
*
cm_core
;
u8
loc_mac
[
ETH_ALEN
];
nes_addr_t
loc_addr
,
mapped_loc_addr
;
u16
loc_port
,
mapped_loc_port
;
nes_addr_t
loc_addr
;
u16
loc_port
;
struct
iw_cm_id
*
cm_id
;
enum
nes_cm_conn_type
conn_type
;
atomic_t
ref_count
;
...
...
@@ -309,9 +309,7 @@ struct nes_cm_listener {
/* per connection node and node state information */
struct
nes_cm_node
{
nes_addr_t
loc_addr
,
rem_addr
;
nes_addr_t
mapped_loc_addr
,
mapped_rem_addr
;
u16
loc_port
,
rem_port
;
u16
mapped_loc_port
,
mapped_rem_port
;
u8
loc_mac
[
ETH_ALEN
];
u8
rem_mac
[
ETH_ALEN
];
...
...
@@ -368,11 +366,6 @@ struct nes_cm_info {
u16
rem_port
;
nes_addr_t
loc_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
;
int
backlog
;
};
...
...
drivers/infiniband/hw/nes/nes_hw.c
浏览文件 @
082eaa50
...
...
@@ -35,18 +35,11 @@
#include <linux/moduleparam.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/if_vlan.h>
#include <linux/inet_lro.h>
#include <linux/slab.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
;
module_param
(
wide_ppm_offset
,
int
,
0644
);
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)
}
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
*/
...
...
@@ -1895,14 +1869,6 @@ int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev)
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
;
}
...
...
@@ -2809,13 +2775,10 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
u16
pkt_type
;
u16
rqes_processed
=
0
;
u8
sq_cqes
=
0
;
u8
nes_use_lro
=
0
;
head
=
cq
->
cq_head
;
cq_size
=
cq
->
cq_size
;
cq
->
cqes_pending
=
1
;
if
(
nesvnic
->
netdev
->
features
&
NETIF_F_LRO
)
nes_use_lro
=
1
;
do
{
if
(
le32_to_cpu
(
cq
->
cq_vbase
[
head
].
cqe_words
[
NES_NIC_CQE_MISC_IDX
])
&
NES_NIC_CQE_VALID
)
{
...
...
@@ -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
);
}
if
(
nes_use_lro
)
lro_receive_skb
(
&
nesvnic
->
lro_mgr
,
rx_skb
,
NULL
);
else
netif_receive_skb
(
rx_skb
);
napi_gro_receive
(
&
nesvnic
->
napi
,
rx_skb
);
skip_rx_indicate0:
;
...
...
@@ -2984,8 +2944,6 @@ void nes_nic_ce_handler(struct nes_device *nesdev, struct nes_hw_nic_cq *cq)
}
while
(
1
);
if
(
nes_use_lro
)
lro_flush_all
(
&
nesvnic
->
lro_mgr
);
if
(
sq_cqes
)
{
barrier
();
/* restart the queue if it had been stopped */
...
...
drivers/infiniband/hw/nes/nes_hw.h
浏览文件 @
082eaa50
...
...
@@ -33,8 +33,6 @@
#ifndef __NES_HW_H
#define __NES_HW_H
#include <linux/inet_lro.h>
#define NES_PHY_TYPE_CX4 1
#define NES_PHY_TYPE_1G 2
#define NES_PHY_TYPE_ARGUS 4
...
...
@@ -1049,8 +1047,6 @@ struct nes_hw_tune_timer {
#define NES_TIMER_ENABLE_LIMIT 4
#define NES_MAX_LINK_INTERRUPTS 128
#define NES_MAX_LINK_CHECK 200
#define NES_MAX_LRO_DESCRIPTORS 32
#define NES_LRO_MAX_AGGR 64
struct
nes_adapter
{
u64
fw_ver
;
...
...
@@ -1263,9 +1259,6 @@ struct nes_vnic {
u8
next_qp_nic_index
;
u8
of_device_registered
;
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
;
enum
ib_event_type
delayed_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] = {
"Free 4Kpbls"
,
"Free 256pbls"
,
"Timer Inits"
,
"LRO aggregated"
,
"LRO flushed"
,
"LRO no_desc"
,
"PAU CreateQPs"
,
"PAU DestroyQPs"
,
};
...
...
@@ -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_256pbl
;
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_destroyed
);
}
...
...
@@ -1709,7 +1703,6 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev,
netdev
->
hw_features
|=
NETIF_F_TSO
;
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,"
" 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)
nesibdev
->
ibdev
.
iwcm
->
create_listen
=
nes_create_listen
;
nesibdev
->
ibdev
.
iwcm
->
destroy_listen
=
nes_destroy_listen
;
nesibdev
->
ibdev
.
get_port_immutable
=
nes_port_immutable
;
memcpy
(
nesibdev
->
ibdev
.
iwcm
->
ifname
,
netdev
->
name
,
sizeof
(
nesibdev
->
ibdev
.
iwcm
->
ifname
));
return
nesibdev
;
}
...
...
drivers/net/ethernet/chelsio/cxgb4/t4_msg.h
浏览文件 @
082eaa50
...
...
@@ -1021,6 +1021,8 @@ struct cpl_l2t_write_req {
#define L2T_W_NOREPLY_V(x) ((x) << L2T_W_NOREPLY_S)
#define L2T_W_NOREPLY_F L2T_W_NOREPLY_V(1U)
#define CPL_L2T_VLAN_NONE 0xfff
struct
cpl_l2t_write_rpl
{
union
opcode_tid
ot
;
u8
status
;
...
...
drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h
浏览文件 @
082eaa50
...
...
@@ -561,6 +561,7 @@ enum fw_flowc_mnem {
FW_FLOWC_MNEM_SNDBUF
,
FW_FLOWC_MNEM_MSS
,
FW_FLOWC_MNEM_TXDATAPLEN_MAX
,
FW_FLOWC_MNEM_SCHEDCLASS
=
11
,
};
struct
fw_flowc_mnemval
{
...
...
include/rdma/iw_cm.h
浏览文件 @
082eaa50
...
...
@@ -83,8 +83,10 @@ struct iw_cm_id {
iw_cm_handler
cm_handler
;
/* client callback function */
void
*
context
;
/* client cb context */
struct
ib_device
*
device
;
struct
sockaddr_storage
local_addr
;
struct
sockaddr_storage
local_addr
;
/* local 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 */
iw_event_handler
event_handler
;
/* cb for provider
events */
...
...
@@ -92,6 +94,7 @@ struct iw_cm_id {
void
(
*
add_ref
)(
struct
iw_cm_id
*
);
void
(
*
rem_ref
)(
struct
iw_cm_id
*
);
u8
tos
;
bool
mapped
;
};
struct
iw_cm_conn_param
{
...
...
@@ -123,6 +126,7 @@ struct iw_cm_verbs {
int
backlog
);
int
(
*
destroy_listen
)(
struct
iw_cm_id
*
cm_id
);
char
ifname
[
IFNAMSIZ
];
};
/**
...
...
include/uapi/rdma/rdma_netlink.h
浏览文件 @
082eaa50
...
...
@@ -5,8 +5,8 @@
enum
{
RDMA_NL_RDMA_CM
=
1
,
RDMA_NL_
NES
,
RDMA_NL_
C4IW
,
RDMA_NL_
IWCM
,
RDMA_NL_
RSVD
,
RDMA_NL_LS
,
/* RDMA Local Services */
RDMA_NL_NUM_CLIENTS
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录