You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branches 'nes', 'cxgb4' and 'iwpm' into k.o/for-4.6
This commit is contained in:
+164
-26
@@ -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);
|
||||
|
||||
@@ -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, IWPM_IFNAME_SIZE,
|
||||
pm_msg->if_name, IWPM_NLA_REG_IF_NAME);
|
||||
ret = ibnl_put_attr(skb, nlh, IFNAMSIZ,
|
||||
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 @@ register_pid_response_exit:
|
||||
/* 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 @@ add_mapping_response_exit:
|
||||
/* 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 @@ query_mapping_response_exit:
|
||||
/* 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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -1877,7 +1877,7 @@ err:
|
||||
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));
|
||||
|
||||
/*
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
if (mr_type != IB_MR_TYPE_MEM_REG ||
|
||||
max_num_sg > t4_max_fr_depth(use_dsgl))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
php = to_c4iw_pd(pd);
|
||||
rhp = php->rhp;
|
||||
|
||||
if (mr_type != IB_MR_TYPE_MEM_REG ||
|
||||
max_num_sg > t4_max_fr_depth(&rhp->rdev.lldi.ulptx_memwrite_dsgl &&
|
||||
use_dsgl))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
mhp = kzalloc(sizeof(*mhp), GFP_KERNEL);
|
||||
if (!mhp) {
|
||||
ret = -ENOMEM;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 (mm5) {
|
||||
if (ma_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(mm5);
|
||||
kfree(ma_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:
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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 @@ skip_rx_indicate0:
|
||||
|
||||
} while (1);
|
||||
|
||||
if (nes_use_lro)
|
||||
lro_flush_all(&nesvnic->lro_mgr);
|
||||
if (sq_cqes) {
|
||||
barrier();
|
||||
/* restart the queue if it had been stopped */
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user