Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
082eaa50
Commit
082eaa50
authored
Mar 16, 2016
by
Doug Ledford
Browse files
Options
Browse Files
Download
Plain Diff
Merge branches 'nes', 'cxgb4' and 'iwpm' into k.o/for-4.6
parents
d2ad9cc7
a82268b3
3021376d
dafb5587
Changes
23
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
442 additions
and
753 deletions
+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
No files found.
drivers/infiniband/core/iwcm.c
View file @
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,7 +560,9 @@ 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
=
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
)
cm_id_priv
->
state
=
IW_CM_STATE_IDLE
;
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)
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
=
cm_id
->
device
->
iwcm
->
connect
(
cm_id
,
iw_param
);
if
(
ret
)
{
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
;
clear_bit
(
IWCM_F_CONNECT_WAIT
,
&
cm_id_priv
->
flags
);
wake_up_all
(
&
cm_id_priv
->
connect_wait
);
}
ret
=
iw_cm_map
(
cm_id
,
true
);
if
(
!
ret
)
ret
=
cm_id
->
device
->
iwcm
->
connect
(
cm_id
,
iw_param
);
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
;
}
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
->
remote_addr
=
iw_event
->
remote_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
View file @
082eaa50
...
...
@@ -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
);
if
(
ret
)
goto
pid_query_error
;
ret
=
ibnl_put_attr
(
skb
,
nlh
,
I
WPM_IFNAME_SIZE
,
pm_msg
->
if_name
,
IWPM_NLA_REG_IF_NAME
);
ret
=
ibnl_put_attr
(
skb
,
nlh
,
I
FNAMSIZ
,
pm_msg
->
if_name
,
IWPM_NLA_REG_IF_NAME
);
if
(
ret
)
goto
pid_query_error
;
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)
/* 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
View file @
082eaa50
...
...
@@ -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
,
struct
sockaddr_storage
*
mapped_rem_addr
,
struct
sockaddr_storage
*
remote_addr
,
u8
nl_client
)
struct
sockaddr_storage
*
mapped_rem_addr
,
struct
sockaddr_storage
*
remote_addr
,
u8
nl_client
)
{
struct
hlist_node
*
tmp_hlist_node
;
struct
hlist_head
*
hash_bucket_head
;
...
...
@@ -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
View file @
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
View file @
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
View file @
082eaa50
This diff is collapsed.
Click to expand it.
drivers/infiniband/hw/cxgb4/device.c
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
082eaa50
This diff is collapsed.
Click to expand it.
drivers/infiniband/hw/nes/nes_cm.h
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment