1 /* bnx2fc_fcoe.c: Broadcom NetXtreme II Linux FCoE offload driver.
2  * This file contains the code that interacts with libfc, libfcoe,
3  * cnic modules to create FCoE instances, send/receive non-offloaded
4  * FIP/FCoE packets, listen to link events etc.
5  *
6  * Copyright (c) 2008 - 2011 Broadcom Corporation
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation.
11  *
12  * Written by: Bhanu Prakash Gollapudi (bprakash@broadcom.com)
13  */
14 
15 #include "bnx2fc.h"
16 
17 static struct list_head adapter_list;
18 static struct list_head if_list;
19 static u32 adapter_count;
20 static DEFINE_MUTEX(bnx2fc_dev_lock);
21 DEFINE_PER_CPU(struct bnx2fc_percpu_s, bnx2fc_percpu);
22 
23 #define DRV_MODULE_NAME		"bnx2fc"
24 #define DRV_MODULE_VERSION	BNX2FC_VERSION
25 #define DRV_MODULE_RELDATE	"Jun 23, 2011"
26 
27 
28 static char version[] __devinitdata =
29 		"Broadcom NetXtreme II FCoE Driver " DRV_MODULE_NAME \
30 		" v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
31 
32 
33 MODULE_AUTHOR("Bhanu Prakash Gollapudi <bprakash@broadcom.com>");
34 MODULE_DESCRIPTION("Broadcom NetXtreme II BCM57710 FCoE Driver");
35 MODULE_LICENSE("GPL");
36 MODULE_VERSION(DRV_MODULE_VERSION);
37 
38 #define BNX2FC_MAX_QUEUE_DEPTH	256
39 #define BNX2FC_MIN_QUEUE_DEPTH	32
40 #define FCOE_WORD_TO_BYTE  4
41 
42 static struct scsi_transport_template	*bnx2fc_transport_template;
43 static struct scsi_transport_template	*bnx2fc_vport_xport_template;
44 
45 struct workqueue_struct *bnx2fc_wq;
46 
47 /* bnx2fc structure needs only one instance of the fcoe_percpu_s structure.
48  * Here the io threads are per cpu but the l2 thread is just one
49  */
50 struct fcoe_percpu_s bnx2fc_global;
51 DEFINE_SPINLOCK(bnx2fc_global_lock);
52 
53 static struct cnic_ulp_ops bnx2fc_cnic_cb;
54 static struct libfc_function_template bnx2fc_libfc_fcn_templ;
55 static struct scsi_host_template bnx2fc_shost_template;
56 static struct fc_function_template bnx2fc_transport_function;
57 static struct fc_function_template bnx2fc_vport_xport_function;
58 static int bnx2fc_create(struct net_device *netdev, enum fip_state fip_mode);
59 static int bnx2fc_destroy(struct net_device *net_device);
60 static int bnx2fc_enable(struct net_device *netdev);
61 static int bnx2fc_disable(struct net_device *netdev);
62 
63 static void bnx2fc_recv_frame(struct sk_buff *skb);
64 
65 static void bnx2fc_start_disc(struct bnx2fc_interface *interface);
66 static int bnx2fc_shost_config(struct fc_lport *lport, struct device *dev);
67 static int bnx2fc_net_config(struct fc_lport *lp);
68 static int bnx2fc_lport_config(struct fc_lport *lport);
69 static int bnx2fc_em_config(struct fc_lport *lport);
70 static int bnx2fc_bind_adapter_devices(struct bnx2fc_hba *hba);
71 static void bnx2fc_unbind_adapter_devices(struct bnx2fc_hba *hba);
72 static int bnx2fc_bind_pcidev(struct bnx2fc_hba *hba);
73 static void bnx2fc_unbind_pcidev(struct bnx2fc_hba *hba);
74 static struct fc_lport *bnx2fc_if_create(struct bnx2fc_interface *interface,
75 				  struct device *parent, int npiv);
76 static void bnx2fc_destroy_work(struct work_struct *work);
77 
78 static struct bnx2fc_hba *bnx2fc_hba_lookup(struct net_device *phys_dev);
79 static struct bnx2fc_interface *bnx2fc_interface_lookup(struct net_device
80 							*phys_dev);
81 static struct bnx2fc_hba *bnx2fc_find_hba_for_cnic(struct cnic_dev *cnic);
82 
83 static int bnx2fc_fw_init(struct bnx2fc_hba *hba);
84 static void bnx2fc_fw_destroy(struct bnx2fc_hba *hba);
85 
86 static void bnx2fc_port_shutdown(struct fc_lport *lport);
87 static void bnx2fc_stop(struct bnx2fc_interface *interface);
88 static int __init bnx2fc_mod_init(void);
89 static void __exit bnx2fc_mod_exit(void);
90 
91 unsigned int bnx2fc_debug_level;
92 module_param_named(debug_logging, bnx2fc_debug_level, int, S_IRUGO|S_IWUSR);
93 
94 static int bnx2fc_cpu_callback(struct notifier_block *nfb,
95 			     unsigned long action, void *hcpu);
96 /* notification function for CPU hotplug events */
97 static struct notifier_block bnx2fc_cpu_notifier = {
98 	.notifier_call = bnx2fc_cpu_callback,
99 };
100 
101 static void bnx2fc_clean_rx_queue(struct fc_lport *lp)
102 {
103 	struct fcoe_percpu_s *bg;
104 	struct fcoe_rcv_info *fr;
105 	struct sk_buff_head *list;
106 	struct sk_buff *skb, *next;
107 	struct sk_buff *head;
108 
109 	bg = &bnx2fc_global;
110 	spin_lock_bh(&bg->fcoe_rx_list.lock);
111 	list = &bg->fcoe_rx_list;
112 	head = list->next;
113 	for (skb = head; skb != (struct sk_buff *)list;
114 	     skb = next) {
115 		next = skb->next;
116 		fr = fcoe_dev_from_skb(skb);
117 		if (fr->fr_dev == lp) {
118 			__skb_unlink(skb, list);
119 			kfree_skb(skb);
120 		}
121 	}
122 	spin_unlock_bh(&bg->fcoe_rx_list.lock);
123 }
124 
125 int bnx2fc_get_paged_crc_eof(struct sk_buff *skb, int tlen)
126 {
127 	int rc;
128 	spin_lock(&bnx2fc_global_lock);
129 	rc = fcoe_get_paged_crc_eof(skb, tlen, &bnx2fc_global);
130 	spin_unlock(&bnx2fc_global_lock);
131 
132 	return rc;
133 }
134 
135 static void bnx2fc_abort_io(struct fc_lport *lport)
136 {
137 	/*
138 	 * This function is no-op for bnx2fc, but we do
139 	 * not want to leave it as NULL either, as libfc
140 	 * can call the default function which is
141 	 * fc_fcp_abort_io.
142 	 */
143 }
144 
145 static void bnx2fc_cleanup(struct fc_lport *lport)
146 {
147 	struct fcoe_port *port = lport_priv(lport);
148 	struct bnx2fc_interface *interface = port->priv;
149 	struct bnx2fc_hba *hba = interface->hba;
150 	struct bnx2fc_rport *tgt;
151 	int i;
152 
153 	BNX2FC_MISC_DBG("Entered %s\n", __func__);
154 	mutex_lock(&hba->hba_mutex);
155 	spin_lock_bh(&hba->hba_lock);
156 	for (i = 0; i < BNX2FC_NUM_MAX_SESS; i++) {
157 		tgt = hba->tgt_ofld_list[i];
158 		if (tgt) {
159 			/* Cleanup IOs belonging to requested vport */
160 			if (tgt->port == port) {
161 				spin_unlock_bh(&hba->hba_lock);
162 				BNX2FC_TGT_DBG(tgt, "flush/cleanup\n");
163 				bnx2fc_flush_active_ios(tgt);
164 				spin_lock_bh(&hba->hba_lock);
165 			}
166 		}
167 	}
168 	spin_unlock_bh(&hba->hba_lock);
169 	mutex_unlock(&hba->hba_mutex);
170 }
171 
172 static int bnx2fc_xmit_l2_frame(struct bnx2fc_rport *tgt,
173 			     struct fc_frame *fp)
174 {
175 	struct fc_rport_priv *rdata = tgt->rdata;
176 	struct fc_frame_header *fh;
177 	int rc = 0;
178 
179 	fh = fc_frame_header_get(fp);
180 	BNX2FC_TGT_DBG(tgt, "Xmit L2 frame rport = 0x%x, oxid = 0x%x, "
181 			"r_ctl = 0x%x\n", rdata->ids.port_id,
182 			ntohs(fh->fh_ox_id), fh->fh_r_ctl);
183 	if ((fh->fh_type == FC_TYPE_ELS) &&
184 	    (fh->fh_r_ctl == FC_RCTL_ELS_REQ)) {
185 
186 		switch (fc_frame_payload_op(fp)) {
187 		case ELS_ADISC:
188 			rc = bnx2fc_send_adisc(tgt, fp);
189 			break;
190 		case ELS_LOGO:
191 			rc = bnx2fc_send_logo(tgt, fp);
192 			break;
193 		case ELS_RLS:
194 			rc = bnx2fc_send_rls(tgt, fp);
195 			break;
196 		default:
197 			break;
198 		}
199 	} else if ((fh->fh_type ==  FC_TYPE_BLS) &&
200 	    (fh->fh_r_ctl == FC_RCTL_BA_ABTS))
201 		BNX2FC_TGT_DBG(tgt, "ABTS frame\n");
202 	else {
203 		BNX2FC_TGT_DBG(tgt, "Send L2 frame type 0x%x "
204 				"rctl 0x%x thru non-offload path\n",
205 				fh->fh_type, fh->fh_r_ctl);
206 		return -ENODEV;
207 	}
208 	if (rc)
209 		return -ENOMEM;
210 	else
211 		return 0;
212 }
213 
214 /**
215  * bnx2fc_xmit - bnx2fc's FCoE frame transmit function
216  *
217  * @lport:	the associated local port
218  * @fp:	the fc_frame to be transmitted
219  */
220 static int bnx2fc_xmit(struct fc_lport *lport, struct fc_frame *fp)
221 {
222 	struct ethhdr		*eh;
223 	struct fcoe_crc_eof	*cp;
224 	struct sk_buff		*skb;
225 	struct fc_frame_header	*fh;
226 	struct bnx2fc_interface	*interface;
227 	struct bnx2fc_hba *hba;
228 	struct fcoe_port	*port;
229 	struct fcoe_hdr		*hp;
230 	struct bnx2fc_rport	*tgt;
231 	struct fcoe_dev_stats	*stats;
232 	u8			sof, eof;
233 	u32			crc;
234 	unsigned int		hlen, tlen, elen;
235 	int			wlen, rc = 0;
236 
237 	port = (struct fcoe_port *)lport_priv(lport);
238 	interface = port->priv;
239 	hba = interface->hba;
240 
241 	fh = fc_frame_header_get(fp);
242 
243 	skb = fp_skb(fp);
244 	if (!lport->link_up) {
245 		BNX2FC_HBA_DBG(lport, "bnx2fc_xmit link down\n");
246 		kfree_skb(skb);
247 		return 0;
248 	}
249 
250 	if (unlikely(fh->fh_r_ctl == FC_RCTL_ELS_REQ)) {
251 		if (!interface->ctlr.sel_fcf) {
252 			BNX2FC_HBA_DBG(lport, "FCF not selected yet!\n");
253 			kfree_skb(skb);
254 			return -EINVAL;
255 		}
256 		if (fcoe_ctlr_els_send(&interface->ctlr, lport, skb))
257 			return 0;
258 	}
259 
260 	sof = fr_sof(fp);
261 	eof = fr_eof(fp);
262 
263 	/*
264 	 * Snoop the frame header to check if the frame is for
265 	 * an offloaded session
266 	 */
267 	/*
268 	 * tgt_ofld_list access is synchronized using
269 	 * both hba mutex and hba lock. Atleast hba mutex or
270 	 * hba lock needs to be held for read access.
271 	 */
272 
273 	spin_lock_bh(&hba->hba_lock);
274 	tgt = bnx2fc_tgt_lookup(port, ntoh24(fh->fh_d_id));
275 	if (tgt && (test_bit(BNX2FC_FLAG_SESSION_READY, &tgt->flags))) {
276 		/* This frame is for offloaded session */
277 		BNX2FC_HBA_DBG(lport, "xmit: Frame is for offloaded session "
278 				"port_id = 0x%x\n", ntoh24(fh->fh_d_id));
279 		spin_unlock_bh(&hba->hba_lock);
280 		rc = bnx2fc_xmit_l2_frame(tgt, fp);
281 		if (rc != -ENODEV) {
282 			kfree_skb(skb);
283 			return rc;
284 		}
285 	} else {
286 		spin_unlock_bh(&hba->hba_lock);
287 	}
288 
289 	elen = sizeof(struct ethhdr);
290 	hlen = sizeof(struct fcoe_hdr);
291 	tlen = sizeof(struct fcoe_crc_eof);
292 	wlen = (skb->len - tlen + sizeof(crc)) / FCOE_WORD_TO_BYTE;
293 
294 	skb->ip_summed = CHECKSUM_NONE;
295 	crc = fcoe_fc_crc(fp);
296 
297 	/* copy port crc and eof to the skb buff */
298 	if (skb_is_nonlinear(skb)) {
299 		skb_frag_t *frag;
300 		if (bnx2fc_get_paged_crc_eof(skb, tlen)) {
301 			kfree_skb(skb);
302 			return -ENOMEM;
303 		}
304 		frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1];
305 		cp = kmap_atomic(frag->page, KM_SKB_DATA_SOFTIRQ)
306 				+ frag->page_offset;
307 	} else {
308 		cp = (struct fcoe_crc_eof *)skb_put(skb, tlen);
309 	}
310 
311 	memset(cp, 0, sizeof(*cp));
312 	cp->fcoe_eof = eof;
313 	cp->fcoe_crc32 = cpu_to_le32(~crc);
314 	if (skb_is_nonlinear(skb)) {
315 		kunmap_atomic(cp, KM_SKB_DATA_SOFTIRQ);
316 		cp = NULL;
317 	}
318 
319 	/* adjust skb network/transport offsets to match mac/fcoe/port */
320 	skb_push(skb, elen + hlen);
321 	skb_reset_mac_header(skb);
322 	skb_reset_network_header(skb);
323 	skb->mac_len = elen;
324 	skb->protocol = htons(ETH_P_FCOE);
325 	skb->dev = interface->netdev;
326 
327 	/* fill up mac and fcoe headers */
328 	eh = eth_hdr(skb);
329 	eh->h_proto = htons(ETH_P_FCOE);
330 	if (interface->ctlr.map_dest)
331 		fc_fcoe_set_mac(eh->h_dest, fh->fh_d_id);
332 	else
333 		/* insert GW address */
334 		memcpy(eh->h_dest, interface->ctlr.dest_addr, ETH_ALEN);
335 
336 	if (unlikely(interface->ctlr.flogi_oxid != FC_XID_UNKNOWN))
337 		memcpy(eh->h_source, interface->ctlr.ctl_src_addr, ETH_ALEN);
338 	else
339 		memcpy(eh->h_source, port->data_src_addr, ETH_ALEN);
340 
341 	hp = (struct fcoe_hdr *)(eh + 1);
342 	memset(hp, 0, sizeof(*hp));
343 	if (FC_FCOE_VER)
344 		FC_FCOE_ENCAPS_VER(hp, FC_FCOE_VER);
345 	hp->fcoe_sof = sof;
346 
347 	/* fcoe lso, mss is in max_payload which is non-zero for FCP data */
348 	if (lport->seq_offload && fr_max_payload(fp)) {
349 		skb_shinfo(skb)->gso_type = SKB_GSO_FCOE;
350 		skb_shinfo(skb)->gso_size = fr_max_payload(fp);
351 	} else {
352 		skb_shinfo(skb)->gso_type = 0;
353 		skb_shinfo(skb)->gso_size = 0;
354 	}
355 
356 	/*update tx stats */
357 	stats = per_cpu_ptr(lport->dev_stats, get_cpu());
358 	stats->TxFrames++;
359 	stats->TxWords += wlen;
360 	put_cpu();
361 
362 	/* send down to lld */
363 	fr_dev(fp) = lport;
364 	if (port->fcoe_pending_queue.qlen)
365 		fcoe_check_wait_queue(lport, skb);
366 	else if (fcoe_start_io(skb))
367 		fcoe_check_wait_queue(lport, skb);
368 
369 	return 0;
370 }
371 
372 /**
373  * bnx2fc_rcv - This is bnx2fc's receive function called by NET_RX_SOFTIRQ
374  *
375  * @skb:	the receive socket buffer
376  * @dev:	associated net device
377  * @ptype:	context
378  * @olddev:	last device
379  *
380  * This function receives the packet and builds FC frame and passes it up
381  */
382 static int bnx2fc_rcv(struct sk_buff *skb, struct net_device *dev,
383 		struct packet_type *ptype, struct net_device *olddev)
384 {
385 	struct fc_lport *lport;
386 	struct bnx2fc_interface *interface;
387 	struct fc_frame_header *fh;
388 	struct fcoe_rcv_info *fr;
389 	struct fcoe_percpu_s *bg;
390 	unsigned short oxid;
391 
392 	interface = container_of(ptype, struct bnx2fc_interface,
393 				 fcoe_packet_type);
394 	lport = interface->ctlr.lp;
395 
396 	if (unlikely(lport == NULL)) {
397 		printk(KERN_ERR PFX "bnx2fc_rcv: lport is NULL\n");
398 		goto err;
399 	}
400 
401 	if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) {
402 		printk(KERN_ERR PFX "bnx2fc_rcv: Wrong FC type frame\n");
403 		goto err;
404 	}
405 
406 	/*
407 	 * Check for minimum frame length, and make sure required FCoE
408 	 * and FC headers are pulled into the linear data area.
409 	 */
410 	if (unlikely((skb->len < FCOE_MIN_FRAME) ||
411 	    !pskb_may_pull(skb, FCOE_HEADER_LEN)))
412 		goto err;
413 
414 	skb_set_transport_header(skb, sizeof(struct fcoe_hdr));
415 	fh = (struct fc_frame_header *) skb_transport_header(skb);
416 
417 	oxid = ntohs(fh->fh_ox_id);
418 
419 	fr = fcoe_dev_from_skb(skb);
420 	fr->fr_dev = lport;
421 
422 	bg = &bnx2fc_global;
423 	spin_lock_bh(&bg->fcoe_rx_list.lock);
424 
425 	__skb_queue_tail(&bg->fcoe_rx_list, skb);
426 	if (bg->fcoe_rx_list.qlen == 1)
427 		wake_up_process(bg->thread);
428 
429 	spin_unlock_bh(&bg->fcoe_rx_list.lock);
430 
431 	return 0;
432 err:
433 	kfree_skb(skb);
434 	return -1;
435 }
436 
437 static int bnx2fc_l2_rcv_thread(void *arg)
438 {
439 	struct fcoe_percpu_s *bg = arg;
440 	struct sk_buff *skb;
441 
442 	set_user_nice(current, -20);
443 	set_current_state(TASK_INTERRUPTIBLE);
444 	while (!kthread_should_stop()) {
445 		schedule();
446 		spin_lock_bh(&bg->fcoe_rx_list.lock);
447 		while ((skb = __skb_dequeue(&bg->fcoe_rx_list)) != NULL) {
448 			spin_unlock_bh(&bg->fcoe_rx_list.lock);
449 			bnx2fc_recv_frame(skb);
450 			spin_lock_bh(&bg->fcoe_rx_list.lock);
451 		}
452 		__set_current_state(TASK_INTERRUPTIBLE);
453 		spin_unlock_bh(&bg->fcoe_rx_list.lock);
454 	}
455 	__set_current_state(TASK_RUNNING);
456 	return 0;
457 }
458 
459 
460 static void bnx2fc_recv_frame(struct sk_buff *skb)
461 {
462 	u32 fr_len;
463 	struct fc_lport *lport;
464 	struct fcoe_rcv_info *fr;
465 	struct fcoe_dev_stats *stats;
466 	struct fc_frame_header *fh;
467 	struct fcoe_crc_eof crc_eof;
468 	struct fc_frame *fp;
469 	struct fc_lport *vn_port;
470 	struct fcoe_port *port;
471 	u8 *mac = NULL;
472 	u8 *dest_mac = NULL;
473 	struct fcoe_hdr *hp;
474 
475 	fr = fcoe_dev_from_skb(skb);
476 	lport = fr->fr_dev;
477 	if (unlikely(lport == NULL)) {
478 		printk(KERN_ERR PFX "Invalid lport struct\n");
479 		kfree_skb(skb);
480 		return;
481 	}
482 
483 	if (skb_is_nonlinear(skb))
484 		skb_linearize(skb);
485 	mac = eth_hdr(skb)->h_source;
486 	dest_mac = eth_hdr(skb)->h_dest;
487 
488 	/* Pull the header */
489 	hp = (struct fcoe_hdr *) skb_network_header(skb);
490 	fh = (struct fc_frame_header *) skb_transport_header(skb);
491 	skb_pull(skb, sizeof(struct fcoe_hdr));
492 	fr_len = skb->len - sizeof(struct fcoe_crc_eof);
493 
494 	stats = per_cpu_ptr(lport->dev_stats, get_cpu());
495 	stats->RxFrames++;
496 	stats->RxWords += fr_len / FCOE_WORD_TO_BYTE;
497 
498 	fp = (struct fc_frame *)skb;
499 	fc_frame_init(fp);
500 	fr_dev(fp) = lport;
501 	fr_sof(fp) = hp->fcoe_sof;
502 	if (skb_copy_bits(skb, fr_len, &crc_eof, sizeof(crc_eof))) {
503 		put_cpu();
504 		kfree_skb(skb);
505 		return;
506 	}
507 	fr_eof(fp) = crc_eof.fcoe_eof;
508 	fr_crc(fp) = crc_eof.fcoe_crc32;
509 	if (pskb_trim(skb, fr_len)) {
510 		put_cpu();
511 		kfree_skb(skb);
512 		return;
513 	}
514 
515 	fh = fc_frame_header_get(fp);
516 
517 	vn_port = fc_vport_id_lookup(lport, ntoh24(fh->fh_d_id));
518 	if (vn_port) {
519 		port = lport_priv(vn_port);
520 		if (compare_ether_addr(port->data_src_addr, dest_mac)
521 		    != 0) {
522 			BNX2FC_HBA_DBG(lport, "fpma mismatch\n");
523 			put_cpu();
524 			kfree_skb(skb);
525 			return;
526 		}
527 	}
528 	if (fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA &&
529 	    fh->fh_type == FC_TYPE_FCP) {
530 		/* Drop FCP data. We dont this in L2 path */
531 		put_cpu();
532 		kfree_skb(skb);
533 		return;
534 	}
535 	if (fh->fh_r_ctl == FC_RCTL_ELS_REQ &&
536 	    fh->fh_type == FC_TYPE_ELS) {
537 		switch (fc_frame_payload_op(fp)) {
538 		case ELS_LOGO:
539 			if (ntoh24(fh->fh_s_id) == FC_FID_FLOGI) {
540 				/* drop non-FIP LOGO */
541 				put_cpu();
542 				kfree_skb(skb);
543 				return;
544 			}
545 			break;
546 		}
547 	}
548 	if (le32_to_cpu(fr_crc(fp)) !=
549 			~crc32(~0, skb->data, fr_len)) {
550 		if (stats->InvalidCRCCount < 5)
551 			printk(KERN_WARNING PFX "dropping frame with "
552 			       "CRC error\n");
553 		stats->InvalidCRCCount++;
554 		put_cpu();
555 		kfree_skb(skb);
556 		return;
557 	}
558 	put_cpu();
559 	fc_exch_recv(lport, fp);
560 }
561 
562 /**
563  * bnx2fc_percpu_io_thread - thread per cpu for ios
564  *
565  * @arg:	ptr to bnx2fc_percpu_info structure
566  */
567 int bnx2fc_percpu_io_thread(void *arg)
568 {
569 	struct bnx2fc_percpu_s *p = arg;
570 	struct bnx2fc_work *work, *tmp;
571 	LIST_HEAD(work_list);
572 
573 	set_user_nice(current, -20);
574 	set_current_state(TASK_INTERRUPTIBLE);
575 	while (!kthread_should_stop()) {
576 		schedule();
577 		spin_lock_bh(&p->fp_work_lock);
578 		while (!list_empty(&p->work_list)) {
579 			list_splice_init(&p->work_list, &work_list);
580 			spin_unlock_bh(&p->fp_work_lock);
581 
582 			list_for_each_entry_safe(work, tmp, &work_list, list) {
583 				list_del_init(&work->list);
584 				bnx2fc_process_cq_compl(work->tgt, work->wqe);
585 				kfree(work);
586 			}
587 
588 			spin_lock_bh(&p->fp_work_lock);
589 		}
590 		__set_current_state(TASK_INTERRUPTIBLE);
591 		spin_unlock_bh(&p->fp_work_lock);
592 	}
593 	__set_current_state(TASK_RUNNING);
594 
595 	return 0;
596 }
597 
598 static struct fc_host_statistics *bnx2fc_get_host_stats(struct Scsi_Host *shost)
599 {
600 	struct fc_host_statistics *bnx2fc_stats;
601 	struct fc_lport *lport = shost_priv(shost);
602 	struct fcoe_port *port = lport_priv(lport);
603 	struct bnx2fc_interface *interface = port->priv;
604 	struct bnx2fc_hba *hba = interface->hba;
605 	struct fcoe_statistics_params *fw_stats;
606 	int rc = 0;
607 
608 	fw_stats = (struct fcoe_statistics_params *)hba->stats_buffer;
609 	if (!fw_stats)
610 		return NULL;
611 
612 	bnx2fc_stats = fc_get_host_stats(shost);
613 
614 	init_completion(&hba->stat_req_done);
615 	if (bnx2fc_send_stat_req(hba))
616 		return bnx2fc_stats;
617 	rc = wait_for_completion_timeout(&hba->stat_req_done, (2 * HZ));
618 	if (!rc) {
619 		BNX2FC_HBA_DBG(lport, "FW stat req timed out\n");
620 		return bnx2fc_stats;
621 	}
622 	bnx2fc_stats->invalid_crc_count += fw_stats->rx_stat2.fc_crc_cnt;
623 	bnx2fc_stats->tx_frames += fw_stats->tx_stat.fcoe_tx_pkt_cnt;
624 	bnx2fc_stats->tx_words += (fw_stats->tx_stat.fcoe_tx_byte_cnt) / 4;
625 	bnx2fc_stats->rx_frames += fw_stats->rx_stat0.fcoe_rx_pkt_cnt;
626 	bnx2fc_stats->rx_words += (fw_stats->rx_stat0.fcoe_rx_byte_cnt) / 4;
627 
628 	bnx2fc_stats->dumped_frames = 0;
629 	bnx2fc_stats->lip_count = 0;
630 	bnx2fc_stats->nos_count = 0;
631 	bnx2fc_stats->loss_of_sync_count = 0;
632 	bnx2fc_stats->loss_of_signal_count = 0;
633 	bnx2fc_stats->prim_seq_protocol_err_count = 0;
634 
635 	return bnx2fc_stats;
636 }
637 
638 static int bnx2fc_shost_config(struct fc_lport *lport, struct device *dev)
639 {
640 	struct fcoe_port *port = lport_priv(lport);
641 	struct bnx2fc_interface *interface = port->priv;
642 	struct Scsi_Host *shost = lport->host;
643 	int rc = 0;
644 
645 	shost->max_cmd_len = BNX2FC_MAX_CMD_LEN;
646 	shost->max_lun = BNX2FC_MAX_LUN;
647 	shost->max_id = BNX2FC_MAX_FCP_TGT;
648 	shost->max_channel = 0;
649 	if (lport->vport)
650 		shost->transportt = bnx2fc_vport_xport_template;
651 	else
652 		shost->transportt = bnx2fc_transport_template;
653 
654 	/* Add the new host to SCSI-ml */
655 	rc = scsi_add_host(lport->host, dev);
656 	if (rc) {
657 		printk(KERN_ERR PFX "Error on scsi_add_host\n");
658 		return rc;
659 	}
660 	if (!lport->vport)
661 		fc_host_max_npiv_vports(lport->host) = USHRT_MAX;
662 	sprintf(fc_host_symbolic_name(lport->host), "%s v%s over %s",
663 		BNX2FC_NAME, BNX2FC_VERSION,
664 		interface->netdev->name);
665 
666 	return 0;
667 }
668 
669 static void bnx2fc_link_speed_update(struct fc_lport *lport)
670 {
671 	struct fcoe_port *port = lport_priv(lport);
672 	struct bnx2fc_interface *interface = port->priv;
673 	struct net_device *netdev = interface->netdev;
674 	struct ethtool_cmd ecmd;
675 
676 	if (!dev_ethtool_get_settings(netdev, &ecmd)) {
677 		lport->link_supported_speeds &=
678 			~(FC_PORTSPEED_1GBIT | FC_PORTSPEED_10GBIT);
679 		if (ecmd.supported & (SUPPORTED_1000baseT_Half |
680 				      SUPPORTED_1000baseT_Full))
681 			lport->link_supported_speeds |= FC_PORTSPEED_1GBIT;
682 		if (ecmd.supported & SUPPORTED_10000baseT_Full)
683 			lport->link_supported_speeds |= FC_PORTSPEED_10GBIT;
684 
685 		switch (ethtool_cmd_speed(&ecmd)) {
686 		case SPEED_1000:
687 			lport->link_speed = FC_PORTSPEED_1GBIT;
688 			break;
689 		case SPEED_2500:
690 			lport->link_speed = FC_PORTSPEED_2GBIT;
691 			break;
692 		case SPEED_10000:
693 			lport->link_speed = FC_PORTSPEED_10GBIT;
694 			break;
695 		}
696 	}
697 }
698 static int bnx2fc_link_ok(struct fc_lport *lport)
699 {
700 	struct fcoe_port *port = lport_priv(lport);
701 	struct bnx2fc_interface *interface = port->priv;
702 	struct bnx2fc_hba *hba = interface->hba;
703 	struct net_device *dev = hba->phys_dev;
704 	int rc = 0;
705 
706 	if ((dev->flags & IFF_UP) && netif_carrier_ok(dev))
707 		clear_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state);
708 	else {
709 		set_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state);
710 		rc = -1;
711 	}
712 	return rc;
713 }
714 
715 /**
716  * bnx2fc_get_link_state - get network link state
717  *
718  * @hba:	adapter instance pointer
719  *
720  * updates adapter structure flag based on netdev state
721  */
722 void bnx2fc_get_link_state(struct bnx2fc_hba *hba)
723 {
724 	if (test_bit(__LINK_STATE_NOCARRIER, &hba->phys_dev->state))
725 		set_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state);
726 	else
727 		clear_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state);
728 }
729 
730 static int bnx2fc_net_config(struct fc_lport *lport)
731 {
732 	struct bnx2fc_hba *hba;
733 	struct bnx2fc_interface *interface;
734 	struct fcoe_port *port;
735 	u64 wwnn, wwpn;
736 
737 	port = lport_priv(lport);
738 	interface = port->priv;
739 	hba = interface->hba;
740 
741 	/* require support for get_pauseparam ethtool op. */
742 	if (!hba->phys_dev->ethtool_ops ||
743 	    !hba->phys_dev->ethtool_ops->get_pauseparam)
744 		return -EOPNOTSUPP;
745 
746 	if (fc_set_mfs(lport, BNX2FC_MFS))
747 		return -EINVAL;
748 
749 	skb_queue_head_init(&port->fcoe_pending_queue);
750 	port->fcoe_pending_queue_active = 0;
751 	setup_timer(&port->timer, fcoe_queue_timer, (unsigned long) lport);
752 
753 	bnx2fc_link_speed_update(lport);
754 
755 	if (!lport->vport) {
756 		wwnn = fcoe_wwn_from_mac(interface->ctlr.ctl_src_addr, 1, 0);
757 		BNX2FC_HBA_DBG(lport, "WWNN = 0x%llx\n", wwnn);
758 		fc_set_wwnn(lport, wwnn);
759 
760 		wwpn = fcoe_wwn_from_mac(interface->ctlr.ctl_src_addr, 2, 0);
761 		BNX2FC_HBA_DBG(lport, "WWPN = 0x%llx\n", wwpn);
762 		fc_set_wwpn(lport, wwpn);
763 	}
764 
765 	return 0;
766 }
767 
768 static void bnx2fc_destroy_timer(unsigned long data)
769 {
770 	struct bnx2fc_hba *hba = (struct bnx2fc_hba *)data;
771 
772 	BNX2FC_MISC_DBG("ERROR:bnx2fc_destroy_timer - "
773 		   "Destroy compl not received!!\n");
774 	set_bit(BNX2FC_FLAG_DESTROY_CMPL, &hba->flags);
775 	wake_up_interruptible(&hba->destroy_wait);
776 }
777 
778 /**
779  * bnx2fc_indicate_netevent - Generic netdev event handler
780  *
781  * @context:	adapter structure pointer
782  * @event:	event type
783  * @vlan_id:	vlan id - associated vlan id with this event
784  *
785  * Handles NETDEV_UP, NETDEV_DOWN, NETDEV_GOING_DOWN,NETDEV_CHANGE and
786  * NETDEV_CHANGE_MTU events
787  */
788 static void bnx2fc_indicate_netevent(void *context, unsigned long event,
789 				     u16 vlan_id)
790 {
791 	struct bnx2fc_hba *hba = (struct bnx2fc_hba *)context;
792 	struct fc_lport *lport;
793 	struct fc_lport *vport;
794 	struct bnx2fc_interface *interface;
795 	int wait_for_upload = 0;
796 	u32 link_possible = 1;
797 
798 	/* Ignore vlans for now */
799 	if (vlan_id != 0)
800 		return;
801 
802 	switch (event) {
803 	case NETDEV_UP:
804 		if (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state))
805 			printk(KERN_ERR "indicate_netevent: "\
806 					"hba is not UP!!\n");
807 		break;
808 
809 	case NETDEV_DOWN:
810 		clear_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state);
811 		clear_bit(ADAPTER_STATE_UP, &hba->adapter_state);
812 		link_possible = 0;
813 		break;
814 
815 	case NETDEV_GOING_DOWN:
816 		set_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state);
817 		link_possible = 0;
818 		break;
819 
820 	case NETDEV_CHANGE:
821 		break;
822 
823 	default:
824 		printk(KERN_ERR PFX "Unkonwn netevent %ld", event);
825 		return;
826 	}
827 
828 	mutex_lock(&bnx2fc_dev_lock);
829 	list_for_each_entry(interface, &if_list, list) {
830 
831 		if (interface->hba != hba)
832 			continue;
833 
834 		lport = interface->ctlr.lp;
835 		BNX2FC_HBA_DBG(lport, "netevent handler - event=%s %ld\n",
836 				interface->netdev->name, event);
837 
838 		bnx2fc_link_speed_update(lport);
839 
840 		if (link_possible && !bnx2fc_link_ok(lport)) {
841 			printk(KERN_ERR "indicate_netevent: ctlr_link_up\n");
842 			fcoe_ctlr_link_up(&interface->ctlr);
843 		} else if (fcoe_ctlr_link_down(&interface->ctlr)) {
844 			mutex_lock(&lport->lp_mutex);
845 			list_for_each_entry(vport, &lport->vports, list)
846 				fc_host_port_type(vport->host) =
847 							FC_PORTTYPE_UNKNOWN;
848 			mutex_unlock(&lport->lp_mutex);
849 			fc_host_port_type(lport->host) = FC_PORTTYPE_UNKNOWN;
850 			per_cpu_ptr(lport->dev_stats,
851 				    get_cpu())->LinkFailureCount++;
852 			put_cpu();
853 			fcoe_clean_pending_queue(lport);
854 			wait_for_upload = 1;
855 		}
856 	}
857 	mutex_unlock(&bnx2fc_dev_lock);
858 
859 	if (wait_for_upload) {
860 		clear_bit(ADAPTER_STATE_READY, &hba->adapter_state);
861 		init_waitqueue_head(&hba->shutdown_wait);
862 		BNX2FC_MISC_DBG("indicate_netevent "
863 				"num_ofld_sess = %d\n",
864 				hba->num_ofld_sess);
865 		hba->wait_for_link_down = 1;
866 		wait_event_interruptible(hba->shutdown_wait,
867 					 (hba->num_ofld_sess == 0));
868 		BNX2FC_MISC_DBG("wakeup - num_ofld_sess = %d\n",
869 				hba->num_ofld_sess);
870 		hba->wait_for_link_down = 0;
871 
872 		if (signal_pending(current))
873 			flush_signals(current);
874 	}
875 }
876 
877 static int bnx2fc_libfc_config(struct fc_lport *lport)
878 {
879 
880 	/* Set the function pointers set by bnx2fc driver */
881 	memcpy(&lport->tt, &bnx2fc_libfc_fcn_templ,
882 		sizeof(struct libfc_function_template));
883 	fc_elsct_init(lport);
884 	fc_exch_init(lport);
885 	fc_rport_init(lport);
886 	fc_disc_init(lport);
887 	return 0;
888 }
889 
890 static int bnx2fc_em_config(struct fc_lport *lport)
891 {
892 	if (!fc_exch_mgr_alloc(lport, FC_CLASS_3, FCOE_MIN_XID,
893 				FCOE_MAX_XID, NULL)) {
894 		printk(KERN_ERR PFX "em_config:fc_exch_mgr_alloc failed\n");
895 		return -ENOMEM;
896 	}
897 
898 	return 0;
899 }
900 
901 static int bnx2fc_lport_config(struct fc_lport *lport)
902 {
903 	lport->link_up = 0;
904 	lport->qfull = 0;
905 	lport->max_retry_count = 3;
906 	lport->max_rport_retry_count = 3;
907 	lport->e_d_tov = 2 * 1000;
908 	lport->r_a_tov = 10 * 1000;
909 
910 	lport->service_params = (FCP_SPPF_INIT_FCN | FCP_SPPF_RD_XRDY_DIS |
911 				FCP_SPPF_RETRY | FCP_SPPF_CONF_COMPL);
912 	lport->does_npiv = 1;
913 
914 	memset(&lport->rnid_gen, 0, sizeof(struct fc_els_rnid_gen));
915 	lport->rnid_gen.rnid_atype = BNX2FC_RNID_HBA;
916 
917 	/* alloc stats structure */
918 	if (fc_lport_init_stats(lport))
919 		return -ENOMEM;
920 
921 	/* Finish fc_lport configuration */
922 	fc_lport_config(lport);
923 
924 	return 0;
925 }
926 
927 /**
928  * bnx2fc_fip_recv - handle a received FIP frame.
929  *
930  * @skb: the received skb
931  * @dev: associated &net_device
932  * @ptype: the &packet_type structure which was used to register this handler.
933  * @orig_dev: original receive &net_device, in case @ dev is a bond.
934  *
935  * Returns: 0 for success
936  */
937 static int bnx2fc_fip_recv(struct sk_buff *skb, struct net_device *dev,
938 			   struct packet_type *ptype,
939 			   struct net_device *orig_dev)
940 {
941 	struct bnx2fc_interface *interface;
942 	interface = container_of(ptype, struct bnx2fc_interface,
943 				 fip_packet_type);
944 	fcoe_ctlr_recv(&interface->ctlr, skb);
945 	return 0;
946 }
947 
948 /**
949  * bnx2fc_update_src_mac - Update Ethernet MAC filters.
950  *
951  * @fip: FCoE controller.
952  * @old: Unicast MAC address to delete if the MAC is non-zero.
953  * @new: Unicast MAC address to add.
954  *
955  * Remove any previously-set unicast MAC filter.
956  * Add secondary FCoE MAC address filter for our OUI.
957  */
958 static void bnx2fc_update_src_mac(struct fc_lport *lport, u8 *addr)
959 {
960 	struct fcoe_port *port = lport_priv(lport);
961 
962 	memcpy(port->data_src_addr, addr, ETH_ALEN);
963 }
964 
965 /**
966  * bnx2fc_get_src_mac - return the ethernet source address for an lport
967  *
968  * @lport: libfc port
969  */
970 static u8 *bnx2fc_get_src_mac(struct fc_lport *lport)
971 {
972 	struct fcoe_port *port;
973 
974 	port = (struct fcoe_port *)lport_priv(lport);
975 	return port->data_src_addr;
976 }
977 
978 /**
979  * bnx2fc_fip_send - send an Ethernet-encapsulated FIP frame.
980  *
981  * @fip: FCoE controller.
982  * @skb: FIP Packet.
983  */
984 static void bnx2fc_fip_send(struct fcoe_ctlr *fip, struct sk_buff *skb)
985 {
986 	skb->dev = bnx2fc_from_ctlr(fip)->netdev;
987 	dev_queue_xmit(skb);
988 }
989 
990 static int bnx2fc_vport_create(struct fc_vport *vport, bool disabled)
991 {
992 	struct Scsi_Host *shost = vport_to_shost(vport);
993 	struct fc_lport *n_port = shost_priv(shost);
994 	struct fcoe_port *port = lport_priv(n_port);
995 	struct bnx2fc_interface *interface = port->priv;
996 	struct net_device *netdev = interface->netdev;
997 	struct fc_lport *vn_port;
998 
999 	if (!test_bit(BNX2FC_FLAG_FW_INIT_DONE, &interface->hba->flags)) {
1000 		printk(KERN_ERR PFX "vn ports cannot be created on"
1001 			"this interface\n");
1002 		return -EIO;
1003 	}
1004 	mutex_lock(&bnx2fc_dev_lock);
1005 	vn_port = bnx2fc_if_create(interface, &vport->dev, 1);
1006 	mutex_unlock(&bnx2fc_dev_lock);
1007 
1008 	if (IS_ERR(vn_port)) {
1009 		printk(KERN_ERR PFX "bnx2fc_vport_create (%s) failed\n",
1010 			netdev->name);
1011 		return -EIO;
1012 	}
1013 
1014 	if (disabled) {
1015 		fc_vport_set_state(vport, FC_VPORT_DISABLED);
1016 	} else {
1017 		vn_port->boot_time = jiffies;
1018 		fc_lport_init(vn_port);
1019 		fc_fabric_login(vn_port);
1020 		fc_vport_setlink(vn_port);
1021 	}
1022 	return 0;
1023 }
1024 
1025 static int bnx2fc_vport_destroy(struct fc_vport *vport)
1026 {
1027 	struct Scsi_Host *shost = vport_to_shost(vport);
1028 	struct fc_lport *n_port = shost_priv(shost);
1029 	struct fc_lport *vn_port = vport->dd_data;
1030 	struct fcoe_port *port = lport_priv(vn_port);
1031 
1032 	mutex_lock(&n_port->lp_mutex);
1033 	list_del(&vn_port->list);
1034 	mutex_unlock(&n_port->lp_mutex);
1035 	queue_work(bnx2fc_wq, &port->destroy_work);
1036 	return 0;
1037 }
1038 
1039 static int bnx2fc_vport_disable(struct fc_vport *vport, bool disable)
1040 {
1041 	struct fc_lport *lport = vport->dd_data;
1042 
1043 	if (disable) {
1044 		fc_vport_set_state(vport, FC_VPORT_DISABLED);
1045 		fc_fabric_logoff(lport);
1046 	} else {
1047 		lport->boot_time = jiffies;
1048 		fc_fabric_login(lport);
1049 		fc_vport_setlink(lport);
1050 	}
1051 	return 0;
1052 }
1053 
1054 
1055 static int bnx2fc_netdev_setup(struct bnx2fc_interface *interface)
1056 {
1057 	struct net_device *netdev = interface->netdev;
1058 	struct net_device *physdev = interface->hba->phys_dev;
1059 	struct netdev_hw_addr *ha;
1060 	int sel_san_mac = 0;
1061 
1062 	/* setup Source MAC Address */
1063 	rcu_read_lock();
1064 	for_each_dev_addr(physdev, ha) {
1065 		BNX2FC_MISC_DBG("net_config: ha->type = %d, fip_mac = ",
1066 				ha->type);
1067 		printk(KERN_INFO "%2x:%2x:%2x:%2x:%2x:%2x\n", ha->addr[0],
1068 				ha->addr[1], ha->addr[2], ha->addr[3],
1069 				ha->addr[4], ha->addr[5]);
1070 
1071 		if ((ha->type == NETDEV_HW_ADDR_T_SAN) &&
1072 		    (is_valid_ether_addr(ha->addr))) {
1073 			memcpy(interface->ctlr.ctl_src_addr, ha->addr,
1074 			       ETH_ALEN);
1075 			sel_san_mac = 1;
1076 			BNX2FC_MISC_DBG("Found SAN MAC\n");
1077 		}
1078 	}
1079 	rcu_read_unlock();
1080 
1081 	if (!sel_san_mac)
1082 		return -ENODEV;
1083 
1084 	interface->fip_packet_type.func = bnx2fc_fip_recv;
1085 	interface->fip_packet_type.type = htons(ETH_P_FIP);
1086 	interface->fip_packet_type.dev = netdev;
1087 	dev_add_pack(&interface->fip_packet_type);
1088 
1089 	interface->fcoe_packet_type.func = bnx2fc_rcv;
1090 	interface->fcoe_packet_type.type = __constant_htons(ETH_P_FCOE);
1091 	interface->fcoe_packet_type.dev = netdev;
1092 	dev_add_pack(&interface->fcoe_packet_type);
1093 
1094 	return 0;
1095 }
1096 
1097 static int bnx2fc_attach_transport(void)
1098 {
1099 	bnx2fc_transport_template =
1100 		fc_attach_transport(&bnx2fc_transport_function);
1101 
1102 	if (bnx2fc_transport_template == NULL) {
1103 		printk(KERN_ERR PFX "Failed to attach FC transport\n");
1104 		return -ENODEV;
1105 	}
1106 
1107 	bnx2fc_vport_xport_template =
1108 		fc_attach_transport(&bnx2fc_vport_xport_function);
1109 	if (bnx2fc_vport_xport_template == NULL) {
1110 		printk(KERN_ERR PFX
1111 		       "Failed to attach FC transport for vport\n");
1112 		fc_release_transport(bnx2fc_transport_template);
1113 		bnx2fc_transport_template = NULL;
1114 		return -ENODEV;
1115 	}
1116 	return 0;
1117 }
1118 static void bnx2fc_release_transport(void)
1119 {
1120 	fc_release_transport(bnx2fc_transport_template);
1121 	fc_release_transport(bnx2fc_vport_xport_template);
1122 	bnx2fc_transport_template = NULL;
1123 	bnx2fc_vport_xport_template = NULL;
1124 }
1125 
1126 static void bnx2fc_interface_release(struct kref *kref)
1127 {
1128 	struct bnx2fc_interface *interface;
1129 	struct net_device *netdev;
1130 
1131 	interface = container_of(kref, struct bnx2fc_interface, kref);
1132 	BNX2FC_MISC_DBG("Interface is being released\n");
1133 
1134 	netdev = interface->netdev;
1135 
1136 	/* tear-down FIP controller */
1137 	if (test_and_clear_bit(BNX2FC_CTLR_INIT_DONE, &interface->if_flags))
1138 		fcoe_ctlr_destroy(&interface->ctlr);
1139 
1140 	kfree(interface);
1141 
1142 	dev_put(netdev);
1143 	module_put(THIS_MODULE);
1144 }
1145 
1146 static inline void bnx2fc_interface_get(struct bnx2fc_interface *interface)
1147 {
1148 	kref_get(&interface->kref);
1149 }
1150 
1151 static inline void bnx2fc_interface_put(struct bnx2fc_interface *interface)
1152 {
1153 	kref_put(&interface->kref, bnx2fc_interface_release);
1154 }
1155 static void bnx2fc_hba_destroy(struct bnx2fc_hba *hba)
1156 {
1157 	/* Free the command manager */
1158 	if (hba->cmd_mgr) {
1159 		bnx2fc_cmd_mgr_free(hba->cmd_mgr);
1160 		hba->cmd_mgr = NULL;
1161 	}
1162 	kfree(hba->tgt_ofld_list);
1163 	bnx2fc_unbind_pcidev(hba);
1164 	kfree(hba);
1165 }
1166 
1167 /**
1168  * bnx2fc_hba_create - create a new bnx2fc hba
1169  *
1170  * @cnic:	pointer to cnic device
1171  *
1172  * Creates a new FCoE hba on the given device.
1173  *
1174  */
1175 static struct bnx2fc_hba *bnx2fc_hba_create(struct cnic_dev *cnic)
1176 {
1177 	struct bnx2fc_hba *hba;
1178 	int rc;
1179 
1180 	hba = kzalloc(sizeof(*hba), GFP_KERNEL);
1181 	if (!hba) {
1182 		printk(KERN_ERR PFX "Unable to allocate hba structure\n");
1183 		return NULL;
1184 	}
1185 	spin_lock_init(&hba->hba_lock);
1186 	mutex_init(&hba->hba_mutex);
1187 
1188 	hba->cnic = cnic;
1189 	rc = bnx2fc_bind_pcidev(hba);
1190 	if (rc) {
1191 		printk(KERN_ERR PFX "create_adapter:  bind error\n");
1192 		goto bind_err;
1193 	}
1194 	hba->phys_dev = cnic->netdev;
1195 	hba->next_conn_id = 0;
1196 
1197 	hba->tgt_ofld_list =
1198 		kzalloc(sizeof(struct bnx2fc_rport *) * BNX2FC_NUM_MAX_SESS,
1199 			GFP_KERNEL);
1200 	if (!hba->tgt_ofld_list) {
1201 		printk(KERN_ERR PFX "Unable to allocate tgt offload list\n");
1202 		goto tgtofld_err;
1203 	}
1204 
1205 	hba->num_ofld_sess = 0;
1206 
1207 	hba->cmd_mgr = bnx2fc_cmd_mgr_alloc(hba, BNX2FC_MIN_XID,
1208 						BNX2FC_MAX_XID);
1209 	if (!hba->cmd_mgr) {
1210 		printk(KERN_ERR PFX "em_config:bnx2fc_cmd_mgr_alloc failed\n");
1211 		goto cmgr_err;
1212 	}
1213 
1214 	init_waitqueue_head(&hba->shutdown_wait);
1215 	init_waitqueue_head(&hba->destroy_wait);
1216 	INIT_LIST_HEAD(&hba->vports);
1217 
1218 	return hba;
1219 
1220 cmgr_err:
1221 	kfree(hba->tgt_ofld_list);
1222 tgtofld_err:
1223 	bnx2fc_unbind_pcidev(hba);
1224 bind_err:
1225 	kfree(hba);
1226 	return NULL;
1227 }
1228 
1229 struct bnx2fc_interface *bnx2fc_interface_create(struct bnx2fc_hba *hba,
1230 				      struct net_device *netdev,
1231 				      enum fip_state fip_mode)
1232 {
1233 	struct bnx2fc_interface *interface;
1234 	int rc = 0;
1235 
1236 	interface = kzalloc(sizeof(*interface), GFP_KERNEL);
1237 	if (!interface) {
1238 		printk(KERN_ERR PFX "Unable to allocate interface structure\n");
1239 		return NULL;
1240 	}
1241 	dev_hold(netdev);
1242 	kref_init(&interface->kref);
1243 	interface->hba = hba;
1244 	interface->netdev = netdev;
1245 
1246 	/* Initialize FIP */
1247 	fcoe_ctlr_init(&interface->ctlr, fip_mode);
1248 	interface->ctlr.send = bnx2fc_fip_send;
1249 	interface->ctlr.update_mac = bnx2fc_update_src_mac;
1250 	interface->ctlr.get_src_addr = bnx2fc_get_src_mac;
1251 	set_bit(BNX2FC_CTLR_INIT_DONE, &interface->if_flags);
1252 
1253 	rc = bnx2fc_netdev_setup(interface);
1254 	if (!rc)
1255 		return interface;
1256 
1257 	fcoe_ctlr_destroy(&interface->ctlr);
1258 	dev_put(netdev);
1259 	kfree(interface);
1260 	return NULL;
1261 }
1262 
1263 /**
1264  * bnx2fc_if_create - Create FCoE instance on a given interface
1265  *
1266  * @interface:	FCoE interface to create a local port on
1267  * @parent:	Device pointer to be the parent in sysfs for the SCSI host
1268  * @npiv:	Indicates if the port is vport or not
1269  *
1270  * Creates a fc_lport instance and a Scsi_Host instance and configure them.
1271  *
1272  * Returns:	Allocated fc_lport or an error pointer
1273  */
1274 static struct fc_lport *bnx2fc_if_create(struct bnx2fc_interface *interface,
1275 				  struct device *parent, int npiv)
1276 {
1277 	struct fc_lport		*lport, *n_port;
1278 	struct fcoe_port	*port;
1279 	struct Scsi_Host	*shost;
1280 	struct fc_vport		*vport = dev_to_vport(parent);
1281 	struct bnx2fc_lport	*blport;
1282 	struct bnx2fc_hba	*hba;
1283 	int			rc = 0;
1284 
1285 	blport = kzalloc(sizeof(struct bnx2fc_lport), GFP_KERNEL);
1286 	if (!blport) {
1287 		BNX2FC_HBA_DBG(interface->ctlr.lp, "Unable to alloc blport\n");
1288 		return NULL;
1289 	}
1290 
1291 	/* Allocate Scsi_Host structure */
1292 	if (!npiv)
1293 		lport = libfc_host_alloc(&bnx2fc_shost_template, sizeof(*port));
1294 	else
1295 		lport = libfc_vport_create(vport, sizeof(*port));
1296 
1297 	if (!lport) {
1298 		printk(KERN_ERR PFX "could not allocate scsi host structure\n");
1299 		goto free_blport;
1300 	}
1301 	shost = lport->host;
1302 	port = lport_priv(lport);
1303 	port->lport = lport;
1304 	port->priv = interface;
1305 	INIT_WORK(&port->destroy_work, bnx2fc_destroy_work);
1306 
1307 	/* Configure fcoe_port */
1308 	rc = bnx2fc_lport_config(lport);
1309 	if (rc)
1310 		goto lp_config_err;
1311 
1312 	if (npiv) {
1313 		printk(KERN_ERR PFX "Setting vport names, 0x%llX 0x%llX\n",
1314 			vport->node_name, vport->port_name);
1315 		fc_set_wwnn(lport, vport->node_name);
1316 		fc_set_wwpn(lport, vport->port_name);
1317 	}
1318 	/* Configure netdev and networking properties of the lport */
1319 	rc = bnx2fc_net_config(lport);
1320 	if (rc) {
1321 		printk(KERN_ERR PFX "Error on bnx2fc_net_config\n");
1322 		goto lp_config_err;
1323 	}
1324 
1325 	rc = bnx2fc_shost_config(lport, parent);
1326 	if (rc) {
1327 		printk(KERN_ERR PFX "Couldnt configure shost for %s\n",
1328 			interface->netdev->name);
1329 		goto lp_config_err;
1330 	}
1331 
1332 	/* Initialize the libfc library */
1333 	rc = bnx2fc_libfc_config(lport);
1334 	if (rc) {
1335 		printk(KERN_ERR PFX "Couldnt configure libfc\n");
1336 		goto shost_err;
1337 	}
1338 	fc_host_port_type(lport->host) = FC_PORTTYPE_UNKNOWN;
1339 
1340 	/* Allocate exchange manager */
1341 	if (!npiv)
1342 		rc = bnx2fc_em_config(lport);
1343 	else {
1344 		shost = vport_to_shost(vport);
1345 		n_port = shost_priv(shost);
1346 		rc = fc_exch_mgr_list_clone(n_port, lport);
1347 	}
1348 
1349 	if (rc) {
1350 		printk(KERN_ERR PFX "Error on bnx2fc_em_config\n");
1351 		goto shost_err;
1352 	}
1353 
1354 	bnx2fc_interface_get(interface);
1355 
1356 	hba = interface->hba;
1357 	spin_lock_bh(&hba->hba_lock);
1358 	blport->lport = lport;
1359 	list_add_tail(&blport->list, &hba->vports);
1360 	spin_unlock_bh(&hba->hba_lock);
1361 
1362 	return lport;
1363 
1364 shost_err:
1365 	scsi_remove_host(shost);
1366 lp_config_err:
1367 	scsi_host_put(lport->host);
1368 free_blport:
1369 	kfree(blport);
1370 	return NULL;
1371 }
1372 
1373 static void bnx2fc_netdev_cleanup(struct bnx2fc_interface *interface)
1374 {
1375 	/* Dont listen for Ethernet packets anymore */
1376 	__dev_remove_pack(&interface->fcoe_packet_type);
1377 	__dev_remove_pack(&interface->fip_packet_type);
1378 	synchronize_net();
1379 }
1380 
1381 static void bnx2fc_if_destroy(struct fc_lport *lport, struct bnx2fc_hba *hba)
1382 {
1383 	struct fcoe_port *port = lport_priv(lport);
1384 	struct bnx2fc_lport *blport, *tmp;
1385 
1386 	/* Stop the transmit retry timer */
1387 	del_timer_sync(&port->timer);
1388 
1389 	/* Free existing transmit skbs */
1390 	fcoe_clean_pending_queue(lport);
1391 
1392 	/* Free queued packets for the receive thread */
1393 	bnx2fc_clean_rx_queue(lport);
1394 
1395 	/* Detach from scsi-ml */
1396 	fc_remove_host(lport->host);
1397 	scsi_remove_host(lport->host);
1398 
1399 	/*
1400 	 * Note that only the physical lport will have the exchange manager.
1401 	 * for vports, this function is NOP
1402 	 */
1403 	fc_exch_mgr_free(lport);
1404 
1405 	/* Free memory used by statistical counters */
1406 	fc_lport_free_stats(lport);
1407 
1408 	spin_lock_bh(&hba->hba_lock);
1409 	list_for_each_entry_safe(blport, tmp, &hba->vports, list) {
1410 		if (blport->lport == lport) {
1411 			list_del(&blport->list);
1412 			kfree(blport);
1413 		}
1414 	}
1415 	spin_unlock_bh(&hba->hba_lock);
1416 
1417 	/* Release Scsi_Host */
1418 	scsi_host_put(lport->host);
1419 }
1420 
1421 /**
1422  * bnx2fc_destroy - Destroy a bnx2fc FCoE interface
1423  *
1424  * @buffer: The name of the Ethernet interface to be destroyed
1425  * @kp:     The associated kernel parameter
1426  *
1427  * Called from sysfs.
1428  *
1429  * Returns: 0 for success
1430  */
1431 static int bnx2fc_destroy(struct net_device *netdev)
1432 {
1433 	struct bnx2fc_interface *interface = NULL;
1434 	struct bnx2fc_hba *hba;
1435 	struct fc_lport *lport;
1436 	int rc = 0;
1437 
1438 	rtnl_lock();
1439 	mutex_lock(&bnx2fc_dev_lock);
1440 
1441 	interface = bnx2fc_interface_lookup(netdev);
1442 	if (!interface || !interface->ctlr.lp) {
1443 		rc = -ENODEV;
1444 		printk(KERN_ERR PFX "bnx2fc_destroy: interface or lport not found\n");
1445 		goto netdev_err;
1446 	}
1447 
1448 	hba = interface->hba;
1449 
1450 	bnx2fc_netdev_cleanup(interface);
1451 	lport = interface->ctlr.lp;
1452 	bnx2fc_stop(interface);
1453 	list_del(&interface->list);
1454 	destroy_workqueue(interface->timer_work_queue);
1455 	bnx2fc_interface_put(interface);
1456 	bnx2fc_if_destroy(lport, hba);
1457 
1458 netdev_err:
1459 	mutex_unlock(&bnx2fc_dev_lock);
1460 	rtnl_unlock();
1461 	return rc;
1462 }
1463 
1464 static void bnx2fc_destroy_work(struct work_struct *work)
1465 {
1466 	struct fcoe_port *port;
1467 	struct fc_lport *lport;
1468 	struct bnx2fc_interface *interface;
1469 	struct bnx2fc_hba *hba;
1470 
1471 	port = container_of(work, struct fcoe_port, destroy_work);
1472 	lport = port->lport;
1473 	interface = port->priv;
1474 	hba = interface->hba;
1475 
1476 	BNX2FC_HBA_DBG(lport, "Entered bnx2fc_destroy_work\n");
1477 
1478 	bnx2fc_port_shutdown(lport);
1479 	rtnl_lock();
1480 	mutex_lock(&bnx2fc_dev_lock);
1481 	bnx2fc_if_destroy(lport, hba);
1482 	mutex_unlock(&bnx2fc_dev_lock);
1483 	rtnl_unlock();
1484 }
1485 
1486 static void bnx2fc_unbind_adapter_devices(struct bnx2fc_hba *hba)
1487 {
1488 	bnx2fc_free_fw_resc(hba);
1489 	bnx2fc_free_task_ctx(hba);
1490 }
1491 
1492 /**
1493  * bnx2fc_bind_adapter_devices - binds bnx2fc adapter with the associated
1494  *			pci structure
1495  *
1496  * @hba:		Adapter instance
1497  */
1498 static int bnx2fc_bind_adapter_devices(struct bnx2fc_hba *hba)
1499 {
1500 	if (bnx2fc_setup_task_ctx(hba))
1501 		goto mem_err;
1502 
1503 	if (bnx2fc_setup_fw_resc(hba))
1504 		goto mem_err;
1505 
1506 	return 0;
1507 mem_err:
1508 	bnx2fc_unbind_adapter_devices(hba);
1509 	return -ENOMEM;
1510 }
1511 
1512 static int bnx2fc_bind_pcidev(struct bnx2fc_hba *hba)
1513 {
1514 	struct cnic_dev *cnic;
1515 
1516 	if (!hba->cnic) {
1517 		printk(KERN_ERR PFX "cnic is NULL\n");
1518 		return -ENODEV;
1519 	}
1520 	cnic = hba->cnic;
1521 	hba->pcidev = cnic->pcidev;
1522 	if (hba->pcidev)
1523 		pci_dev_get(hba->pcidev);
1524 
1525 	return 0;
1526 }
1527 
1528 static void bnx2fc_unbind_pcidev(struct bnx2fc_hba *hba)
1529 {
1530 	if (hba->pcidev)
1531 		pci_dev_put(hba->pcidev);
1532 	hba->pcidev = NULL;
1533 }
1534 
1535 
1536 
1537 /**
1538  * bnx2fc_ulp_start - cnic callback to initialize & start adapter instance
1539  *
1540  * @handle:	transport handle pointing to adapter struture
1541  *
1542  * This function maps adapter structure to pcidev structure and initiates
1543  *	firmware handshake to enable/initialize on-chip FCoE components.
1544  *	This bnx2fc - cnic interface api callback is used after following
1545  *	conditions are met -
1546  *	a) underlying network interface is up (marked by event NETDEV_UP
1547  *		from netdev
1548  *	b) bnx2fc adatper structure is registered.
1549  */
1550 static void bnx2fc_ulp_start(void *handle)
1551 {
1552 	struct bnx2fc_hba *hba = handle;
1553 	struct bnx2fc_interface *interface;
1554 	struct fc_lport *lport;
1555 
1556 	mutex_lock(&bnx2fc_dev_lock);
1557 
1558 	if (!test_bit(BNX2FC_FLAG_FW_INIT_DONE, &hba->flags))
1559 		bnx2fc_fw_init(hba);
1560 
1561 	BNX2FC_MISC_DBG("bnx2fc started.\n");
1562 
1563 	list_for_each_entry(interface, &if_list, list) {
1564 		if (interface->hba == hba) {
1565 			lport = interface->ctlr.lp;
1566 			/* Kick off Fabric discovery*/
1567 			printk(KERN_ERR PFX "ulp_init: start discovery\n");
1568 			lport->tt.frame_send = bnx2fc_xmit;
1569 			bnx2fc_start_disc(interface);
1570 		}
1571 	}
1572 
1573 	mutex_unlock(&bnx2fc_dev_lock);
1574 }
1575 
1576 static void bnx2fc_port_shutdown(struct fc_lport *lport)
1577 {
1578 	BNX2FC_MISC_DBG("Entered %s\n", __func__);
1579 	fc_fabric_logoff(lport);
1580 	fc_lport_destroy(lport);
1581 }
1582 
1583 static void bnx2fc_stop(struct bnx2fc_interface *interface)
1584 {
1585 	struct fc_lport *lport;
1586 	struct fc_lport *vport;
1587 
1588 	if (!test_bit(BNX2FC_FLAG_FW_INIT_DONE, &interface->hba->flags))
1589 		return;
1590 
1591 	lport = interface->ctlr.lp;
1592 	bnx2fc_port_shutdown(lport);
1593 
1594 	mutex_lock(&lport->lp_mutex);
1595 	list_for_each_entry(vport, &lport->vports, list)
1596 		fc_host_port_type(vport->host) =
1597 					FC_PORTTYPE_UNKNOWN;
1598 	mutex_unlock(&lport->lp_mutex);
1599 	fc_host_port_type(lport->host) = FC_PORTTYPE_UNKNOWN;
1600 	fcoe_ctlr_link_down(&interface->ctlr);
1601 	fcoe_clean_pending_queue(lport);
1602 }
1603 
1604 static int bnx2fc_fw_init(struct bnx2fc_hba *hba)
1605 {
1606 #define BNX2FC_INIT_POLL_TIME		(1000 / HZ)
1607 	int rc = -1;
1608 	int i = HZ;
1609 
1610 	rc = bnx2fc_bind_adapter_devices(hba);
1611 	if (rc) {
1612 		printk(KERN_ALERT PFX
1613 			"bnx2fc_bind_adapter_devices failed - rc = %d\n", rc);
1614 		goto err_out;
1615 	}
1616 
1617 	rc = bnx2fc_send_fw_fcoe_init_msg(hba);
1618 	if (rc) {
1619 		printk(KERN_ALERT PFX
1620 			"bnx2fc_send_fw_fcoe_init_msg failed - rc = %d\n", rc);
1621 		goto err_unbind;
1622 	}
1623 
1624 	/*
1625 	 * Wait until the adapter init message is complete, and adapter
1626 	 * state is UP.
1627 	 */
1628 	while (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state) && i--)
1629 		msleep(BNX2FC_INIT_POLL_TIME);
1630 
1631 	if (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state)) {
1632 		printk(KERN_ERR PFX "bnx2fc_start: %s failed to initialize.  "
1633 				"Ignoring...\n",
1634 				hba->cnic->netdev->name);
1635 		rc = -1;
1636 		goto err_unbind;
1637 	}
1638 
1639 
1640 	set_bit(BNX2FC_FLAG_FW_INIT_DONE, &hba->flags);
1641 	return 0;
1642 
1643 err_unbind:
1644 	bnx2fc_unbind_adapter_devices(hba);
1645 err_out:
1646 	return rc;
1647 }
1648 
1649 static void bnx2fc_fw_destroy(struct bnx2fc_hba *hba)
1650 {
1651 	if (test_and_clear_bit(BNX2FC_FLAG_FW_INIT_DONE, &hba->flags)) {
1652 		if (bnx2fc_send_fw_fcoe_destroy_msg(hba) == 0) {
1653 			init_timer(&hba->destroy_timer);
1654 			hba->destroy_timer.expires = BNX2FC_FW_TIMEOUT +
1655 								jiffies;
1656 			hba->destroy_timer.function = bnx2fc_destroy_timer;
1657 			hba->destroy_timer.data = (unsigned long)hba;
1658 			add_timer(&hba->destroy_timer);
1659 			wait_event_interruptible(hba->destroy_wait,
1660 					test_bit(BNX2FC_FLAG_DESTROY_CMPL,
1661 						 &hba->flags));
1662 			/* This should never happen */
1663 			if (signal_pending(current))
1664 				flush_signals(current);
1665 
1666 			del_timer_sync(&hba->destroy_timer);
1667 		}
1668 		bnx2fc_unbind_adapter_devices(hba);
1669 	}
1670 }
1671 
1672 /**
1673  * bnx2fc_ulp_stop - cnic callback to shutdown adapter instance
1674  *
1675  * @handle:	transport handle pointing to adapter structure
1676  *
1677  * Driver checks if adapter is already in shutdown mode, if not start
1678  *	the shutdown process.
1679  */
1680 static void bnx2fc_ulp_stop(void *handle)
1681 {
1682 	struct bnx2fc_hba *hba = handle;
1683 	struct bnx2fc_interface *interface;
1684 
1685 	printk(KERN_ERR "ULP_STOP\n");
1686 
1687 	mutex_lock(&bnx2fc_dev_lock);
1688 	if (!test_bit(BNX2FC_FLAG_FW_INIT_DONE, &hba->flags))
1689 		goto exit;
1690 	list_for_each_entry(interface, &if_list, list) {
1691 		if (interface->hba == hba)
1692 			bnx2fc_stop(interface);
1693 	}
1694 	BUG_ON(hba->num_ofld_sess != 0);
1695 
1696 	mutex_lock(&hba->hba_mutex);
1697 	clear_bit(ADAPTER_STATE_UP, &hba->adapter_state);
1698 	clear_bit(ADAPTER_STATE_GOING_DOWN,
1699 		  &hba->adapter_state);
1700 
1701 	clear_bit(ADAPTER_STATE_READY, &hba->adapter_state);
1702 	mutex_unlock(&hba->hba_mutex);
1703 
1704 	bnx2fc_fw_destroy(hba);
1705 exit:
1706 	mutex_unlock(&bnx2fc_dev_lock);
1707 }
1708 
1709 static void bnx2fc_start_disc(struct bnx2fc_interface *interface)
1710 {
1711 	struct fc_lport *lport;
1712 	int wait_cnt = 0;
1713 
1714 	BNX2FC_MISC_DBG("Entered %s\n", __func__);
1715 	/* Kick off FIP/FLOGI */
1716 	if (!test_bit(BNX2FC_FLAG_FW_INIT_DONE, &interface->hba->flags)) {
1717 		printk(KERN_ERR PFX "Init not done yet\n");
1718 		return;
1719 	}
1720 
1721 	lport = interface->ctlr.lp;
1722 	BNX2FC_HBA_DBG(lport, "calling fc_fabric_login\n");
1723 
1724 	if (!bnx2fc_link_ok(lport)) {
1725 		BNX2FC_HBA_DBG(lport, "ctlr_link_up\n");
1726 		fcoe_ctlr_link_up(&interface->ctlr);
1727 		fc_host_port_type(lport->host) = FC_PORTTYPE_NPORT;
1728 		set_bit(ADAPTER_STATE_READY, &interface->hba->adapter_state);
1729 	}
1730 
1731 	/* wait for the FCF to be selected before issuing FLOGI */
1732 	while (!interface->ctlr.sel_fcf) {
1733 		msleep(250);
1734 		/* give up after 3 secs */
1735 		if (++wait_cnt > 12)
1736 			break;
1737 	}
1738 	fc_lport_init(lport);
1739 	fc_fabric_login(lport);
1740 }
1741 
1742 
1743 /**
1744  * bnx2fc_ulp_init - Initialize an adapter instance
1745  *
1746  * @dev :	cnic device handle
1747  * Called from cnic_register_driver() context to initialize all
1748  *	enumerated cnic devices. This routine allocates adapter structure
1749  *	and other device specific resources.
1750  */
1751 static void bnx2fc_ulp_init(struct cnic_dev *dev)
1752 {
1753 	struct bnx2fc_hba *hba;
1754 	int rc = 0;
1755 
1756 	BNX2FC_MISC_DBG("Entered %s\n", __func__);
1757 	/* bnx2fc works only when bnx2x is loaded */
1758 	if (!test_bit(CNIC_F_BNX2X_CLASS, &dev->flags) ||
1759 	    (dev->max_fcoe_conn == 0)) {
1760 		printk(KERN_ERR PFX "bnx2fc FCoE not supported on %s,"
1761 				    " flags: %lx fcoe_conn: %d\n",
1762 			dev->netdev->name, dev->flags, dev->max_fcoe_conn);
1763 		return;
1764 	}
1765 
1766 	hba = bnx2fc_hba_create(dev);
1767 	if (!hba) {
1768 		printk(KERN_ERR PFX "hba initialization failed\n");
1769 		return;
1770 	}
1771 
1772 	/* Add HBA to the adapter list */
1773 	mutex_lock(&bnx2fc_dev_lock);
1774 	list_add_tail(&hba->list, &adapter_list);
1775 	adapter_count++;
1776 	mutex_unlock(&bnx2fc_dev_lock);
1777 
1778 	clear_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic);
1779 	rc = dev->register_device(dev, CNIC_ULP_FCOE,
1780 						(void *) hba);
1781 	if (rc)
1782 		printk(KERN_ERR PFX "register_device failed, rc = %d\n", rc);
1783 	else
1784 		set_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic);
1785 }
1786 
1787 
1788 static int bnx2fc_disable(struct net_device *netdev)
1789 {
1790 	struct bnx2fc_interface *interface;
1791 	int rc = 0;
1792 
1793 	rtnl_lock();
1794 	mutex_lock(&bnx2fc_dev_lock);
1795 
1796 	interface = bnx2fc_interface_lookup(netdev);
1797 	if (!interface || !interface->ctlr.lp) {
1798 		rc = -ENODEV;
1799 		printk(KERN_ERR PFX "bnx2fc_disable: interface or lport not found\n");
1800 	} else {
1801 		fcoe_ctlr_link_down(&interface->ctlr);
1802 		fcoe_clean_pending_queue(interface->ctlr.lp);
1803 	}
1804 
1805 	mutex_unlock(&bnx2fc_dev_lock);
1806 	rtnl_unlock();
1807 	return rc;
1808 }
1809 
1810 
1811 static int bnx2fc_enable(struct net_device *netdev)
1812 {
1813 	struct bnx2fc_interface *interface;
1814 	int rc = 0;
1815 
1816 	rtnl_lock();
1817 	mutex_lock(&bnx2fc_dev_lock);
1818 
1819 	interface = bnx2fc_interface_lookup(netdev);
1820 	if (!interface || !interface->ctlr.lp) {
1821 		rc = -ENODEV;
1822 		printk(KERN_ERR PFX "bnx2fc_enable: interface or lport not found\n");
1823 	} else if (!bnx2fc_link_ok(interface->ctlr.lp))
1824 		fcoe_ctlr_link_up(&interface->ctlr);
1825 
1826 	mutex_unlock(&bnx2fc_dev_lock);
1827 	rtnl_unlock();
1828 	return rc;
1829 }
1830 
1831 /**
1832  * bnx2fc_create - Create bnx2fc FCoE interface
1833  *
1834  * @buffer: The name of Ethernet interface to create on
1835  * @kp:     The associated kernel param
1836  *
1837  * Called from sysfs.
1838  *
1839  * Returns: 0 for success
1840  */
1841 static int bnx2fc_create(struct net_device *netdev, enum fip_state fip_mode)
1842 {
1843 	struct bnx2fc_interface *interface;
1844 	struct bnx2fc_hba *hba;
1845 	struct net_device *phys_dev;
1846 	struct fc_lport *lport;
1847 	struct ethtool_drvinfo drvinfo;
1848 	int rc = 0;
1849 	int vlan_id;
1850 
1851 	BNX2FC_MISC_DBG("Entered bnx2fc_create\n");
1852 	if (fip_mode != FIP_MODE_FABRIC) {
1853 		printk(KERN_ERR "fip mode not FABRIC\n");
1854 		return -EIO;
1855 	}
1856 
1857 	rtnl_lock();
1858 
1859 	mutex_lock(&bnx2fc_dev_lock);
1860 
1861 	if (!try_module_get(THIS_MODULE)) {
1862 		rc = -EINVAL;
1863 		goto mod_err;
1864 	}
1865 
1866 	/* obtain physical netdev */
1867 	if (netdev->priv_flags & IFF_802_1Q_VLAN) {
1868 		phys_dev = vlan_dev_real_dev(netdev);
1869 		vlan_id = vlan_dev_vlan_id(netdev);
1870 	} else {
1871 		printk(KERN_ERR PFX "Not a vlan device\n");
1872 		rc = -EINVAL;
1873 		goto netdev_err;
1874 	}
1875 	/* verify if the physical device is a netxtreme2 device */
1876 	if (phys_dev->ethtool_ops && phys_dev->ethtool_ops->get_drvinfo) {
1877 		memset(&drvinfo, 0, sizeof(drvinfo));
1878 		phys_dev->ethtool_ops->get_drvinfo(phys_dev, &drvinfo);
1879 		if (strncmp(drvinfo.driver, "bnx2x", strlen("bnx2x"))) {
1880 			printk(KERN_ERR PFX "Not a netxtreme2 device\n");
1881 			rc = -EINVAL;
1882 			goto netdev_err;
1883 		}
1884 	} else {
1885 		printk(KERN_ERR PFX "unable to obtain drv_info\n");
1886 		rc = -EINVAL;
1887 		goto netdev_err;
1888 	}
1889 
1890 	/* obtain interface and initialize rest of the structure */
1891 	hba = bnx2fc_hba_lookup(phys_dev);
1892 	if (!hba) {
1893 		rc = -ENODEV;
1894 		printk(KERN_ERR PFX "bnx2fc_create: hba not found\n");
1895 		goto netdev_err;
1896 	}
1897 
1898 	if (bnx2fc_interface_lookup(netdev)) {
1899 		rc = -EEXIST;
1900 		goto netdev_err;
1901 	}
1902 
1903 	interface = bnx2fc_interface_create(hba, netdev, fip_mode);
1904 	if (!interface) {
1905 		printk(KERN_ERR PFX "bnx2fc_interface_create failed\n");
1906 		goto ifput_err;
1907 	}
1908 
1909 	interface->vlan_id = vlan_id;
1910 	interface->vlan_enabled = 1;
1911 
1912 	interface->timer_work_queue =
1913 			create_singlethread_workqueue("bnx2fc_timer_wq");
1914 	if (!interface->timer_work_queue) {
1915 		printk(KERN_ERR PFX "ulp_init could not create timer_wq\n");
1916 		rc = -EINVAL;
1917 		goto ifput_err;
1918 	}
1919 
1920 	lport = bnx2fc_if_create(interface, &interface->hba->pcidev->dev, 0);
1921 	if (!lport) {
1922 		printk(KERN_ERR PFX "Failed to create interface (%s)\n",
1923 			netdev->name);
1924 		bnx2fc_netdev_cleanup(interface);
1925 		rc = -EINVAL;
1926 		goto if_create_err;
1927 	}
1928 
1929 	/* Add interface to if_list */
1930 	list_add_tail(&interface->list, &if_list);
1931 
1932 	lport->boot_time = jiffies;
1933 
1934 	/* Make this master N_port */
1935 	interface->ctlr.lp = lport;
1936 
1937 	BNX2FC_HBA_DBG(lport, "create: START DISC\n");
1938 	bnx2fc_start_disc(interface);
1939 	/*
1940 	 * Release from kref_init in bnx2fc_interface_setup, on success
1941 	 * lport should be holding a reference taken in bnx2fc_if_create
1942 	 */
1943 	bnx2fc_interface_put(interface);
1944 	/* put netdev that was held while calling dev_get_by_name */
1945 	mutex_unlock(&bnx2fc_dev_lock);
1946 	rtnl_unlock();
1947 	return 0;
1948 
1949 if_create_err:
1950 	destroy_workqueue(interface->timer_work_queue);
1951 ifput_err:
1952 	bnx2fc_interface_put(interface);
1953 netdev_err:
1954 	module_put(THIS_MODULE);
1955 mod_err:
1956 	mutex_unlock(&bnx2fc_dev_lock);
1957 	rtnl_unlock();
1958 	return rc;
1959 }
1960 
1961 /**
1962  * bnx2fc_find_hba_for_cnic - maps cnic instance to bnx2fc hba instance
1963  *
1964  * @cnic:	Pointer to cnic device instance
1965  *
1966  **/
1967 static struct bnx2fc_hba *bnx2fc_find_hba_for_cnic(struct cnic_dev *cnic)
1968 {
1969 	struct list_head *list;
1970 	struct list_head *temp;
1971 	struct bnx2fc_hba *hba;
1972 
1973 	/* Called with bnx2fc_dev_lock held */
1974 	list_for_each_safe(list, temp, &adapter_list) {
1975 		hba = (struct bnx2fc_hba *)list;
1976 		if (hba->cnic == cnic)
1977 			return hba;
1978 	}
1979 	return NULL;
1980 }
1981 
1982 static struct bnx2fc_interface *bnx2fc_interface_lookup(struct net_device
1983 							*netdev)
1984 {
1985 	struct bnx2fc_interface *interface;
1986 
1987 	/* Called with bnx2fc_dev_lock held */
1988 	list_for_each_entry(interface, &if_list, list) {
1989 		if (interface->netdev == netdev)
1990 			return interface;
1991 	}
1992 	return NULL;
1993 }
1994 
1995 static struct bnx2fc_hba *bnx2fc_hba_lookup(struct net_device
1996 						      *phys_dev)
1997 {
1998 	struct bnx2fc_hba *hba;
1999 
2000 	/* Called with bnx2fc_dev_lock held */
2001 	list_for_each_entry(hba, &adapter_list, list) {
2002 		if (hba->phys_dev == phys_dev)
2003 			return hba;
2004 	}
2005 	printk(KERN_ERR PFX "adapter_lookup: hba NULL\n");
2006 	return NULL;
2007 }
2008 
2009 /**
2010  * bnx2fc_ulp_exit - shuts down adapter instance and frees all resources
2011  *
2012  * @dev		cnic device handle
2013  */
2014 static void bnx2fc_ulp_exit(struct cnic_dev *dev)
2015 {
2016 	struct bnx2fc_hba *hba;
2017 	struct bnx2fc_interface *interface, *tmp;
2018 	struct fc_lport *lport;
2019 
2020 	BNX2FC_MISC_DBG("Entered bnx2fc_ulp_exit\n");
2021 
2022 	if (!test_bit(CNIC_F_BNX2X_CLASS, &dev->flags)) {
2023 		printk(KERN_ERR PFX "bnx2fc port check: %s, flags: %lx\n",
2024 			dev->netdev->name, dev->flags);
2025 		return;
2026 	}
2027 
2028 	mutex_lock(&bnx2fc_dev_lock);
2029 	hba = bnx2fc_find_hba_for_cnic(dev);
2030 	if (!hba) {
2031 		printk(KERN_ERR PFX "bnx2fc_ulp_exit: hba not found, dev 0%p\n",
2032 		       dev);
2033 		mutex_unlock(&bnx2fc_dev_lock);
2034 		return;
2035 	}
2036 
2037 	list_del_init(&hba->list);
2038 	adapter_count--;
2039 
2040 	list_for_each_entry_safe(interface, tmp, &if_list, list) {
2041 		/* destroy not called yet, move to quiesced list */
2042 		if (interface->hba == hba) {
2043 			bnx2fc_netdev_cleanup(interface);
2044 			bnx2fc_stop(interface);
2045 
2046 			list_del(&interface->list);
2047 			lport = interface->ctlr.lp;
2048 			bnx2fc_interface_put(interface);
2049 			bnx2fc_if_destroy(lport, hba);
2050 		}
2051 	}
2052 	mutex_unlock(&bnx2fc_dev_lock);
2053 
2054 	bnx2fc_ulp_stop(hba);
2055 	/* unregister cnic device */
2056 	if (test_and_clear_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic))
2057 		hba->cnic->unregister_device(hba->cnic, CNIC_ULP_FCOE);
2058 	bnx2fc_hba_destroy(hba);
2059 }
2060 
2061 /**
2062  * bnx2fc_fcoe_reset - Resets the fcoe
2063  *
2064  * @shost: shost the reset is from
2065  *
2066  * Returns: always 0
2067  */
2068 static int bnx2fc_fcoe_reset(struct Scsi_Host *shost)
2069 {
2070 	struct fc_lport *lport = shost_priv(shost);
2071 	fc_lport_reset(lport);
2072 	return 0;
2073 }
2074 
2075 
2076 static bool bnx2fc_match(struct net_device *netdev)
2077 {
2078 	mutex_lock(&bnx2fc_dev_lock);
2079 	if (netdev->priv_flags & IFF_802_1Q_VLAN) {
2080 		struct net_device *phys_dev = vlan_dev_real_dev(netdev);
2081 
2082 		if (bnx2fc_hba_lookup(phys_dev)) {
2083 			mutex_unlock(&bnx2fc_dev_lock);
2084 			return true;
2085 		}
2086 	}
2087 	mutex_unlock(&bnx2fc_dev_lock);
2088 	return false;
2089 }
2090 
2091 
2092 static struct fcoe_transport bnx2fc_transport = {
2093 	.name = {"bnx2fc"},
2094 	.attached = false,
2095 	.list = LIST_HEAD_INIT(bnx2fc_transport.list),
2096 	.match = bnx2fc_match,
2097 	.create = bnx2fc_create,
2098 	.destroy = bnx2fc_destroy,
2099 	.enable = bnx2fc_enable,
2100 	.disable = bnx2fc_disable,
2101 };
2102 
2103 /**
2104  * bnx2fc_percpu_thread_create - Create a receive thread for an
2105  *				 online CPU
2106  *
2107  * @cpu: cpu index for the online cpu
2108  */
2109 static void bnx2fc_percpu_thread_create(unsigned int cpu)
2110 {
2111 	struct bnx2fc_percpu_s *p;
2112 	struct task_struct *thread;
2113 
2114 	p = &per_cpu(bnx2fc_percpu, cpu);
2115 
2116 	thread = kthread_create(bnx2fc_percpu_io_thread,
2117 				(void *)p,
2118 				"bnx2fc_thread/%d", cpu);
2119 	/* bind thread to the cpu */
2120 	if (likely(!IS_ERR(p->iothread))) {
2121 		kthread_bind(thread, cpu);
2122 		p->iothread = thread;
2123 		wake_up_process(thread);
2124 	}
2125 }
2126 
2127 static void bnx2fc_percpu_thread_destroy(unsigned int cpu)
2128 {
2129 	struct bnx2fc_percpu_s *p;
2130 	struct task_struct *thread;
2131 	struct bnx2fc_work *work, *tmp;
2132 	LIST_HEAD(work_list);
2133 
2134 	BNX2FC_MISC_DBG("destroying io thread for CPU %d\n", cpu);
2135 
2136 	/* Prevent any new work from being queued for this CPU */
2137 	p = &per_cpu(bnx2fc_percpu, cpu);
2138 	spin_lock_bh(&p->fp_work_lock);
2139 	thread = p->iothread;
2140 	p->iothread = NULL;
2141 
2142 
2143 	/* Free all work in the list */
2144 	list_for_each_entry_safe(work, tmp, &work_list, list) {
2145 		list_del_init(&work->list);
2146 		bnx2fc_process_cq_compl(work->tgt, work->wqe);
2147 		kfree(work);
2148 	}
2149 
2150 	spin_unlock_bh(&p->fp_work_lock);
2151 
2152 	if (thread)
2153 		kthread_stop(thread);
2154 }
2155 
2156 /**
2157  * bnx2fc_cpu_callback - Handler for CPU hotplug events
2158  *
2159  * @nfb:    The callback data block
2160  * @action: The event triggering the callback
2161  * @hcpu:   The index of the CPU that the event is for
2162  *
2163  * This creates or destroys per-CPU data for fcoe
2164  *
2165  * Returns NOTIFY_OK always.
2166  */
2167 static int bnx2fc_cpu_callback(struct notifier_block *nfb,
2168 			     unsigned long action, void *hcpu)
2169 {
2170 	unsigned cpu = (unsigned long)hcpu;
2171 
2172 	switch (action) {
2173 	case CPU_ONLINE:
2174 	case CPU_ONLINE_FROZEN:
2175 		printk(PFX "CPU %x online: Create Rx thread\n", cpu);
2176 		bnx2fc_percpu_thread_create(cpu);
2177 		break;
2178 	case CPU_DEAD:
2179 	case CPU_DEAD_FROZEN:
2180 		printk(PFX "CPU %x offline: Remove Rx thread\n", cpu);
2181 		bnx2fc_percpu_thread_destroy(cpu);
2182 		break;
2183 	default:
2184 		break;
2185 	}
2186 	return NOTIFY_OK;
2187 }
2188 
2189 /**
2190  * bnx2fc_mod_init - module init entry point
2191  *
2192  * Initialize driver wide global data structures, and register
2193  * with cnic module
2194  **/
2195 static int __init bnx2fc_mod_init(void)
2196 {
2197 	struct fcoe_percpu_s *bg;
2198 	struct task_struct *l2_thread;
2199 	int rc = 0;
2200 	unsigned int cpu = 0;
2201 	struct bnx2fc_percpu_s *p;
2202 
2203 	printk(KERN_INFO PFX "%s", version);
2204 
2205 	/* register as a fcoe transport */
2206 	rc = fcoe_transport_attach(&bnx2fc_transport);
2207 	if (rc) {
2208 		printk(KERN_ERR "failed to register an fcoe transport, check "
2209 			"if libfcoe is loaded\n");
2210 		goto out;
2211 	}
2212 
2213 	INIT_LIST_HEAD(&adapter_list);
2214 	INIT_LIST_HEAD(&if_list);
2215 	mutex_init(&bnx2fc_dev_lock);
2216 	adapter_count = 0;
2217 
2218 	/* Attach FC transport template */
2219 	rc = bnx2fc_attach_transport();
2220 	if (rc)
2221 		goto detach_ft;
2222 
2223 	bnx2fc_wq = alloc_workqueue("bnx2fc", 0, 0);
2224 	if (!bnx2fc_wq) {
2225 		rc = -ENOMEM;
2226 		goto release_bt;
2227 	}
2228 
2229 	bg = &bnx2fc_global;
2230 	skb_queue_head_init(&bg->fcoe_rx_list);
2231 	l2_thread = kthread_create(bnx2fc_l2_rcv_thread,
2232 				   (void *)bg,
2233 				   "bnx2fc_l2_thread");
2234 	if (IS_ERR(l2_thread)) {
2235 		rc = PTR_ERR(l2_thread);
2236 		goto free_wq;
2237 	}
2238 	wake_up_process(l2_thread);
2239 	spin_lock_bh(&bg->fcoe_rx_list.lock);
2240 	bg->thread = l2_thread;
2241 	spin_unlock_bh(&bg->fcoe_rx_list.lock);
2242 
2243 	for_each_possible_cpu(cpu) {
2244 		p = &per_cpu(bnx2fc_percpu, cpu);
2245 		INIT_LIST_HEAD(&p->work_list);
2246 		spin_lock_init(&p->fp_work_lock);
2247 	}
2248 
2249 	for_each_online_cpu(cpu) {
2250 		bnx2fc_percpu_thread_create(cpu);
2251 	}
2252 
2253 	/* Initialize per CPU interrupt thread */
2254 	register_hotcpu_notifier(&bnx2fc_cpu_notifier);
2255 
2256 	cnic_register_driver(CNIC_ULP_FCOE, &bnx2fc_cnic_cb);
2257 
2258 	return 0;
2259 
2260 free_wq:
2261 	destroy_workqueue(bnx2fc_wq);
2262 release_bt:
2263 	bnx2fc_release_transport();
2264 detach_ft:
2265 	fcoe_transport_detach(&bnx2fc_transport);
2266 out:
2267 	return rc;
2268 }
2269 
2270 static void __exit bnx2fc_mod_exit(void)
2271 {
2272 	LIST_HEAD(to_be_deleted);
2273 	struct bnx2fc_hba *hba, *next;
2274 	struct fcoe_percpu_s *bg;
2275 	struct task_struct *l2_thread;
2276 	struct sk_buff *skb;
2277 	unsigned int cpu = 0;
2278 
2279 	/*
2280 	 * NOTE: Since cnic calls register_driver routine rtnl_lock,
2281 	 * it will have higher precedence than bnx2fc_dev_lock.
2282 	 * unregister_device() cannot be called with bnx2fc_dev_lock
2283 	 * held.
2284 	 */
2285 	mutex_lock(&bnx2fc_dev_lock);
2286 	list_splice(&adapter_list, &to_be_deleted);
2287 	INIT_LIST_HEAD(&adapter_list);
2288 	adapter_count = 0;
2289 	mutex_unlock(&bnx2fc_dev_lock);
2290 
2291 	/* Unregister with cnic */
2292 	list_for_each_entry_safe(hba, next, &to_be_deleted, list) {
2293 		list_del_init(&hba->list);
2294 		printk(KERN_ERR PFX "MOD_EXIT:destroy hba = 0x%p\n",
2295 		       hba);
2296 		bnx2fc_ulp_stop(hba);
2297 		/* unregister cnic device */
2298 		if (test_and_clear_bit(BNX2FC_CNIC_REGISTERED,
2299 				       &hba->reg_with_cnic))
2300 			hba->cnic->unregister_device(hba->cnic,
2301 							 CNIC_ULP_FCOE);
2302 		bnx2fc_hba_destroy(hba);
2303 	}
2304 	cnic_unregister_driver(CNIC_ULP_FCOE);
2305 
2306 	/* Destroy global thread */
2307 	bg = &bnx2fc_global;
2308 	spin_lock_bh(&bg->fcoe_rx_list.lock);
2309 	l2_thread = bg->thread;
2310 	bg->thread = NULL;
2311 	while ((skb = __skb_dequeue(&bg->fcoe_rx_list)) != NULL)
2312 		kfree_skb(skb);
2313 
2314 	spin_unlock_bh(&bg->fcoe_rx_list.lock);
2315 
2316 	if (l2_thread)
2317 		kthread_stop(l2_thread);
2318 
2319 	unregister_hotcpu_notifier(&bnx2fc_cpu_notifier);
2320 
2321 	/* Destroy per cpu threads */
2322 	for_each_online_cpu(cpu) {
2323 		bnx2fc_percpu_thread_destroy(cpu);
2324 	}
2325 
2326 	destroy_workqueue(bnx2fc_wq);
2327 	/*
2328 	 * detach from scsi transport
2329 	 * must happen after all destroys are done
2330 	 */
2331 	bnx2fc_release_transport();
2332 
2333 	/* detach from fcoe transport */
2334 	fcoe_transport_detach(&bnx2fc_transport);
2335 }
2336 
2337 module_init(bnx2fc_mod_init);
2338 module_exit(bnx2fc_mod_exit);
2339 
2340 static struct fc_function_template bnx2fc_transport_function = {
2341 	.show_host_node_name = 1,
2342 	.show_host_port_name = 1,
2343 	.show_host_supported_classes = 1,
2344 	.show_host_supported_fc4s = 1,
2345 	.show_host_active_fc4s = 1,
2346 	.show_host_maxframe_size = 1,
2347 
2348 	.show_host_port_id = 1,
2349 	.show_host_supported_speeds = 1,
2350 	.get_host_speed = fc_get_host_speed,
2351 	.show_host_speed = 1,
2352 	.show_host_port_type = 1,
2353 	.get_host_port_state = fc_get_host_port_state,
2354 	.show_host_port_state = 1,
2355 	.show_host_symbolic_name = 1,
2356 
2357 	.dd_fcrport_size = (sizeof(struct fc_rport_libfc_priv) +
2358 				sizeof(struct bnx2fc_rport)),
2359 	.show_rport_maxframe_size = 1,
2360 	.show_rport_supported_classes = 1,
2361 
2362 	.show_host_fabric_name = 1,
2363 	.show_starget_node_name = 1,
2364 	.show_starget_port_name = 1,
2365 	.show_starget_port_id = 1,
2366 	.set_rport_dev_loss_tmo = fc_set_rport_loss_tmo,
2367 	.show_rport_dev_loss_tmo = 1,
2368 	.get_fc_host_stats = bnx2fc_get_host_stats,
2369 
2370 	.issue_fc_host_lip = bnx2fc_fcoe_reset,
2371 
2372 	.terminate_rport_io = fc_rport_terminate_io,
2373 
2374 	.vport_create = bnx2fc_vport_create,
2375 	.vport_delete = bnx2fc_vport_destroy,
2376 	.vport_disable = bnx2fc_vport_disable,
2377 };
2378 
2379 static struct fc_function_template bnx2fc_vport_xport_function = {
2380 	.show_host_node_name = 1,
2381 	.show_host_port_name = 1,
2382 	.show_host_supported_classes = 1,
2383 	.show_host_supported_fc4s = 1,
2384 	.show_host_active_fc4s = 1,
2385 	.show_host_maxframe_size = 1,
2386 
2387 	.show_host_port_id = 1,
2388 	.show_host_supported_speeds = 1,
2389 	.get_host_speed = fc_get_host_speed,
2390 	.show_host_speed = 1,
2391 	.show_host_port_type = 1,
2392 	.get_host_port_state = fc_get_host_port_state,
2393 	.show_host_port_state = 1,
2394 	.show_host_symbolic_name = 1,
2395 
2396 	.dd_fcrport_size = (sizeof(struct fc_rport_libfc_priv) +
2397 				sizeof(struct bnx2fc_rport)),
2398 	.show_rport_maxframe_size = 1,
2399 	.show_rport_supported_classes = 1,
2400 
2401 	.show_host_fabric_name = 1,
2402 	.show_starget_node_name = 1,
2403 	.show_starget_port_name = 1,
2404 	.show_starget_port_id = 1,
2405 	.set_rport_dev_loss_tmo = fc_set_rport_loss_tmo,
2406 	.show_rport_dev_loss_tmo = 1,
2407 	.get_fc_host_stats = fc_get_host_stats,
2408 	.issue_fc_host_lip = bnx2fc_fcoe_reset,
2409 	.terminate_rport_io = fc_rport_terminate_io,
2410 };
2411 
2412 /**
2413  * scsi_host_template structure used while registering with SCSI-ml
2414  */
2415 static struct scsi_host_template bnx2fc_shost_template = {
2416 	.module			= THIS_MODULE,
2417 	.name			= "Broadcom Offload FCoE Initiator",
2418 	.queuecommand		= bnx2fc_queuecommand,
2419 	.eh_abort_handler	= bnx2fc_eh_abort,	  /* abts */
2420 	.eh_device_reset_handler = bnx2fc_eh_device_reset, /* lun reset */
2421 	.eh_target_reset_handler = bnx2fc_eh_target_reset, /* tgt reset */
2422 	.eh_host_reset_handler	= fc_eh_host_reset,
2423 	.slave_alloc		= fc_slave_alloc,
2424 	.change_queue_depth	= fc_change_queue_depth,
2425 	.change_queue_type	= fc_change_queue_type,
2426 	.this_id		= -1,
2427 	.cmd_per_lun		= 3,
2428 	.can_queue		= BNX2FC_CAN_QUEUE,
2429 	.use_clustering		= ENABLE_CLUSTERING,
2430 	.sg_tablesize		= BNX2FC_MAX_BDS_PER_CMD,
2431 	.max_sectors		= 512,
2432 };
2433 
2434 static struct libfc_function_template bnx2fc_libfc_fcn_templ = {
2435 	.frame_send		= bnx2fc_xmit,
2436 	.elsct_send		= bnx2fc_elsct_send,
2437 	.fcp_abort_io		= bnx2fc_abort_io,
2438 	.fcp_cleanup		= bnx2fc_cleanup,
2439 	.rport_event_callback	= bnx2fc_rport_event_handler,
2440 };
2441 
2442 /**
2443  * bnx2fc_cnic_cb - global template of bnx2fc - cnic driver interface
2444  *			structure carrying callback function pointers
2445  */
2446 static struct cnic_ulp_ops bnx2fc_cnic_cb = {
2447 	.owner			= THIS_MODULE,
2448 	.cnic_init		= bnx2fc_ulp_init,
2449 	.cnic_exit		= bnx2fc_ulp_exit,
2450 	.cnic_start		= bnx2fc_ulp_start,
2451 	.cnic_stop		= bnx2fc_ulp_stop,
2452 	.indicate_kcqes		= bnx2fc_indicate_kcqe,
2453 	.indicate_netevent	= bnx2fc_indicate_netevent,
2454 };
2455