Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[linux-2.6] / drivers / infiniband / hw / nes / nes_cm.c
1 /*
2  * Copyright (c) 2006 - 2008 NetEffect, Inc. All rights reserved.
3  *
4  * This software is available to you under a choice of one of two
5  * licenses.  You may choose to be licensed under the terms of the GNU
6  * General Public License (GPL) Version 2, available from the file
7  * COPYING in the main directory of this source tree, or the
8  * OpenIB.org BSD license below:
9  *
10  *     Redistribution and use in source and binary forms, with or
11  *     without modification, are permitted provided that the following
12  *     conditions are met:
13  *
14  *      - Redistributions of source code must retain the above
15  *        copyright notice, this list of conditions and the following
16  *        disclaimer.
17  *
18  *      - Redistributions in binary form must reproduce the above
19  *        copyright notice, this list of conditions and the following
20  *        disclaimer in the documentation and/or other materials
21  *        provided with the distribution.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30  * SOFTWARE.
31  *
32  */
33
34
35 #define TCPOPT_TIMESTAMP 8
36
37 #include <asm/atomic.h>
38 #include <linux/skbuff.h>
39 #include <linux/ip.h>
40 #include <linux/tcp.h>
41 #include <linux/init.h>
42 #include <linux/if_arp.h>
43 #include <linux/if_vlan.h>
44 #include <linux/notifier.h>
45 #include <linux/net.h>
46 #include <linux/types.h>
47 #include <linux/timer.h>
48 #include <linux/time.h>
49 #include <linux/delay.h>
50 #include <linux/etherdevice.h>
51 #include <linux/netdevice.h>
52 #include <linux/random.h>
53 #include <linux/list.h>
54 #include <linux/threads.h>
55 #include <net/arp.h>
56 #include <net/neighbour.h>
57 #include <net/route.h>
58 #include <net/ip_fib.h>
59
60 #include "nes.h"
61
62 u32 cm_packets_sent;
63 u32 cm_packets_bounced;
64 u32 cm_packets_dropped;
65 u32 cm_packets_retrans;
66 u32 cm_packets_created;
67 u32 cm_packets_received;
68 u32 cm_listens_created;
69 u32 cm_listens_destroyed;
70 u32 cm_backlog_drops;
71 atomic_t cm_loopbacks;
72 atomic_t cm_nodes_created;
73 atomic_t cm_nodes_destroyed;
74 atomic_t cm_accel_dropped_pkts;
75 atomic_t cm_resets_recvd;
76
77 static inline int mini_cm_accelerated(struct nes_cm_core *,
78         struct nes_cm_node *);
79 static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *,
80         struct nes_vnic *, struct nes_cm_info *);
81 static int mini_cm_del_listen(struct nes_cm_core *, struct nes_cm_listener *);
82 static struct nes_cm_node *mini_cm_connect(struct nes_cm_core *,
83         struct nes_vnic *, u16, void *, struct nes_cm_info *);
84 static int mini_cm_close(struct nes_cm_core *, struct nes_cm_node *);
85 static int mini_cm_accept(struct nes_cm_core *, struct ietf_mpa_frame *,
86         struct nes_cm_node *);
87 static int mini_cm_reject(struct nes_cm_core *, struct ietf_mpa_frame *,
88         struct nes_cm_node *);
89 static int mini_cm_recv_pkt(struct nes_cm_core *, struct nes_vnic *,
90         struct sk_buff *);
91 static int mini_cm_dealloc_core(struct nes_cm_core *);
92 static int mini_cm_get(struct nes_cm_core *);
93 static int mini_cm_set(struct nes_cm_core *, u32, u32);
94
95 static void form_cm_frame(struct sk_buff *, struct nes_cm_node *,
96         void *, u32, void *, u32, u8);
97 static int add_ref_cm_node(struct nes_cm_node *);
98 static int rem_ref_cm_node(struct nes_cm_core *, struct nes_cm_node *);
99
100 static int nes_cm_disconn_true(struct nes_qp *);
101 static int nes_cm_post_event(struct nes_cm_event *event);
102 static int nes_disconnect(struct nes_qp *nesqp, int abrupt);
103 static void nes_disconnect_worker(struct work_struct *work);
104
105 static int send_mpa_request(struct nes_cm_node *, struct sk_buff *);
106 static int send_syn(struct nes_cm_node *, u32, struct sk_buff *);
107 static int send_reset(struct nes_cm_node *, struct sk_buff *);
108 static int send_ack(struct nes_cm_node *cm_node, struct sk_buff *skb);
109 static int send_fin(struct nes_cm_node *cm_node, struct sk_buff *skb);
110 static void process_packet(struct nes_cm_node *, struct sk_buff *,
111         struct nes_cm_core *);
112
113 static void active_open_err(struct nes_cm_node *, struct sk_buff *, int);
114 static void passive_open_err(struct nes_cm_node *, struct sk_buff *, int);
115 static void cleanup_retrans_entry(struct nes_cm_node *);
116 static void handle_rcv_mpa(struct nes_cm_node *, struct sk_buff *,
117         enum nes_cm_event_type);
118 static void free_retrans_entry(struct nes_cm_node *cm_node);
119 static int handle_tcp_options(struct nes_cm_node *cm_node, struct tcphdr *tcph,
120         struct sk_buff *skb, int optionsize, int passive);
121
122 /* CM event handler functions */
123 static void cm_event_connected(struct nes_cm_event *);
124 static void cm_event_connect_error(struct nes_cm_event *);
125 static void cm_event_reset(struct nes_cm_event *);
126 static void cm_event_mpa_req(struct nes_cm_event *);
127
128 static void print_core(struct nes_cm_core *core);
129
130 /* External CM API Interface */
131 /* instance of function pointers for client API */
132 /* set address of this instance to cm_core->cm_ops at cm_core alloc */
133 static struct nes_cm_ops nes_cm_api = {
134         mini_cm_accelerated,
135         mini_cm_listen,
136         mini_cm_del_listen,
137         mini_cm_connect,
138         mini_cm_close,
139         mini_cm_accept,
140         mini_cm_reject,
141         mini_cm_recv_pkt,
142         mini_cm_dealloc_core,
143         mini_cm_get,
144         mini_cm_set
145 };
146
147 static struct nes_cm_core *g_cm_core;
148
149 atomic_t cm_connects;
150 atomic_t cm_accepts;
151 atomic_t cm_disconnects;
152 atomic_t cm_closes;
153 atomic_t cm_connecteds;
154 atomic_t cm_connect_reqs;
155 atomic_t cm_rejects;
156
157
158 /**
159  * create_event
160  */
161 static struct nes_cm_event *create_event(struct nes_cm_node *cm_node,
162                 enum nes_cm_event_type type)
163 {
164         struct nes_cm_event *event;
165
166         if (!cm_node->cm_id)
167                 return NULL;
168
169         /* allocate an empty event */
170         event = kzalloc(sizeof(*event), GFP_ATOMIC);
171
172         if (!event)
173                 return NULL;
174
175         event->type = type;
176         event->cm_node = cm_node;
177         event->cm_info.rem_addr = cm_node->rem_addr;
178         event->cm_info.loc_addr = cm_node->loc_addr;
179         event->cm_info.rem_port = cm_node->rem_port;
180         event->cm_info.loc_port = cm_node->loc_port;
181         event->cm_info.cm_id = cm_node->cm_id;
182
183         nes_debug(NES_DBG_CM, "cm_node=%p Created event=%p, type=%u, "
184                 "dst_addr=%08x[%x], src_addr=%08x[%x]\n",
185                 cm_node, event, type, event->cm_info.loc_addr,
186                 event->cm_info.loc_port, event->cm_info.rem_addr,
187                 event->cm_info.rem_port);
188
189         nes_cm_post_event(event);
190         return event;
191 }
192
193
194 /**
195  * send_mpa_request
196  */
197 static int send_mpa_request(struct nes_cm_node *cm_node, struct sk_buff *skb)
198 {
199         int ret;
200         if (!skb) {
201                 nes_debug(NES_DBG_CM, "skb set to NULL\n");
202                 return -1;
203         }
204
205         /* send an MPA Request frame */
206         form_cm_frame(skb, cm_node, NULL, 0, &cm_node->mpa_frame,
207                         cm_node->mpa_frame_size, SET_ACK);
208
209         ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0);
210         if (ret < 0)
211                 return ret;
212
213         return 0;
214 }
215
216
217 /**
218  * recv_mpa - process a received TCP pkt, we are expecting an
219  * IETF MPA frame
220  */
221 static int parse_mpa(struct nes_cm_node *cm_node, u8 *buffer, u32 len)
222 {
223         struct ietf_mpa_frame *mpa_frame;
224
225         /* assume req frame is in tcp data payload */
226         if (len < sizeof(struct ietf_mpa_frame)) {
227                 nes_debug(NES_DBG_CM, "The received ietf buffer was too small (%x)\n", len);
228                 return -1;
229         }
230
231         mpa_frame = (struct ietf_mpa_frame *)buffer;
232         cm_node->mpa_frame_size = ntohs(mpa_frame->priv_data_len);
233
234         if (cm_node->mpa_frame_size + sizeof(struct ietf_mpa_frame) != len) {
235                 nes_debug(NES_DBG_CM, "The received ietf buffer was not right"
236                                 " complete (%x + %x != %x)\n",
237                                 cm_node->mpa_frame_size, (u32)sizeof(struct ietf_mpa_frame), len);
238                 return -1;
239         }
240
241         /* copy entire MPA frame to our cm_node's frame */
242         memcpy(cm_node->mpa_frame_buf, buffer + sizeof(struct ietf_mpa_frame),
243                         cm_node->mpa_frame_size);
244
245         return 0;
246 }
247
248
249 /**
250  * form_cm_frame - get a free packet and build empty frame Use
251  * node info to build.
252  */
253 static void form_cm_frame(struct sk_buff *skb,
254         struct nes_cm_node *cm_node, void *options, u32 optionsize,
255         void *data, u32 datasize, u8 flags)
256 {
257         struct tcphdr *tcph;
258         struct iphdr *iph;
259         struct ethhdr *ethh;
260         u8 *buf;
261         u16 packetsize = sizeof(*iph);
262
263         packetsize += sizeof(*tcph);
264         packetsize +=  optionsize + datasize;
265
266         memset(skb->data, 0x00, ETH_HLEN + sizeof(*iph) + sizeof(*tcph));
267
268         skb->len = 0;
269         buf = skb_put(skb, packetsize + ETH_HLEN);
270
271         ethh = (struct ethhdr *) buf;
272         buf += ETH_HLEN;
273
274         iph = (struct iphdr *)buf;
275         buf += sizeof(*iph);
276         tcph = (struct tcphdr *)buf;
277         skb_reset_mac_header(skb);
278         skb_set_network_header(skb, ETH_HLEN);
279         skb_set_transport_header(skb, ETH_HLEN+sizeof(*iph));
280         buf += sizeof(*tcph);
281
282         skb->ip_summed = CHECKSUM_PARTIAL;
283         skb->protocol = htons(0x800);
284         skb->data_len = 0;
285         skb->mac_len = ETH_HLEN;
286
287         memcpy(ethh->h_dest, cm_node->rem_mac, ETH_ALEN);
288         memcpy(ethh->h_source, cm_node->loc_mac, ETH_ALEN);
289         ethh->h_proto = htons(0x0800);
290
291         iph->version = IPVERSION;
292         iph->ihl = 5;           /* 5 * 4Byte words, IP headr len */
293         iph->tos = 0;
294         iph->tot_len = htons(packetsize);
295         iph->id = htons(++cm_node->tcp_cntxt.loc_id);
296
297         iph->frag_off = htons(0x4000);
298         iph->ttl = 0x40;
299         iph->protocol = 0x06;   /* IPPROTO_TCP */
300
301         iph->saddr = htonl(cm_node->loc_addr);
302         iph->daddr = htonl(cm_node->rem_addr);
303
304         tcph->source = htons(cm_node->loc_port);
305         tcph->dest = htons(cm_node->rem_port);
306         tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num);
307
308         if (flags & SET_ACK) {
309                 cm_node->tcp_cntxt.loc_ack_num = cm_node->tcp_cntxt.rcv_nxt;
310                 tcph->ack_seq = htonl(cm_node->tcp_cntxt.loc_ack_num);
311                 tcph->ack = 1;
312         } else
313                 tcph->ack_seq = 0;
314
315         if (flags & SET_SYN) {
316                 cm_node->tcp_cntxt.loc_seq_num++;
317                 tcph->syn = 1;
318         } else
319                 cm_node->tcp_cntxt.loc_seq_num += datasize;
320
321         if (flags & SET_FIN) {
322                 cm_node->tcp_cntxt.loc_seq_num++;
323                 tcph->fin = 1;
324         }
325
326         if (flags & SET_RST)
327                 tcph->rst = 1;
328
329         tcph->doff = (u16)((sizeof(*tcph) + optionsize + 3) >> 2);
330         tcph->window = htons(cm_node->tcp_cntxt.rcv_wnd);
331         tcph->urg_ptr = 0;
332         if (optionsize)
333                 memcpy(buf, options, optionsize);
334         buf += optionsize;
335         if (datasize)
336                 memcpy(buf, data, datasize);
337
338         skb_shinfo(skb)->nr_frags = 0;
339         cm_packets_created++;
340
341 }
342
343
344 /**
345  * print_core - dump a cm core
346  */
347 static void print_core(struct nes_cm_core *core)
348 {
349         nes_debug(NES_DBG_CM, "---------------------------------------------\n");
350         nes_debug(NES_DBG_CM, "CM Core  -- (core = %p )\n", core);
351         if (!core)
352                 return;
353         nes_debug(NES_DBG_CM, "---------------------------------------------\n");
354
355         nes_debug(NES_DBG_CM, "State         : %u \n",  core->state);
356
357         nes_debug(NES_DBG_CM, "Listen Nodes  : %u \n", atomic_read(&core->listen_node_cnt));
358         nes_debug(NES_DBG_CM, "Active Nodes  : %u \n", atomic_read(&core->node_cnt));
359
360         nes_debug(NES_DBG_CM, "core          : %p \n", core);
361
362         nes_debug(NES_DBG_CM, "-------------- end core ---------------\n");
363 }
364
365
366 /**
367  * schedule_nes_timer
368  * note - cm_node needs to be protected before calling this. Encase in:
369  *                      rem_ref_cm_node(cm_core, cm_node);add_ref_cm_node(cm_node);
370  */
371 int schedule_nes_timer(struct nes_cm_node *cm_node, struct sk_buff *skb,
372                 enum nes_timer_type type, int send_retrans,
373                 int close_when_complete)
374 {
375         unsigned long  flags;
376         struct nes_cm_core *cm_core = cm_node->cm_core;
377         struct nes_timer_entry *new_send;
378         int ret = 0;
379         u32 was_timer_set;
380
381         new_send = kzalloc(sizeof(*new_send), GFP_ATOMIC);
382         if (!new_send)
383                 return -1;
384
385         /* new_send->timetosend = currenttime */
386         new_send->retrycount = NES_DEFAULT_RETRYS;
387         new_send->retranscount = NES_DEFAULT_RETRANS;
388         new_send->skb = skb;
389         new_send->timetosend = jiffies;
390         new_send->type = type;
391         new_send->netdev = cm_node->netdev;
392         new_send->send_retrans = send_retrans;
393         new_send->close_when_complete = close_when_complete;
394
395         if (type == NES_TIMER_TYPE_CLOSE) {
396                 new_send->timetosend += (HZ/10);
397                 spin_lock_irqsave(&cm_node->recv_list_lock, flags);
398                 list_add_tail(&new_send->list, &cm_node->recv_list);
399                 spin_unlock_irqrestore(&cm_node->recv_list_lock, flags);
400         }
401
402         if (type == NES_TIMER_TYPE_SEND) {
403                 new_send->seq_num = ntohl(tcp_hdr(skb)->seq);
404                 atomic_inc(&new_send->skb->users);
405                 spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
406                 cm_node->send_entry = new_send;
407                 add_ref_cm_node(cm_node);
408                 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
409                 new_send->timetosend = jiffies + NES_RETRY_TIMEOUT;
410
411                 ret = nes_nic_cm_xmit(new_send->skb, cm_node->netdev);
412                 if (ret != NETDEV_TX_OK) {
413                         nes_debug(NES_DBG_CM, "Error sending packet %p "
414                                 "(jiffies = %lu)\n", new_send, jiffies);
415                         atomic_dec(&new_send->skb->users);
416                         new_send->timetosend = jiffies;
417                 } else {
418                         cm_packets_sent++;
419                         if (!send_retrans) {
420                                 cleanup_retrans_entry(cm_node);
421                                 if (close_when_complete)
422                                         rem_ref_cm_node(cm_core, cm_node);
423                                 return ret;
424                         }
425                 }
426         }
427
428         was_timer_set = timer_pending(&cm_core->tcp_timer);
429
430         if (!was_timer_set) {
431                 cm_core->tcp_timer.expires = new_send->timetosend;
432                 add_timer(&cm_core->tcp_timer);
433         }
434
435         return ret;
436 }
437
438
439 /**
440  * nes_cm_timer_tick
441  */
442 static void nes_cm_timer_tick(unsigned long pass)
443 {
444         unsigned long flags, qplockflags;
445         unsigned long nexttimeout = jiffies + NES_LONG_TIME;
446         struct iw_cm_id *cm_id;
447         struct nes_cm_node *cm_node;
448         struct nes_timer_entry *send_entry, *recv_entry;
449         struct list_head *list_core, *list_core_temp;
450         struct list_head *list_node, *list_node_temp;
451         struct nes_cm_core *cm_core = g_cm_core;
452         struct nes_qp *nesqp;
453         u32 settimer = 0;
454         int ret = NETDEV_TX_OK;
455         enum nes_cm_node_state last_state;
456
457         struct list_head timer_list;
458         INIT_LIST_HEAD(&timer_list);
459         spin_lock_irqsave(&cm_core->ht_lock, flags);
460
461         list_for_each_safe(list_node, list_core_temp,
462                                 &cm_core->connected_nodes) {
463                 cm_node = container_of(list_node, struct nes_cm_node, list);
464                 if (!list_empty(&cm_node->recv_list) || (cm_node->send_entry)) {
465                         add_ref_cm_node(cm_node);
466                         list_add(&cm_node->timer_entry, &timer_list);
467                 }
468         }
469         spin_unlock_irqrestore(&cm_core->ht_lock, flags);
470
471         list_for_each_safe(list_node, list_core_temp, &timer_list) {
472                 cm_node = container_of(list_node, struct nes_cm_node,
473                                         timer_entry);
474                 spin_lock_irqsave(&cm_node->recv_list_lock, flags);
475                 list_for_each_safe(list_core, list_node_temp,
476                         &cm_node->recv_list) {
477                         recv_entry = container_of(list_core,
478                                 struct nes_timer_entry, list);
479                         if (!recv_entry)
480                                 break;
481                         if (time_after(recv_entry->timetosend, jiffies)) {
482                                 if (nexttimeout > recv_entry->timetosend ||
483                                         !settimer) {
484                                         nexttimeout = recv_entry->timetosend;
485                                         settimer = 1;
486                                 }
487                                 continue;
488                         }
489                         list_del(&recv_entry->list);
490                         cm_id = cm_node->cm_id;
491                         spin_unlock_irqrestore(&cm_node->recv_list_lock, flags);
492                         nesqp = (struct nes_qp *)recv_entry->skb;
493                         spin_lock_irqsave(&nesqp->lock, qplockflags);
494                         if (nesqp->cm_id) {
495                                 nes_debug(NES_DBG_CM, "QP%u: cm_id = %p, "
496                                         "refcount = %d: HIT A "
497                                         "NES_TIMER_TYPE_CLOSE with something "
498                                         "to do!!!\n", nesqp->hwqp.qp_id, cm_id,
499                                         atomic_read(&nesqp->refcount));
500                                 nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_CLOSED;
501                                 nesqp->last_aeq = NES_AEQE_AEID_RESET_SENT;
502                                 nesqp->ibqp_state = IB_QPS_ERR;
503                                 spin_unlock_irqrestore(&nesqp->lock,
504                                         qplockflags);
505                                 nes_cm_disconn(nesqp);
506                         } else {
507                                 spin_unlock_irqrestore(&nesqp->lock,
508                                         qplockflags);
509                                 nes_debug(NES_DBG_CM, "QP%u: cm_id = %p, "
510                                         "refcount = %d: HIT A "
511                                         "NES_TIMER_TYPE_CLOSE with nothing "
512                                         "to do!!!\n", nesqp->hwqp.qp_id, cm_id,
513                                         atomic_read(&nesqp->refcount));
514                         }
515                         if (cm_id)
516                                 cm_id->rem_ref(cm_id);
517
518                         kfree(recv_entry);
519                         spin_lock_irqsave(&cm_node->recv_list_lock, flags);
520                 }
521                 spin_unlock_irqrestore(&cm_node->recv_list_lock, flags);
522
523                 spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
524                 do {
525                         send_entry = cm_node->send_entry;
526                         if (!send_entry)
527                                 break;
528                         if (time_after(send_entry->timetosend, jiffies)) {
529                                 if (cm_node->state != NES_CM_STATE_TSA) {
530                                         if ((nexttimeout >
531                                                 send_entry->timetosend) ||
532                                                 !settimer) {
533                                                 nexttimeout =
534                                                         send_entry->timetosend;
535                                                 settimer = 1;
536                                                 break;
537                                         }
538                                 } else {
539                                         free_retrans_entry(cm_node);
540                                         break;
541                                 }
542                         }
543
544                         if ((cm_node->state == NES_CM_STATE_TSA) ||
545                                 (cm_node->state == NES_CM_STATE_CLOSED)) {
546                                 free_retrans_entry(cm_node);
547                                 break;
548                         }
549
550                         if (!send_entry->retranscount ||
551                                 !send_entry->retrycount) {
552                                 cm_packets_dropped++;
553                                 last_state = cm_node->state;
554                                 cm_node->state = NES_CM_STATE_CLOSED;
555                                 free_retrans_entry(cm_node);
556                                 spin_unlock_irqrestore(
557                                         &cm_node->retrans_list_lock, flags);
558                                 if (last_state == NES_CM_STATE_SYN_RCVD)
559                                         rem_ref_cm_node(cm_core, cm_node);
560                                 else
561                                         create_event(cm_node,
562                                                 NES_CM_EVENT_ABORTED);
563                                 spin_lock_irqsave(&cm_node->retrans_list_lock,
564                                         flags);
565                                 break;
566                         }
567                         atomic_inc(&send_entry->skb->users);
568                         cm_packets_retrans++;
569                         nes_debug(NES_DBG_CM, "Retransmitting send_entry %p "
570                                 "for node %p, jiffies = %lu, time to send = "
571                                 "%lu, retranscount = %u, send_entry->seq_num = "
572                                 "0x%08X, cm_node->tcp_cntxt.rem_ack_num = "
573                                 "0x%08X\n", send_entry, cm_node, jiffies,
574                                 send_entry->timetosend,
575                                 send_entry->retranscount,
576                                 send_entry->seq_num,
577                                 cm_node->tcp_cntxt.rem_ack_num);
578
579                         spin_unlock_irqrestore(&cm_node->retrans_list_lock,
580                                 flags);
581                         ret = nes_nic_cm_xmit(send_entry->skb, cm_node->netdev);
582                         spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
583                         if (ret != NETDEV_TX_OK) {
584                                 nes_debug(NES_DBG_CM, "rexmit failed for "
585                                         "node=%p\n", cm_node);
586                                 cm_packets_bounced++;
587                                 atomic_dec(&send_entry->skb->users);
588                                 send_entry->retrycount--;
589                                 nexttimeout = jiffies + NES_SHORT_TIME;
590                                 settimer = 1;
591                                 break;
592                         } else {
593                                 cm_packets_sent++;
594                         }
595                         nes_debug(NES_DBG_CM, "Packet Sent: retrans count = "
596                                 "%u, retry count = %u.\n",
597                                 send_entry->retranscount,
598                                 send_entry->retrycount);
599                         if (send_entry->send_retrans) {
600                                 send_entry->retranscount--;
601                                 send_entry->timetosend = jiffies +
602                                         NES_RETRY_TIMEOUT;
603                                 if (nexttimeout > send_entry->timetosend ||
604                                         !settimer) {
605                                         nexttimeout = send_entry->timetosend;
606                                         settimer = 1;
607                                 }
608                         } else {
609                                 int close_when_complete;
610                                 close_when_complete =
611                                         send_entry->close_when_complete;
612                                 nes_debug(NES_DBG_CM, "cm_node=%p state=%d\n",
613                                         cm_node, cm_node->state);
614                                 free_retrans_entry(cm_node);
615                                 if (close_when_complete)
616                                         rem_ref_cm_node(cm_node->cm_core,
617                                                 cm_node);
618                         }
619                 } while (0);
620
621                 spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
622                 rem_ref_cm_node(cm_node->cm_core, cm_node);
623                 if (ret != NETDEV_TX_OK) {
624                         nes_debug(NES_DBG_CM, "rexmit failed for cm_node=%p\n",
625                                 cm_node);
626                         break;
627                 }
628         }
629
630         if (settimer) {
631                 if (!timer_pending(&cm_core->tcp_timer)) {
632                         cm_core->tcp_timer.expires  = nexttimeout;
633                         add_timer(&cm_core->tcp_timer);
634                 }
635         }
636 }
637
638
639 /**
640  * send_syn
641  */
642 static int send_syn(struct nes_cm_node *cm_node, u32 sendack,
643         struct sk_buff *skb)
644 {
645         int ret;
646         int flags = SET_SYN;
647         char optionsbuffer[sizeof(struct option_mss) +
648                 sizeof(struct option_windowscale) + sizeof(struct option_base) +
649                 TCP_OPTIONS_PADDING];
650
651         int optionssize = 0;
652         /* Sending MSS option */
653         union all_known_options *options;
654
655         if (!cm_node)
656                 return -EINVAL;
657
658         options = (union all_known_options *)&optionsbuffer[optionssize];
659         options->as_mss.optionnum = OPTION_NUMBER_MSS;
660         options->as_mss.length = sizeof(struct option_mss);
661         options->as_mss.mss = htons(cm_node->tcp_cntxt.mss);
662         optionssize += sizeof(struct option_mss);
663
664         options = (union all_known_options *)&optionsbuffer[optionssize];
665         options->as_windowscale.optionnum = OPTION_NUMBER_WINDOW_SCALE;
666         options->as_windowscale.length = sizeof(struct option_windowscale);
667         options->as_windowscale.shiftcount = cm_node->tcp_cntxt.rcv_wscale;
668         optionssize += sizeof(struct option_windowscale);
669
670         if (sendack && !(NES_DRV_OPT_SUPRESS_OPTION_BC & nes_drv_opt)) {
671                 options = (union all_known_options *)&optionsbuffer[optionssize];
672                 options->as_base.optionnum = OPTION_NUMBER_WRITE0;
673                 options->as_base.length = sizeof(struct option_base);
674                 optionssize += sizeof(struct option_base);
675                 /* we need the size to be a multiple of 4 */
676                 options = (union all_known_options *)&optionsbuffer[optionssize];
677                 options->as_end = 1;
678                 optionssize += 1;
679                 options = (union all_known_options *)&optionsbuffer[optionssize];
680                 options->as_end = 1;
681                 optionssize += 1;
682         }
683
684         options = (union all_known_options *)&optionsbuffer[optionssize];
685         options->as_end = OPTION_NUMBER_END;
686         optionssize += 1;
687
688         if (!skb)
689                 skb = dev_alloc_skb(MAX_CM_BUFFER);
690         if (!skb) {
691                 nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");
692                 return -1;
693         }
694
695         if (sendack)
696                 flags |= SET_ACK;
697
698         form_cm_frame(skb, cm_node, optionsbuffer, optionssize, NULL, 0, flags);
699         ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0);
700
701         return ret;
702 }
703
704
705 /**
706  * send_reset
707  */
708 static int send_reset(struct nes_cm_node *cm_node, struct sk_buff *skb)
709 {
710         int ret;
711         int flags = SET_RST | SET_ACK;
712
713         if (!skb)
714                 skb = dev_alloc_skb(MAX_CM_BUFFER);
715         if (!skb) {
716                 nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");
717                 return -1;
718         }
719
720         form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, flags);
721         ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 0, 1);
722
723         return ret;
724 }
725
726
727 /**
728  * send_ack
729  */
730 static int send_ack(struct nes_cm_node *cm_node, struct sk_buff *skb)
731 {
732         int ret;
733
734         if (!skb)
735                 skb = dev_alloc_skb(MAX_CM_BUFFER);
736
737         if (!skb) {
738                 nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");
739                 return -1;
740         }
741
742         form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, SET_ACK);
743         ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 0, 0);
744
745         return ret;
746 }
747
748
749 /**
750  * send_fin
751  */
752 static int send_fin(struct nes_cm_node *cm_node, struct sk_buff *skb)
753 {
754         int ret;
755
756         /* if we didn't get a frame get one */
757         if (!skb)
758                 skb = dev_alloc_skb(MAX_CM_BUFFER);
759
760         if (!skb) {
761                 nes_debug(NES_DBG_CM, "Failed to get a Free pkt\n");
762                 return -1;
763         }
764
765         form_cm_frame(skb, cm_node, NULL, 0, NULL, 0, SET_ACK | SET_FIN);
766         ret = schedule_nes_timer(cm_node, skb, NES_TIMER_TYPE_SEND, 1, 0);
767
768         return ret;
769 }
770
771
772 /**
773  * find_node - find a cm node that matches the reference cm node
774  */
775 static struct nes_cm_node *find_node(struct nes_cm_core *cm_core,
776                 u16 rem_port, nes_addr_t rem_addr, u16 loc_port, nes_addr_t loc_addr)
777 {
778         unsigned long flags;
779         struct list_head *hte;
780         struct nes_cm_node *cm_node;
781
782         /* get a handle on the hte */
783         hte = &cm_core->connected_nodes;
784
785         nes_debug(NES_DBG_CM, "Searching for an owner node: " NIPQUAD_FMT ":%x from core %p->%p\n",
786                   HIPQUAD(loc_addr), loc_port, cm_core, hte);
787
788         /* walk list and find cm_node associated with this session ID */
789         spin_lock_irqsave(&cm_core->ht_lock, flags);
790         list_for_each_entry(cm_node, hte, list) {
791                 /* compare quad, return node handle if a match */
792                 nes_debug(NES_DBG_CM, "finding node %x:%x =? %x:%x ^ %x:%x =? %x:%x\n",
793                                 cm_node->loc_addr, cm_node->loc_port,
794                                 loc_addr, loc_port,
795                                 cm_node->rem_addr, cm_node->rem_port,
796                                 rem_addr, rem_port);
797                 if ((cm_node->loc_addr == loc_addr) && (cm_node->loc_port == loc_port) &&
798                                 (cm_node->rem_addr == rem_addr) && (cm_node->rem_port == rem_port)) {
799                         add_ref_cm_node(cm_node);
800                         spin_unlock_irqrestore(&cm_core->ht_lock, flags);
801                         return cm_node;
802                 }
803         }
804         spin_unlock_irqrestore(&cm_core->ht_lock, flags);
805
806         /* no owner node */
807         return NULL;
808 }
809
810
811 /**
812  * find_listener - find a cm node listening on this addr-port pair
813  */
814 static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core,
815                 nes_addr_t dst_addr, u16 dst_port, enum nes_cm_listener_state listener_state)
816 {
817         unsigned long flags;
818         struct nes_cm_listener *listen_node;
819
820         /* walk list and find cm_node associated with this session ID */
821         spin_lock_irqsave(&cm_core->listen_list_lock, flags);
822         list_for_each_entry(listen_node, &cm_core->listen_list.list, list) {
823                 /* compare node pair, return node handle if a match */
824                 if (((listen_node->loc_addr == dst_addr) ||
825                                 listen_node->loc_addr == 0x00000000) &&
826                                 (listen_node->loc_port == dst_port) &&
827                                 (listener_state & listen_node->listener_state)) {
828                         atomic_inc(&listen_node->ref_count);
829                         spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
830                         return listen_node;
831                 }
832         }
833         spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
834
835         nes_debug(NES_DBG_CM, "Unable to find listener for " NIPQUAD_FMT ":%x\n",
836                   HIPQUAD(dst_addr), dst_port);
837
838         /* no listener */
839         return NULL;
840 }
841
842
843 /**
844  * add_hte_node - add a cm node to the hash table
845  */
846 static int add_hte_node(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node)
847 {
848         unsigned long flags;
849         struct list_head *hte;
850
851         if (!cm_node || !cm_core)
852                 return -EINVAL;
853
854         nes_debug(NES_DBG_CM, "Adding Node %p to Active Connection HT\n",
855                 cm_node);
856
857         spin_lock_irqsave(&cm_core->ht_lock, flags);
858
859         /* get a handle on the hash table element (list head for this slot) */
860         hte = &cm_core->connected_nodes;
861         list_add_tail(&cm_node->list, hte);
862         atomic_inc(&cm_core->ht_node_cnt);
863
864         spin_unlock_irqrestore(&cm_core->ht_lock, flags);
865
866         return 0;
867 }
868
869
870 /**
871  * mini_cm_dec_refcnt_listen
872  */
873 static int mini_cm_dec_refcnt_listen(struct nes_cm_core *cm_core,
874         struct nes_cm_listener *listener, int free_hanging_nodes)
875 {
876         int ret = 1;
877         unsigned long flags;
878         struct list_head *list_pos = NULL;
879         struct list_head *list_temp = NULL;
880         struct nes_cm_node *cm_node = NULL;
881         struct list_head reset_list;
882
883         nes_debug(NES_DBG_CM, "attempting listener= %p free_nodes= %d, "
884                 "refcnt=%d\n", listener, free_hanging_nodes,
885                 atomic_read(&listener->ref_count));
886         /* free non-accelerated child nodes for this listener */
887         INIT_LIST_HEAD(&reset_list);
888         if (free_hanging_nodes) {
889                 spin_lock_irqsave(&cm_core->ht_lock, flags);
890                 list_for_each_safe(list_pos, list_temp,
891                                    &g_cm_core->connected_nodes) {
892                         cm_node = container_of(list_pos, struct nes_cm_node,
893                                 list);
894                         if ((cm_node->listener == listener) &&
895                             (!cm_node->accelerated)) {
896                                 add_ref_cm_node(cm_node);
897                                 list_add(&cm_node->reset_entry, &reset_list);
898                         }
899                 }
900                 spin_unlock_irqrestore(&cm_core->ht_lock, flags);
901         }
902
903         list_for_each_safe(list_pos, list_temp, &reset_list) {
904                 cm_node = container_of(list_pos, struct nes_cm_node,
905                                         reset_entry);
906                 cleanup_retrans_entry(cm_node);
907                 send_reset(cm_node, NULL);
908                 rem_ref_cm_node(cm_node->cm_core, cm_node);
909         }
910
911         spin_lock_irqsave(&cm_core->listen_list_lock, flags);
912         if (!atomic_dec_return(&listener->ref_count)) {
913                 list_del(&listener->list);
914
915                 /* decrement our listen node count */
916                 atomic_dec(&cm_core->listen_node_cnt);
917
918                 spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
919
920                 if (listener->nesvnic) {
921                         nes_manage_apbvt(listener->nesvnic, listener->loc_port,
922                                         PCI_FUNC(listener->nesvnic->nesdev->pcidev->devfn), NES_MANAGE_APBVT_DEL);
923                 }
924
925                 nes_debug(NES_DBG_CM, "destroying listener (%p)\n", listener);
926
927                 kfree(listener);
928                 listener = NULL;
929                 ret = 0;
930                 cm_listens_destroyed++;
931         } else {
932                 spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
933         }
934         if (listener) {
935                 if (atomic_read(&listener->pend_accepts_cnt) > 0)
936                         nes_debug(NES_DBG_CM, "destroying listener (%p)"
937                                         " with non-zero pending accepts=%u\n",
938                                         listener, atomic_read(&listener->pend_accepts_cnt));
939         }
940
941         return ret;
942 }
943
944
945 /**
946  * mini_cm_del_listen
947  */
948 static int mini_cm_del_listen(struct nes_cm_core *cm_core,
949                 struct nes_cm_listener *listener)
950 {
951         listener->listener_state = NES_CM_LISTENER_PASSIVE_STATE;
952         listener->cm_id = NULL; /* going to be destroyed pretty soon */
953         return mini_cm_dec_refcnt_listen(cm_core, listener, 1);
954 }
955
956
957 /**
958  * mini_cm_accelerated
959  */
960 static inline int mini_cm_accelerated(struct nes_cm_core *cm_core,
961                 struct nes_cm_node *cm_node)
962 {
963         u32 was_timer_set;
964         cm_node->accelerated = 1;
965
966         if (cm_node->accept_pend) {
967                 BUG_ON(!cm_node->listener);
968                 atomic_dec(&cm_node->listener->pend_accepts_cnt);
969                 BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0);
970         }
971
972         was_timer_set = timer_pending(&cm_core->tcp_timer);
973         if (!was_timer_set) {
974                 cm_core->tcp_timer.expires = jiffies + NES_SHORT_TIME;
975                 add_timer(&cm_core->tcp_timer);
976         }
977
978         return 0;
979 }
980
981
982 /**
983  * nes_addr_resolve_neigh
984  */
985 static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip)
986 {
987         struct rtable *rt;
988         struct flowi fl;
989         struct neighbour *neigh;
990         int rc = -1;
991         DECLARE_MAC_BUF(mac);
992
993         memset(&fl, 0, sizeof fl);
994         fl.nl_u.ip4_u.daddr = htonl(dst_ip);
995         if (ip_route_output_key(&init_net, &rt, &fl)) {
996                 printk("%s: ip_route_output_key failed for 0x%08X\n",
997                                 __func__, dst_ip);
998                 return rc;
999         }
1000
1001         neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, nesvnic->netdev);
1002         if (neigh) {
1003                 if (neigh->nud_state & NUD_VALID) {
1004                         nes_debug(NES_DBG_CM, "Neighbor MAC address for 0x%08X"
1005                                   " is %s, Gateway is 0x%08X \n", dst_ip,
1006                                   print_mac(mac, neigh->ha), ntohl(rt->rt_gateway));
1007                         nes_manage_arp_cache(nesvnic->netdev, neigh->ha,
1008                                              dst_ip, NES_ARP_ADD);
1009                         rc = nes_arp_table(nesvnic->nesdev, dst_ip, NULL,
1010                                            NES_ARP_RESOLVE);
1011                 }
1012                 neigh_release(neigh);
1013         }
1014
1015         if ((neigh == NULL) || (!(neigh->nud_state & NUD_VALID)))
1016                 neigh_event_send(rt->u.dst.neighbour, NULL);
1017
1018         ip_rt_put(rt);
1019         return rc;
1020 }
1021
1022
1023 /**
1024  * make_cm_node - create a new instance of a cm node
1025  */
1026 static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core,
1027                 struct nes_vnic *nesvnic, struct nes_cm_info *cm_info,
1028                 struct nes_cm_listener *listener)
1029 {
1030         struct nes_cm_node *cm_node;
1031         struct timespec ts;
1032         int arpindex = 0;
1033         struct nes_device *nesdev;
1034         struct nes_adapter *nesadapter;
1035         DECLARE_MAC_BUF(mac);
1036
1037         /* create an hte and cm_node for this instance */
1038         cm_node = kzalloc(sizeof(*cm_node), GFP_ATOMIC);
1039         if (!cm_node)
1040                 return NULL;
1041
1042         /* set our node specific transport info */
1043         cm_node->loc_addr = cm_info->loc_addr;
1044         cm_node->rem_addr = cm_info->rem_addr;
1045         cm_node->loc_port = cm_info->loc_port;
1046         cm_node->rem_port = cm_info->rem_port;
1047         cm_node->send_write0 = send_first;
1048         nes_debug(NES_DBG_CM, "Make node addresses : loc = " NIPQUAD_FMT
1049                         ":%x, rem = " NIPQUAD_FMT ":%x\n",
1050                         HIPQUAD(cm_node->loc_addr), cm_node->loc_port,
1051                         HIPQUAD(cm_node->rem_addr), cm_node->rem_port);
1052         cm_node->listener = listener;
1053         cm_node->netdev = nesvnic->netdev;
1054         cm_node->cm_id = cm_info->cm_id;
1055         memcpy(cm_node->loc_mac, nesvnic->netdev->dev_addr, ETH_ALEN);
1056
1057         nes_debug(NES_DBG_CM, "listener=%p, cm_id=%p\n", cm_node->listener,
1058                         cm_node->cm_id);
1059
1060         spin_lock_init(&cm_node->retrans_list_lock);
1061         INIT_LIST_HEAD(&cm_node->recv_list);
1062         spin_lock_init(&cm_node->recv_list_lock);
1063
1064         cm_node->loopbackpartner = NULL;
1065         atomic_set(&cm_node->ref_count, 1);
1066         /* associate our parent CM core */
1067         cm_node->cm_core = cm_core;
1068         cm_node->tcp_cntxt.loc_id = NES_CM_DEF_LOCAL_ID;
1069         cm_node->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE;
1070         cm_node->tcp_cntxt.rcv_wnd = NES_CM_DEFAULT_RCV_WND_SCALED >>
1071                         NES_CM_DEFAULT_RCV_WND_SCALE;
1072         ts = current_kernel_time();
1073         cm_node->tcp_cntxt.loc_seq_num = htonl(ts.tv_nsec);
1074         cm_node->tcp_cntxt.mss = nesvnic->max_frame_size - sizeof(struct iphdr) -
1075                         sizeof(struct tcphdr) - ETH_HLEN - VLAN_HLEN;
1076         cm_node->tcp_cntxt.rcv_nxt = 0;
1077         /* get a unique session ID , add thread_id to an upcounter to handle race */
1078         atomic_inc(&cm_core->node_cnt);
1079         cm_node->conn_type = cm_info->conn_type;
1080         cm_node->apbvt_set = 0;
1081         cm_node->accept_pend = 0;
1082
1083         cm_node->nesvnic = nesvnic;
1084         /* get some device handles, for arp lookup */
1085         nesdev = nesvnic->nesdev;
1086         nesadapter = nesdev->nesadapter;
1087
1088         cm_node->loopbackpartner = NULL;
1089         /* get the mac addr for the remote node */
1090         if (ipv4_is_loopback(htonl(cm_node->rem_addr)))
1091                 arpindex = nes_arp_table(nesdev, ntohl(nesvnic->local_ipaddr), NULL, NES_ARP_RESOLVE);
1092         else
1093                 arpindex = nes_arp_table(nesdev, cm_node->rem_addr, NULL, NES_ARP_RESOLVE);
1094         if (arpindex < 0) {
1095                 arpindex = nes_addr_resolve_neigh(nesvnic, cm_info->rem_addr);
1096                 if (arpindex < 0) {
1097                         kfree(cm_node);
1098                         return NULL;
1099                 }
1100         }
1101
1102         /* copy the mac addr to node context */
1103         memcpy(cm_node->rem_mac, nesadapter->arp_table[arpindex].mac_addr, ETH_ALEN);
1104         nes_debug(NES_DBG_CM, "Remote mac addr from arp table: %s\n",
1105                   print_mac(mac, cm_node->rem_mac));
1106
1107         add_hte_node(cm_core, cm_node);
1108         atomic_inc(&cm_nodes_created);
1109
1110         return cm_node;
1111 }
1112
1113
1114 /**
1115  * add_ref_cm_node - destroy an instance of a cm node
1116  */
1117 static int add_ref_cm_node(struct nes_cm_node *cm_node)
1118 {
1119         atomic_inc(&cm_node->ref_count);
1120         return 0;
1121 }
1122
1123
1124 /**
1125  * rem_ref_cm_node - destroy an instance of a cm node
1126  */
1127 static int rem_ref_cm_node(struct nes_cm_core *cm_core,
1128         struct nes_cm_node *cm_node)
1129 {
1130         unsigned long flags, qplockflags;
1131         struct nes_timer_entry *recv_entry;
1132         struct iw_cm_id *cm_id;
1133         struct list_head *list_core, *list_node_temp;
1134         struct nes_qp *nesqp;
1135
1136         if (!cm_node)
1137                 return -EINVAL;
1138
1139         spin_lock_irqsave(&cm_node->cm_core->ht_lock, flags);
1140         if (atomic_dec_return(&cm_node->ref_count)) {
1141                 spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags);
1142                 return 0;
1143         }
1144         list_del(&cm_node->list);
1145         atomic_dec(&cm_core->ht_node_cnt);
1146         spin_unlock_irqrestore(&cm_node->cm_core->ht_lock, flags);
1147
1148         /* if the node is destroyed before connection was accelerated */
1149         if (!cm_node->accelerated && cm_node->accept_pend) {
1150                 BUG_ON(!cm_node->listener);
1151                 atomic_dec(&cm_node->listener->pend_accepts_cnt);
1152                 BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0);
1153         }
1154         BUG_ON(cm_node->send_entry);
1155         spin_lock_irqsave(&cm_node->recv_list_lock, flags);
1156         list_for_each_safe(list_core, list_node_temp, &cm_node->recv_list) {
1157                 recv_entry = container_of(list_core, struct nes_timer_entry,
1158                                 list);
1159                 list_del(&recv_entry->list);
1160                 cm_id = cm_node->cm_id;
1161                 spin_unlock_irqrestore(&cm_node->recv_list_lock, flags);
1162                 nesqp = (struct nes_qp *)recv_entry->skb;
1163                 spin_lock_irqsave(&nesqp->lock, qplockflags);
1164                 if (nesqp->cm_id) {
1165                         nes_debug(NES_DBG_CM, "QP%u: cm_id = %p: HIT A "
1166                                 "NES_TIMER_TYPE_CLOSE with something to do!\n",
1167                                 nesqp->hwqp.qp_id, cm_id);
1168                         nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_CLOSED;
1169                         nesqp->last_aeq = NES_AEQE_AEID_RESET_SENT;
1170                         nesqp->ibqp_state = IB_QPS_ERR;
1171                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
1172                         nes_cm_disconn(nesqp);
1173                 } else {
1174                         spin_unlock_irqrestore(&nesqp->lock, qplockflags);
1175                         nes_debug(NES_DBG_CM, "QP%u: cm_id = %p: HIT A "
1176                                 "NES_TIMER_TYPE_CLOSE with nothing to do!\n",
1177                                 nesqp->hwqp.qp_id, cm_id);
1178                 }
1179                 cm_id->rem_ref(cm_id);
1180
1181                 kfree(recv_entry);
1182                 spin_lock_irqsave(&cm_node->recv_list_lock, flags);
1183         }
1184         spin_unlock_irqrestore(&cm_node->recv_list_lock, flags);
1185
1186         if (cm_node->listener) {
1187                 mini_cm_dec_refcnt_listen(cm_core, cm_node->listener, 0);
1188         } else {
1189                 if (cm_node->apbvt_set && cm_node->nesvnic) {
1190                         nes_manage_apbvt(cm_node->nesvnic, cm_node->loc_port,
1191                                 PCI_FUNC(
1192                                 cm_node->nesvnic->nesdev->pcidev->devfn),
1193                                 NES_MANAGE_APBVT_DEL);
1194                 }
1195         }
1196
1197         atomic_dec(&cm_core->node_cnt);
1198         atomic_inc(&cm_nodes_destroyed);
1199         nesqp = cm_node->nesqp;
1200         if (nesqp) {
1201                 nesqp->cm_node = NULL;
1202                 nes_rem_ref(&nesqp->ibqp);
1203                 cm_node->nesqp = NULL;
1204         }
1205
1206         cm_node->freed = 1;
1207         kfree(cm_node);
1208         return 0;
1209 }
1210
1211 /**
1212  * process_options
1213  */
1214 static int process_options(struct nes_cm_node *cm_node, u8 *optionsloc,
1215         u32 optionsize, u32 syn_packet)
1216 {
1217         u32 tmp;
1218         u32 offset = 0;
1219         union all_known_options *all_options;
1220         char got_mss_option = 0;
1221
1222         while (offset < optionsize) {
1223                 all_options = (union all_known_options *)(optionsloc + offset);
1224                 switch (all_options->as_base.optionnum) {
1225                 case OPTION_NUMBER_END:
1226                         offset = optionsize;
1227                         break;
1228                 case OPTION_NUMBER_NONE:
1229                         offset += 1;
1230                         continue;
1231                 case OPTION_NUMBER_MSS:
1232                         nes_debug(NES_DBG_CM, "%s: MSS Length: %d Offset: %d "
1233                                 "Size: %d\n", __func__,
1234                                 all_options->as_mss.length, offset, optionsize);
1235                         got_mss_option = 1;
1236                         if (all_options->as_mss.length != 4) {
1237                                 return 1;
1238                         } else {
1239                                 tmp = ntohs(all_options->as_mss.mss);
1240                                 if (tmp > 0 && tmp <
1241                                         cm_node->tcp_cntxt.mss)
1242                                         cm_node->tcp_cntxt.mss = tmp;
1243                         }
1244                         break;
1245                 case OPTION_NUMBER_WINDOW_SCALE:
1246                         cm_node->tcp_cntxt.snd_wscale =
1247                                 all_options->as_windowscale.shiftcount;
1248                         break;
1249                 case OPTION_NUMBER_WRITE0:
1250                         cm_node->send_write0 = 1;
1251                         break;
1252                 default:
1253                         nes_debug(NES_DBG_CM, "TCP Option not understood: %x\n",
1254                                 all_options->as_base.optionnum);
1255                         break;
1256                 }
1257                 offset += all_options->as_base.length;
1258         }
1259         if ((!got_mss_option) && (syn_packet))
1260                 cm_node->tcp_cntxt.mss = NES_CM_DEFAULT_MSS;
1261         return 0;
1262 }
1263
1264 static void drop_packet(struct sk_buff *skb)
1265 {
1266         atomic_inc(&cm_accel_dropped_pkts);
1267         dev_kfree_skb_any(skb);
1268 }
1269
1270 static void handle_fin_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
1271         struct tcphdr *tcph)
1272 {
1273         nes_debug(NES_DBG_CM, "Received FIN, cm_node = %p, state = %u. "
1274                 "refcnt=%d\n", cm_node, cm_node->state,
1275                 atomic_read(&cm_node->ref_count));
1276         cm_node->tcp_cntxt.rcv_nxt++;
1277         cleanup_retrans_entry(cm_node);
1278         switch (cm_node->state) {
1279         case NES_CM_STATE_SYN_RCVD:
1280         case NES_CM_STATE_SYN_SENT:
1281         case NES_CM_STATE_ESTABLISHED:
1282         case NES_CM_STATE_MPAREQ_SENT:
1283                 cm_node->state = NES_CM_STATE_LAST_ACK;
1284                 send_fin(cm_node, skb);
1285                 break;
1286         case NES_CM_STATE_FIN_WAIT1:
1287                 cm_node->state = NES_CM_STATE_CLOSING;
1288                 send_ack(cm_node, skb);
1289                 break;
1290         case NES_CM_STATE_FIN_WAIT2:
1291                 cm_node->state = NES_CM_STATE_TIME_WAIT;
1292                 send_ack(cm_node, skb);
1293                 cm_node->state = NES_CM_STATE_CLOSED;
1294                 break;
1295         case NES_CM_STATE_TSA:
1296         default:
1297                 nes_debug(NES_DBG_CM, "Error Rcvd FIN for node-%p state = %d\n",
1298                         cm_node, cm_node->state);
1299                 drop_packet(skb);
1300                 break;
1301         }
1302 }
1303
1304
1305 static void handle_rst_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
1306         struct tcphdr *tcph)
1307 {
1308
1309         int     reset = 0;      /* whether to send reset in case of err.. */
1310         int     passive_state;
1311         atomic_inc(&cm_resets_recvd);
1312         nes_debug(NES_DBG_CM, "Received Reset, cm_node = %p, state = %u."
1313                         " refcnt=%d\n", cm_node, cm_node->state,
1314                         atomic_read(&cm_node->ref_count));
1315         cleanup_retrans_entry(cm_node);
1316         switch (cm_node->state) {
1317         case NES_CM_STATE_SYN_SENT:
1318         case NES_CM_STATE_MPAREQ_SENT:
1319                 nes_debug(NES_DBG_CM, "%s[%u] create abort for cm_node=%p "
1320                         "listener=%p state=%d\n", __func__, __LINE__, cm_node,
1321                         cm_node->listener, cm_node->state);
1322                 active_open_err(cm_node, skb, reset);
1323                 break;
1324         case NES_CM_STATE_MPAREQ_RCVD:
1325                 passive_state = atomic_add_return(1, &cm_node->passive_state);
1326                 if (passive_state ==  NES_SEND_RESET_EVENT)
1327                         create_event(cm_node, NES_CM_EVENT_RESET);
1328                 cleanup_retrans_entry(cm_node);
1329                 cm_node->state = NES_CM_STATE_CLOSED;
1330                 dev_kfree_skb_any(skb);
1331                 break;
1332         case NES_CM_STATE_ESTABLISHED:
1333         case NES_CM_STATE_SYN_RCVD:
1334         case NES_CM_STATE_LISTENING:
1335                 nes_debug(NES_DBG_CM, "Bad state %s[%u]\n", __func__, __LINE__);
1336                 passive_open_err(cm_node, skb, reset);
1337                 break;
1338         case NES_CM_STATE_TSA:
1339                 active_open_err(cm_node, skb, reset);
1340                 break;
1341         case NES_CM_STATE_CLOSED:
1342                 cleanup_retrans_entry(cm_node);
1343                 drop_packet(skb);
1344                 break;
1345         default:
1346                 drop_packet(skb);
1347                 break;
1348         }
1349 }
1350
1351 static void handle_rcv_mpa(struct nes_cm_node *cm_node, struct sk_buff *skb,
1352         enum nes_cm_event_type type)
1353 {
1354
1355         int     ret;
1356         int datasize = skb->len;
1357         u8 *dataloc = skb->data;
1358         ret = parse_mpa(cm_node, dataloc, datasize);
1359         if (ret < 0) {
1360                 nes_debug(NES_DBG_CM, "didn't like MPA Request\n");
1361                 if (type == NES_CM_EVENT_CONNECTED) {
1362                         nes_debug(NES_DBG_CM, "%s[%u] create abort for "
1363                                 "cm_node=%p listener=%p state=%d\n", __func__,
1364                                 __LINE__, cm_node, cm_node->listener,
1365                                 cm_node->state);
1366                         active_open_err(cm_node, skb, 1);
1367                 } else {
1368                         passive_open_err(cm_node, skb, 1);
1369                 }
1370         } else {
1371                 cleanup_retrans_entry(cm_node);
1372                 dev_kfree_skb_any(skb);
1373                 if (type == NES_CM_EVENT_CONNECTED)
1374                         cm_node->state = NES_CM_STATE_TSA;
1375                 else
1376                         atomic_set(&cm_node->passive_state,
1377                                         NES_PASSIVE_STATE_INDICATED);
1378                 create_event(cm_node, type);
1379
1380         }
1381         return ;
1382 }
1383
1384 static void indicate_pkt_err(struct nes_cm_node *cm_node, struct sk_buff *skb)
1385 {
1386         switch (cm_node->state) {
1387         case NES_CM_STATE_SYN_SENT:
1388         case NES_CM_STATE_MPAREQ_SENT:
1389                 nes_debug(NES_DBG_CM, "%s[%u] create abort for cm_node=%p "
1390                         "listener=%p state=%d\n", __func__, __LINE__, cm_node,
1391                         cm_node->listener, cm_node->state);
1392                 active_open_err(cm_node, skb, 1);
1393                 break;
1394         case NES_CM_STATE_ESTABLISHED:
1395         case NES_CM_STATE_SYN_RCVD:
1396                 passive_open_err(cm_node, skb, 1);
1397                 break;
1398         case NES_CM_STATE_TSA:
1399         default:
1400                 drop_packet(skb);
1401         }
1402 }
1403
1404 static int check_syn(struct nes_cm_node *cm_node, struct tcphdr *tcph,
1405         struct sk_buff *skb)
1406 {
1407         int err;
1408
1409         err = ((ntohl(tcph->ack_seq) == cm_node->tcp_cntxt.loc_seq_num))? 0 : 1;
1410         if (err)
1411                 active_open_err(cm_node, skb, 1);
1412
1413         return err;
1414 }
1415
1416 static int check_seq(struct nes_cm_node *cm_node, struct tcphdr *tcph,
1417         struct sk_buff *skb)
1418 {
1419         int err = 0;
1420         u32 seq;
1421         u32 ack_seq;
1422         u32 loc_seq_num = cm_node->tcp_cntxt.loc_seq_num;
1423         u32 rcv_nxt = cm_node->tcp_cntxt.rcv_nxt;
1424         u32 rcv_wnd;
1425         seq = ntohl(tcph->seq);
1426         ack_seq = ntohl(tcph->ack_seq);
1427         rcv_wnd = cm_node->tcp_cntxt.rcv_wnd;
1428         if (ack_seq != loc_seq_num)
1429                 err = 1;
1430         else if ((seq + rcv_wnd) < rcv_nxt)
1431                 err = 1;
1432         if (err) {
1433                 nes_debug(NES_DBG_CM, "%s[%u] create abort for cm_node=%p "
1434                         "listener=%p state=%d\n", __func__, __LINE__, cm_node,
1435                         cm_node->listener, cm_node->state);
1436                 indicate_pkt_err(cm_node, skb);
1437                 nes_debug(NES_DBG_CM, "seq ERROR cm_node =%p seq=0x%08X "
1438                         "rcv_nxt=0x%08X rcv_wnd=0x%x\n", cm_node, seq, rcv_nxt,
1439                         rcv_wnd);
1440         }
1441         return err;
1442 }
1443
1444 /*
1445  * handle_syn_pkt() is for Passive node. The syn packet is received when a node
1446  * is created with a listener or it may comein as rexmitted packet which in
1447  * that case will be just dropped.
1448  */
1449
1450 static void handle_syn_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
1451         struct tcphdr *tcph)
1452 {
1453         int ret;
1454         u32 inc_sequence;
1455         int optionsize;
1456
1457         optionsize = (tcph->doff << 2) - sizeof(struct tcphdr);
1458         skb_trim(skb, 0);
1459         inc_sequence = ntohl(tcph->seq);
1460
1461         switch (cm_node->state) {
1462         case NES_CM_STATE_SYN_SENT:
1463         case NES_CM_STATE_MPAREQ_SENT:
1464                 /* Rcvd syn on active open connection*/
1465                 active_open_err(cm_node, skb, 1);
1466                 break;
1467         case NES_CM_STATE_LISTENING:
1468                 /* Passive OPEN */
1469                 cm_node->accept_pend = 1;
1470                 atomic_inc(&cm_node->listener->pend_accepts_cnt);
1471                 if (atomic_read(&cm_node->listener->pend_accepts_cnt) >
1472                                 cm_node->listener->backlog) {
1473                         nes_debug(NES_DBG_CM, "drop syn due to backlog "
1474                                 "pressure \n");
1475                         cm_backlog_drops++;
1476                         passive_open_err(cm_node, skb, 0);
1477                         break;
1478                 }
1479                 ret = handle_tcp_options(cm_node, tcph, skb, optionsize,
1480                         1);
1481                 if (ret) {
1482                         passive_open_err(cm_node, skb, 0);
1483                         /* drop pkt */
1484                         break;
1485                 }
1486                 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1;
1487                 BUG_ON(cm_node->send_entry);
1488                 cm_node->state = NES_CM_STATE_SYN_RCVD;
1489                 send_syn(cm_node, 1, skb);
1490                 break;
1491         case NES_CM_STATE_CLOSED:
1492                 cleanup_retrans_entry(cm_node);
1493                 send_reset(cm_node, skb);
1494                 break;
1495         case NES_CM_STATE_TSA:
1496         case NES_CM_STATE_ESTABLISHED:
1497         case NES_CM_STATE_FIN_WAIT1:
1498         case NES_CM_STATE_FIN_WAIT2:
1499         case NES_CM_STATE_MPAREQ_RCVD:
1500         case NES_CM_STATE_LAST_ACK:
1501         case NES_CM_STATE_CLOSING:
1502         case NES_CM_STATE_UNKNOWN:
1503         default:
1504                 drop_packet(skb);
1505                 break;
1506         }
1507 }
1508
1509 static void handle_synack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
1510         struct tcphdr *tcph)
1511 {
1512
1513         int ret;
1514         u32 inc_sequence;
1515         int optionsize;
1516
1517         optionsize = (tcph->doff << 2) - sizeof(struct tcphdr);
1518         skb_trim(skb, 0);
1519         inc_sequence = ntohl(tcph->seq);
1520         switch (cm_node->state) {
1521         case NES_CM_STATE_SYN_SENT:
1522                 /* active open */
1523                 if (check_syn(cm_node, tcph, skb))
1524                         return;
1525                 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);
1526                 /* setup options */
1527                 ret = handle_tcp_options(cm_node, tcph, skb, optionsize, 0);
1528                 if (ret) {
1529                         nes_debug(NES_DBG_CM, "cm_node=%p tcp_options failed\n",
1530                                 cm_node);
1531                         break;
1532                 }
1533                 cleanup_retrans_entry(cm_node);
1534                 cm_node->tcp_cntxt.rcv_nxt = inc_sequence + 1;
1535                 send_mpa_request(cm_node, skb);
1536                 cm_node->state = NES_CM_STATE_MPAREQ_SENT;
1537                 break;
1538         case NES_CM_STATE_MPAREQ_RCVD:
1539                 /* passive open, so should not be here */
1540                 passive_open_err(cm_node, skb, 1);
1541                 break;
1542         case NES_CM_STATE_LISTENING:
1543         case NES_CM_STATE_CLOSED:
1544                 cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq);
1545                 cleanup_retrans_entry(cm_node);
1546                 send_reset(cm_node, skb);
1547                 break;
1548         case NES_CM_STATE_ESTABLISHED:
1549         case NES_CM_STATE_FIN_WAIT1:
1550         case NES_CM_STATE_FIN_WAIT2:
1551         case NES_CM_STATE_LAST_ACK:
1552         case NES_CM_STATE_TSA:
1553         case NES_CM_STATE_CLOSING:
1554         case NES_CM_STATE_UNKNOWN:
1555         case NES_CM_STATE_MPAREQ_SENT:
1556         default:
1557                 drop_packet(skb);
1558                 break;
1559         }
1560 }
1561
1562 static void handle_ack_pkt(struct nes_cm_node *cm_node, struct sk_buff *skb,
1563         struct tcphdr *tcph)
1564 {
1565         int datasize = 0;
1566         u32 inc_sequence;
1567         u32 rem_seq_ack;
1568         u32 rem_seq;
1569         int ret;
1570         int optionsize;
1571         u32 temp_seq = cm_node->tcp_cntxt.loc_seq_num;
1572
1573         optionsize = (tcph->doff << 2) - sizeof(struct tcphdr);
1574         cm_node->tcp_cntxt.loc_seq_num = ntohl(tcph->ack_seq);
1575
1576         if (check_seq(cm_node, tcph, skb))
1577                 return;
1578
1579         skb_pull(skb, tcph->doff << 2);
1580         inc_sequence = ntohl(tcph->seq);
1581         rem_seq = ntohl(tcph->seq);
1582         rem_seq_ack =  ntohl(tcph->ack_seq);
1583         datasize = skb->len;
1584
1585         switch (cm_node->state) {
1586         case NES_CM_STATE_SYN_RCVD:
1587                 /* Passive OPEN */
1588                 ret = handle_tcp_options(cm_node, tcph, skb, optionsize, 1);
1589                 if (ret)
1590                         break;
1591                 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);
1592                 cm_node->tcp_cntxt.loc_seq_num = temp_seq;
1593                 if (cm_node->tcp_cntxt.rem_ack_num !=
1594                     cm_node->tcp_cntxt.loc_seq_num) {
1595                         nes_debug(NES_DBG_CM, "rem_ack_num != loc_seq_num\n");
1596                         cleanup_retrans_entry(cm_node);
1597                         send_reset(cm_node, skb);
1598                         return;
1599                 }
1600                 cm_node->state = NES_CM_STATE_ESTABLISHED;
1601                 if (datasize) {
1602                         cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;
1603                         cm_node->state = NES_CM_STATE_MPAREQ_RCVD;
1604                         handle_rcv_mpa(cm_node, skb, NES_CM_EVENT_MPA_REQ);
1605                  } else { /* rcvd ACK only */
1606                         dev_kfree_skb_any(skb);
1607                         cleanup_retrans_entry(cm_node);
1608                  }
1609                 break;
1610         case NES_CM_STATE_ESTABLISHED:
1611                 /* Passive OPEN */
1612                 /* We expect mpa frame to be received only */
1613                 if (datasize) {
1614                         cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;
1615                         cm_node->state = NES_CM_STATE_MPAREQ_RCVD;
1616                         handle_rcv_mpa(cm_node, skb,
1617                                 NES_CM_EVENT_MPA_REQ);
1618                 } else
1619                         drop_packet(skb);
1620                 break;
1621         case NES_CM_STATE_MPAREQ_SENT:
1622                 cm_node->tcp_cntxt.rem_ack_num = ntohl(tcph->ack_seq);
1623                 if (datasize) {
1624                         cm_node->tcp_cntxt.rcv_nxt = inc_sequence + datasize;
1625                         handle_rcv_mpa(cm_node, skb, NES_CM_EVENT_CONNECTED);
1626                 } else { /* Could be just an ack pkt.. */
1627                         cleanup_retrans_entry(cm_node);
1628                         dev_kfree_skb_any(skb);
1629                 }
1630                 break;
1631         case NES_CM_STATE_LISTENING:
1632         case NES_CM_STATE_CLOSED:
1633                 cleanup_retrans_entry(cm_node);
1634                 send_reset(cm_node, skb);
1635                 break;
1636         case NES_CM_STATE_FIN_WAIT1:
1637         case NES_CM_STATE_SYN_SENT:
1638         case NES_CM_STATE_FIN_WAIT2:
1639         case NES_CM_STATE_TSA:
1640         case NES_CM_STATE_MPAREQ_RCVD:
1641         case NES_CM_STATE_LAST_ACK:
1642         case NES_CM_STATE_CLOSING:
1643         case NES_CM_STATE_UNKNOWN:
1644         default:
1645                 drop_packet(skb);
1646                 break;
1647         }
1648 }
1649
1650
1651
1652 static int handle_tcp_options(struct nes_cm_node *cm_node, struct tcphdr *tcph,
1653         struct sk_buff *skb, int optionsize, int passive)
1654 {
1655         u8 *optionsloc = (u8 *)&tcph[1];
1656         if (optionsize) {
1657                 if (process_options(cm_node, optionsloc, optionsize,
1658                         (u32)tcph->syn)) {
1659                         nes_debug(NES_DBG_CM, "%s: Node %p, Sending RESET\n",
1660                                 __func__, cm_node);
1661                         if (passive)
1662                                 passive_open_err(cm_node, skb, 1);
1663                         else
1664                                 active_open_err(cm_node, skb, 1);
1665                         return 1;
1666                 }
1667         }
1668
1669         cm_node->tcp_cntxt.snd_wnd = ntohs(tcph->window) <<
1670                         cm_node->tcp_cntxt.snd_wscale;
1671
1672         if (cm_node->tcp_cntxt.snd_wnd > cm_node->tcp_cntxt.max_snd_wnd)
1673                 cm_node->tcp_cntxt.max_snd_wnd = cm_node->tcp_cntxt.snd_wnd;
1674         return 0;
1675 }
1676
1677 /*
1678  * active_open_err() will send reset() if flag set..
1679  * It will also send ABORT event.
1680  */
1681
1682 static void active_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb,
1683         int reset)
1684 {
1685         cleanup_retrans_entry(cm_node);
1686         if (reset) {
1687                 nes_debug(NES_DBG_CM, "ERROR active err called for cm_node=%p, "
1688                                 "state=%d\n", cm_node, cm_node->state);
1689                 add_ref_cm_node(cm_node);
1690                 send_reset(cm_node, skb);
1691         } else
1692                 dev_kfree_skb_any(skb);
1693
1694         cm_node->state = NES_CM_STATE_CLOSED;
1695         create_event(cm_node, NES_CM_EVENT_ABORTED);
1696 }
1697
1698 /*
1699  * passive_open_err() will either do a reset() or will free up the skb and
1700  * remove the cm_node.
1701  */
1702
1703 static void passive_open_err(struct nes_cm_node *cm_node, struct sk_buff *skb,
1704         int reset)
1705 {
1706         cleanup_retrans_entry(cm_node);
1707         cm_node->state = NES_CM_STATE_CLOSED;
1708         if (reset) {
1709                 nes_debug(NES_DBG_CM, "passive_open_err sending RST for "
1710                         "cm_node=%p state =%d\n", cm_node, cm_node->state);
1711                 send_reset(cm_node, skb);
1712         } else {
1713                 dev_kfree_skb_any(skb);
1714                 rem_ref_cm_node(cm_node->cm_core, cm_node);
1715         }
1716 }
1717
1718 /*
1719  * free_retrans_entry() routines assumes that the retrans_list_lock has
1720  * been acquired before calling.
1721  */
1722 static void free_retrans_entry(struct nes_cm_node *cm_node)
1723 {
1724         struct nes_timer_entry *send_entry;
1725         send_entry = cm_node->send_entry;
1726         if (send_entry) {
1727                 cm_node->send_entry = NULL;
1728                 dev_kfree_skb_any(send_entry->skb);
1729                 kfree(send_entry);
1730                 rem_ref_cm_node(cm_node->cm_core, cm_node);
1731         }
1732 }
1733
1734 static void cleanup_retrans_entry(struct nes_cm_node *cm_node)
1735 {
1736         unsigned long flags;
1737
1738         spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
1739         free_retrans_entry(cm_node);
1740         spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
1741 }
1742
1743 /**
1744  * process_packet
1745  * Returns skb if to be freed, else it will return NULL if already used..
1746  */
1747 static void process_packet(struct nes_cm_node *cm_node, struct sk_buff *skb,
1748         struct nes_cm_core *cm_core)
1749 {
1750         enum nes_tcpip_pkt_type pkt_type = NES_PKT_TYPE_UNKNOWN;
1751         struct tcphdr *tcph = tcp_hdr(skb);
1752         skb_pull(skb, ip_hdr(skb)->ihl << 2);
1753
1754         nes_debug(NES_DBG_CM, "process_packet: cm_node=%p state =%d syn=%d "
1755                 "ack=%d rst=%d fin=%d\n", cm_node, cm_node->state, tcph->syn,
1756                 tcph->ack, tcph->rst, tcph->fin);
1757
1758         if (tcph->rst)
1759                 pkt_type = NES_PKT_TYPE_RST;
1760         else if (tcph->syn) {
1761                 pkt_type = NES_PKT_TYPE_SYN;
1762                 if (tcph->ack)
1763                         pkt_type = NES_PKT_TYPE_SYNACK;
1764         } else if (tcph->fin)
1765                 pkt_type = NES_PKT_TYPE_FIN;
1766         else if (tcph->ack)
1767                 pkt_type = NES_PKT_TYPE_ACK;
1768
1769         switch (pkt_type) {
1770         case NES_PKT_TYPE_SYN:
1771                 handle_syn_pkt(cm_node, skb, tcph);
1772                 break;
1773         case NES_PKT_TYPE_SYNACK:
1774                 handle_synack_pkt(cm_node, skb, tcph);
1775                 break;
1776         case NES_PKT_TYPE_ACK:
1777                 handle_ack_pkt(cm_node, skb, tcph);
1778                 break;
1779         case NES_PKT_TYPE_RST:
1780                 handle_rst_pkt(cm_node, skb, tcph);
1781                 break;
1782         case NES_PKT_TYPE_FIN:
1783                 handle_fin_pkt(cm_node, skb, tcph);
1784                 break;
1785         default:
1786                 drop_packet(skb);
1787                 break;
1788         }
1789 }
1790
1791 /**
1792  * mini_cm_listen - create a listen node with params
1793  */
1794 static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *cm_core,
1795         struct nes_vnic *nesvnic, struct nes_cm_info *cm_info)
1796 {
1797         struct nes_cm_listener *listener;
1798         unsigned long flags;
1799
1800         nes_debug(NES_DBG_CM, "Search for 0x%08x : 0x%04x\n",
1801                 cm_info->loc_addr, cm_info->loc_port);
1802
1803         /* cannot have multiple matching listeners */
1804         listener = find_listener(cm_core, htonl(cm_info->loc_addr),
1805                         htons(cm_info->loc_port), NES_CM_LISTENER_EITHER_STATE);
1806         if (listener && listener->listener_state == NES_CM_LISTENER_ACTIVE_STATE) {
1807                 /* find automatically incs ref count ??? */
1808                 atomic_dec(&listener->ref_count);
1809                 nes_debug(NES_DBG_CM, "Not creating listener since it already exists\n");
1810                 return NULL;
1811         }
1812
1813         if (!listener) {
1814                 /* create a CM listen node (1/2 node to compare incoming traffic to) */
1815                 listener = kzalloc(sizeof(*listener), GFP_ATOMIC);
1816                 if (!listener) {
1817                         nes_debug(NES_DBG_CM, "Not creating listener memory allocation failed\n");
1818                         return NULL;
1819                 }
1820
1821                 listener->loc_addr = htonl(cm_info->loc_addr);
1822                 listener->loc_port = htons(cm_info->loc_port);
1823                 listener->reused_node = 0;
1824
1825                 atomic_set(&listener->ref_count, 1);
1826         }
1827         /* pasive case */
1828         /* find already inc'ed the ref count */
1829         else {
1830                 listener->reused_node = 1;
1831         }
1832
1833         listener->cm_id = cm_info->cm_id;
1834         atomic_set(&listener->pend_accepts_cnt, 0);
1835         listener->cm_core = cm_core;
1836         listener->nesvnic = nesvnic;
1837         atomic_inc(&cm_core->node_cnt);
1838
1839         listener->conn_type = cm_info->conn_type;
1840         listener->backlog = cm_info->backlog;
1841         listener->listener_state = NES_CM_LISTENER_ACTIVE_STATE;
1842
1843         if (!listener->reused_node) {
1844                 spin_lock_irqsave(&cm_core->listen_list_lock, flags);
1845                 list_add(&listener->list, &cm_core->listen_list.list);
1846                 spin_unlock_irqrestore(&cm_core->listen_list_lock, flags);
1847                 atomic_inc(&cm_core->listen_node_cnt);
1848         }
1849
1850         nes_debug(NES_DBG_CM, "Api - listen(): addr=0x%08X, port=0x%04x,"
1851                         " listener = %p, backlog = %d, cm_id = %p.\n",
1852                         cm_info->loc_addr, cm_info->loc_port,
1853                         listener, listener->backlog, listener->cm_id);
1854
1855         return listener;
1856 }
1857
1858
1859 /**
1860  * mini_cm_connect - make a connection node with params
1861  */
1862 static struct nes_cm_node *mini_cm_connect(struct nes_cm_core *cm_core,
1863         struct nes_vnic *nesvnic, u16 private_data_len,
1864         void *private_data, struct nes_cm_info *cm_info)
1865 {
1866         int ret = 0;
1867         struct nes_cm_node *cm_node;
1868         struct nes_cm_listener *loopbackremotelistener;
1869         struct nes_cm_node *loopbackremotenode;
1870         struct nes_cm_info loopback_cm_info;
1871         u16 mpa_frame_size = sizeof(struct ietf_mpa_frame) + private_data_len;
1872         struct ietf_mpa_frame *mpa_frame = NULL;
1873
1874         /* create a CM connection node */
1875         cm_node = make_cm_node(cm_core, nesvnic, cm_info, NULL);
1876         if (!cm_node)
1877                 return NULL;
1878         mpa_frame = &cm_node->mpa_frame;
1879         strcpy(mpa_frame->key, IEFT_MPA_KEY_REQ);
1880         mpa_frame->flags = IETF_MPA_FLAGS_CRC;
1881         mpa_frame->rev =  IETF_MPA_VERSION;
1882         mpa_frame->priv_data_len = htons(private_data_len);
1883
1884         /* set our node side to client (active) side */
1885         cm_node->tcp_cntxt.client = 1;
1886         cm_node->tcp_cntxt.rcv_wscale = NES_CM_DEFAULT_RCV_WND_SCALE;
1887
1888         if (cm_info->loc_addr == cm_info->rem_addr) {
1889                 loopbackremotelistener = find_listener(cm_core,
1890                                 ntohl(nesvnic->local_ipaddr), cm_node->rem_port,
1891                                 NES_CM_LISTENER_ACTIVE_STATE);
1892                 if (loopbackremotelistener == NULL) {
1893                         create_event(cm_node, NES_CM_EVENT_ABORTED);
1894                 } else {
1895                         atomic_inc(&cm_loopbacks);
1896                         loopback_cm_info = *cm_info;
1897                         loopback_cm_info.loc_port = cm_info->rem_port;
1898                         loopback_cm_info.rem_port = cm_info->loc_port;
1899                         loopback_cm_info.cm_id = loopbackremotelistener->cm_id;
1900                         loopbackremotenode = make_cm_node(cm_core, nesvnic,
1901                                 &loopback_cm_info, loopbackremotelistener);
1902                         loopbackremotenode->loopbackpartner = cm_node;
1903                         loopbackremotenode->tcp_cntxt.rcv_wscale =
1904                                 NES_CM_DEFAULT_RCV_WND_SCALE;
1905                         cm_node->loopbackpartner = loopbackremotenode;
1906                         memcpy(loopbackremotenode->mpa_frame_buf, private_data,
1907                                 private_data_len);
1908                         loopbackremotenode->mpa_frame_size = private_data_len;
1909
1910                         /* we are done handling this state. */
1911                         /* set node to a TSA state */
1912                         cm_node->state = NES_CM_STATE_TSA;
1913                         cm_node->tcp_cntxt.rcv_nxt =
1914                                 loopbackremotenode->tcp_cntxt.loc_seq_num;
1915                         loopbackremotenode->tcp_cntxt.rcv_nxt =
1916                                 cm_node->tcp_cntxt.loc_seq_num;
1917                         cm_node->tcp_cntxt.max_snd_wnd =
1918                                 loopbackremotenode->tcp_cntxt.rcv_wnd;
1919                         loopbackremotenode->tcp_cntxt.max_snd_wnd =
1920                                 cm_node->tcp_cntxt.rcv_wnd;
1921                         cm_node->tcp_cntxt.snd_wnd =
1922                                 loopbackremotenode->tcp_cntxt.rcv_wnd;
1923                         loopbackremotenode->tcp_cntxt.snd_wnd =
1924                                 cm_node->tcp_cntxt.rcv_wnd;
1925                         cm_node->tcp_cntxt.snd_wscale =
1926                                 loopbackremotenode->tcp_cntxt.rcv_wscale;
1927                         loopbackremotenode->tcp_cntxt.snd_wscale =
1928                                 cm_node->tcp_cntxt.rcv_wscale;
1929
1930                         create_event(loopbackremotenode, NES_CM_EVENT_MPA_REQ);
1931                 }
1932                 return cm_node;
1933         }
1934
1935         /* set our node side to client (active) side */
1936         cm_node->tcp_cntxt.client = 1;
1937         /* init our MPA frame ptr */
1938         memcpy(mpa_frame->priv_data, private_data, private_data_len);
1939
1940         cm_node->mpa_frame_size = mpa_frame_size;
1941
1942         /* send a syn and goto syn sent state */
1943         cm_node->state = NES_CM_STATE_SYN_SENT;
1944         ret = send_syn(cm_node, 0, NULL);
1945
1946         if (ret) {
1947                 /* error in sending the syn free up the cm_node struct */
1948                 nes_debug(NES_DBG_CM, "Api - connect() FAILED: dest "
1949                         "addr=0x%08X, port=0x%04x, cm_node=%p, cm_id = %p.\n",
1950                         cm_node->rem_addr, cm_node->rem_port, cm_node,
1951                         cm_node->cm_id);
1952                 rem_ref_cm_node(cm_node->cm_core, cm_node);
1953                 cm_node = NULL;
1954         }
1955
1956         if (cm_node)
1957                 nes_debug(NES_DBG_CM, "Api - connect(): dest addr=0x%08X,"
1958                         "port=0x%04x, cm_node=%p, cm_id = %p.\n",
1959                         cm_node->rem_addr, cm_node->rem_port, cm_node,
1960                         cm_node->cm_id);
1961
1962         return cm_node;
1963 }
1964
1965
1966 /**
1967  * mini_cm_accept - accept a connection
1968  * This function is never called
1969  */
1970 static int mini_cm_accept(struct nes_cm_core *cm_core,
1971         struct ietf_mpa_frame *mpa_frame, struct nes_cm_node *cm_node)
1972 {
1973         return 0;
1974 }
1975
1976
1977 /**
1978  * mini_cm_reject - reject and teardown a connection
1979  */
1980 static int mini_cm_reject(struct nes_cm_core *cm_core,
1981         struct ietf_mpa_frame *mpa_frame, struct nes_cm_node *cm_node)
1982 {
1983         int ret = 0;
1984         int passive_state;
1985
1986         nes_debug(NES_DBG_CM, "%s cm_node=%p type=%d state=%d\n",
1987                 __func__, cm_node, cm_node->tcp_cntxt.client, cm_node->state);
1988
1989         if (cm_node->tcp_cntxt.client)
1990                 return ret;
1991         cleanup_retrans_entry(cm_node);
1992
1993         passive_state = atomic_add_return(1, &cm_node->passive_state);
1994         cm_node->state = NES_CM_STATE_CLOSED;
1995         if (passive_state == NES_SEND_RESET_EVENT)
1996                 rem_ref_cm_node(cm_core, cm_node);
1997         else
1998                 ret = send_reset(cm_node, NULL);
1999         return ret;
2000 }
2001
2002
2003 /**
2004  * mini_cm_close
2005  */
2006 static int mini_cm_close(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node)
2007 {
2008         int ret = 0;
2009
2010         if (!cm_core || !cm_node)
2011                 return -EINVAL;
2012
2013         switch (cm_node->state) {
2014         case NES_CM_STATE_SYN_RCVD:
2015         case NES_CM_STATE_SYN_SENT:
2016         case NES_CM_STATE_ONE_SIDE_ESTABLISHED:
2017         case NES_CM_STATE_ESTABLISHED:
2018         case NES_CM_STATE_ACCEPTING:
2019         case NES_CM_STATE_MPAREQ_SENT:
2020         case NES_CM_STATE_MPAREQ_RCVD:
2021                 cleanup_retrans_entry(cm_node);
2022                 send_reset(cm_node, NULL);
2023                 break;
2024         case NES_CM_STATE_CLOSE_WAIT:
2025                 cm_node->state = NES_CM_STATE_LAST_ACK;
2026                 send_fin(cm_node, NULL);
2027                 break;
2028         case NES_CM_STATE_FIN_WAIT1:
2029         case NES_CM_STATE_FIN_WAIT2:
2030         case NES_CM_STATE_LAST_ACK:
2031         case NES_CM_STATE_TIME_WAIT:
2032         case NES_CM_STATE_CLOSING:
2033                 ret = -1;
2034                 break;
2035         case NES_CM_STATE_LISTENING:
2036         case NES_CM_STATE_UNKNOWN:
2037         case NES_CM_STATE_INITED:
2038         case NES_CM_STATE_CLOSED:
2039                 ret = rem_ref_cm_node(cm_core, cm_node);
2040                 break;
2041         case NES_CM_STATE_TSA:
2042                 if (cm_node->send_entry)
2043                         printk(KERN_ERR "ERROR Close got called from STATE_TSA "
2044                                 "send_entry=%p\n", cm_node->send_entry);
2045                 ret = rem_ref_cm_node(cm_core, cm_node);
2046                 break;
2047         }
2048         return ret;
2049 }
2050
2051
2052 /**
2053  * recv_pkt - recv an ETHERNET packet, and process it through CM
2054  * node state machine
2055  */
2056 static int mini_cm_recv_pkt(struct nes_cm_core *cm_core,
2057         struct nes_vnic *nesvnic, struct sk_buff *skb)
2058 {
2059         struct nes_cm_node *cm_node = NULL;
2060         struct nes_cm_listener *listener = NULL;
2061         struct iphdr *iph;
2062         struct tcphdr *tcph;
2063         struct nes_cm_info nfo;
2064         int skb_handled = 1;
2065
2066         if (!skb)
2067                 return 0;
2068         if (skb->len < sizeof(struct iphdr) + sizeof(struct tcphdr)) {
2069                 return 0;
2070         }
2071
2072         iph = (struct iphdr *)skb->data;
2073         tcph = (struct tcphdr *)(skb->data + sizeof(struct iphdr));
2074
2075         nfo.loc_addr = ntohl(iph->daddr);
2076         nfo.loc_port = ntohs(tcph->dest);
2077         nfo.rem_addr = ntohl(iph->saddr);
2078         nfo.rem_port = ntohs(tcph->source);
2079
2080         nes_debug(NES_DBG_CM, "Received packet: dest=" NIPQUAD_FMT
2081                   ":0x%04X src=" NIPQUAD_FMT ":0x%04X\n",
2082                   NIPQUAD(iph->daddr), tcph->dest,
2083                   NIPQUAD(iph->saddr), tcph->source);
2084
2085         do {
2086                 cm_node = find_node(cm_core,
2087                         nfo.rem_port, nfo.rem_addr,
2088                         nfo.loc_port, nfo.loc_addr);
2089
2090                 if (!cm_node) {
2091                         /* Only type of packet accepted are for */
2092                         /* the PASSIVE open (syn only) */
2093                         if ((!tcph->syn) || (tcph->ack)) {
2094                                 skb_handled = 0;
2095                                 break;
2096                         }
2097                         listener = find_listener(cm_core, nfo.loc_addr,
2098                                 nfo.loc_port,
2099                                 NES_CM_LISTENER_ACTIVE_STATE);
2100                         if (!listener) {
2101                                 nfo.cm_id = NULL;
2102                                 nfo.conn_type = 0;
2103                                 nes_debug(NES_DBG_CM, "Unable to find listener for the pkt\n");
2104                                 skb_handled = 0;
2105                                 break;
2106                         }
2107                         nfo.cm_id = listener->cm_id;
2108                         nfo.conn_type = listener->conn_type;
2109                         cm_node = make_cm_node(cm_core, nesvnic, &nfo,
2110                                 listener);
2111                         if (!cm_node) {
2112                                 nes_debug(NES_DBG_CM, "Unable to allocate "
2113                                         "node\n");
2114                                 cm_packets_dropped++;
2115                                 atomic_dec(&listener->ref_count);
2116                                 dev_kfree_skb_any(skb);
2117                                 break;
2118                         }
2119                         if (!tcph->rst && !tcph->fin) {
2120                                 cm_node->state = NES_CM_STATE_LISTENING;
2121                         } else {
2122                                 cm_packets_dropped++;
2123                                 rem_ref_cm_node(cm_core, cm_node);
2124                                 dev_kfree_skb_any(skb);
2125                                 break;
2126                         }
2127                         add_ref_cm_node(cm_node);
2128                 } else if (cm_node->state == NES_CM_STATE_TSA) {
2129                         rem_ref_cm_node(cm_core, cm_node);
2130                         atomic_inc(&cm_accel_dropped_pkts);
2131                         dev_kfree_skb_any(skb);
2132                         break;
2133                 }
2134                 skb_reset_network_header(skb);
2135                 skb_set_transport_header(skb, sizeof(*tcph));
2136                 skb->len = ntohs(iph->tot_len);
2137                 process_packet(cm_node, skb, cm_core);
2138                 rem_ref_cm_node(cm_core, cm_node);
2139         } while (0);
2140         return skb_handled;
2141 }
2142
2143
2144 /**
2145  * nes_cm_alloc_core - allocate a top level instance of a cm core
2146  */
2147 static struct nes_cm_core *nes_cm_alloc_core(void)
2148 {
2149         struct nes_cm_core *cm_core;
2150
2151         /* setup the CM core */
2152         /* alloc top level core control structure */
2153         cm_core = kzalloc(sizeof(*cm_core), GFP_KERNEL);
2154         if (!cm_core)
2155                 return NULL;
2156
2157         INIT_LIST_HEAD(&cm_core->connected_nodes);
2158         init_timer(&cm_core->tcp_timer);
2159         cm_core->tcp_timer.function = nes_cm_timer_tick;
2160
2161         cm_core->mtu   = NES_CM_DEFAULT_MTU;
2162         cm_core->state = NES_CM_STATE_INITED;
2163         cm_core->free_tx_pkt_max = NES_CM_DEFAULT_FREE_PKTS;
2164
2165         atomic_set(&cm_core->events_posted, 0);
2166
2167         cm_core->api = &nes_cm_api;
2168
2169         spin_lock_init(&cm_core->ht_lock);
2170         spin_lock_init(&cm_core->listen_list_lock);
2171
2172         INIT_LIST_HEAD(&cm_core->listen_list.list);
2173
2174         nes_debug(NES_DBG_CM, "Init CM Core completed -- cm_core=%p\n", cm_core);
2175
2176         nes_debug(NES_DBG_CM, "Enable QUEUE EVENTS\n");
2177         cm_core->event_wq = create_singlethread_workqueue("nesewq");
2178         cm_core->post_event = nes_cm_post_event;
2179         nes_debug(NES_DBG_CM, "Enable QUEUE DISCONNECTS\n");
2180         cm_core->disconn_wq = create_singlethread_workqueue("nesdwq");
2181
2182         print_core(cm_core);
2183         return cm_core;
2184 }
2185
2186
2187 /**
2188  * mini_cm_dealloc_core - deallocate a top level instance of a cm core
2189  */
2190 static int mini_cm_dealloc_core(struct nes_cm_core *cm_core)
2191 {
2192         nes_debug(NES_DBG_CM, "De-Alloc CM Core (%p)\n", cm_core);
2193
2194         if (!cm_core)
2195                 return -EINVAL;
2196
2197         barrier();
2198
2199         if (timer_pending(&cm_core->tcp_timer)) {
2200                 del_timer(&cm_core->tcp_timer);
2201         }
2202
2203         destroy_workqueue(cm_core->event_wq);
2204         destroy_workqueue(cm_core->disconn_wq);
2205         nes_debug(NES_DBG_CM, "\n");
2206         kfree(cm_core);
2207
2208         return 0;
2209 }
2210
2211
2212 /**
2213  * mini_cm_get
2214  */
2215 static int mini_cm_get(struct nes_cm_core *cm_core)
2216 {
2217         return cm_core->state;
2218 }
2219
2220
2221 /**
2222  * mini_cm_set
2223  */
2224 static int mini_cm_set(struct nes_cm_core *cm_core, u32 type, u32 value)
2225 {
2226         int ret = 0;
2227
2228         switch (type) {
2229                 case NES_CM_SET_PKT_SIZE:
2230                         cm_core->mtu = value;
2231                         break;
2232                 case NES_CM_SET_FREE_PKT_Q_SIZE:
2233                         cm_core->free_tx_pkt_max = value;
2234                         break;
2235                 default:
2236                         /* unknown set option */
2237                         ret = -EINVAL;
2238         }
2239
2240         return ret;
2241 }
2242
2243
2244 /**
2245  * nes_cm_init_tsa_conn setup HW; MPA frames must be
2246  * successfully exchanged when this is called
2247  */
2248 static int nes_cm_init_tsa_conn(struct nes_qp *nesqp, struct nes_cm_node *cm_node)
2249 {
2250         int ret = 0;
2251
2252         if (!nesqp)
2253                 return -EINVAL;
2254
2255         nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_IPV4 |
2256                         NES_QPCONTEXT_MISC_NO_NAGLE | NES_QPCONTEXT_MISC_DO_NOT_FRAG |
2257                         NES_QPCONTEXT_MISC_DROS);
2258
2259         if (cm_node->tcp_cntxt.snd_wscale || cm_node->tcp_cntxt.rcv_wscale)
2260                 nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_WSCALE);
2261
2262         nesqp->nesqp_context->misc2 |= cpu_to_le32(64 << NES_QPCONTEXT_MISC2_TTL_SHIFT);
2263
2264         nesqp->nesqp_context->mss |= cpu_to_le32(((u32)cm_node->tcp_cntxt.mss) << 16);
2265
2266         nesqp->nesqp_context->tcp_state_flow_label |= cpu_to_le32(
2267                         (u32)NES_QPCONTEXT_TCPSTATE_EST << NES_QPCONTEXT_TCPFLOW_TCP_STATE_SHIFT);
2268
2269         nesqp->nesqp_context->pd_index_wscale |= cpu_to_le32(
2270                         (cm_node->tcp_cntxt.snd_wscale << NES_QPCONTEXT_PDWSCALE_SND_WSCALE_SHIFT) &
2271                         NES_QPCONTEXT_PDWSCALE_SND_WSCALE_MASK);
2272
2273         nesqp->nesqp_context->pd_index_wscale |= cpu_to_le32(
2274                         (cm_node->tcp_cntxt.rcv_wscale << NES_QPCONTEXT_PDWSCALE_RCV_WSCALE_SHIFT) &
2275                         NES_QPCONTEXT_PDWSCALE_RCV_WSCALE_MASK);
2276
2277         nesqp->nesqp_context->keepalive = cpu_to_le32(0x80);
2278         nesqp->nesqp_context->ts_recent = 0;
2279         nesqp->nesqp_context->ts_age = 0;
2280         nesqp->nesqp_context->snd_nxt = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
2281         nesqp->nesqp_context->snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.snd_wnd);
2282         nesqp->nesqp_context->rcv_nxt = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt);
2283         nesqp->nesqp_context->rcv_wnd = cpu_to_le32(cm_node->tcp_cntxt.rcv_wnd <<
2284                         cm_node->tcp_cntxt.rcv_wscale);
2285         nesqp->nesqp_context->snd_max = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
2286         nesqp->nesqp_context->snd_una = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
2287         nesqp->nesqp_context->srtt = 0;
2288         nesqp->nesqp_context->rttvar = cpu_to_le32(0x6);
2289         nesqp->nesqp_context->ssthresh = cpu_to_le32(0x3FFFC000);
2290         nesqp->nesqp_context->cwnd = cpu_to_le32(2*cm_node->tcp_cntxt.mss);
2291         nesqp->nesqp_context->snd_wl1 = cpu_to_le32(cm_node->tcp_cntxt.rcv_nxt);
2292         nesqp->nesqp_context->snd_wl2 = cpu_to_le32(cm_node->tcp_cntxt.loc_seq_num);
2293         nesqp->nesqp_context->max_snd_wnd = cpu_to_le32(cm_node->tcp_cntxt.max_snd_wnd);
2294
2295         nes_debug(NES_DBG_CM, "QP%u: rcv_nxt = 0x%08X, snd_nxt = 0x%08X,"
2296                         " Setting MSS to %u, PDWscale = 0x%08X, rcv_wnd = %u, context misc = 0x%08X.\n",
2297                         nesqp->hwqp.qp_id, le32_to_cpu(nesqp->nesqp_context->rcv_nxt),
2298                         le32_to_cpu(nesqp->nesqp_context->snd_nxt),
2299                         cm_node->tcp_cntxt.mss, le32_to_cpu(nesqp->nesqp_context->pd_index_wscale),
2300                         le32_to_cpu(nesqp->nesqp_context->rcv_wnd),
2301                         le32_to_cpu(nesqp->nesqp_context->misc));
2302         nes_debug(NES_DBG_CM, "  snd_wnd  = 0x%08X.\n", le32_to_cpu(nesqp->nesqp_context->snd_wnd));
2303         nes_debug(NES_DBG_CM, "  snd_cwnd = 0x%08X.\n", le32_to_cpu(nesqp->nesqp_context->cwnd));
2304         nes_debug(NES_DBG_CM, "  max_swnd = 0x%08X.\n", le32_to_cpu(nesqp->nesqp_context->max_snd_wnd));
2305
2306         nes_debug(NES_DBG_CM, "Change cm_node state to TSA\n");
2307         cm_node->state = NES_CM_STATE_TSA;
2308
2309         return ret;
2310 }
2311
2312
2313 /**
2314  * nes_cm_disconn
2315  */
2316 int nes_cm_disconn(struct nes_qp *nesqp)
2317 {
2318         unsigned long flags;
2319
2320         spin_lock_irqsave(&nesqp->lock, flags);
2321         if (nesqp->disconn_pending == 0) {
2322                 nesqp->disconn_pending++;
2323                 spin_unlock_irqrestore(&nesqp->lock, flags);
2324                 /* init our disconnect work element, to */
2325                 INIT_WORK(&nesqp->disconn_work, nes_disconnect_worker);
2326
2327                 queue_work(g_cm_core->disconn_wq, &nesqp->disconn_work);
2328         } else
2329                 spin_unlock_irqrestore(&nesqp->lock, flags);
2330
2331         return 0;
2332 }
2333
2334
2335 /**
2336  * nes_disconnect_worker
2337  */
2338 static void nes_disconnect_worker(struct work_struct *work)
2339 {
2340         struct nes_qp *nesqp = container_of(work, struct nes_qp, disconn_work);
2341
2342         nes_debug(NES_DBG_CM, "processing AEQE id 0x%04X for QP%u.\n",
2343                         nesqp->last_aeq, nesqp->hwqp.qp_id);
2344         nes_cm_disconn_true(nesqp);
2345 }
2346
2347
2348 /**
2349  * nes_cm_disconn_true
2350  */
2351 static int nes_cm_disconn_true(struct nes_qp *nesqp)
2352 {
2353         unsigned long flags;
2354         int ret = 0;
2355         struct iw_cm_id *cm_id;
2356         struct iw_cm_event cm_event;
2357         struct nes_vnic *nesvnic;
2358         u16 last_ae;
2359         u8 original_hw_tcp_state;
2360         u8 original_ibqp_state;
2361         u8 issued_disconnect_reset = 0;
2362
2363         if (!nesqp) {
2364                 nes_debug(NES_DBG_CM, "disconnect_worker nesqp is NULL\n");
2365                 return -1;
2366         }
2367
2368         spin_lock_irqsave(&nesqp->lock, flags);
2369         cm_id = nesqp->cm_id;
2370         /* make sure we havent already closed this connection */
2371         if (!cm_id) {
2372                 nes_debug(NES_DBG_CM, "QP%u disconnect_worker cmid is NULL\n",
2373                                 nesqp->hwqp.qp_id);
2374                 spin_unlock_irqrestore(&nesqp->lock, flags);
2375                 return -1;
2376         }
2377
2378         nesvnic = to_nesvnic(nesqp->ibqp.device);
2379         nes_debug(NES_DBG_CM, "Disconnecting QP%u\n", nesqp->hwqp.qp_id);
2380
2381         original_hw_tcp_state = nesqp->hw_tcp_state;
2382         original_ibqp_state   = nesqp->ibqp_state;
2383         last_ae = nesqp->last_aeq;
2384
2385
2386         nes_debug(NES_DBG_CM, "set ibqp_state=%u\n", nesqp->ibqp_state);
2387
2388         if ((nesqp->cm_id) && (cm_id->event_handler)) {
2389                 if ((original_hw_tcp_state == NES_AEQE_TCP_STATE_CLOSE_WAIT) ||
2390                                 ((original_ibqp_state == IB_QPS_RTS) &&
2391                                 (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET))) {
2392                         atomic_inc(&cm_disconnects);
2393                         cm_event.event = IW_CM_EVENT_DISCONNECT;
2394                         if (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET) {
2395                                 cm_event.status = IW_CM_EVENT_STATUS_RESET;
2396                                 nes_debug(NES_DBG_CM, "Generating a CM "
2397                                         "Disconnect Event (status reset) for "
2398                                         "QP%u, cm_id = %p. \n",
2399                                         nesqp->hwqp.qp_id, cm_id);
2400                         } else
2401                                 cm_event.status = IW_CM_EVENT_STATUS_OK;
2402
2403                         cm_event.local_addr = cm_id->local_addr;
2404                         cm_event.remote_addr = cm_id->remote_addr;
2405                         cm_event.private_data = NULL;
2406                         cm_event.private_data_len = 0;
2407
2408                         nes_debug(NES_DBG_CM, "Generating a CM Disconnect Event"
2409                                 " for  QP%u, SQ Head = %u, SQ Tail = %u. "
2410                                 "cm_id = %p, refcount = %u.\n",
2411                                 nesqp->hwqp.qp_id, nesqp->hwqp.sq_head,
2412                                 nesqp->hwqp.sq_tail, cm_id,
2413                                 atomic_read(&nesqp->refcount));
2414
2415                         spin_unlock_irqrestore(&nesqp->lock, flags);
2416                         ret = cm_id->event_handler(cm_id, &cm_event);
2417                         if (ret)
2418                                 nes_debug(NES_DBG_CM, "OFA CM event_handler "
2419                                         "returned, ret=%d\n", ret);
2420                         spin_lock_irqsave(&nesqp->lock, flags);
2421                 }
2422
2423                 nesqp->disconn_pending = 0;
2424                 /* There might have been another AE while the lock was released */
2425                 original_hw_tcp_state = nesqp->hw_tcp_state;
2426                 original_ibqp_state   = nesqp->ibqp_state;
2427                 last_ae = nesqp->last_aeq;
2428
2429                 if ((issued_disconnect_reset == 0) && (nesqp->cm_id) &&
2430                                 ((original_hw_tcp_state == NES_AEQE_TCP_STATE_CLOSED) ||
2431                                  (original_hw_tcp_state == NES_AEQE_TCP_STATE_TIME_WAIT) ||
2432                                  (last_ae == NES_AEQE_AEID_RDMAP_ROE_BAD_LLP_CLOSE) ||
2433                                  (last_ae == NES_AEQE_AEID_LLP_CONNECTION_RESET))) {
2434                         atomic_inc(&cm_closes);
2435                         nesqp->cm_id = NULL;
2436                         nesqp->in_disconnect = 0;
2437                         spin_unlock_irqrestore(&nesqp->lock, flags);
2438                         nes_disconnect(nesqp, 1);
2439
2440                         cm_id->provider_data = nesqp;
2441                         /* Send up the close complete event */
2442                         cm_event.event = IW_CM_EVENT_CLOSE;
2443                         cm_event.status = IW_CM_EVENT_STATUS_OK;
2444                         cm_event.provider_data = cm_id->provider_data;
2445                         cm_event.local_addr = cm_id->local_addr;
2446                         cm_event.remote_addr = cm_id->remote_addr;
2447                         cm_event.private_data = NULL;
2448                         cm_event.private_data_len = 0;
2449
2450                         ret = cm_id->event_handler(cm_id, &cm_event);
2451                         if (ret) {
2452                                 nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);
2453                         }
2454
2455                         cm_id->rem_ref(cm_id);
2456
2457                         spin_lock_irqsave(&nesqp->lock, flags);
2458                         if (nesqp->flush_issued == 0) {
2459                                 nesqp->flush_issued = 1;
2460                                 spin_unlock_irqrestore(&nesqp->lock, flags);
2461                                 flush_wqes(nesvnic->nesdev, nesqp,
2462                                         NES_CQP_FLUSH_RQ, 1);
2463                         } else
2464                                 spin_unlock_irqrestore(&nesqp->lock, flags);
2465                 } else {
2466                         cm_id = nesqp->cm_id;
2467                         spin_unlock_irqrestore(&nesqp->lock, flags);
2468                         /* check to see if the inbound reset beat the outbound reset */
2469                         if ((!cm_id) && (last_ae==NES_AEQE_AEID_RESET_SENT)) {
2470                                 nes_debug(NES_DBG_CM, "QP%u: Decing refcount "
2471                                         "due to inbound reset beating the "
2472                                         "outbound reset.\n", nesqp->hwqp.qp_id);
2473                         }
2474                 }
2475         } else {
2476                 nesqp->disconn_pending = 0;
2477                 spin_unlock_irqrestore(&nesqp->lock, flags);
2478         }
2479
2480         return 0;
2481 }
2482
2483
2484 /**
2485  * nes_disconnect
2486  */
2487 static int nes_disconnect(struct nes_qp *nesqp, int abrupt)
2488 {
2489         int ret = 0;
2490         struct nes_vnic *nesvnic;
2491         struct nes_device *nesdev;
2492
2493         nesvnic = to_nesvnic(nesqp->ibqp.device);
2494         if (!nesvnic)
2495                 return -EINVAL;
2496
2497         nesdev = nesvnic->nesdev;
2498
2499         nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",
2500                         atomic_read(&nesvnic->netdev->refcnt));
2501
2502         if (nesqp->active_conn) {
2503
2504                 /* indicate this connection is NOT active */
2505                 nesqp->active_conn = 0;
2506         } else {
2507                 /* Need to free the Last Streaming Mode Message */
2508                 if (nesqp->ietf_frame) {
2509                         pci_free_consistent(nesdev->pcidev,
2510                                         nesqp->private_data_len+sizeof(struct ietf_mpa_frame),
2511                                         nesqp->ietf_frame, nesqp->ietf_frame_pbase);
2512                 }
2513         }
2514
2515         /* close the CM node down if it is still active */
2516         if (nesqp->cm_node) {
2517                 nes_debug(NES_DBG_CM, "Call close API\n");
2518
2519                 g_cm_core->api->close(g_cm_core, nesqp->cm_node);
2520         }
2521
2522         return ret;
2523 }
2524
2525
2526 /**
2527  * nes_accept
2528  */
2529 int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
2530 {
2531         u64 u64temp;
2532         struct ib_qp *ibqp;
2533         struct nes_qp *nesqp;
2534         struct nes_vnic *nesvnic;
2535         struct nes_device *nesdev;
2536         struct nes_cm_node *cm_node;
2537         struct nes_adapter *adapter;
2538         struct ib_qp_attr attr;
2539         struct iw_cm_event cm_event;
2540         struct nes_hw_qp_wqe *wqe;
2541         struct nes_v4_quad nes_quad;
2542         u32 crc_value;
2543         int ret;
2544         int passive_state;
2545
2546         ibqp = nes_get_qp(cm_id->device, conn_param->qpn);
2547         if (!ibqp)
2548                 return -EINVAL;
2549
2550         /* get all our handles */
2551         nesqp = to_nesqp(ibqp);
2552         nesvnic = to_nesvnic(nesqp->ibqp.device);
2553         nesdev = nesvnic->nesdev;
2554         adapter = nesdev->nesadapter;
2555
2556         cm_node = (struct nes_cm_node *)cm_id->provider_data;
2557         nes_debug(NES_DBG_CM, "nes_accept: cm_node= %p nesvnic=%p, netdev=%p,"
2558                 "%s\n", cm_node, nesvnic, nesvnic->netdev,
2559                 nesvnic->netdev->name);
2560
2561         /* associate the node with the QP */
2562         nesqp->cm_node = (void *)cm_node;
2563         cm_node->nesqp = nesqp;
2564         nes_add_ref(&nesqp->ibqp);
2565
2566         nes_debug(NES_DBG_CM, "QP%u, cm_node=%p, jiffies = %lu listener = %p\n",
2567                 nesqp->hwqp.qp_id, cm_node, jiffies, cm_node->listener);
2568         atomic_inc(&cm_accepts);
2569
2570         nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",
2571                         atomic_read(&nesvnic->netdev->refcnt));
2572
2573         /* allocate the ietf frame and space for private data */
2574         nesqp->ietf_frame = pci_alloc_consistent(nesdev->pcidev,
2575                 sizeof(struct ietf_mpa_frame) + conn_param->private_data_len,
2576                 &nesqp->ietf_frame_pbase);
2577
2578         if (!nesqp->ietf_frame) {
2579                 nes_debug(NES_DBG_CM, "Unable to allocate memory for private "
2580                         "data\n");
2581                 return -ENOMEM;
2582         }
2583
2584
2585         /* setup the MPA frame */
2586         nesqp->private_data_len = conn_param->private_data_len;
2587         memcpy(nesqp->ietf_frame->key, IEFT_MPA_KEY_REP, IETF_MPA_KEY_SIZE);
2588
2589         memcpy(nesqp->ietf_frame->priv_data, conn_param->private_data,
2590                         conn_param->private_data_len);
2591
2592         nesqp->ietf_frame->priv_data_len =
2593                 cpu_to_be16(conn_param->private_data_len);
2594         nesqp->ietf_frame->rev = mpa_version;
2595         nesqp->ietf_frame->flags = IETF_MPA_FLAGS_CRC;
2596
2597         /* setup our first outgoing iWarp send WQE (the IETF frame response) */
2598         wqe = &nesqp->hwqp.sq_vbase[0];
2599
2600         if (cm_id->remote_addr.sin_addr.s_addr !=
2601                         cm_id->local_addr.sin_addr.s_addr) {
2602                 u64temp = (unsigned long)nesqp;
2603                 u64temp |= NES_SW_CONTEXT_ALIGN>>1;
2604                 set_wqe_64bit_value(wqe->wqe_words,
2605                         NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX,
2606                         u64temp);
2607                 wqe->wqe_words[NES_IWARP_SQ_WQE_MISC_IDX] =
2608                         cpu_to_le32(NES_IWARP_SQ_WQE_STREAMING |
2609                         NES_IWARP_SQ_WQE_WRPDU);
2610                 wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] =
2611                         cpu_to_le32(conn_param->private_data_len +
2612                         sizeof(struct ietf_mpa_frame));
2613                 wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] =
2614                         cpu_to_le32((u32)nesqp->ietf_frame_pbase);
2615                 wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] =
2616                         cpu_to_le32((u32)((u64)nesqp->ietf_frame_pbase >> 32));
2617                 wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] =
2618                         cpu_to_le32(conn_param->private_data_len +
2619                         sizeof(struct ietf_mpa_frame));
2620                 wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;
2621
2622                 nesqp->nesqp_context->ird_ord_sizes |=
2623                         cpu_to_le32(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
2624                         NES_QPCONTEXT_ORDIRD_WRPDU);
2625         } else {
2626                 nesqp->nesqp_context->ird_ord_sizes |=
2627                         cpu_to_le32((NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
2628                         NES_QPCONTEXT_ORDIRD_WRPDU |
2629                         NES_QPCONTEXT_ORDIRD_ALSMM));
2630         }
2631         nesqp->skip_lsmm = 1;
2632
2633
2634         /* Cache the cm_id in the qp */
2635         nesqp->cm_id = cm_id;
2636         cm_node->cm_id = cm_id;
2637
2638         /*  nesqp->cm_node = (void *)cm_id->provider_data; */
2639         cm_id->provider_data = nesqp;
2640         nesqp->active_conn   = 0;
2641
2642         if (cm_node->state == NES_CM_STATE_TSA)
2643                 nes_debug(NES_DBG_CM, "Already state = TSA for cm_node=%p\n",
2644                         cm_node);
2645
2646         nes_cm_init_tsa_conn(nesqp, cm_node);
2647
2648         nesqp->nesqp_context->tcpPorts[0] =
2649                 cpu_to_le16(ntohs(cm_id->local_addr.sin_port));
2650         nesqp->nesqp_context->tcpPorts[1] =
2651                 cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));
2652
2653         if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))
2654                 nesqp->nesqp_context->ip0 =
2655                         cpu_to_le32(ntohl(nesvnic->local_ipaddr));
2656         else
2657                 nesqp->nesqp_context->ip0 =
2658                         cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));
2659
2660         nesqp->nesqp_context->misc2 |= cpu_to_le32(
2661                         (u32)PCI_FUNC(nesdev->pcidev->devfn) <<
2662                         NES_QPCONTEXT_MISC2_SRC_IP_SHIFT);
2663
2664         nesqp->nesqp_context->arp_index_vlan |=
2665                 cpu_to_le32(nes_arp_table(nesdev,
2666                         le32_to_cpu(nesqp->nesqp_context->ip0), NULL,
2667                         NES_ARP_RESOLVE) << 16);
2668
2669         nesqp->nesqp_context->ts_val_delta = cpu_to_le32(
2670                 jiffies - nes_read_indexed(nesdev, NES_IDX_TCP_NOW));
2671
2672         nesqp->nesqp_context->ird_index = cpu_to_le32(nesqp->hwqp.qp_id);
2673
2674         nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32(
2675                 ((u32)1 << NES_QPCONTEXT_ORDIRD_IWARP_MODE_SHIFT));
2676         nesqp->nesqp_context->ird_ord_sizes |=
2677                 cpu_to_le32((u32)conn_param->ord);
2678
2679         memset(&nes_quad, 0, sizeof(nes_quad));
2680         nes_quad.DstIpAdrIndex =
2681                 cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);
2682         if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))
2683                 nes_quad.SrcIpadr = nesvnic->local_ipaddr;
2684         else
2685                 nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;
2686         nes_quad.TcpPorts[0] = cm_id->remote_addr.sin_port;
2687         nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port;
2688
2689         /* Produce hash key */
2690         crc_value = get_crc_value(&nes_quad);
2691         nesqp->hte_index = cpu_to_be32(crc_value ^ 0xffffffff);
2692         nes_debug(NES_DBG_CM, "HTE Index = 0x%08X, CRC = 0x%08X\n",
2693                 nesqp->hte_index, nesqp->hte_index & adapter->hte_index_mask);
2694
2695         nesqp->hte_index &= adapter->hte_index_mask;
2696         nesqp->nesqp_context->hte_index = cpu_to_le32(nesqp->hte_index);
2697
2698         cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node);
2699
2700         nes_debug(NES_DBG_CM, "QP%u, Destination IP = 0x%08X:0x%04X, local = "
2701                         "0x%08X:0x%04X, rcv_nxt=0x%08X, snd_nxt=0x%08X, mpa + "
2702                         "private data length=%zu.\n", nesqp->hwqp.qp_id,
2703                         ntohl(cm_id->remote_addr.sin_addr.s_addr),
2704                         ntohs(cm_id->remote_addr.sin_port),
2705                         ntohl(cm_id->local_addr.sin_addr.s_addr),
2706                         ntohs(cm_id->local_addr.sin_port),
2707                         le32_to_cpu(nesqp->nesqp_context->rcv_nxt),
2708                         le32_to_cpu(nesqp->nesqp_context->snd_nxt),
2709                         conn_param->private_data_len +
2710                         sizeof(struct ietf_mpa_frame));
2711
2712
2713         /* notify OF layer that accept event was successfull */
2714         cm_id->add_ref(cm_id);
2715
2716         cm_event.event = IW_CM_EVENT_ESTABLISHED;
2717         cm_event.status = IW_CM_EVENT_STATUS_ACCEPTED;
2718         cm_event.provider_data = (void *)nesqp;
2719         cm_event.local_addr = cm_id->local_addr;
2720         cm_event.remote_addr = cm_id->remote_addr;
2721         cm_event.private_data = NULL;
2722         cm_event.private_data_len = 0;
2723         ret = cm_id->event_handler(cm_id, &cm_event);
2724         attr.qp_state = IB_QPS_RTS;
2725         nes_modify_qp(&nesqp->ibqp, &attr, IB_QP_STATE, NULL);
2726         if (cm_node->loopbackpartner) {
2727                 cm_node->loopbackpartner->mpa_frame_size =
2728                         nesqp->private_data_len;
2729                 /* copy entire MPA frame to our cm_node's frame */
2730                 memcpy(cm_node->loopbackpartner->mpa_frame_buf,
2731                         nesqp->ietf_frame->priv_data, nesqp->private_data_len);
2732                 create_event(cm_node->loopbackpartner, NES_CM_EVENT_CONNECTED);
2733         }
2734         if (ret)
2735                 printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "
2736                         "ret=%d\n", __func__, __LINE__, ret);
2737
2738         passive_state = atomic_add_return(1, &cm_node->passive_state);
2739         if (passive_state == NES_SEND_RESET_EVENT)
2740                 create_event(cm_node, NES_CM_EVENT_RESET);
2741         return 0;
2742 }
2743
2744
2745 /**
2746  * nes_reject
2747  */
2748 int nes_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len)
2749 {
2750         struct nes_cm_node *cm_node;
2751         struct nes_cm_core *cm_core;
2752
2753         atomic_inc(&cm_rejects);
2754         cm_node = (struct nes_cm_node *) cm_id->provider_data;
2755         cm_core = cm_node->cm_core;
2756         cm_node->mpa_frame_size = sizeof(struct ietf_mpa_frame) + pdata_len;
2757
2758         strcpy(&cm_node->mpa_frame.key[0], IEFT_MPA_KEY_REP);
2759         memcpy(&cm_node->mpa_frame.priv_data, pdata, pdata_len);
2760
2761         cm_node->mpa_frame.priv_data_len = cpu_to_be16(pdata_len);
2762         cm_node->mpa_frame.rev = mpa_version;
2763         cm_node->mpa_frame.flags = IETF_MPA_FLAGS_CRC | IETF_MPA_FLAGS_REJECT;
2764
2765         cm_core->api->reject(cm_core, &cm_node->mpa_frame, cm_node);
2766
2767         return 0;
2768 }
2769
2770
2771 /**
2772  * nes_connect
2773  * setup and launch cm connect node
2774  */
2775 int nes_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
2776 {
2777         struct ib_qp *ibqp;
2778         struct nes_qp *nesqp;
2779         struct nes_vnic *nesvnic;
2780         struct nes_device *nesdev;
2781         struct nes_cm_node *cm_node;
2782         struct nes_cm_info cm_info;
2783
2784         ibqp = nes_get_qp(cm_id->device, conn_param->qpn);
2785         if (!ibqp)
2786                 return -EINVAL;
2787         nesqp = to_nesqp(ibqp);
2788         if (!nesqp)
2789                 return -EINVAL;
2790         nesvnic = to_nesvnic(nesqp->ibqp.device);
2791         if (!nesvnic)
2792                 return -EINVAL;
2793         nesdev  = nesvnic->nesdev;
2794         if (!nesdev)
2795                 return -EINVAL;
2796
2797         nes_debug(NES_DBG_CM, "QP%u, current IP = 0x%08X, Destination IP = "
2798                 "0x%08X:0x%04X, local = 0x%08X:0x%04X.\n", nesqp->hwqp.qp_id,
2799                 ntohl(nesvnic->local_ipaddr),
2800                 ntohl(cm_id->remote_addr.sin_addr.s_addr),
2801                 ntohs(cm_id->remote_addr.sin_port),
2802                 ntohl(cm_id->local_addr.sin_addr.s_addr),
2803                 ntohs(cm_id->local_addr.sin_port));
2804
2805         atomic_inc(&cm_connects);
2806         nesqp->active_conn = 1;
2807
2808         /* cache the cm_id in the qp */
2809         nesqp->cm_id = cm_id;
2810
2811         cm_id->provider_data = nesqp;
2812
2813         nesqp->private_data_len = conn_param->private_data_len;
2814         nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32((u32)conn_param->ord);
2815         nes_debug(NES_DBG_CM, "requested ord = 0x%08X.\n", (u32)conn_param->ord);
2816         nes_debug(NES_DBG_CM, "mpa private data len =%u\n",
2817                 conn_param->private_data_len);
2818
2819         if (cm_id->local_addr.sin_addr.s_addr !=
2820                 cm_id->remote_addr.sin_addr.s_addr)
2821                 nes_manage_apbvt(nesvnic, ntohs(cm_id->local_addr.sin_port),
2822                         PCI_FUNC(nesdev->pcidev->devfn), NES_MANAGE_APBVT_ADD);
2823
2824         /* set up the connection params for the node */
2825         cm_info.loc_addr = htonl(cm_id->local_addr.sin_addr.s_addr);
2826         cm_info.loc_port = htons(cm_id->local_addr.sin_port);
2827         cm_info.rem_addr = htonl(cm_id->remote_addr.sin_addr.s_addr);
2828         cm_info.rem_port = htons(cm_id->remote_addr.sin_port);
2829         cm_info.cm_id = cm_id;
2830         cm_info.conn_type = NES_CM_IWARP_CONN_TYPE;
2831
2832         cm_id->add_ref(cm_id);
2833
2834         /* create a connect CM node connection */
2835         cm_node = g_cm_core->api->connect(g_cm_core, nesvnic,
2836                 conn_param->private_data_len, (void *)conn_param->private_data,
2837                 &cm_info);
2838         if (!cm_node) {
2839                 if (cm_id->local_addr.sin_addr.s_addr !=
2840                                 cm_id->remote_addr.sin_addr.s_addr)
2841                         nes_manage_apbvt(nesvnic, ntohs(cm_id->local_addr.sin_port),
2842                                 PCI_FUNC(nesdev->pcidev->devfn),
2843                                 NES_MANAGE_APBVT_DEL);
2844
2845                 cm_id->rem_ref(cm_id);
2846                 return -ENOMEM;
2847         }
2848
2849         cm_node->apbvt_set = 1;
2850         nesqp->cm_node = cm_node;
2851         cm_node->nesqp = nesqp;
2852         nes_add_ref(&nesqp->ibqp);
2853
2854         return 0;
2855 }
2856
2857
2858 /**
2859  * nes_create_listen
2860  */
2861 int nes_create_listen(struct iw_cm_id *cm_id, int backlog)
2862 {
2863         struct nes_vnic *nesvnic;
2864         struct nes_cm_listener *cm_node;
2865         struct nes_cm_info cm_info;
2866         struct nes_adapter *adapter;
2867         int err;
2868
2869
2870         nes_debug(NES_DBG_CM, "cm_id = %p, local port = 0x%04X.\n",
2871                         cm_id, ntohs(cm_id->local_addr.sin_port));
2872
2873         nesvnic = to_nesvnic(cm_id->device);
2874         if (!nesvnic)
2875                 return -EINVAL;
2876         adapter = nesvnic->nesdev->nesadapter;
2877         nes_debug(NES_DBG_CM, "nesvnic=%p, netdev=%p, %s\n",
2878                         nesvnic, nesvnic->netdev, nesvnic->netdev->name);
2879
2880         nes_debug(NES_DBG_CM, "nesvnic->local_ipaddr=0x%08x, sin_addr.s_addr=0x%08x\n",
2881                         nesvnic->local_ipaddr, cm_id->local_addr.sin_addr.s_addr);
2882
2883         /* setup listen params in our api call struct */
2884         cm_info.loc_addr = nesvnic->local_ipaddr;
2885         cm_info.loc_port = cm_id->local_addr.sin_port;
2886         cm_info.backlog = backlog;
2887         cm_info.cm_id = cm_id;
2888
2889         cm_info.conn_type = NES_CM_IWARP_CONN_TYPE;
2890
2891
2892         cm_node = g_cm_core->api->listen(g_cm_core, nesvnic, &cm_info);
2893         if (!cm_node) {
2894                 printk(KERN_ERR "%s[%u] Error returned from listen API call\n",
2895                                 __func__, __LINE__);
2896                 return -ENOMEM;
2897         }
2898
2899         cm_id->provider_data = cm_node;
2900
2901         if (!cm_node->reused_node) {
2902                 err = nes_manage_apbvt(nesvnic,
2903                         ntohs(cm_id->local_addr.sin_port),
2904                         PCI_FUNC(nesvnic->nesdev->pcidev->devfn),
2905                         NES_MANAGE_APBVT_ADD);
2906                 if (err) {
2907                         printk(KERN_ERR "nes_manage_apbvt call returned %d.\n",
2908                                 err);
2909                         g_cm_core->api->stop_listener(g_cm_core, (void *)cm_node);
2910                         return err;
2911                 }
2912                 cm_listens_created++;
2913         }
2914
2915         cm_id->add_ref(cm_id);
2916         cm_id->provider_data = (void *)cm_node;
2917
2918
2919         return 0;
2920 }
2921
2922
2923 /**
2924  * nes_destroy_listen
2925  */
2926 int nes_destroy_listen(struct iw_cm_id *cm_id)
2927 {
2928         if (cm_id->provider_data)
2929                 g_cm_core->api->stop_listener(g_cm_core, cm_id->provider_data);
2930         else
2931                 nes_debug(NES_DBG_CM, "cm_id->provider_data was NULL\n");
2932
2933         cm_id->rem_ref(cm_id);
2934
2935         return 0;
2936 }
2937
2938
2939 /**
2940  * nes_cm_recv
2941  */
2942 int nes_cm_recv(struct sk_buff *skb, struct net_device *netdevice)
2943 {
2944         int rc = 0;
2945         cm_packets_received++;
2946         if ((g_cm_core) && (g_cm_core->api)) {
2947                 rc = g_cm_core->api->recv_pkt(g_cm_core, netdev_priv(netdevice), skb);
2948         } else {
2949                 nes_debug(NES_DBG_CM, "Unable to process packet for CM,"
2950                                 " cm is not setup properly.\n");
2951         }
2952
2953         return rc;
2954 }
2955
2956
2957 /**
2958  * nes_cm_start
2959  * Start and init a cm core module
2960  */
2961 int nes_cm_start(void)
2962 {
2963         nes_debug(NES_DBG_CM, "\n");
2964         /* create the primary CM core, pass this handle to subsequent core inits */
2965         g_cm_core = nes_cm_alloc_core();
2966         if (g_cm_core) {
2967                 return 0;
2968         } else {
2969                 return -ENOMEM;
2970         }
2971 }
2972
2973
2974 /**
2975  * nes_cm_stop
2976  * stop and dealloc all cm core instances
2977  */
2978 int nes_cm_stop(void)
2979 {
2980         g_cm_core->api->destroy_cm_core(g_cm_core);
2981         return 0;
2982 }
2983
2984
2985 /**
2986  * cm_event_connected
2987  * handle a connected event, setup QPs and HW
2988  */
2989 static void cm_event_connected(struct nes_cm_event *event)
2990 {
2991         u64 u64temp;
2992         struct nes_qp *nesqp;
2993         struct nes_vnic *nesvnic;
2994         struct nes_device *nesdev;
2995         struct nes_cm_node *cm_node;
2996         struct nes_adapter *nesadapter;
2997         struct ib_qp_attr attr;
2998         struct iw_cm_id *cm_id;
2999         struct iw_cm_event cm_event;
3000         struct nes_hw_qp_wqe *wqe;
3001         struct nes_v4_quad nes_quad;
3002         u32 crc_value;
3003         int ret;
3004
3005         /* get all our handles */
3006         cm_node = event->cm_node;
3007         cm_id = cm_node->cm_id;
3008         nes_debug(NES_DBG_CM, "cm_event_connected - %p - cm_id = %p\n", cm_node, cm_id);
3009         nesqp = (struct nes_qp *)cm_id->provider_data;
3010         nesvnic = to_nesvnic(nesqp->ibqp.device);
3011         nesdev = nesvnic->nesdev;
3012         nesadapter = nesdev->nesadapter;
3013
3014         if (nesqp->destroyed) {
3015                 return;
3016         }
3017         atomic_inc(&cm_connecteds);
3018         nes_debug(NES_DBG_CM, "QP%u attempting to connect to  0x%08X:0x%04X on"
3019                         " local port 0x%04X. jiffies = %lu.\n",
3020                         nesqp->hwqp.qp_id,
3021                         ntohl(cm_id->remote_addr.sin_addr.s_addr),
3022                         ntohs(cm_id->remote_addr.sin_port),
3023                         ntohs(cm_id->local_addr.sin_port),
3024                         jiffies);
3025
3026         nes_cm_init_tsa_conn(nesqp, cm_node);
3027
3028         /* set the QP tsa context */
3029         nesqp->nesqp_context->tcpPorts[0] =
3030                 cpu_to_le16(ntohs(cm_id->local_addr.sin_port));
3031         nesqp->nesqp_context->tcpPorts[1] =
3032                 cpu_to_le16(ntohs(cm_id->remote_addr.sin_port));
3033         if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))
3034                 nesqp->nesqp_context->ip0 =
3035                         cpu_to_le32(ntohl(nesvnic->local_ipaddr));
3036         else
3037                 nesqp->nesqp_context->ip0 =
3038                         cpu_to_le32(ntohl(cm_id->remote_addr.sin_addr.s_addr));
3039
3040         nesqp->nesqp_context->misc2 |= cpu_to_le32(
3041                         (u32)PCI_FUNC(nesdev->pcidev->devfn) <<
3042                         NES_QPCONTEXT_MISC2_SRC_IP_SHIFT);
3043         nesqp->nesqp_context->arp_index_vlan |= cpu_to_le32(
3044                         nes_arp_table(nesdev,
3045                         le32_to_cpu(nesqp->nesqp_context->ip0),
3046                         NULL, NES_ARP_RESOLVE) << 16);
3047         nesqp->nesqp_context->ts_val_delta = cpu_to_le32(
3048                         jiffies - nes_read_indexed(nesdev, NES_IDX_TCP_NOW));
3049         nesqp->nesqp_context->ird_index = cpu_to_le32(nesqp->hwqp.qp_id);
3050         nesqp->nesqp_context->ird_ord_sizes |=
3051                         cpu_to_le32((u32)1 <<
3052                         NES_QPCONTEXT_ORDIRD_IWARP_MODE_SHIFT);
3053
3054         /* Adjust tail for not having a LSMM */
3055         nesqp->hwqp.sq_tail = 1;
3056
3057 #if defined(NES_SEND_FIRST_WRITE)
3058         if (cm_node->send_write0) {
3059                 nes_debug(NES_DBG_CM, "Sending first write.\n");
3060                 wqe = &nesqp->hwqp.sq_vbase[0];
3061                 u64temp = (unsigned long)nesqp;
3062                 u64temp |= NES_SW_CONTEXT_ALIGN>>1;
3063                 set_wqe_64bit_value(wqe->wqe_words,
3064                                 NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX, u64temp);
3065                 wqe->wqe_words[NES_IWARP_SQ_WQE_MISC_IDX] =
3066                         cpu_to_le32(NES_IWARP_SQ_OP_RDMAW);
3067                 wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] = 0;
3068                 wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] = 0;
3069                 wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] = 0;
3070                 wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] = 0;
3071                 wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;
3072
3073                 /* use the reserved spot on the WQ for the extra first WQE */
3074                 nesqp->nesqp_context->ird_ord_sizes &=
3075                         cpu_to_le32(~(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
3076                                                 NES_QPCONTEXT_ORDIRD_WRPDU |
3077                                                 NES_QPCONTEXT_ORDIRD_ALSMM));
3078                 nesqp->skip_lsmm = 1;
3079                 nesqp->hwqp.sq_tail = 0;
3080                 nes_write32(nesdev->regs + NES_WQE_ALLOC,
3081                                 (1 << 24) | 0x00800000 | nesqp->hwqp.qp_id);
3082         }
3083 #endif
3084
3085         memset(&nes_quad, 0, sizeof(nes_quad));
3086
3087         nes_quad.DstIpAdrIndex =
3088                 cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24);
3089         if (ipv4_is_loopback(cm_id->remote_addr.sin_addr.s_addr))
3090                 nes_quad.SrcIpadr = nesvnic->local_ipaddr;
3091         else
3092                 nes_quad.SrcIpadr = cm_id->remote_addr.sin_addr.s_addr;
3093         nes_quad.TcpPorts[0] = cm_id->remote_addr.sin_port;
3094         nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port;
3095
3096         /* Produce hash key */
3097         crc_value = get_crc_value(&nes_quad);
3098         nesqp->hte_index = cpu_to_be32(crc_value ^ 0xffffffff);
3099         nes_debug(NES_DBG_CM, "HTE Index = 0x%08X, After CRC = 0x%08X\n",
3100                         nesqp->hte_index, nesqp->hte_index & nesadapter->hte_index_mask);
3101
3102         nesqp->hte_index &= nesadapter->hte_index_mask;
3103         nesqp->nesqp_context->hte_index = cpu_to_le32(nesqp->hte_index);
3104
3105         nesqp->ietf_frame = &cm_node->mpa_frame;
3106         nesqp->private_data_len = (u8) cm_node->mpa_frame_size;
3107         cm_node->cm_core->api->accelerated(cm_node->cm_core, cm_node);
3108
3109         /* notify OF layer we successfully created the requested connection */
3110         cm_event.event = IW_CM_EVENT_CONNECT_REPLY;
3111         cm_event.status = IW_CM_EVENT_STATUS_ACCEPTED;
3112         cm_event.provider_data = cm_id->provider_data;
3113         cm_event.local_addr.sin_family = AF_INET;
3114         cm_event.local_addr.sin_port = cm_id->local_addr.sin_port;
3115         cm_event.remote_addr = cm_id->remote_addr;
3116
3117         cm_event.private_data = (void *)event->cm_node->mpa_frame_buf;
3118         cm_event.private_data_len = (u8) event->cm_node->mpa_frame_size;
3119
3120         cm_event.local_addr.sin_addr.s_addr = event->cm_info.rem_addr;
3121         ret = cm_id->event_handler(cm_id, &cm_event);
3122         nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);
3123
3124         if (ret)
3125                 printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "
3126                         "ret=%d\n", __func__, __LINE__, ret);
3127         attr.qp_state = IB_QPS_RTS;
3128         nes_modify_qp(&nesqp->ibqp, &attr, IB_QP_STATE, NULL);
3129
3130         nes_debug(NES_DBG_CM, "Exiting connect thread for QP%u. jiffies = "
3131                 "%lu\n", nesqp->hwqp.qp_id, jiffies);
3132
3133         return;
3134 }
3135
3136
3137 /**
3138  * cm_event_connect_error
3139  */
3140 static void cm_event_connect_error(struct nes_cm_event *event)
3141 {
3142         struct nes_qp *nesqp;
3143         struct iw_cm_id *cm_id;
3144         struct iw_cm_event cm_event;
3145         /* struct nes_cm_info cm_info; */
3146         int ret;
3147
3148         if (!event->cm_node)
3149                 return;
3150
3151         cm_id = event->cm_node->cm_id;
3152         if (!cm_id) {
3153                 return;
3154         }
3155
3156         nes_debug(NES_DBG_CM, "cm_node=%p, cm_id=%p\n", event->cm_node, cm_id);
3157         nesqp = cm_id->provider_data;
3158
3159         if (!nesqp) {
3160                 return;
3161         }
3162
3163         /* notify OF layer about this connection error event */
3164         /* cm_id->rem_ref(cm_id); */
3165         nesqp->cm_id = NULL;
3166         cm_id->provider_data = NULL;
3167         cm_event.event = IW_CM_EVENT_CONNECT_REPLY;
3168         cm_event.status = IW_CM_EVENT_STATUS_REJECTED;
3169         cm_event.provider_data = cm_id->provider_data;
3170         cm_event.local_addr = cm_id->local_addr;
3171         cm_event.remote_addr = cm_id->remote_addr;
3172         cm_event.private_data = NULL;
3173         cm_event.private_data_len = 0;
3174
3175         nes_debug(NES_DBG_CM, "call CM_EVENT REJECTED, local_addr=%08x, "
3176                 "remove_addr=%08x\n", cm_event.local_addr.sin_addr.s_addr,
3177                 cm_event.remote_addr.sin_addr.s_addr);
3178
3179         ret = cm_id->event_handler(cm_id, &cm_event);
3180         nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);
3181         if (ret)
3182                 printk(KERN_ERR "%s[%u] OFA CM event_handler returned, "
3183                         "ret=%d\n", __func__, __LINE__, ret);
3184         cm_id->rem_ref(cm_id);
3185
3186         rem_ref_cm_node(event->cm_node->cm_core, event->cm_node);
3187         return;
3188 }
3189
3190
3191 /**
3192  * cm_event_reset
3193  */
3194 static void cm_event_reset(struct nes_cm_event *event)
3195 {
3196         struct nes_qp *nesqp;
3197         struct iw_cm_id *cm_id;
3198         struct iw_cm_event cm_event;
3199         /* struct nes_cm_info cm_info; */
3200         int ret;
3201
3202         if (!event->cm_node)
3203                 return;
3204
3205         if (!event->cm_node->cm_id)
3206                 return;
3207
3208         cm_id = event->cm_node->cm_id;
3209
3210         nes_debug(NES_DBG_CM, "%p - cm_id = %p\n", event->cm_node, cm_id);
3211         nesqp = cm_id->provider_data;
3212
3213         nesqp->cm_id = NULL;
3214         /* cm_id->provider_data = NULL; */
3215         cm_event.event = IW_CM_EVENT_DISCONNECT;
3216         cm_event.status = IW_CM_EVENT_STATUS_RESET;
3217         cm_event.provider_data = cm_id->provider_data;
3218         cm_event.local_addr = cm_id->local_addr;
3219         cm_event.remote_addr = cm_id->remote_addr;
3220         cm_event.private_data = NULL;
3221         cm_event.private_data_len = 0;
3222
3223         ret = cm_id->event_handler(cm_id, &cm_event);
3224         cm_id->add_ref(cm_id);
3225         atomic_inc(&cm_closes);
3226         cm_event.event = IW_CM_EVENT_CLOSE;
3227         cm_event.status = IW_CM_EVENT_STATUS_OK;
3228         cm_event.provider_data = cm_id->provider_data;
3229         cm_event.local_addr = cm_id->local_addr;
3230         cm_event.remote_addr = cm_id->remote_addr;
3231         cm_event.private_data = NULL;
3232         cm_event.private_data_len = 0;
3233         nes_debug(NES_DBG_CM, "NODE %p Generating CLOSE\n", event->cm_node);
3234         ret = cm_id->event_handler(cm_id, &cm_event);
3235
3236         nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret);
3237
3238
3239         /* notify OF layer about this connection error event */
3240         cm_id->rem_ref(cm_id);
3241
3242         return;
3243 }
3244
3245
3246 /**
3247  * cm_event_mpa_req
3248  */
3249 static void cm_event_mpa_req(struct nes_cm_event *event)
3250 {
3251         struct iw_cm_id   *cm_id;
3252         struct iw_cm_event cm_event;
3253         int ret;
3254         struct nes_cm_node *cm_node;
3255
3256         cm_node = event->cm_node;
3257         if (!cm_node)
3258                 return;
3259         cm_id = cm_node->cm_id;
3260
3261         atomic_inc(&cm_connect_reqs);
3262         nes_debug(NES_DBG_CM, "cm_node = %p - cm_id = %p, jiffies = %lu\n",
3263                         cm_node, cm_id, jiffies);
3264
3265         cm_event.event = IW_CM_EVENT_CONNECT_REQUEST;
3266         cm_event.status = IW_CM_EVENT_STATUS_OK;
3267         cm_event.provider_data = (void *)cm_node;
3268
3269         cm_event.local_addr.sin_family = AF_INET;
3270         cm_event.local_addr.sin_port = htons(event->cm_info.loc_port);
3271         cm_event.local_addr.sin_addr.s_addr = htonl(event->cm_info.loc_addr);
3272
3273         cm_event.remote_addr.sin_family = AF_INET;
3274         cm_event.remote_addr.sin_port = htons(event->cm_info.rem_port);
3275         cm_event.remote_addr.sin_addr.s_addr = htonl(event->cm_info.rem_addr);
3276
3277                 cm_event.private_data                = cm_node->mpa_frame_buf;
3278                 cm_event.private_data_len            = (u8) cm_node->mpa_frame_size;
3279
3280         ret = cm_id->event_handler(cm_id, &cm_event);
3281         if (ret)
3282                 printk("%s[%u] OFA CM event_handler returned, ret=%d\n",
3283                                 __func__, __LINE__, ret);
3284
3285         return;
3286 }
3287
3288
3289 static void nes_cm_event_handler(struct work_struct *);
3290
3291 /**
3292  * nes_cm_post_event
3293  * post an event to the cm event handler
3294  */
3295 static int nes_cm_post_event(struct nes_cm_event *event)
3296 {
3297         atomic_inc(&event->cm_node->cm_core->events_posted);
3298         add_ref_cm_node(event->cm_node);
3299         event->cm_info.cm_id->add_ref(event->cm_info.cm_id);
3300         INIT_WORK(&event->event_work, nes_cm_event_handler);
3301         nes_debug(NES_DBG_CM, "cm_node=%p queue_work, event=%p\n",
3302                 event->cm_node, event);
3303
3304         queue_work(event->cm_node->cm_core->event_wq, &event->event_work);
3305
3306         nes_debug(NES_DBG_CM, "Exit\n");
3307         return 0;
3308 }
3309
3310
3311 /**
3312  * nes_cm_event_handler
3313  * worker function to handle cm events
3314  * will free instance of nes_cm_event
3315  */
3316 static void nes_cm_event_handler(struct work_struct *work)
3317 {
3318         struct nes_cm_event *event = container_of(work, struct nes_cm_event,
3319                         event_work);
3320         struct nes_cm_core *cm_core;
3321
3322         if ((!event) || (!event->cm_node) || (!event->cm_node->cm_core))
3323                 return;
3324
3325         cm_core = event->cm_node->cm_core;
3326         nes_debug(NES_DBG_CM, "event=%p, event->type=%u, events posted=%u\n",
3327                 event, event->type, atomic_read(&cm_core->events_posted));
3328
3329         switch (event->type) {
3330         case NES_CM_EVENT_MPA_REQ:
3331                 cm_event_mpa_req(event);
3332                 nes_debug(NES_DBG_CM, "cm_node=%p CM Event: MPA REQUEST\n",
3333                         event->cm_node);
3334                 break;
3335         case NES_CM_EVENT_RESET:
3336                 nes_debug(NES_DBG_CM, "cm_node = %p CM Event: RESET\n",
3337                         event->cm_node);
3338                 cm_event_reset(event);
3339                 break;
3340         case NES_CM_EVENT_CONNECTED:
3341                 if ((!event->cm_node->cm_id) ||
3342                         (event->cm_node->state != NES_CM_STATE_TSA))
3343                         break;
3344                 cm_event_connected(event);
3345                 nes_debug(NES_DBG_CM, "CM Event: CONNECTED\n");
3346                 break;
3347         case NES_CM_EVENT_ABORTED:
3348                 if ((!event->cm_node->cm_id) ||
3349                         (event->cm_node->state == NES_CM_STATE_TSA))
3350                         break;
3351                 cm_event_connect_error(event);
3352                 nes_debug(NES_DBG_CM, "CM Event: ABORTED\n");
3353                 break;
3354         case NES_CM_EVENT_DROPPED_PKT:
3355                 nes_debug(NES_DBG_CM, "CM Event: DROPPED PKT\n");
3356                 break;
3357         default:
3358                 nes_debug(NES_DBG_CM, "CM Event: UNKNOWN EVENT TYPE\n");
3359                 break;
3360         }
3361
3362         atomic_dec(&cm_core->events_posted);
3363         event->cm_info.cm_id->rem_ref(event->cm_info.cm_id);
3364         rem_ref_cm_node(cm_core, event->cm_node);
3365         kfree(event);
3366
3367         return;
3368 }