Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: (45 commits) RDMA/cxgb3: Fix error paths in post_send and post_recv RDMA/nes: Fix stale ARP issue RDMA/nes: FIN during MPA startup causes timeout RDMA/nes: Free kmap() resources RDMA/nes: Check for zero STag RDMA/nes: Fix Xansation test crash on cm_node ref_count RDMA/nes: Abnormal listener exit causes loopback node crash RDMA/nes: Fix crash in nes_accept() RDMA/nes: Resource not freed for REJECTed connections RDMA/nes: MPA request/response error checking RDMA/nes: Fix query of ORD values RDMA/nes: Fix MAX_CM_BUFFER define RDMA/nes: Pass correct size to ioremap_nocache() RDMA/nes: Update copyright and branding string RDMA/nes: Add max_cqe check to nes_create_cq() RDMA/nes: Clean up struct nes_qp RDMA/nes: Implement IB_SIGNAL_ALL_WR as an iWARP extension RDMA/nes: Add additional SFP+ PHY uC status check and PHY reset RDMA/nes: Correct fast memory registration implementation IB/ehca: Fix error paths in post_send and post_recv ...
このコミットが含まれているのは:
@@ -4,14 +4,13 @@ config INFINIBAND_NES
|
||||
select LIBCRC32C
|
||||
select INET_LRO
|
||||
---help---
|
||||
This is a low-level driver for NetEffect RDMA enabled
|
||||
Network Interface Cards (RNIC).
|
||||
This is the RDMA Network Interface Card (RNIC) driver for
|
||||
NetEffect Ethernet Cluster Server Adapters.
|
||||
|
||||
config INFINIBAND_NES_DEBUG
|
||||
bool "Verbose debugging output"
|
||||
depends on INFINIBAND_NES
|
||||
default n
|
||||
---help---
|
||||
This option causes the NetEffect RNIC driver to produce debug
|
||||
messages. Select this if you are developing the driver
|
||||
or trying to diagnose a problem.
|
||||
This option enables debug messages from the NetEffect RNIC
|
||||
driver. Select this if you are diagnosing a problem.
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
@@ -521,7 +521,8 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i
|
||||
spin_lock_init(&nesdev->indexed_regs_lock);
|
||||
|
||||
/* Remap the PCI registers in adapter BAR0 to kernel VA space */
|
||||
mmio_regs = ioremap_nocache(pci_resource_start(pcidev, BAR_0), sizeof(mmio_regs));
|
||||
mmio_regs = ioremap_nocache(pci_resource_start(pcidev, BAR_0),
|
||||
pci_resource_len(pcidev, BAR_0));
|
||||
if (mmio_regs == NULL) {
|
||||
printk(KERN_ERR PFX "Unable to remap BAR0\n");
|
||||
ret = -EIO;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
@@ -52,6 +52,7 @@
|
||||
#include <linux/random.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/threads.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <net/arp.h>
|
||||
#include <net/neighbour.h>
|
||||
#include <net/route.h>
|
||||
@@ -251,6 +252,33 @@ static int parse_mpa(struct nes_cm_node *cm_node, u8 *buffer, u32 *type,
|
||||
|
||||
mpa_frame = (struct ietf_mpa_frame *)buffer;
|
||||
cm_node->mpa_frame_size = ntohs(mpa_frame->priv_data_len);
|
||||
/* make sure mpa private data len is less than 512 bytes */
|
||||
if (cm_node->mpa_frame_size > IETF_MAX_PRIV_DATA_LEN) {
|
||||
nes_debug(NES_DBG_CM, "The received Length of Private"
|
||||
" Data field exceeds 512 octets\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
/*
|
||||
* make sure MPA receiver interoperate with the
|
||||
* received MPA version and MPA key information
|
||||
*
|
||||
*/
|
||||
if (mpa_frame->rev != mpa_version) {
|
||||
nes_debug(NES_DBG_CM, "The received mpa version"
|
||||
" can not be interoperated\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (cm_node->state != NES_CM_STATE_MPAREQ_SENT) {
|
||||
if (memcmp(mpa_frame->key, IEFT_MPA_KEY_REQ, IETF_MPA_KEY_SIZE)) {
|
||||
nes_debug(NES_DBG_CM, "Unexpected MPA Key received \n");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
if (memcmp(mpa_frame->key, IEFT_MPA_KEY_REP, IETF_MPA_KEY_SIZE)) {
|
||||
nes_debug(NES_DBG_CM, "Unexpected MPA Key received \n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (cm_node->mpa_frame_size + sizeof(struct ietf_mpa_frame) != len) {
|
||||
nes_debug(NES_DBG_CM, "The received ietf buffer was not right"
|
||||
@@ -486,6 +514,8 @@ static void nes_retrans_expired(struct nes_cm_node *cm_node)
|
||||
send_reset(cm_node, NULL);
|
||||
break;
|
||||
default:
|
||||
add_ref_cm_node(cm_node);
|
||||
send_reset(cm_node, NULL);
|
||||
create_event(cm_node, NES_CM_EVENT_ABORTED);
|
||||
}
|
||||
}
|
||||
@@ -949,6 +979,7 @@ static int mini_cm_dec_refcnt_listen(struct nes_cm_core *cm_core,
|
||||
reset_entry);
|
||||
{
|
||||
struct nes_cm_node *loopback = cm_node->loopbackpartner;
|
||||
enum nes_cm_node_state old_state;
|
||||
if (NES_CM_STATE_FIN_WAIT1 <= cm_node->state) {
|
||||
rem_ref_cm_node(cm_node->cm_core, cm_node);
|
||||
} else {
|
||||
@@ -960,11 +991,12 @@ static int mini_cm_dec_refcnt_listen(struct nes_cm_core *cm_core,
|
||||
NES_CM_STATE_CLOSED;
|
||||
WARN_ON(1);
|
||||
} else {
|
||||
cm_node->state =
|
||||
NES_CM_STATE_CLOSED;
|
||||
rem_ref_cm_node(
|
||||
cm_node->cm_core,
|
||||
cm_node);
|
||||
old_state = cm_node->state;
|
||||
cm_node->state = NES_CM_STATE_LISTENER_DESTROYED;
|
||||
if (old_state != NES_CM_STATE_MPAREQ_RCVD)
|
||||
rem_ref_cm_node(
|
||||
cm_node->cm_core,
|
||||
cm_node);
|
||||
}
|
||||
} else {
|
||||
struct nes_cm_event event;
|
||||
@@ -980,20 +1012,9 @@ static int mini_cm_dec_refcnt_listen(struct nes_cm_core *cm_core,
|
||||
loopback->loc_port;
|
||||
event.cm_info.cm_id = loopback->cm_id;
|
||||
cm_event_connect_error(&event);
|
||||
cm_node->state = NES_CM_STATE_LISTENER_DESTROYED;
|
||||
loopback->state = NES_CM_STATE_CLOSED;
|
||||
|
||||
event.cm_node = cm_node;
|
||||
event.cm_info.rem_addr =
|
||||
cm_node->rem_addr;
|
||||
event.cm_info.loc_addr =
|
||||
cm_node->loc_addr;
|
||||
event.cm_info.rem_port =
|
||||
cm_node->rem_port;
|
||||
event.cm_info.loc_port =
|
||||
cm_node->loc_port;
|
||||
event.cm_info.cm_id = cm_node->cm_id;
|
||||
cm_event_reset(&event);
|
||||
|
||||
rem_ref_cm_node(cm_node->cm_core,
|
||||
cm_node);
|
||||
|
||||
@@ -1077,12 +1098,13 @@ static inline int mini_cm_accelerated(struct nes_cm_core *cm_core,
|
||||
/**
|
||||
* nes_addr_resolve_neigh
|
||||
*/
|
||||
static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip)
|
||||
static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpindex)
|
||||
{
|
||||
struct rtable *rt;
|
||||
struct flowi fl;
|
||||
struct neighbour *neigh;
|
||||
int rc = -1;
|
||||
int rc = arpindex;
|
||||
struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;
|
||||
|
||||
memset(&fl, 0, sizeof fl);
|
||||
fl.nl_u.ip4_u.daddr = htonl(dst_ip);
|
||||
@@ -1098,6 +1120,21 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip)
|
||||
nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X"
|
||||
" is %pM, Gateway is 0x%08X \n", dst_ip,
|
||||
neigh->ha, ntohl(rt->rt_gateway));
|
||||
|
||||
if (arpindex >= 0) {
|
||||
if (!memcmp(nesadapter->arp_table[arpindex].mac_addr,
|
||||
neigh->ha, ETH_ALEN)){
|
||||
/* Mac address same as in nes_arp_table */
|
||||
neigh_release(neigh);
|
||||
ip_rt_put(rt);
|
||||
return rc;
|
||||
}
|
||||
|
||||
nes_manage_arp_cache(nesvnic->netdev,
|
||||
nesadapter->arp_table[arpindex].mac_addr,
|
||||
dst_ip, NES_ARP_DELETE);
|
||||
}
|
||||
|
||||
nes_manage_arp_cache(nesvnic->netdev, neigh->ha,
|
||||
dst_ip, NES_ARP_ADD);
|
||||
rc = nes_arp_table(nesvnic->nesdev, dst_ip, NULL,
|
||||
@@ -1113,7 +1150,6 @@ static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip)
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* make_cm_node - create a new instance of a cm node
|
||||
*/
|
||||
@@ -1123,6 +1159,7 @@ static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core,
|
||||
{
|
||||
struct nes_cm_node *cm_node;
|
||||
struct timespec ts;
|
||||
int oldarpindex = 0;
|
||||
int arpindex = 0;
|
||||
struct nes_device *nesdev;
|
||||
struct nes_adapter *nesadapter;
|
||||
@@ -1176,17 +1213,18 @@ static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core,
|
||||
nesadapter = nesdev->nesadapter;
|
||||
|
||||
cm_node->loopbackpartner = NULL;
|
||||
|
||||
/* get the mac addr for the remote node */
|
||||
if (ipv4_is_loopback(htonl(cm_node->rem_addr)))
|
||||
arpindex = nes_arp_table(nesdev, ntohl(nesvnic->local_ipaddr), NULL, NES_ARP_RESOLVE);
|
||||
else
|
||||
arpindex = nes_arp_table(nesdev, cm_node->rem_addr, NULL, NES_ARP_RESOLVE);
|
||||
else {
|
||||
oldarpindex = nes_arp_table(nesdev, cm_node->rem_addr, NULL, NES_ARP_RESOLVE);
|
||||
arpindex = nes_addr_resolve_neigh(nesvnic, cm_info->rem_addr, oldarpindex);
|
||||
|
||||
}
|
||||
if (arpindex < 0) {
|
||||
arpindex = nes_addr_resolve_neigh(nesvnic, cm_info->rem_addr);
|
||||
if (arpindex < 0) {
|
||||
kfree(cm_node);
|
||||
return NULL;
|
||||
}
|
||||
kfree(cm_node);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* copy the mac addr to node context */
|
||||
@@ -1333,13 +1371,20 @@ static void handle_fin_pkt(struct nes_cm_node *cm_node)
|
||||
case NES_CM_STATE_SYN_RCVD:
|
||||
case NES_CM_STATE_SYN_SENT:
|
||||
case NES_CM_STATE_ESTABLISHED:
|
||||
case NES_CM_STATE_MPAREQ_SENT:
|
||||
case NES_CM_STATE_MPAREJ_RCVD:
|
||||
cm_node->tcp_cntxt.rcv_nxt++;
|
||||
cleanup_retrans_entry(cm_node);
|
||||
cm_node->state = NES_CM_STATE_LAST_ACK;
|
||||
send_fin(cm_node, NULL);
|
||||
break;
|
||||
case NES_CM_STATE_MPAREQ_SENT:
|
||||
create_event(cm_node, NES_CM_EVENT_ABORTED);
|
||||
cm_node->tcp_cntxt.rcv_nxt++;
|
||||
cleanup_retrans_entry(cm_node);
|
||||
cm_node->state = NES_CM_STATE_CLOSED;
|
||||
add_ref_cm_node(cm_node);
|
||||
send_reset(cm_node, NULL);
|
||||
break;
|
||||
case NES_CM_STATE_FIN_WAIT1:
|
||||
cm_node->tcp_cntxt.rcv_nxt++;
|
||||
cleanup_retrans_entry(cm_node);
|
||||
@@ -1590,6 +1635,7 @@ static void handle_syn_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
|
||||
break;
|
||||
case NES_CM_STATE_CLOSED:
|
||||
cleanup_retrans_entry(cm_node);
|
||||
add_ref_cm_node(cm_node);
|
||||
send_reset(cm_node, skb);
|
||||
break;
|
||||
case NES_CM_STATE_TSA:
|
||||
@@ -1641,9 +1687,15 @@ static void handle_synack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
|
||||
passive_open_err(cm_node, skb, 1);
|
||||
break;
|
||||
case NES_CM_STATE_LISTENING:
|
||||
cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq);
|
||||
cleanup_retrans_entry(cm_node);
|
||||
cm_node->state = NES_CM_STATE_CLOSED;
|
||||
send_reset(cm_node, skb);
|
||||
break;
|
||||
case NES_CM_STATE_CLOSED:
|
||||
cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq);
|
||||
cleanup_retrans_entry(cm_node);
|
||||
add_ref_cm_node(cm_node);
|
||||
send_reset(cm_node, skb);
|
||||
break;
|
||||
case NES_CM_STATE_ESTABLISHED:
|
||||
@@ -1712,8 +1764,13 @@ static int handle_ack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
|
||||
dev_kfree_skb_any(skb);
|
||||
break;
|
||||
case NES_CM_STATE_LISTENING:
|
||||
cleanup_retrans_entry(cm_node);
|
||||
cm_node->state = NES_CM_STATE_CLOSED;
|
||||
send_reset(cm_node, skb);
|
||||
break;
|
||||
case NES_CM_STATE_CLOSED:
|
||||
cleanup_retrans_entry(cm_node);
|
||||
add_ref_cm_node(cm_node);
|
||||
send_reset(cm_node, skb);
|
||||
break;
|
||||
case NES_CM_STATE_LAST_ACK:
|
||||
@@ -1974,7 +2031,7 @@ static struct nes_cm_node *mini_cm_connect(struct nes_cm_core *cm_core,
|
||||
if (!cm_node)
|
||||
return NULL;
|
||||
mpa_frame = &cm_node->mpa_frame;
|
||||
strcpy(mpa_frame->key, IEFT_MPA_KEY_REQ);
|
||||
memcpy(mpa_frame->key, IEFT_MPA_KEY_REQ, IETF_MPA_KEY_SIZE);
|
||||
mpa_frame->flags = IETF_MPA_FLAGS_CRC;
|
||||
mpa_frame->rev = IETF_MPA_VERSION;
|
||||
mpa_frame->priv_data_len = htons(private_data_len);
|
||||
@@ -2102,30 +2159,39 @@ static int mini_cm_reject(struct nes_cm_core *cm_core,
|
||||
cm_node->state = NES_CM_STATE_CLOSED;
|
||||
rem_ref_cm_node(cm_core, cm_node);
|
||||
} else {
|
||||
ret = send_mpa_reject(cm_node);
|
||||
if (ret) {
|
||||
cm_node->state = NES_CM_STATE_CLOSED;
|
||||
err = send_reset(cm_node, NULL);
|
||||
if (err)
|
||||
WARN_ON(1);
|
||||
} else
|
||||
cm_id->add_ref(cm_id);
|
||||
if (cm_node->state == NES_CM_STATE_LISTENER_DESTROYED) {
|
||||
rem_ref_cm_node(cm_core, cm_node);
|
||||
} else {
|
||||
ret = send_mpa_reject(cm_node);
|
||||
if (ret) {
|
||||
cm_node->state = NES_CM_STATE_CLOSED;
|
||||
err = send_reset(cm_node, NULL);
|
||||
if (err)
|
||||
WARN_ON(1);
|
||||
} else
|
||||
cm_id->add_ref(cm_id);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cm_node->cm_id = NULL;
|
||||
event.cm_node = loopback;
|
||||
event.cm_info.rem_addr = loopback->rem_addr;
|
||||
event.cm_info.loc_addr = loopback->loc_addr;
|
||||
event.cm_info.rem_port = loopback->rem_port;
|
||||
event.cm_info.loc_port = loopback->loc_port;
|
||||
event.cm_info.cm_id = loopback->cm_id;
|
||||
cm_event_mpa_reject(&event);
|
||||
rem_ref_cm_node(cm_core, cm_node);
|
||||
loopback->state = NES_CM_STATE_CLOSING;
|
||||
if (cm_node->state == NES_CM_STATE_LISTENER_DESTROYED) {
|
||||
rem_ref_cm_node(cm_core, cm_node);
|
||||
rem_ref_cm_node(cm_core, loopback);
|
||||
} else {
|
||||
event.cm_node = loopback;
|
||||
event.cm_info.rem_addr = loopback->rem_addr;
|
||||
event.cm_info.loc_addr = loopback->loc_addr;
|
||||
event.cm_info.rem_port = loopback->rem_port;
|
||||
event.cm_info.loc_port = loopback->loc_port;
|
||||
event.cm_info.cm_id = loopback->cm_id;
|
||||
cm_event_mpa_reject(&event);
|
||||
rem_ref_cm_node(cm_core, cm_node);
|
||||
loopback->state = NES_CM_STATE_CLOSING;
|
||||
|
||||
cm_id = loopback->cm_id;
|
||||
rem_ref_cm_node(cm_core, loopback);
|
||||
cm_id->rem_ref(cm_id);
|
||||
cm_id = loopback->cm_id;
|
||||
rem_ref_cm_node(cm_core, loopback);
|
||||
cm_id->rem_ref(cm_id);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -2164,11 +2230,15 @@ static int mini_cm_close(struct nes_cm_core *cm_core, struct nes_cm_node *cm_nod
|
||||
case NES_CM_STATE_CLOSING:
|
||||
ret = -1;
|
||||
break;
|
||||
case NES_CM_STATE_MPAREJ_RCVD:
|
||||
case NES_CM_STATE_LISTENING:
|
||||
cleanup_retrans_entry(cm_node);
|
||||
send_reset(cm_node, NULL);
|
||||
break;
|
||||
case NES_CM_STATE_MPAREJ_RCVD:
|
||||
case NES_CM_STATE_UNKNOWN:
|
||||
case NES_CM_STATE_INITED:
|
||||
case NES_CM_STATE_CLOSED:
|
||||
case NES_CM_STATE_LISTENER_DESTROYED:
|
||||
ret = rem_ref_cm_node(cm_core, cm_node);
|
||||
break;
|
||||
case NES_CM_STATE_TSA:
|
||||
@@ -2687,8 +2757,6 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
||||
struct nes_pd *nespd;
|
||||
u64 tagged_offset;
|
||||
|
||||
|
||||
|
||||
ibqp = nes_get_qp(cm_id->device, conn_param->qpn);
|
||||
if (!ibqp)
|
||||
return -EINVAL;
|
||||
@@ -2704,6 +2772,13 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
||||
"%s\n", cm_node, nesvnic, nesvnic->netdev,
|
||||
nesvnic->netdev->name);
|
||||
|
||||
if (NES_CM_STATE_LISTENER_DESTROYED == cm_node->state) {
|
||||
if (cm_node->loopbackpartner)
|
||||
rem_ref_cm_node(cm_node->cm_core, cm_node->loopbackpartner);
|
||||
rem_ref_cm_node(cm_node->cm_core, cm_node);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* associate the node with the QP */
|
||||
nesqp->cm_node = (void *)cm_node;
|
||||
cm_node->nesqp = nesqp;
|
||||
@@ -2786,6 +2861,10 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
||||
cpu_to_le32(conn_param->private_data_len +
|
||||
sizeof(struct ietf_mpa_frame));
|
||||
wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = ibmr->lkey;
|
||||
if (nesqp->sq_kmapped) {
|
||||
nesqp->sq_kmapped = 0;
|
||||
kunmap(nesqp->page);
|
||||
}
|
||||
|
||||
nesqp->nesqp_context->ird_ord_sizes |=
|
||||
cpu_to_le32(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
|
||||
@@ -2929,7 +3008,7 @@ int nes_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len)
|
||||
if (cm_node->mpa_frame_size > MAX_CM_BUFFER)
|
||||
return -EINVAL;
|
||||
|
||||
strcpy(&cm_node->mpa_frame.key[0], IEFT_MPA_KEY_REP);
|
||||
memcpy(&cm_node->mpa_frame.key[0], IEFT_MPA_KEY_REP, IETF_MPA_KEY_SIZE);
|
||||
if (loopback) {
|
||||
memcpy(&loopback->mpa_frame.priv_data, pdata, pdata_len);
|
||||
loopback->mpa_frame.priv_data_len = pdata_len;
|
||||
@@ -2974,6 +3053,9 @@ int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
||||
if (!nesdev)
|
||||
return -EINVAL;
|
||||
|
||||
if (!(cm_id->local_addr.sin_port) || !(cm_id->remote_addr.sin_port))
|
||||
return -EINVAL;
|
||||
|
||||
nes_debug(NES_DBG_CM, "QP%u, current IP = 0x%08X, Destination IP = "
|
||||
"0x%08X:0x%04X, local = 0x%08X:0x%04X.\n", nesqp->hwqp.qp_id,
|
||||
ntohl(nesvnic->local_ipaddr),
|
||||
@@ -3251,6 +3333,11 @@ static void cm_event_connected(struct nes_cm_event *event)
|
||||
wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] = 0;
|
||||
wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;
|
||||
|
||||
if (nesqp->sq_kmapped) {
|
||||
nesqp->sq_kmapped = 0;
|
||||
kunmap(nesqp->page);
|
||||
}
|
||||
|
||||
/* use the reserved spot on the WQ for the extra first WQE */
|
||||
nesqp->nesqp_context->ird_ord_sizes &=
|
||||
cpu_to_le32(~(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
|
||||
@@ -3346,7 +3433,7 @@ static void cm_event_connect_error(struct nes_cm_event *event)
|
||||
nesqp->cm_id = NULL;
|
||||
cm_id->provider_data = NULL;
|
||||
cm_event.event = IW_CM_EVENT_CONNECT_REPLY;
|
||||
cm_event.status = IW_CM_EVENT_STATUS_REJECTED;
|
||||
cm_event.status = -ECONNRESET;
|
||||
cm_event.provider_data = cm_id->provider_data;
|
||||
cm_event.local_addr = cm_id->local_addr;
|
||||
cm_event.remote_addr = cm_id->remote_addr;
|
||||
@@ -3390,6 +3477,8 @@ static void cm_event_reset(struct nes_cm_event *event)
|
||||
|
||||
nes_debug(NES_DBG_CM, "%p - cm_id = %p\n", event->cm_node, cm_id);
|
||||
nesqp = cm_id->provider_data;
|
||||
if (!nesqp)
|
||||
return;
|
||||
|
||||
nesqp->cm_id = NULL;
|
||||
/* cm_id->provider_data = NULL; */
|
||||
@@ -3401,8 +3490,8 @@ static void cm_event_reset(struct nes_cm_event *event)
|
||||
cm_event.private_data = NULL;
|
||||
cm_event.private_data_len = 0;
|
||||
|
||||
ret = cm_id->event_handler(cm_id, &cm_event);
|
||||
cm_id->add_ref(cm_id);
|
||||
ret = cm_id->event_handler(cm_id, &cm_event);
|
||||
atomic_inc(&cm_closes);
|
||||
cm_event.event = IW_CM_EVENT_CLOSE;
|
||||
cm_event.status = IW_CM_EVENT_STATUS_OK;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
@@ -47,6 +47,8 @@
|
||||
#define IEFT_MPA_KEY_REP "MPA ID Rep Frame"
|
||||
#define IETF_MPA_KEY_SIZE 16
|
||||
#define IETF_MPA_VERSION 1
|
||||
#define IETF_MAX_PRIV_DATA_LEN 512
|
||||
#define IETF_MPA_FRAME_SIZE 20
|
||||
|
||||
enum ietf_mpa_flags {
|
||||
IETF_MPA_FLAGS_MARKERS = 0x80, /* receive Markers */
|
||||
@@ -169,7 +171,7 @@ struct nes_timer_entry {
|
||||
|
||||
#define NES_CM_DEF_SEQ2 0x18ed5740
|
||||
#define NES_CM_DEF_LOCAL_ID2 0xb807
|
||||
#define MAX_CM_BUFFER 512
|
||||
#define MAX_CM_BUFFER (IETF_MPA_FRAME_SIZE + IETF_MAX_PRIV_DATA_LEN)
|
||||
|
||||
|
||||
typedef u32 nes_addr_t;
|
||||
@@ -198,6 +200,7 @@ enum nes_cm_node_state {
|
||||
NES_CM_STATE_TIME_WAIT,
|
||||
NES_CM_STATE_LAST_ACK,
|
||||
NES_CM_STATE_CLOSING,
|
||||
NES_CM_STATE_LISTENER_DESTROYED,
|
||||
NES_CM_STATE_CLOSED
|
||||
};
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
@@ -424,8 +424,9 @@ struct nes_adapter *nes_init_adapter(struct nes_device *nesdev, u8 hw_rev) {
|
||||
|
||||
nesadapter->base_pd = 1;
|
||||
|
||||
nesadapter->device_cap_flags =
|
||||
IB_DEVICE_LOCAL_DMA_LKEY | IB_DEVICE_MEM_WINDOW;
|
||||
nesadapter->device_cap_flags = IB_DEVICE_LOCAL_DMA_LKEY |
|
||||
IB_DEVICE_MEM_WINDOW |
|
||||
IB_DEVICE_MEM_MGT_EXTENSIONS;
|
||||
|
||||
nesadapter->allocated_qps = (unsigned long *)&(((unsigned char *)nesadapter)
|
||||
[(sizeof(struct nes_adapter)+(sizeof(unsigned long)-1))&(~(sizeof(unsigned long)-1))]);
|
||||
@@ -436,11 +437,12 @@ struct nes_adapter *nes_init_adapter(struct nes_device *nesdev, u8 hw_rev) {
|
||||
nesadapter->qp_table = (struct nes_qp **)(&nesadapter->allocated_arps[BITS_TO_LONGS(arp_table_size)]);
|
||||
|
||||
|
||||
/* mark the usual suspect QPs and CQs as in use */
|
||||
/* mark the usual suspect QPs, MR and CQs as in use */
|
||||
for (u32temp = 0; u32temp < NES_FIRST_QPN; u32temp++) {
|
||||
set_bit(u32temp, nesadapter->allocated_qps);
|
||||
set_bit(u32temp, nesadapter->allocated_cqs);
|
||||
}
|
||||
set_bit(0, nesadapter->allocated_mrs);
|
||||
|
||||
for (u32temp = 0; u32temp < 20; u32temp++)
|
||||
set_bit(u32temp, nesadapter->allocated_pds);
|
||||
@@ -481,7 +483,7 @@ struct nes_adapter *nes_init_adapter(struct nes_device *nesdev, u8 hw_rev) {
|
||||
nesadapter->max_irrq_wr = (u32temp >> 16) & 3;
|
||||
|
||||
nesadapter->max_sge = 4;
|
||||
nesadapter->max_cqe = 32767;
|
||||
nesadapter->max_cqe = 32766;
|
||||
|
||||
if (nes_read_eeprom_values(nesdev, nesadapter)) {
|
||||
printk(KERN_ERR PFX "Unable to read EEPROM data.\n");
|
||||
@@ -1355,6 +1357,8 @@ int nes_init_phy(struct nes_device *nesdev)
|
||||
}
|
||||
if ((phy_type == NES_PHY_TYPE_ARGUS) ||
|
||||
(phy_type == NES_PHY_TYPE_SFP_D)) {
|
||||
u32 first_time = 1;
|
||||
|
||||
/* Check firmware heartbeat */
|
||||
nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee);
|
||||
temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
||||
@@ -1362,8 +1366,13 @@ int nes_init_phy(struct nes_device *nesdev)
|
||||
nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee);
|
||||
temp_phy_data2 = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
||||
|
||||
if (temp_phy_data != temp_phy_data2)
|
||||
return 0;
|
||||
if (temp_phy_data != temp_phy_data2) {
|
||||
nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7fd);
|
||||
temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
||||
if ((temp_phy_data & 0xff) > 0x20)
|
||||
return 0;
|
||||
printk(PFX "Reinitializing PHY\n");
|
||||
}
|
||||
|
||||
/* no heartbeat, configure the PHY */
|
||||
nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0x0000, 0x8000);
|
||||
@@ -1399,7 +1408,7 @@ int nes_init_phy(struct nes_device *nesdev)
|
||||
temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
||||
do {
|
||||
if (counter++ > 150) {
|
||||
nes_debug(NES_DBG_PHY, "No PHY heartbeat\n");
|
||||
printk(PFX "No PHY heartbeat\n");
|
||||
break;
|
||||
}
|
||||
mdelay(1);
|
||||
@@ -1413,11 +1422,20 @@ int nes_init_phy(struct nes_device *nesdev)
|
||||
nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7fd);
|
||||
temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
|
||||
if (counter++ > 300) {
|
||||
nes_debug(NES_DBG_PHY, "PHY did not track\n");
|
||||
break;
|
||||
if (((temp_phy_data & 0xff) == 0x0) && first_time) {
|
||||
first_time = 0;
|
||||
counter = 0;
|
||||
/* reset AMCC PHY and try again */
|
||||
nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0xe854, 0x00c0);
|
||||
nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0xe854, 0x0040);
|
||||
continue;
|
||||
} else {
|
||||
printk(PFX "PHY did not track\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
mdelay(10);
|
||||
} while (((temp_phy_data & 0xff) != 0x50) && ((temp_phy_data & 0xff) != 0x70));
|
||||
} while ((temp_phy_data & 0xff) < 0x30);
|
||||
|
||||
/* setup signal integrity */
|
||||
nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xd003, 0x0000);
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
@@ -546,11 +546,23 @@ enum nes_iwarp_sq_fmr_wqe_word_idx {
|
||||
NES_IWARP_SQ_FMR_WQE_PBL_LENGTH_IDX = 14,
|
||||
};
|
||||
|
||||
enum nes_iwarp_sq_fmr_opcodes {
|
||||
NES_IWARP_SQ_FMR_WQE_ZERO_BASED = (1<<6),
|
||||
NES_IWARP_SQ_FMR_WQE_PAGE_SIZE_4K = (0<<7),
|
||||
NES_IWARP_SQ_FMR_WQE_PAGE_SIZE_2M = (1<<7),
|
||||
NES_IWARP_SQ_FMR_WQE_RIGHTS_ENABLE_LOCAL_READ = (1<<16),
|
||||
NES_IWARP_SQ_FMR_WQE_RIGHTS_ENABLE_LOCAL_WRITE = (1<<17),
|
||||
NES_IWARP_SQ_FMR_WQE_RIGHTS_ENABLE_REMOTE_READ = (1<<18),
|
||||
NES_IWARP_SQ_FMR_WQE_RIGHTS_ENABLE_REMOTE_WRITE = (1<<19),
|
||||
NES_IWARP_SQ_FMR_WQE_RIGHTS_ENABLE_WINDOW_BIND = (1<<20),
|
||||
};
|
||||
|
||||
#define NES_IWARP_SQ_FMR_WQE_MR_LENGTH_HIGH_MASK 0xFF;
|
||||
|
||||
enum nes_iwarp_sq_locinv_wqe_word_idx {
|
||||
NES_IWARP_SQ_LOCINV_WQE_INV_STAG_IDX = 6,
|
||||
};
|
||||
|
||||
|
||||
enum nes_iwarp_rq_wqe_word_idx {
|
||||
NES_IWARP_RQ_WQE_TOTAL_PAYLOAD_IDX = 1,
|
||||
NES_IWARP_RQ_WQE_COMP_CTX_LOW_IDX = 2,
|
||||
@@ -1153,6 +1165,19 @@ struct nes_pbl {
|
||||
/* TODO: need to add list for two level tables */
|
||||
};
|
||||
|
||||
#define NES_4K_PBL_CHUNK_SIZE 4096
|
||||
|
||||
struct nes_fast_mr_wqe_pbl {
|
||||
u64 *kva;
|
||||
dma_addr_t paddr;
|
||||
};
|
||||
|
||||
struct nes_ib_fast_reg_page_list {
|
||||
struct ib_fast_reg_page_list ibfrpl;
|
||||
struct nes_fast_mr_wqe_pbl nes_wqe_pbl;
|
||||
u64 pbl;
|
||||
};
|
||||
|
||||
struct nes_listener {
|
||||
struct work_struct work;
|
||||
struct workqueue_struct *wq;
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Topspin Communications. All rights reserved.
|
||||
* Copyright (c) 2005 Cisco Systems. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
@@ -86,6 +86,7 @@ enum iwnes_memreg_type {
|
||||
IWNES_MEMREG_TYPE_CQ = 0x0002,
|
||||
IWNES_MEMREG_TYPE_MW = 0x0003,
|
||||
IWNES_MEMREG_TYPE_FMR = 0x0004,
|
||||
IWNES_MEMREG_TYPE_FMEM = 0x0005,
|
||||
};
|
||||
|
||||
struct nes_mem_reg_req {
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
|
ファイル差分が大きすぎるため省略します
差分を読み込み
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006 - 2009 Intel-NE, Inc. All rights reserved.
|
||||
* Copyright (c) 2006 - 2009 Intel Corporation. All rights reserved.
|
||||
* Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
@@ -135,19 +135,15 @@ struct nes_qp {
|
||||
struct ib_qp ibqp;
|
||||
void *allocated_buffer;
|
||||
struct iw_cm_id *cm_id;
|
||||
struct workqueue_struct *wq;
|
||||
struct nes_cq *nesscq;
|
||||
struct nes_cq *nesrcq;
|
||||
struct nes_pd *nespd;
|
||||
void *cm_node; /* handle of the node this QP is associated with */
|
||||
struct ietf_mpa_frame *ietf_frame;
|
||||
dma_addr_t ietf_frame_pbase;
|
||||
wait_queue_head_t state_waitq;
|
||||
struct ib_mr *lsmm_mr;
|
||||
unsigned long socket;
|
||||
struct nes_hw_qp hwqp;
|
||||
struct work_struct work;
|
||||
struct work_struct ae_work;
|
||||
enum ib_qp_state ibqp_state;
|
||||
u32 iwarp_state;
|
||||
u32 hte_index;
|
||||
@@ -165,19 +161,20 @@ struct nes_qp {
|
||||
struct page *page;
|
||||
struct timer_list terminate_timer;
|
||||
enum ib_event_type terminate_eventtype;
|
||||
wait_queue_head_t kick_waitq;
|
||||
u16 in_disconnect;
|
||||
u16 active_conn:1;
|
||||
u16 skip_lsmm:1;
|
||||
u16 user_mode:1;
|
||||
u16 hte_added:1;
|
||||
u16 flush_issued:1;
|
||||
u16 destroyed:1;
|
||||
u16 sig_all:1;
|
||||
u16 rsvd:9;
|
||||
u16 private_data_len;
|
||||
u16 term_sq_flush_code;
|
||||
u16 term_rq_flush_code;
|
||||
u8 active_conn;
|
||||
u8 skip_lsmm;
|
||||
u8 user_mode;
|
||||
u8 hte_added;
|
||||
u8 hw_iwarp_state;
|
||||
u8 flush_issued;
|
||||
u8 hw_tcp_state;
|
||||
u8 term_flags;
|
||||
u8 destroyed;
|
||||
u8 sq_kmapped;
|
||||
};
|
||||
#endif /* NES_VERBS_H */
|
||||
|
新しいイシューから参照
ユーザーをブロックする