cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bnx2fc_fcoe.c (78108B)


      1/* bnx2fc_fcoe.c: QLogic 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-2013 Broadcom Corporation
      7 * Copyright (c) 2014-2016 QLogic Corporation
      8 * Copyright (c) 2016-2017 Cavium Inc.
      9 *
     10 * This program is free software; you can redistribute it and/or modify
     11 * it under the terms of the GNU General Public License as published by
     12 * the Free Software Foundation.
     13 *
     14 * Written by: Bhanu Prakash Gollapudi (bprakash@broadcom.com)
     15 */
     16
     17#include "bnx2fc.h"
     18
     19#include <linux/ethtool.h>
     20
     21static struct list_head adapter_list;
     22static struct list_head if_list;
     23static u32 adapter_count;
     24static DEFINE_MUTEX(bnx2fc_dev_lock);
     25DEFINE_PER_CPU(struct bnx2fc_percpu_s, bnx2fc_percpu);
     26
     27#define DRV_MODULE_NAME		"bnx2fc"
     28#define DRV_MODULE_VERSION	BNX2FC_VERSION
     29#define DRV_MODULE_RELDATE	"October 15, 2015"
     30
     31
     32static char version[] =
     33		"QLogic FCoE Driver " DRV_MODULE_NAME \
     34		" v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
     35
     36
     37MODULE_AUTHOR("Bhanu Prakash Gollapudi <bprakash@broadcom.com>");
     38MODULE_DESCRIPTION("QLogic FCoE Driver");
     39MODULE_LICENSE("GPL");
     40MODULE_VERSION(DRV_MODULE_VERSION);
     41
     42#define BNX2FC_MAX_QUEUE_DEPTH	256
     43#define BNX2FC_MIN_QUEUE_DEPTH	32
     44#define FCOE_WORD_TO_BYTE  4
     45
     46static struct scsi_transport_template	*bnx2fc_transport_template;
     47static struct scsi_transport_template	*bnx2fc_vport_xport_template;
     48
     49struct workqueue_struct *bnx2fc_wq;
     50
     51/* bnx2fc structure needs only one instance of the fcoe_percpu_s structure.
     52 * Here the io threads are per cpu but the l2 thread is just one
     53 */
     54struct fcoe_percpu_s bnx2fc_global;
     55static DEFINE_SPINLOCK(bnx2fc_global_lock);
     56
     57static struct cnic_ulp_ops bnx2fc_cnic_cb;
     58static struct libfc_function_template bnx2fc_libfc_fcn_templ;
     59static struct scsi_host_template bnx2fc_shost_template;
     60static struct fc_function_template bnx2fc_transport_function;
     61static struct fcoe_sysfs_function_template bnx2fc_fcoe_sysfs_templ;
     62static struct fc_function_template bnx2fc_vport_xport_function;
     63static int bnx2fc_create(struct net_device *netdev, enum fip_mode fip_mode);
     64static void __bnx2fc_destroy(struct bnx2fc_interface *interface);
     65static int bnx2fc_destroy(struct net_device *net_device);
     66static int bnx2fc_enable(struct net_device *netdev);
     67static int bnx2fc_disable(struct net_device *netdev);
     68
     69/* fcoe_syfs control interface handlers */
     70static int bnx2fc_ctlr_alloc(struct net_device *netdev);
     71static int bnx2fc_ctlr_enabled(struct fcoe_ctlr_device *cdev);
     72
     73static void bnx2fc_recv_frame(struct sk_buff *skb);
     74
     75static void bnx2fc_start_disc(struct bnx2fc_interface *interface);
     76static int bnx2fc_shost_config(struct fc_lport *lport, struct device *dev);
     77static int bnx2fc_lport_config(struct fc_lport *lport);
     78static int bnx2fc_em_config(struct fc_lport *lport, struct bnx2fc_hba *hba);
     79static int bnx2fc_bind_adapter_devices(struct bnx2fc_hba *hba);
     80static void bnx2fc_unbind_adapter_devices(struct bnx2fc_hba *hba);
     81static int bnx2fc_bind_pcidev(struct bnx2fc_hba *hba);
     82static void bnx2fc_unbind_pcidev(struct bnx2fc_hba *hba);
     83static struct fc_lport *bnx2fc_if_create(struct bnx2fc_interface *interface,
     84				  struct device *parent, int npiv);
     85static void bnx2fc_port_destroy(struct fcoe_port *port);
     86
     87static struct bnx2fc_hba *bnx2fc_hba_lookup(struct net_device *phys_dev);
     88static struct bnx2fc_interface *bnx2fc_interface_lookup(struct net_device
     89							*phys_dev);
     90static inline void bnx2fc_interface_put(struct bnx2fc_interface *interface);
     91static struct bnx2fc_hba *bnx2fc_find_hba_for_cnic(struct cnic_dev *cnic);
     92
     93static int bnx2fc_fw_init(struct bnx2fc_hba *hba);
     94static void bnx2fc_fw_destroy(struct bnx2fc_hba *hba);
     95
     96static void bnx2fc_port_shutdown(struct fc_lport *lport);
     97static void bnx2fc_stop(struct bnx2fc_interface *interface);
     98static int __init bnx2fc_mod_init(void);
     99static void __exit bnx2fc_mod_exit(void);
    100
    101unsigned int bnx2fc_debug_level;
    102module_param_named(debug_logging, bnx2fc_debug_level, int, S_IRUGO|S_IWUSR);
    103MODULE_PARM_DESC(debug_logging,
    104		"Option to enable extended logging,\n"
    105		"\t\tDefault is 0 - no logging.\n"
    106		"\t\t0x01 - SCSI cmd error, cleanup.\n"
    107		"\t\t0x02 - Session setup, cleanup, etc.\n"
    108		"\t\t0x04 - lport events, link, mtu, etc.\n"
    109		"\t\t0x08 - ELS logs.\n"
    110		"\t\t0x10 - fcoe L2 fame related logs.\n"
    111		"\t\t0xff - LOG all messages.");
    112
    113static uint bnx2fc_devloss_tmo;
    114module_param_named(devloss_tmo, bnx2fc_devloss_tmo, uint, S_IRUGO);
    115MODULE_PARM_DESC(devloss_tmo, " Change devloss_tmo for the remote ports "
    116	"attached via bnx2fc.");
    117
    118static uint bnx2fc_max_luns = BNX2FC_MAX_LUN;
    119module_param_named(max_luns, bnx2fc_max_luns, uint, S_IRUGO);
    120MODULE_PARM_DESC(max_luns, " Change the default max_lun per SCSI host. Default "
    121	"0xffff.");
    122
    123static uint bnx2fc_queue_depth;
    124module_param_named(queue_depth, bnx2fc_queue_depth, uint, S_IRUGO);
    125MODULE_PARM_DESC(queue_depth, " Change the default queue depth of SCSI devices "
    126	"attached via bnx2fc.");
    127
    128static uint bnx2fc_log_fka;
    129module_param_named(log_fka, bnx2fc_log_fka, uint, S_IRUGO|S_IWUSR);
    130MODULE_PARM_DESC(log_fka, " Print message to kernel log when fcoe is "
    131	"initiating a FIP keep alive when debug logging is enabled.");
    132
    133static inline struct net_device *bnx2fc_netdev(const struct fc_lport *lport)
    134{
    135	return ((struct bnx2fc_interface *)
    136		((struct fcoe_port *)lport_priv(lport))->priv)->netdev;
    137}
    138
    139static void bnx2fc_fcf_get_vlan_id(struct fcoe_fcf_device *fcf_dev)
    140{
    141	struct fcoe_ctlr_device *ctlr_dev =
    142		fcoe_fcf_dev_to_ctlr_dev(fcf_dev);
    143	struct fcoe_ctlr *ctlr = fcoe_ctlr_device_priv(ctlr_dev);
    144	struct bnx2fc_interface *fcoe = fcoe_ctlr_priv(ctlr);
    145
    146	fcf_dev->vlan_id = fcoe->vlan_id;
    147}
    148
    149static void bnx2fc_clean_rx_queue(struct fc_lport *lp)
    150{
    151	struct fcoe_percpu_s *bg;
    152	struct fcoe_rcv_info *fr;
    153	struct sk_buff_head *list;
    154	struct sk_buff *skb, *next;
    155
    156	bg = &bnx2fc_global;
    157	spin_lock_bh(&bg->fcoe_rx_list.lock);
    158	list = &bg->fcoe_rx_list;
    159	skb_queue_walk_safe(list, skb, next) {
    160		fr = fcoe_dev_from_skb(skb);
    161		if (fr->fr_dev == lp) {
    162			__skb_unlink(skb, list);
    163			kfree_skb(skb);
    164		}
    165	}
    166	spin_unlock_bh(&bg->fcoe_rx_list.lock);
    167}
    168
    169int bnx2fc_get_paged_crc_eof(struct sk_buff *skb, int tlen)
    170{
    171	int rc;
    172	spin_lock(&bnx2fc_global_lock);
    173	rc = fcoe_get_paged_crc_eof(skb, tlen, &bnx2fc_global);
    174	spin_unlock(&bnx2fc_global_lock);
    175
    176	return rc;
    177}
    178
    179static void bnx2fc_abort_io(struct fc_lport *lport)
    180{
    181	/*
    182	 * This function is no-op for bnx2fc, but we do
    183	 * not want to leave it as NULL either, as libfc
    184	 * can call the default function which is
    185	 * fc_fcp_abort_io.
    186	 */
    187}
    188
    189static void bnx2fc_cleanup(struct fc_lport *lport)
    190{
    191	struct fcoe_port *port = lport_priv(lport);
    192	struct bnx2fc_interface *interface = port->priv;
    193	struct bnx2fc_hba *hba = interface->hba;
    194	struct bnx2fc_rport *tgt;
    195	int i;
    196
    197	BNX2FC_MISC_DBG("Entered %s\n", __func__);
    198	mutex_lock(&hba->hba_mutex);
    199	spin_lock_bh(&hba->hba_lock);
    200	for (i = 0; i < BNX2FC_NUM_MAX_SESS; i++) {
    201		tgt = hba->tgt_ofld_list[i];
    202		if (tgt) {
    203			/* Cleanup IOs belonging to requested vport */
    204			if (tgt->port == port) {
    205				spin_unlock_bh(&hba->hba_lock);
    206				BNX2FC_TGT_DBG(tgt, "flush/cleanup\n");
    207				bnx2fc_flush_active_ios(tgt);
    208				spin_lock_bh(&hba->hba_lock);
    209			}
    210		}
    211	}
    212	spin_unlock_bh(&hba->hba_lock);
    213	mutex_unlock(&hba->hba_mutex);
    214}
    215
    216static int bnx2fc_xmit_l2_frame(struct bnx2fc_rport *tgt,
    217			     struct fc_frame *fp)
    218{
    219	struct fc_rport_priv *rdata = tgt->rdata;
    220	struct fc_frame_header *fh;
    221	int rc = 0;
    222
    223	fh = fc_frame_header_get(fp);
    224	BNX2FC_TGT_DBG(tgt, "Xmit L2 frame rport = 0x%x, oxid = 0x%x, "
    225			"r_ctl = 0x%x\n", rdata->ids.port_id,
    226			ntohs(fh->fh_ox_id), fh->fh_r_ctl);
    227	if ((fh->fh_type == FC_TYPE_ELS) &&
    228	    (fh->fh_r_ctl == FC_RCTL_ELS_REQ)) {
    229
    230		switch (fc_frame_payload_op(fp)) {
    231		case ELS_ADISC:
    232			rc = bnx2fc_send_adisc(tgt, fp);
    233			break;
    234		case ELS_LOGO:
    235			rc = bnx2fc_send_logo(tgt, fp);
    236			break;
    237		case ELS_RLS:
    238			rc = bnx2fc_send_rls(tgt, fp);
    239			break;
    240		default:
    241			break;
    242		}
    243	} else if ((fh->fh_type ==  FC_TYPE_BLS) &&
    244	    (fh->fh_r_ctl == FC_RCTL_BA_ABTS))
    245		BNX2FC_TGT_DBG(tgt, "ABTS frame\n");
    246	else {
    247		BNX2FC_TGT_DBG(tgt, "Send L2 frame type 0x%x "
    248				"rctl 0x%x thru non-offload path\n",
    249				fh->fh_type, fh->fh_r_ctl);
    250		return -ENODEV;
    251	}
    252	if (rc)
    253		return -ENOMEM;
    254	else
    255		return 0;
    256}
    257
    258/**
    259 * bnx2fc_xmit - bnx2fc's FCoE frame transmit function
    260 *
    261 * @lport:	the associated local port
    262 * @fp:	the fc_frame to be transmitted
    263 */
    264static int bnx2fc_xmit(struct fc_lport *lport, struct fc_frame *fp)
    265{
    266	struct ethhdr		*eh;
    267	struct fcoe_crc_eof	*cp;
    268	struct sk_buff		*skb;
    269	struct fc_frame_header	*fh;
    270	struct bnx2fc_interface	*interface;
    271	struct fcoe_ctlr        *ctlr;
    272	struct bnx2fc_hba *hba;
    273	struct fcoe_port	*port;
    274	struct fcoe_hdr		*hp;
    275	struct bnx2fc_rport	*tgt;
    276	u8			sof, eof;
    277	u32			crc;
    278	unsigned int		hlen, tlen, elen;
    279	int			wlen, rc = 0;
    280
    281	port = (struct fcoe_port *)lport_priv(lport);
    282	interface = port->priv;
    283	ctlr = bnx2fc_to_ctlr(interface);
    284	hba = interface->hba;
    285
    286	fh = fc_frame_header_get(fp);
    287
    288	skb = fp_skb(fp);
    289	if (!lport->link_up) {
    290		BNX2FC_HBA_DBG(lport, "bnx2fc_xmit link down\n");
    291		kfree_skb(skb);
    292		return 0;
    293	}
    294
    295	if (unlikely(fh->fh_r_ctl == FC_RCTL_ELS_REQ)) {
    296		if (!ctlr->sel_fcf) {
    297			BNX2FC_HBA_DBG(lport, "FCF not selected yet!\n");
    298			kfree_skb(skb);
    299			return -EINVAL;
    300		}
    301		if (fcoe_ctlr_els_send(ctlr, lport, skb))
    302			return 0;
    303	}
    304
    305	sof = fr_sof(fp);
    306	eof = fr_eof(fp);
    307
    308	/*
    309	 * Snoop the frame header to check if the frame is for
    310	 * an offloaded session
    311	 */
    312	/*
    313	 * tgt_ofld_list access is synchronized using
    314	 * both hba mutex and hba lock. Atleast hba mutex or
    315	 * hba lock needs to be held for read access.
    316	 */
    317
    318	spin_lock_bh(&hba->hba_lock);
    319	tgt = bnx2fc_tgt_lookup(port, ntoh24(fh->fh_d_id));
    320	if (tgt && (test_bit(BNX2FC_FLAG_SESSION_READY, &tgt->flags))) {
    321		/* This frame is for offloaded session */
    322		BNX2FC_HBA_DBG(lport, "xmit: Frame is for offloaded session "
    323				"port_id = 0x%x\n", ntoh24(fh->fh_d_id));
    324		spin_unlock_bh(&hba->hba_lock);
    325		rc = bnx2fc_xmit_l2_frame(tgt, fp);
    326		if (rc != -ENODEV) {
    327			kfree_skb(skb);
    328			return rc;
    329		}
    330	} else {
    331		spin_unlock_bh(&hba->hba_lock);
    332	}
    333
    334	elen = sizeof(struct ethhdr);
    335	hlen = sizeof(struct fcoe_hdr);
    336	tlen = sizeof(struct fcoe_crc_eof);
    337	wlen = (skb->len - tlen + sizeof(crc)) / FCOE_WORD_TO_BYTE;
    338
    339	skb->ip_summed = CHECKSUM_NONE;
    340	crc = fcoe_fc_crc(fp);
    341
    342	/* copy port crc and eof to the skb buff */
    343	if (skb_is_nonlinear(skb)) {
    344		skb_frag_t *frag;
    345		if (bnx2fc_get_paged_crc_eof(skb, tlen)) {
    346			kfree_skb(skb);
    347			return -ENOMEM;
    348		}
    349		frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1];
    350		cp = kmap_atomic(skb_frag_page(frag)) + skb_frag_off(frag);
    351	} else {
    352		cp = skb_put(skb, tlen);
    353	}
    354
    355	memset(cp, 0, sizeof(*cp));
    356	cp->fcoe_eof = eof;
    357	cp->fcoe_crc32 = cpu_to_le32(~crc);
    358	if (skb_is_nonlinear(skb)) {
    359		kunmap_atomic(cp);
    360		cp = NULL;
    361	}
    362
    363	/* adjust skb network/transport offsets to match mac/fcoe/port */
    364	skb_push(skb, elen + hlen);
    365	skb_reset_mac_header(skb);
    366	skb_reset_network_header(skb);
    367	skb->mac_len = elen;
    368	skb->protocol = htons(ETH_P_FCOE);
    369	skb->dev = interface->netdev;
    370
    371	/* fill up mac and fcoe headers */
    372	eh = eth_hdr(skb);
    373	eh->h_proto = htons(ETH_P_FCOE);
    374	if (ctlr->map_dest)
    375		fc_fcoe_set_mac(eh->h_dest, fh->fh_d_id);
    376	else
    377		/* insert GW address */
    378		memcpy(eh->h_dest, ctlr->dest_addr, ETH_ALEN);
    379
    380	if (unlikely(ctlr->flogi_oxid != FC_XID_UNKNOWN))
    381		memcpy(eh->h_source, ctlr->ctl_src_addr, ETH_ALEN);
    382	else
    383		memcpy(eh->h_source, port->data_src_addr, ETH_ALEN);
    384
    385	hp = (struct fcoe_hdr *)(eh + 1);
    386	memset(hp, 0, sizeof(*hp));
    387	if (FC_FCOE_VER)
    388		FC_FCOE_ENCAPS_VER(hp, FC_FCOE_VER);
    389	hp->fcoe_sof = sof;
    390
    391	/* fcoe lso, mss is in max_payload which is non-zero for FCP data */
    392	if (lport->seq_offload && fr_max_payload(fp)) {
    393		skb_shinfo(skb)->gso_type = SKB_GSO_FCOE;
    394		skb_shinfo(skb)->gso_size = fr_max_payload(fp);
    395	} else {
    396		skb_shinfo(skb)->gso_type = 0;
    397		skb_shinfo(skb)->gso_size = 0;
    398	}
    399
    400	/*update tx stats */
    401	this_cpu_inc(lport->stats->TxFrames);
    402	this_cpu_add(lport->stats->TxWords, wlen);
    403
    404	/* send down to lld */
    405	fr_dev(fp) = lport;
    406	if (port->fcoe_pending_queue.qlen)
    407		fcoe_check_wait_queue(lport, skb);
    408	else if (fcoe_start_io(skb))
    409		fcoe_check_wait_queue(lport, skb);
    410
    411	return 0;
    412}
    413
    414/**
    415 * bnx2fc_rcv - This is bnx2fc's receive function called by NET_RX_SOFTIRQ
    416 *
    417 * @skb:	the receive socket buffer
    418 * @dev:	associated net device
    419 * @ptype:	context
    420 * @olddev:	last device
    421 *
    422 * This function receives the packet and builds FC frame and passes it up
    423 */
    424static int bnx2fc_rcv(struct sk_buff *skb, struct net_device *dev,
    425		struct packet_type *ptype, struct net_device *olddev)
    426{
    427	struct fc_lport *lport;
    428	struct bnx2fc_interface *interface;
    429	struct fcoe_ctlr *ctlr;
    430	struct fcoe_rcv_info *fr;
    431	struct fcoe_percpu_s *bg;
    432	struct sk_buff *tmp_skb;
    433
    434	interface = container_of(ptype, struct bnx2fc_interface,
    435				 fcoe_packet_type);
    436	ctlr = bnx2fc_to_ctlr(interface);
    437	lport = ctlr->lp;
    438
    439	if (unlikely(lport == NULL)) {
    440		printk(KERN_ERR PFX "bnx2fc_rcv: lport is NULL\n");
    441		goto err;
    442	}
    443
    444	tmp_skb = skb_share_check(skb, GFP_ATOMIC);
    445	if (!tmp_skb)
    446		goto err;
    447
    448	skb = tmp_skb;
    449
    450	if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) {
    451		printk(KERN_ERR PFX "bnx2fc_rcv: Wrong FC type frame\n");
    452		goto err;
    453	}
    454
    455	/*
    456	 * Check for minimum frame length, and make sure required FCoE
    457	 * and FC headers are pulled into the linear data area.
    458	 */
    459	if (unlikely((skb->len < FCOE_MIN_FRAME) ||
    460	    !pskb_may_pull(skb, FCOE_HEADER_LEN)))
    461		goto err;
    462
    463	skb_set_transport_header(skb, sizeof(struct fcoe_hdr));
    464
    465	fr = fcoe_dev_from_skb(skb);
    466	fr->fr_dev = lport;
    467
    468	bg = &bnx2fc_global;
    469	spin_lock(&bg->fcoe_rx_list.lock);
    470
    471	__skb_queue_tail(&bg->fcoe_rx_list, skb);
    472	if (bg->fcoe_rx_list.qlen == 1)
    473		wake_up_process(bg->kthread);
    474
    475	spin_unlock(&bg->fcoe_rx_list.lock);
    476
    477	return 0;
    478err:
    479	kfree_skb(skb);
    480	return -1;
    481}
    482
    483static int bnx2fc_l2_rcv_thread(void *arg)
    484{
    485	struct fcoe_percpu_s *bg = arg;
    486	struct sk_buff *skb;
    487
    488	set_user_nice(current, MIN_NICE);
    489	set_current_state(TASK_INTERRUPTIBLE);
    490	while (!kthread_should_stop()) {
    491		schedule();
    492		spin_lock_bh(&bg->fcoe_rx_list.lock);
    493		while ((skb = __skb_dequeue(&bg->fcoe_rx_list)) != NULL) {
    494			spin_unlock_bh(&bg->fcoe_rx_list.lock);
    495			bnx2fc_recv_frame(skb);
    496			spin_lock_bh(&bg->fcoe_rx_list.lock);
    497		}
    498		__set_current_state(TASK_INTERRUPTIBLE);
    499		spin_unlock_bh(&bg->fcoe_rx_list.lock);
    500	}
    501	__set_current_state(TASK_RUNNING);
    502	return 0;
    503}
    504
    505
    506static void bnx2fc_recv_frame(struct sk_buff *skb)
    507{
    508	u64 crc_err;
    509	u32 fr_len, fr_crc;
    510	struct fc_lport *lport;
    511	struct fcoe_rcv_info *fr;
    512	struct fc_frame_header *fh;
    513	struct fcoe_crc_eof crc_eof;
    514	struct fc_frame *fp;
    515	struct fc_lport *vn_port;
    516	struct fcoe_port *port, *phys_port;
    517	u8 *mac = NULL;
    518	u8 *dest_mac = NULL;
    519	struct fcoe_hdr *hp;
    520	struct bnx2fc_interface *interface;
    521	struct fcoe_ctlr *ctlr;
    522
    523	fr = fcoe_dev_from_skb(skb);
    524	lport = fr->fr_dev;
    525	if (unlikely(lport == NULL)) {
    526		printk(KERN_ERR PFX "Invalid lport struct\n");
    527		kfree_skb(skb);
    528		return;
    529	}
    530
    531	if (skb_is_nonlinear(skb))
    532		skb_linearize(skb);
    533	mac = eth_hdr(skb)->h_source;
    534	dest_mac = eth_hdr(skb)->h_dest;
    535
    536	/* Pull the header */
    537	hp = (struct fcoe_hdr *) skb_network_header(skb);
    538	fh = (struct fc_frame_header *) skb_transport_header(skb);
    539	skb_pull(skb, sizeof(struct fcoe_hdr));
    540	fr_len = skb->len - sizeof(struct fcoe_crc_eof);
    541
    542	this_cpu_inc(lport->stats->RxFrames);
    543	this_cpu_add(lport->stats->RxWords, fr_len / FCOE_WORD_TO_BYTE);
    544
    545	fp = (struct fc_frame *)skb;
    546	fc_frame_init(fp);
    547	fr_dev(fp) = lport;
    548	fr_sof(fp) = hp->fcoe_sof;
    549	if (skb_copy_bits(skb, fr_len, &crc_eof, sizeof(crc_eof))) {
    550		kfree_skb(skb);
    551		return;
    552	}
    553	fr_eof(fp) = crc_eof.fcoe_eof;
    554	fr_crc(fp) = crc_eof.fcoe_crc32;
    555	if (pskb_trim(skb, fr_len)) {
    556		kfree_skb(skb);
    557		return;
    558	}
    559
    560	phys_port = lport_priv(lport);
    561	interface = phys_port->priv;
    562	ctlr = bnx2fc_to_ctlr(interface);
    563
    564	fh = fc_frame_header_get(fp);
    565
    566	if (ntoh24(&dest_mac[3]) != ntoh24(fh->fh_d_id)) {
    567		BNX2FC_HBA_DBG(lport, "FC frame d_id mismatch with MAC %pM.\n",
    568		    dest_mac);
    569		kfree_skb(skb);
    570		return;
    571	}
    572
    573	vn_port = fc_vport_id_lookup(lport, ntoh24(fh->fh_d_id));
    574	if (vn_port) {
    575		port = lport_priv(vn_port);
    576		if (!ether_addr_equal(port->data_src_addr, dest_mac)) {
    577			BNX2FC_HBA_DBG(lport, "fpma mismatch\n");
    578			kfree_skb(skb);
    579			return;
    580		}
    581	}
    582	if (ctlr->state) {
    583		if (!ether_addr_equal(mac, ctlr->dest_addr)) {
    584			BNX2FC_HBA_DBG(lport, "Wrong source address: mac:%pM dest_addr:%pM.\n",
    585			    mac, ctlr->dest_addr);
    586			kfree_skb(skb);
    587			return;
    588		}
    589	}
    590	if (fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA &&
    591	    fh->fh_type == FC_TYPE_FCP) {
    592		/* Drop FCP data. We dont this in L2 path */
    593		kfree_skb(skb);
    594		return;
    595	}
    596	if (fh->fh_r_ctl == FC_RCTL_ELS_REQ &&
    597	    fh->fh_type == FC_TYPE_ELS) {
    598		switch (fc_frame_payload_op(fp)) {
    599		case ELS_LOGO:
    600			if (ntoh24(fh->fh_s_id) == FC_FID_FLOGI) {
    601				/* drop non-FIP LOGO */
    602				kfree_skb(skb);
    603				return;
    604			}
    605			break;
    606		}
    607	}
    608
    609	if (fh->fh_r_ctl == FC_RCTL_BA_ABTS) {
    610		/* Drop incoming ABTS */
    611		kfree_skb(skb);
    612		return;
    613	}
    614
    615	/*
    616	 * If the destination ID from the frame header does not match what we
    617	 * have on record for lport and the search for a NPIV port came up
    618	 * empty then this is not addressed to our port so simply drop it.
    619	 */
    620	if (lport->port_id != ntoh24(fh->fh_d_id) && !vn_port) {
    621		BNX2FC_HBA_DBG(lport, "Dropping frame due to destination mismatch: lport->port_id=%x fh->d_id=%x.\n",
    622		    lport->port_id, ntoh24(fh->fh_d_id));
    623		kfree_skb(skb);
    624		return;
    625	}
    626
    627	fr_crc = le32_to_cpu(fr_crc(fp));
    628
    629	if (unlikely(fr_crc != ~crc32(~0, skb->data, fr_len))) {
    630		crc_err = this_cpu_inc_return(lport->stats->InvalidCRCCount);
    631		if (crc_err < 5)
    632			printk(KERN_WARNING PFX "dropping frame with "
    633			       "CRC error\n");
    634		kfree_skb(skb);
    635		return;
    636	}
    637	fc_exch_recv(lport, fp);
    638}
    639
    640/**
    641 * bnx2fc_percpu_io_thread - thread per cpu for ios
    642 *
    643 * @arg:	ptr to bnx2fc_percpu_info structure
    644 */
    645static int bnx2fc_percpu_io_thread(void *arg)
    646{
    647	struct bnx2fc_percpu_s *p = arg;
    648	struct bnx2fc_work *work, *tmp;
    649	LIST_HEAD(work_list);
    650
    651	set_user_nice(current, MIN_NICE);
    652	set_current_state(TASK_INTERRUPTIBLE);
    653	while (!kthread_should_stop()) {
    654		schedule();
    655		spin_lock_bh(&p->fp_work_lock);
    656		while (!list_empty(&p->work_list)) {
    657			list_splice_init(&p->work_list, &work_list);
    658			spin_unlock_bh(&p->fp_work_lock);
    659
    660			list_for_each_entry_safe(work, tmp, &work_list, list) {
    661				list_del_init(&work->list);
    662				bnx2fc_process_cq_compl(work->tgt, work->wqe,
    663							work->rq_data,
    664							work->num_rq,
    665							work->task);
    666				kfree(work);
    667			}
    668
    669			spin_lock_bh(&p->fp_work_lock);
    670		}
    671		__set_current_state(TASK_INTERRUPTIBLE);
    672		spin_unlock_bh(&p->fp_work_lock);
    673	}
    674	__set_current_state(TASK_RUNNING);
    675
    676	return 0;
    677}
    678
    679static struct fc_host_statistics *bnx2fc_get_host_stats(struct Scsi_Host *shost)
    680{
    681	struct fc_host_statistics *bnx2fc_stats;
    682	struct fc_lport *lport = shost_priv(shost);
    683	struct fcoe_port *port = lport_priv(lport);
    684	struct bnx2fc_interface *interface = port->priv;
    685	struct bnx2fc_hba *hba = interface->hba;
    686	struct fcoe_statistics_params *fw_stats;
    687	int rc = 0;
    688
    689	fw_stats = (struct fcoe_statistics_params *)hba->stats_buffer;
    690	if (!fw_stats)
    691		return NULL;
    692
    693	mutex_lock(&hba->hba_stats_mutex);
    694
    695	bnx2fc_stats = fc_get_host_stats(shost);
    696
    697	init_completion(&hba->stat_req_done);
    698	if (bnx2fc_send_stat_req(hba))
    699		goto unlock_stats_mutex;
    700	rc = wait_for_completion_timeout(&hba->stat_req_done, (2 * HZ));
    701	if (!rc) {
    702		BNX2FC_HBA_DBG(lport, "FW stat req timed out\n");
    703		goto unlock_stats_mutex;
    704	}
    705	BNX2FC_STATS(hba, rx_stat2, fc_crc_cnt);
    706	bnx2fc_stats->invalid_crc_count += hba->bfw_stats.fc_crc_cnt;
    707	BNX2FC_STATS(hba, tx_stat, fcoe_tx_pkt_cnt);
    708	bnx2fc_stats->tx_frames += hba->bfw_stats.fcoe_tx_pkt_cnt;
    709	BNX2FC_STATS(hba, tx_stat, fcoe_tx_byte_cnt);
    710	bnx2fc_stats->tx_words += ((hba->bfw_stats.fcoe_tx_byte_cnt) / 4);
    711	BNX2FC_STATS(hba, rx_stat0, fcoe_rx_pkt_cnt);
    712	bnx2fc_stats->rx_frames += hba->bfw_stats.fcoe_rx_pkt_cnt;
    713	BNX2FC_STATS(hba, rx_stat0, fcoe_rx_byte_cnt);
    714	bnx2fc_stats->rx_words += ((hba->bfw_stats.fcoe_rx_byte_cnt) / 4);
    715
    716	bnx2fc_stats->dumped_frames = 0;
    717	bnx2fc_stats->lip_count = 0;
    718	bnx2fc_stats->nos_count = 0;
    719	bnx2fc_stats->loss_of_sync_count = 0;
    720	bnx2fc_stats->loss_of_signal_count = 0;
    721	bnx2fc_stats->prim_seq_protocol_err_count = 0;
    722
    723	memcpy(&hba->prev_stats, hba->stats_buffer,
    724	       sizeof(struct fcoe_statistics_params));
    725
    726unlock_stats_mutex:
    727	mutex_unlock(&hba->hba_stats_mutex);
    728	return bnx2fc_stats;
    729}
    730
    731static int bnx2fc_shost_config(struct fc_lport *lport, struct device *dev)
    732{
    733	struct fcoe_port *port = lport_priv(lport);
    734	struct bnx2fc_interface *interface = port->priv;
    735	struct bnx2fc_hba *hba = interface->hba;
    736	struct Scsi_Host *shost = lport->host;
    737	int rc = 0;
    738
    739	shost->max_cmd_len = BNX2FC_MAX_CMD_LEN;
    740	shost->max_lun = bnx2fc_max_luns;
    741	shost->max_id = BNX2FC_MAX_FCP_TGT;
    742	shost->max_channel = 0;
    743	if (lport->vport)
    744		shost->transportt = bnx2fc_vport_xport_template;
    745	else
    746		shost->transportt = bnx2fc_transport_template;
    747
    748	/* Add the new host to SCSI-ml */
    749	rc = scsi_add_host(lport->host, dev);
    750	if (rc) {
    751		printk(KERN_ERR PFX "Error on scsi_add_host\n");
    752		return rc;
    753	}
    754	if (!lport->vport)
    755		fc_host_max_npiv_vports(lport->host) = USHRT_MAX;
    756	snprintf(fc_host_symbolic_name(lport->host), 256,
    757		 "%s (QLogic %s) v%s over %s",
    758		BNX2FC_NAME, hba->chip_num, BNX2FC_VERSION,
    759		interface->netdev->name);
    760
    761	return 0;
    762}
    763
    764static int bnx2fc_link_ok(struct fc_lport *lport)
    765{
    766	struct fcoe_port *port = lport_priv(lport);
    767	struct bnx2fc_interface *interface = port->priv;
    768	struct bnx2fc_hba *hba = interface->hba;
    769	struct net_device *dev = hba->phys_dev;
    770	int rc = 0;
    771
    772	if ((dev->flags & IFF_UP) && netif_carrier_ok(dev))
    773		clear_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state);
    774	else {
    775		set_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state);
    776		rc = -1;
    777	}
    778	return rc;
    779}
    780
    781/**
    782 * bnx2fc_get_link_state - get network link state
    783 *
    784 * @hba:	adapter instance pointer
    785 *
    786 * updates adapter structure flag based on netdev state
    787 */
    788void bnx2fc_get_link_state(struct bnx2fc_hba *hba)
    789{
    790	if (test_bit(__LINK_STATE_NOCARRIER, &hba->phys_dev->state))
    791		set_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state);
    792	else
    793		clear_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state);
    794}
    795
    796static int bnx2fc_net_config(struct fc_lport *lport, struct net_device *netdev)
    797{
    798	struct bnx2fc_hba *hba;
    799	struct bnx2fc_interface *interface;
    800	struct fcoe_ctlr *ctlr;
    801	struct fcoe_port *port;
    802	u64 wwnn, wwpn;
    803
    804	port = lport_priv(lport);
    805	interface = port->priv;
    806	ctlr = bnx2fc_to_ctlr(interface);
    807	hba = interface->hba;
    808
    809	/* require support for get_pauseparam ethtool op. */
    810	if (!hba->phys_dev->ethtool_ops ||
    811	    !hba->phys_dev->ethtool_ops->get_pauseparam)
    812		return -EOPNOTSUPP;
    813
    814	if (fc_set_mfs(lport, BNX2FC_MFS))
    815		return -EINVAL;
    816
    817	skb_queue_head_init(&port->fcoe_pending_queue);
    818	port->fcoe_pending_queue_active = 0;
    819	timer_setup(&port->timer, fcoe_queue_timer, 0);
    820
    821	fcoe_link_speed_update(lport);
    822
    823	if (!lport->vport) {
    824		if (fcoe_get_wwn(netdev, &wwnn, NETDEV_FCOE_WWNN))
    825			wwnn = fcoe_wwn_from_mac(ctlr->ctl_src_addr,
    826						 1, 0);
    827		BNX2FC_HBA_DBG(lport, "WWNN = 0x%llx\n", wwnn);
    828		fc_set_wwnn(lport, wwnn);
    829
    830		if (fcoe_get_wwn(netdev, &wwpn, NETDEV_FCOE_WWPN))
    831			wwpn = fcoe_wwn_from_mac(ctlr->ctl_src_addr,
    832						 2, 0);
    833
    834		BNX2FC_HBA_DBG(lport, "WWPN = 0x%llx\n", wwpn);
    835		fc_set_wwpn(lport, wwpn);
    836	}
    837
    838	return 0;
    839}
    840
    841static void bnx2fc_destroy_timer(struct timer_list *t)
    842{
    843	struct bnx2fc_hba *hba = from_timer(hba, t, destroy_timer);
    844
    845	printk(KERN_ERR PFX "ERROR:bnx2fc_destroy_timer - "
    846	       "Destroy compl not received!!\n");
    847	set_bit(BNX2FC_FLAG_DESTROY_CMPL, &hba->flags);
    848	wake_up_interruptible(&hba->destroy_wait);
    849}
    850
    851/**
    852 * bnx2fc_indicate_netevent - Generic netdev event handler
    853 *
    854 * @context:	adapter structure pointer
    855 * @event:	event type
    856 * @vlan_id:	vlan id - associated vlan id with this event
    857 *
    858 * Handles NETDEV_UP, NETDEV_DOWN, NETDEV_GOING_DOWN,NETDEV_CHANGE and
    859 * NETDEV_CHANGE_MTU events. Handle NETDEV_UNREGISTER only for vlans.
    860 */
    861static void bnx2fc_indicate_netevent(void *context, unsigned long event,
    862				     u16 vlan_id)
    863{
    864	struct bnx2fc_hba *hba = (struct bnx2fc_hba *)context;
    865	struct fcoe_ctlr_device *cdev;
    866	struct fc_lport *lport;
    867	struct fc_lport *vport;
    868	struct bnx2fc_interface *interface, *tmp;
    869	struct fcoe_ctlr *ctlr;
    870	int wait_for_upload = 0;
    871	u32 link_possible = 1;
    872
    873	if (vlan_id != 0 && event != NETDEV_UNREGISTER)
    874		return;
    875
    876	switch (event) {
    877	case NETDEV_UP:
    878		if (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state))
    879			printk(KERN_ERR "indicate_netevent: "\
    880					"hba is not UP!!\n");
    881		break;
    882
    883	case NETDEV_DOWN:
    884		clear_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state);
    885		clear_bit(ADAPTER_STATE_UP, &hba->adapter_state);
    886		link_possible = 0;
    887		break;
    888
    889	case NETDEV_GOING_DOWN:
    890		set_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state);
    891		link_possible = 0;
    892		break;
    893
    894	case NETDEV_CHANGE:
    895		break;
    896
    897	case NETDEV_UNREGISTER:
    898		if (!vlan_id)
    899			return;
    900		mutex_lock(&bnx2fc_dev_lock);
    901		list_for_each_entry_safe(interface, tmp, &if_list, list) {
    902			if (interface->hba == hba &&
    903			    interface->vlan_id == (vlan_id & VLAN_VID_MASK))
    904				__bnx2fc_destroy(interface);
    905		}
    906		mutex_unlock(&bnx2fc_dev_lock);
    907		return;
    908
    909	default:
    910		return;
    911	}
    912
    913	mutex_lock(&bnx2fc_dev_lock);
    914	list_for_each_entry(interface, &if_list, list) {
    915
    916		if (interface->hba != hba)
    917			continue;
    918
    919		ctlr = bnx2fc_to_ctlr(interface);
    920		lport = ctlr->lp;
    921		BNX2FC_HBA_DBG(lport, "netevent handler - event=%s %ld\n",
    922				interface->netdev->name, event);
    923
    924		fcoe_link_speed_update(lport);
    925
    926		cdev = fcoe_ctlr_to_ctlr_dev(ctlr);
    927
    928		if (link_possible && !bnx2fc_link_ok(lport)) {
    929			switch (cdev->enabled) {
    930			case FCOE_CTLR_DISABLED:
    931				pr_info("Link up while interface is disabled.\n");
    932				break;
    933			case FCOE_CTLR_ENABLED:
    934			case FCOE_CTLR_UNUSED:
    935				/* Reset max recv frame size to default */
    936				fc_set_mfs(lport, BNX2FC_MFS);
    937				/*
    938				 * ctlr link up will only be handled during
    939				 * enable to avoid sending discovery
    940				 * solicitation on a stale vlan
    941				 */
    942				if (interface->enabled)
    943					fcoe_ctlr_link_up(ctlr);
    944			}
    945		} else if (fcoe_ctlr_link_down(ctlr)) {
    946			switch (cdev->enabled) {
    947			case FCOE_CTLR_DISABLED:
    948				pr_info("Link down while interface is disabled.\n");
    949				break;
    950			case FCOE_CTLR_ENABLED:
    951			case FCOE_CTLR_UNUSED:
    952				mutex_lock(&lport->lp_mutex);
    953				list_for_each_entry(vport, &lport->vports, list)
    954					fc_host_port_type(vport->host) =
    955					FC_PORTTYPE_UNKNOWN;
    956				mutex_unlock(&lport->lp_mutex);
    957				fc_host_port_type(lport->host) =
    958					FC_PORTTYPE_UNKNOWN;
    959				this_cpu_inc(lport->stats->LinkFailureCount);
    960				fcoe_clean_pending_queue(lport);
    961				wait_for_upload = 1;
    962			}
    963		}
    964	}
    965	mutex_unlock(&bnx2fc_dev_lock);
    966
    967	if (wait_for_upload) {
    968		clear_bit(ADAPTER_STATE_READY, &hba->adapter_state);
    969		init_waitqueue_head(&hba->shutdown_wait);
    970		BNX2FC_MISC_DBG("indicate_netevent "
    971				"num_ofld_sess = %d\n",
    972				hba->num_ofld_sess);
    973		hba->wait_for_link_down = 1;
    974		wait_event_interruptible(hba->shutdown_wait,
    975					 (hba->num_ofld_sess == 0));
    976		BNX2FC_MISC_DBG("wakeup - num_ofld_sess = %d\n",
    977				hba->num_ofld_sess);
    978		hba->wait_for_link_down = 0;
    979
    980		if (signal_pending(current))
    981			flush_signals(current);
    982	}
    983}
    984
    985static int bnx2fc_libfc_config(struct fc_lport *lport)
    986{
    987
    988	/* Set the function pointers set by bnx2fc driver */
    989	memcpy(&lport->tt, &bnx2fc_libfc_fcn_templ,
    990		sizeof(struct libfc_function_template));
    991	fc_elsct_init(lport);
    992	fc_exch_init(lport);
    993	fc_disc_init(lport);
    994	fc_disc_config(lport, lport);
    995	return 0;
    996}
    997
    998static int bnx2fc_em_config(struct fc_lport *lport, struct bnx2fc_hba *hba)
    999{
   1000	int fcoe_min_xid, fcoe_max_xid;
   1001
   1002	fcoe_min_xid = hba->max_xid + 1;
   1003	if (nr_cpu_ids <= 2)
   1004		fcoe_max_xid = hba->max_xid + FCOE_XIDS_PER_CPU_OFFSET;
   1005	else
   1006		fcoe_max_xid = hba->max_xid + FCOE_MAX_XID_OFFSET;
   1007	if (!fc_exch_mgr_alloc(lport, FC_CLASS_3, fcoe_min_xid,
   1008			       fcoe_max_xid, NULL)) {
   1009		printk(KERN_ERR PFX "em_config:fc_exch_mgr_alloc failed\n");
   1010		return -ENOMEM;
   1011	}
   1012
   1013	return 0;
   1014}
   1015
   1016static int bnx2fc_lport_config(struct fc_lport *lport)
   1017{
   1018	lport->link_up = 0;
   1019	lport->qfull = 0;
   1020	lport->max_retry_count = BNX2FC_MAX_RETRY_CNT;
   1021	lport->max_rport_retry_count = BNX2FC_MAX_RPORT_RETRY_CNT;
   1022	lport->e_d_tov = 2 * 1000;
   1023	lport->r_a_tov = 10 * 1000;
   1024
   1025	lport->service_params = (FCP_SPPF_INIT_FCN | FCP_SPPF_RD_XRDY_DIS |
   1026				FCP_SPPF_RETRY | FCP_SPPF_CONF_COMPL);
   1027	lport->does_npiv = 1;
   1028
   1029	memset(&lport->rnid_gen, 0, sizeof(struct fc_els_rnid_gen));
   1030	lport->rnid_gen.rnid_atype = BNX2FC_RNID_HBA;
   1031
   1032	/* alloc stats structure */
   1033	if (fc_lport_init_stats(lport))
   1034		return -ENOMEM;
   1035
   1036	/* Finish fc_lport configuration */
   1037	fc_lport_config(lport);
   1038
   1039	return 0;
   1040}
   1041
   1042/**
   1043 * bnx2fc_fip_recv - handle a received FIP frame.
   1044 *
   1045 * @skb: the received skb
   1046 * @dev: associated &net_device
   1047 * @ptype: the &packet_type structure which was used to register this handler.
   1048 * @orig_dev: original receive &net_device, in case @ dev is a bond.
   1049 *
   1050 * Returns: 0 for success
   1051 */
   1052static int bnx2fc_fip_recv(struct sk_buff *skb, struct net_device *dev,
   1053			   struct packet_type *ptype,
   1054			   struct net_device *orig_dev)
   1055{
   1056	struct bnx2fc_interface *interface;
   1057	struct fcoe_ctlr *ctlr;
   1058	interface = container_of(ptype, struct bnx2fc_interface,
   1059				 fip_packet_type);
   1060	ctlr = bnx2fc_to_ctlr(interface);
   1061	fcoe_ctlr_recv(ctlr, skb);
   1062	return 0;
   1063}
   1064
   1065/**
   1066 * bnx2fc_update_src_mac - Update Ethernet MAC filters.
   1067 *
   1068 * @lport: The local port
   1069 * @addr: Location of data to copy
   1070 *
   1071 * Remove any previously-set unicast MAC filter.
   1072 * Add secondary FCoE MAC address filter for our OUI.
   1073 */
   1074static void bnx2fc_update_src_mac(struct fc_lport *lport, u8 *addr)
   1075{
   1076	struct fcoe_port *port = lport_priv(lport);
   1077
   1078	memcpy(port->data_src_addr, addr, ETH_ALEN);
   1079}
   1080
   1081/**
   1082 * bnx2fc_get_src_mac - return the ethernet source address for an lport
   1083 *
   1084 * @lport: libfc port
   1085 */
   1086static u8 *bnx2fc_get_src_mac(struct fc_lport *lport)
   1087{
   1088	struct fcoe_port *port;
   1089
   1090	port = (struct fcoe_port *)lport_priv(lport);
   1091	return port->data_src_addr;
   1092}
   1093
   1094/**
   1095 * bnx2fc_fip_send - send an Ethernet-encapsulated FIP frame.
   1096 *
   1097 * @fip: FCoE controller.
   1098 * @skb: FIP Packet.
   1099 */
   1100static void bnx2fc_fip_send(struct fcoe_ctlr *fip, struct sk_buff *skb)
   1101{
   1102	struct fip_header *fiph;
   1103	struct ethhdr *eth_hdr;
   1104	u16 op;
   1105	u8 sub;
   1106
   1107	fiph = (struct fip_header *) ((void *)skb->data + 2 * ETH_ALEN + 2);
   1108	eth_hdr = (struct ethhdr *)skb_mac_header(skb);
   1109	op = ntohs(fiph->fip_op);
   1110	sub = fiph->fip_subcode;
   1111
   1112	if (op == FIP_OP_CTRL && sub == FIP_SC_SOL && bnx2fc_log_fka)
   1113		BNX2FC_MISC_DBG("Sending FKA from %pM to %pM.\n",
   1114		    eth_hdr->h_source, eth_hdr->h_dest);
   1115
   1116	skb->dev = bnx2fc_from_ctlr(fip)->netdev;
   1117	dev_queue_xmit(skb);
   1118}
   1119
   1120static int bnx2fc_vport_create(struct fc_vport *vport, bool disabled)
   1121{
   1122	struct Scsi_Host *shost = vport_to_shost(vport);
   1123	struct fc_lport *n_port = shost_priv(shost);
   1124	struct fcoe_port *port = lport_priv(n_port);
   1125	struct bnx2fc_interface *interface = port->priv;
   1126	struct net_device *netdev = interface->netdev;
   1127	struct fc_lport *vn_port;
   1128	int rc;
   1129	char buf[32];
   1130
   1131	rc = fcoe_validate_vport_create(vport);
   1132	if (rc) {
   1133		fcoe_wwn_to_str(vport->port_name, buf, sizeof(buf));
   1134		printk(KERN_ERR PFX "Failed to create vport, "
   1135		       "WWPN (0x%s) already exists\n",
   1136		       buf);
   1137		return rc;
   1138	}
   1139
   1140	if (!test_bit(BNX2FC_FLAG_FW_INIT_DONE, &interface->hba->flags)) {
   1141		printk(KERN_ERR PFX "vn ports cannot be created on"
   1142			"this interface\n");
   1143		return -EIO;
   1144	}
   1145	rtnl_lock();
   1146	mutex_lock(&bnx2fc_dev_lock);
   1147	vn_port = bnx2fc_if_create(interface, &vport->dev, 1);
   1148	mutex_unlock(&bnx2fc_dev_lock);
   1149	rtnl_unlock();
   1150
   1151	if (!vn_port) {
   1152		printk(KERN_ERR PFX "bnx2fc_vport_create (%s) failed\n",
   1153			netdev->name);
   1154		return -EIO;
   1155	}
   1156
   1157	if (bnx2fc_devloss_tmo)
   1158		fc_host_dev_loss_tmo(vn_port->host) = bnx2fc_devloss_tmo;
   1159
   1160	if (disabled) {
   1161		fc_vport_set_state(vport, FC_VPORT_DISABLED);
   1162	} else {
   1163		vn_port->boot_time = jiffies;
   1164		fc_lport_init(vn_port);
   1165		fc_fabric_login(vn_port);
   1166		fc_vport_setlink(vn_port);
   1167	}
   1168	return 0;
   1169}
   1170
   1171static void bnx2fc_free_vport(struct bnx2fc_hba *hba, struct fc_lport *lport)
   1172{
   1173	struct bnx2fc_lport *blport, *tmp;
   1174
   1175	spin_lock_bh(&hba->hba_lock);
   1176	list_for_each_entry_safe(blport, tmp, &hba->vports, list) {
   1177		if (blport->lport == lport) {
   1178			list_del(&blport->list);
   1179			kfree(blport);
   1180		}
   1181	}
   1182	spin_unlock_bh(&hba->hba_lock);
   1183}
   1184
   1185static int bnx2fc_vport_destroy(struct fc_vport *vport)
   1186{
   1187	struct Scsi_Host *shost = vport_to_shost(vport);
   1188	struct fc_lport *n_port = shost_priv(shost);
   1189	struct fc_lport *vn_port = vport->dd_data;
   1190	struct fcoe_port *port = lport_priv(vn_port);
   1191	struct bnx2fc_interface *interface = port->priv;
   1192	struct fc_lport *v_port;
   1193	bool found = false;
   1194
   1195	mutex_lock(&n_port->lp_mutex);
   1196	list_for_each_entry(v_port, &n_port->vports, list)
   1197		if (v_port->vport == vport) {
   1198			found = true;
   1199			break;
   1200		}
   1201
   1202	if (!found) {
   1203		mutex_unlock(&n_port->lp_mutex);
   1204		return -ENOENT;
   1205	}
   1206	list_del(&vn_port->list);
   1207	mutex_unlock(&n_port->lp_mutex);
   1208	bnx2fc_free_vport(interface->hba, port->lport);
   1209	bnx2fc_port_shutdown(port->lport);
   1210	bnx2fc_port_destroy(port);
   1211	bnx2fc_interface_put(interface);
   1212	return 0;
   1213}
   1214
   1215static int bnx2fc_vport_disable(struct fc_vport *vport, bool disable)
   1216{
   1217	struct fc_lport *lport = vport->dd_data;
   1218
   1219	if (disable) {
   1220		fc_vport_set_state(vport, FC_VPORT_DISABLED);
   1221		fc_fabric_logoff(lport);
   1222	} else {
   1223		lport->boot_time = jiffies;
   1224		fc_fabric_login(lport);
   1225		fc_vport_setlink(lport);
   1226	}
   1227	return 0;
   1228}
   1229
   1230
   1231static int bnx2fc_interface_setup(struct bnx2fc_interface *interface)
   1232{
   1233	struct net_device *netdev = interface->netdev;
   1234	struct net_device *physdev = interface->hba->phys_dev;
   1235	struct fcoe_ctlr *ctlr = bnx2fc_to_ctlr(interface);
   1236	struct netdev_hw_addr *ha;
   1237	int sel_san_mac = 0;
   1238
   1239	/* setup Source MAC Address */
   1240	rcu_read_lock();
   1241	for_each_dev_addr(physdev, ha) {
   1242		BNX2FC_MISC_DBG("net_config: ha->type = %d, fip_mac = ",
   1243				ha->type);
   1244		printk(KERN_INFO "%2x:%2x:%2x:%2x:%2x:%2x\n", ha->addr[0],
   1245				ha->addr[1], ha->addr[2], ha->addr[3],
   1246				ha->addr[4], ha->addr[5]);
   1247
   1248		if ((ha->type == NETDEV_HW_ADDR_T_SAN) &&
   1249		    (is_valid_ether_addr(ha->addr))) {
   1250			memcpy(ctlr->ctl_src_addr, ha->addr,
   1251			       ETH_ALEN);
   1252			sel_san_mac = 1;
   1253			BNX2FC_MISC_DBG("Found SAN MAC\n");
   1254		}
   1255	}
   1256	rcu_read_unlock();
   1257
   1258	if (!sel_san_mac)
   1259		return -ENODEV;
   1260
   1261	interface->fip_packet_type.func = bnx2fc_fip_recv;
   1262	interface->fip_packet_type.type = htons(ETH_P_FIP);
   1263	interface->fip_packet_type.dev = netdev;
   1264	dev_add_pack(&interface->fip_packet_type);
   1265
   1266	interface->fcoe_packet_type.func = bnx2fc_rcv;
   1267	interface->fcoe_packet_type.type = __constant_htons(ETH_P_FCOE);
   1268	interface->fcoe_packet_type.dev = netdev;
   1269	dev_add_pack(&interface->fcoe_packet_type);
   1270
   1271	return 0;
   1272}
   1273
   1274static int bnx2fc_attach_transport(void)
   1275{
   1276	bnx2fc_transport_template =
   1277		fc_attach_transport(&bnx2fc_transport_function);
   1278
   1279	if (bnx2fc_transport_template == NULL) {
   1280		printk(KERN_ERR PFX "Failed to attach FC transport\n");
   1281		return -ENODEV;
   1282	}
   1283
   1284	bnx2fc_vport_xport_template =
   1285		fc_attach_transport(&bnx2fc_vport_xport_function);
   1286	if (bnx2fc_vport_xport_template == NULL) {
   1287		printk(KERN_ERR PFX
   1288		       "Failed to attach FC transport for vport\n");
   1289		fc_release_transport(bnx2fc_transport_template);
   1290		bnx2fc_transport_template = NULL;
   1291		return -ENODEV;
   1292	}
   1293	return 0;
   1294}
   1295static void bnx2fc_release_transport(void)
   1296{
   1297	fc_release_transport(bnx2fc_transport_template);
   1298	fc_release_transport(bnx2fc_vport_xport_template);
   1299	bnx2fc_transport_template = NULL;
   1300	bnx2fc_vport_xport_template = NULL;
   1301}
   1302
   1303static void bnx2fc_interface_release(struct kref *kref)
   1304{
   1305	struct fcoe_ctlr_device *ctlr_dev;
   1306	struct bnx2fc_interface *interface;
   1307	struct fcoe_ctlr *ctlr;
   1308	struct net_device *netdev;
   1309
   1310	interface = container_of(kref, struct bnx2fc_interface, kref);
   1311	BNX2FC_MISC_DBG("Interface is being released\n");
   1312
   1313	ctlr = bnx2fc_to_ctlr(interface);
   1314	ctlr_dev = fcoe_ctlr_to_ctlr_dev(ctlr);
   1315	netdev = interface->netdev;
   1316
   1317	/* tear-down FIP controller */
   1318	if (test_and_clear_bit(BNX2FC_CTLR_INIT_DONE, &interface->if_flags))
   1319		fcoe_ctlr_destroy(ctlr);
   1320
   1321	fcoe_ctlr_device_delete(ctlr_dev);
   1322
   1323	dev_put(netdev);
   1324	module_put(THIS_MODULE);
   1325}
   1326
   1327static inline void bnx2fc_interface_get(struct bnx2fc_interface *interface)
   1328{
   1329	kref_get(&interface->kref);
   1330}
   1331
   1332static inline void bnx2fc_interface_put(struct bnx2fc_interface *interface)
   1333{
   1334	kref_put(&interface->kref, bnx2fc_interface_release);
   1335}
   1336static void bnx2fc_hba_destroy(struct bnx2fc_hba *hba)
   1337{
   1338	/* Free the command manager */
   1339	if (hba->cmd_mgr) {
   1340		bnx2fc_cmd_mgr_free(hba->cmd_mgr);
   1341		hba->cmd_mgr = NULL;
   1342	}
   1343	kfree(hba->tgt_ofld_list);
   1344	bnx2fc_unbind_pcidev(hba);
   1345	kfree(hba);
   1346}
   1347
   1348/**
   1349 * bnx2fc_hba_create - create a new bnx2fc hba
   1350 *
   1351 * @cnic:	pointer to cnic device
   1352 *
   1353 * Creates a new FCoE hba on the given device.
   1354 *
   1355 */
   1356static struct bnx2fc_hba *bnx2fc_hba_create(struct cnic_dev *cnic)
   1357{
   1358	struct bnx2fc_hba *hba;
   1359	struct fcoe_capabilities *fcoe_cap;
   1360	int rc;
   1361
   1362	hba = kzalloc(sizeof(*hba), GFP_KERNEL);
   1363	if (!hba) {
   1364		printk(KERN_ERR PFX "Unable to allocate hba structure\n");
   1365		return NULL;
   1366	}
   1367	spin_lock_init(&hba->hba_lock);
   1368	mutex_init(&hba->hba_mutex);
   1369	mutex_init(&hba->hba_stats_mutex);
   1370
   1371	hba->cnic = cnic;
   1372
   1373	hba->max_tasks = cnic->max_fcoe_exchanges;
   1374	hba->elstm_xids = (hba->max_tasks / 2);
   1375	hba->max_outstanding_cmds = hba->elstm_xids;
   1376	hba->max_xid = (hba->max_tasks - 1);
   1377
   1378	rc = bnx2fc_bind_pcidev(hba);
   1379	if (rc) {
   1380		printk(KERN_ERR PFX "create_adapter:  bind error\n");
   1381		goto bind_err;
   1382	}
   1383	hba->phys_dev = cnic->netdev;
   1384	hba->next_conn_id = 0;
   1385
   1386	hba->tgt_ofld_list =
   1387		kcalloc(BNX2FC_NUM_MAX_SESS, sizeof(struct bnx2fc_rport *),
   1388			GFP_KERNEL);
   1389	if (!hba->tgt_ofld_list) {
   1390		printk(KERN_ERR PFX "Unable to allocate tgt offload list\n");
   1391		goto tgtofld_err;
   1392	}
   1393
   1394	hba->num_ofld_sess = 0;
   1395
   1396	hba->cmd_mgr = bnx2fc_cmd_mgr_alloc(hba);
   1397	if (!hba->cmd_mgr) {
   1398		printk(KERN_ERR PFX "em_config:bnx2fc_cmd_mgr_alloc failed\n");
   1399		goto cmgr_err;
   1400	}
   1401	fcoe_cap = &hba->fcoe_cap;
   1402
   1403	fcoe_cap->capability1 = BNX2FC_TM_MAX_SQES <<
   1404					FCOE_IOS_PER_CONNECTION_SHIFT;
   1405	fcoe_cap->capability1 |= BNX2FC_NUM_MAX_SESS <<
   1406					FCOE_LOGINS_PER_PORT_SHIFT;
   1407	fcoe_cap->capability2 = hba->max_outstanding_cmds <<
   1408					FCOE_NUMBER_OF_EXCHANGES_SHIFT;
   1409	fcoe_cap->capability2 |= BNX2FC_MAX_NPIV <<
   1410					FCOE_NPIV_WWN_PER_PORT_SHIFT;
   1411	fcoe_cap->capability3 = BNX2FC_NUM_MAX_SESS <<
   1412					FCOE_TARGETS_SUPPORTED_SHIFT;
   1413	fcoe_cap->capability3 |= hba->max_outstanding_cmds <<
   1414					FCOE_OUTSTANDING_COMMANDS_SHIFT;
   1415	fcoe_cap->capability4 = FCOE_CAPABILITY4_STATEFUL;
   1416
   1417	init_waitqueue_head(&hba->shutdown_wait);
   1418	init_waitqueue_head(&hba->destroy_wait);
   1419	INIT_LIST_HEAD(&hba->vports);
   1420
   1421	return hba;
   1422
   1423cmgr_err:
   1424	kfree(hba->tgt_ofld_list);
   1425tgtofld_err:
   1426	bnx2fc_unbind_pcidev(hba);
   1427bind_err:
   1428	kfree(hba);
   1429	return NULL;
   1430}
   1431
   1432static struct bnx2fc_interface *
   1433bnx2fc_interface_create(struct bnx2fc_hba *hba,
   1434			struct net_device *netdev,
   1435			enum fip_mode fip_mode)
   1436{
   1437	struct fcoe_ctlr_device *ctlr_dev;
   1438	struct bnx2fc_interface *interface;
   1439	struct fcoe_ctlr *ctlr;
   1440	int size;
   1441	int rc = 0;
   1442
   1443	size = (sizeof(*interface) + sizeof(struct fcoe_ctlr));
   1444	ctlr_dev = fcoe_ctlr_device_add(&netdev->dev, &bnx2fc_fcoe_sysfs_templ,
   1445					 size);
   1446	if (!ctlr_dev) {
   1447		printk(KERN_ERR PFX "Unable to allocate interface structure\n");
   1448		return NULL;
   1449	}
   1450	ctlr = fcoe_ctlr_device_priv(ctlr_dev);
   1451	ctlr->cdev = ctlr_dev;
   1452	interface = fcoe_ctlr_priv(ctlr);
   1453	dev_hold(netdev);
   1454	kref_init(&interface->kref);
   1455	interface->hba = hba;
   1456	interface->netdev = netdev;
   1457
   1458	/* Initialize FIP */
   1459	fcoe_ctlr_init(ctlr, fip_mode);
   1460	ctlr->send = bnx2fc_fip_send;
   1461	ctlr->update_mac = bnx2fc_update_src_mac;
   1462	ctlr->get_src_addr = bnx2fc_get_src_mac;
   1463	set_bit(BNX2FC_CTLR_INIT_DONE, &interface->if_flags);
   1464
   1465	rc = bnx2fc_interface_setup(interface);
   1466	if (!rc)
   1467		return interface;
   1468
   1469	fcoe_ctlr_destroy(ctlr);
   1470	dev_put(netdev);
   1471	fcoe_ctlr_device_delete(ctlr_dev);
   1472	return NULL;
   1473}
   1474
   1475/**
   1476 * bnx2fc_if_create - Create FCoE instance on a given interface
   1477 *
   1478 * @interface:	FCoE interface to create a local port on
   1479 * @parent:	Device pointer to be the parent in sysfs for the SCSI host
   1480 * @npiv:	Indicates if the port is vport or not
   1481 *
   1482 * Creates a fc_lport instance and a Scsi_Host instance and configure them.
   1483 *
   1484 * Returns:	Allocated fc_lport or an error pointer
   1485 */
   1486static struct fc_lport *bnx2fc_if_create(struct bnx2fc_interface *interface,
   1487				  struct device *parent, int npiv)
   1488{
   1489	struct fcoe_ctlr        *ctlr = bnx2fc_to_ctlr(interface);
   1490	struct fc_lport		*lport, *n_port;
   1491	struct fcoe_port	*port;
   1492	struct Scsi_Host	*shost;
   1493	struct fc_vport		*vport = dev_to_vport(parent);
   1494	struct bnx2fc_lport	*blport;
   1495	struct bnx2fc_hba	*hba = interface->hba;
   1496	int			rc = 0;
   1497
   1498	blport = kzalloc(sizeof(struct bnx2fc_lport), GFP_KERNEL);
   1499	if (!blport) {
   1500		BNX2FC_HBA_DBG(ctlr->lp, "Unable to alloc blport\n");
   1501		return NULL;
   1502	}
   1503
   1504	/* Allocate Scsi_Host structure */
   1505	bnx2fc_shost_template.can_queue = hba->max_outstanding_cmds;
   1506	if (!npiv)
   1507		lport = libfc_host_alloc(&bnx2fc_shost_template, sizeof(*port));
   1508	else
   1509		lport = libfc_vport_create(vport, sizeof(*port));
   1510
   1511	if (!lport) {
   1512		printk(KERN_ERR PFX "could not allocate scsi host structure\n");
   1513		goto free_blport;
   1514	}
   1515	shost = lport->host;
   1516	port = lport_priv(lport);
   1517	port->lport = lport;
   1518	port->priv = interface;
   1519	port->get_netdev = bnx2fc_netdev;
   1520
   1521	/* Configure fcoe_port */
   1522	rc = bnx2fc_lport_config(lport);
   1523	if (rc)
   1524		goto lp_config_err;
   1525
   1526	if (npiv) {
   1527		printk(KERN_ERR PFX "Setting vport names, 0x%llX 0x%llX\n",
   1528			vport->node_name, vport->port_name);
   1529		fc_set_wwnn(lport, vport->node_name);
   1530		fc_set_wwpn(lport, vport->port_name);
   1531	}
   1532	/* Configure netdev and networking properties of the lport */
   1533	rc = bnx2fc_net_config(lport, interface->netdev);
   1534	if (rc) {
   1535		printk(KERN_ERR PFX "Error on bnx2fc_net_config\n");
   1536		goto lp_config_err;
   1537	}
   1538
   1539	rc = bnx2fc_shost_config(lport, parent);
   1540	if (rc) {
   1541		printk(KERN_ERR PFX "Couldn't configure shost for %s\n",
   1542			interface->netdev->name);
   1543		goto lp_config_err;
   1544	}
   1545
   1546	/* Initialize the libfc library */
   1547	rc = bnx2fc_libfc_config(lport);
   1548	if (rc) {
   1549		printk(KERN_ERR PFX "Couldn't configure libfc\n");
   1550		goto shost_err;
   1551	}
   1552	fc_host_port_type(lport->host) = FC_PORTTYPE_UNKNOWN;
   1553
   1554	if (bnx2fc_devloss_tmo)
   1555		fc_host_dev_loss_tmo(shost) = bnx2fc_devloss_tmo;
   1556
   1557	/* Allocate exchange manager */
   1558	if (!npiv)
   1559		rc = bnx2fc_em_config(lport, hba);
   1560	else {
   1561		shost = vport_to_shost(vport);
   1562		n_port = shost_priv(shost);
   1563		rc = fc_exch_mgr_list_clone(n_port, lport);
   1564	}
   1565
   1566	if (rc) {
   1567		printk(KERN_ERR PFX "Error on bnx2fc_em_config\n");
   1568		goto shost_err;
   1569	}
   1570
   1571	bnx2fc_interface_get(interface);
   1572
   1573	spin_lock_bh(&hba->hba_lock);
   1574	blport->lport = lport;
   1575	list_add_tail(&blport->list, &hba->vports);
   1576	spin_unlock_bh(&hba->hba_lock);
   1577
   1578	return lport;
   1579
   1580shost_err:
   1581	scsi_remove_host(shost);
   1582lp_config_err:
   1583	scsi_host_put(lport->host);
   1584free_blport:
   1585	kfree(blport);
   1586	return NULL;
   1587}
   1588
   1589static void bnx2fc_net_cleanup(struct bnx2fc_interface *interface)
   1590{
   1591	/* Dont listen for Ethernet packets anymore */
   1592	__dev_remove_pack(&interface->fcoe_packet_type);
   1593	__dev_remove_pack(&interface->fip_packet_type);
   1594	synchronize_net();
   1595}
   1596
   1597static void bnx2fc_interface_cleanup(struct bnx2fc_interface *interface)
   1598{
   1599	struct fcoe_ctlr *ctlr = bnx2fc_to_ctlr(interface);
   1600	struct fc_lport *lport = ctlr->lp;
   1601	struct fcoe_port *port = lport_priv(lport);
   1602	struct bnx2fc_hba *hba = interface->hba;
   1603
   1604	/* Stop the transmit retry timer */
   1605	del_timer_sync(&port->timer);
   1606
   1607	/* Free existing transmit skbs */
   1608	fcoe_clean_pending_queue(lport);
   1609
   1610	bnx2fc_net_cleanup(interface);
   1611
   1612	bnx2fc_free_vport(hba, lport);
   1613}
   1614
   1615static void bnx2fc_if_destroy(struct fc_lport *lport)
   1616{
   1617
   1618	/* Free queued packets for the receive thread */
   1619	bnx2fc_clean_rx_queue(lport);
   1620
   1621	/* Detach from scsi-ml */
   1622	fc_remove_host(lport->host);
   1623	scsi_remove_host(lport->host);
   1624
   1625	/*
   1626	 * Note that only the physical lport will have the exchange manager.
   1627	 * for vports, this function is NOP
   1628	 */
   1629	fc_exch_mgr_free(lport);
   1630
   1631	/* Free memory used by statistical counters */
   1632	fc_lport_free_stats(lport);
   1633
   1634	/* Release Scsi_Host */
   1635	scsi_host_put(lport->host);
   1636}
   1637
   1638static void __bnx2fc_destroy(struct bnx2fc_interface *interface)
   1639{
   1640	struct fcoe_ctlr *ctlr = bnx2fc_to_ctlr(interface);
   1641	struct fc_lport *lport = ctlr->lp;
   1642	struct fcoe_port *port = lport_priv(lport);
   1643
   1644	bnx2fc_interface_cleanup(interface);
   1645	bnx2fc_stop(interface);
   1646	list_del(&interface->list);
   1647	bnx2fc_port_destroy(port);
   1648	bnx2fc_interface_put(interface);
   1649}
   1650
   1651/**
   1652 * bnx2fc_destroy - Destroy a bnx2fc FCoE interface
   1653 *
   1654 * @netdev: The net device that the FCoE interface is on
   1655 *
   1656 * Called from sysfs.
   1657 *
   1658 * Returns: 0 for success
   1659 */
   1660static int bnx2fc_destroy(struct net_device *netdev)
   1661{
   1662	struct bnx2fc_interface *interface = NULL;
   1663	struct workqueue_struct *timer_work_queue;
   1664	struct fcoe_ctlr *ctlr;
   1665	int rc = 0;
   1666
   1667	rtnl_lock();
   1668	mutex_lock(&bnx2fc_dev_lock);
   1669
   1670	interface = bnx2fc_interface_lookup(netdev);
   1671	ctlr = bnx2fc_to_ctlr(interface);
   1672	if (!interface || !ctlr->lp) {
   1673		rc = -ENODEV;
   1674		printk(KERN_ERR PFX "bnx2fc_destroy: interface or lport not found\n");
   1675		goto netdev_err;
   1676	}
   1677
   1678	timer_work_queue = interface->timer_work_queue;
   1679	__bnx2fc_destroy(interface);
   1680	destroy_workqueue(timer_work_queue);
   1681
   1682netdev_err:
   1683	mutex_unlock(&bnx2fc_dev_lock);
   1684	rtnl_unlock();
   1685	return rc;
   1686}
   1687
   1688static void bnx2fc_port_destroy(struct fcoe_port *port)
   1689{
   1690	struct fc_lport *lport;
   1691
   1692	lport = port->lport;
   1693	BNX2FC_HBA_DBG(lport, "Entered %s, destroying lport %p\n", __func__, lport);
   1694
   1695	bnx2fc_if_destroy(lport);
   1696}
   1697
   1698static void bnx2fc_unbind_adapter_devices(struct bnx2fc_hba *hba)
   1699{
   1700	bnx2fc_free_fw_resc(hba);
   1701	bnx2fc_free_task_ctx(hba);
   1702}
   1703
   1704/**
   1705 * bnx2fc_bind_adapter_devices - binds bnx2fc adapter with the associated
   1706 *			pci structure
   1707 *
   1708 * @hba:		Adapter instance
   1709 */
   1710static int bnx2fc_bind_adapter_devices(struct bnx2fc_hba *hba)
   1711{
   1712	if (bnx2fc_setup_task_ctx(hba))
   1713		goto mem_err;
   1714
   1715	if (bnx2fc_setup_fw_resc(hba))
   1716		goto mem_err;
   1717
   1718	return 0;
   1719mem_err:
   1720	bnx2fc_unbind_adapter_devices(hba);
   1721	return -ENOMEM;
   1722}
   1723
   1724static int bnx2fc_bind_pcidev(struct bnx2fc_hba *hba)
   1725{
   1726	struct cnic_dev *cnic;
   1727	struct pci_dev *pdev;
   1728
   1729	if (!hba->cnic) {
   1730		printk(KERN_ERR PFX "cnic is NULL\n");
   1731		return -ENODEV;
   1732	}
   1733	cnic = hba->cnic;
   1734	pdev = hba->pcidev = cnic->pcidev;
   1735	if (!hba->pcidev)
   1736		return -ENODEV;
   1737
   1738	switch (pdev->device) {
   1739	case PCI_DEVICE_ID_NX2_57710:
   1740		strncpy(hba->chip_num, "BCM57710", BCM_CHIP_LEN);
   1741		break;
   1742	case PCI_DEVICE_ID_NX2_57711:
   1743		strncpy(hba->chip_num, "BCM57711", BCM_CHIP_LEN);
   1744		break;
   1745	case PCI_DEVICE_ID_NX2_57712:
   1746	case PCI_DEVICE_ID_NX2_57712_MF:
   1747	case PCI_DEVICE_ID_NX2_57712_VF:
   1748		strncpy(hba->chip_num, "BCM57712", BCM_CHIP_LEN);
   1749		break;
   1750	case PCI_DEVICE_ID_NX2_57800:
   1751	case PCI_DEVICE_ID_NX2_57800_MF:
   1752	case PCI_DEVICE_ID_NX2_57800_VF:
   1753		strncpy(hba->chip_num, "BCM57800", BCM_CHIP_LEN);
   1754		break;
   1755	case PCI_DEVICE_ID_NX2_57810:
   1756	case PCI_DEVICE_ID_NX2_57810_MF:
   1757	case PCI_DEVICE_ID_NX2_57810_VF:
   1758		strncpy(hba->chip_num, "BCM57810", BCM_CHIP_LEN);
   1759		break;
   1760	case PCI_DEVICE_ID_NX2_57840:
   1761	case PCI_DEVICE_ID_NX2_57840_MF:
   1762	case PCI_DEVICE_ID_NX2_57840_VF:
   1763	case PCI_DEVICE_ID_NX2_57840_2_20:
   1764	case PCI_DEVICE_ID_NX2_57840_4_10:
   1765		strncpy(hba->chip_num, "BCM57840", BCM_CHIP_LEN);
   1766		break;
   1767	default:
   1768		pr_err(PFX "Unknown device id 0x%x\n", pdev->device);
   1769		break;
   1770	}
   1771	pci_dev_get(hba->pcidev);
   1772	return 0;
   1773}
   1774
   1775static void bnx2fc_unbind_pcidev(struct bnx2fc_hba *hba)
   1776{
   1777	if (hba->pcidev) {
   1778		hba->chip_num[0] = '\0';
   1779		pci_dev_put(hba->pcidev);
   1780	}
   1781	hba->pcidev = NULL;
   1782}
   1783
   1784/**
   1785 * bnx2fc_ulp_get_stats - cnic callback to populate FCoE stats
   1786 *
   1787 * @handle:    transport handle pointing to adapter structure
   1788 */
   1789static int bnx2fc_ulp_get_stats(void *handle)
   1790{
   1791	struct bnx2fc_hba *hba = handle;
   1792	struct cnic_dev *cnic;
   1793	struct fcoe_stats_info *stats_addr;
   1794
   1795	if (!hba)
   1796		return -EINVAL;
   1797
   1798	cnic = hba->cnic;
   1799	stats_addr = &cnic->stats_addr->fcoe_stat;
   1800	if (!stats_addr)
   1801		return -EINVAL;
   1802
   1803	strncpy(stats_addr->version, BNX2FC_VERSION,
   1804		sizeof(stats_addr->version));
   1805	stats_addr->txq_size = BNX2FC_SQ_WQES_MAX;
   1806	stats_addr->rxq_size = BNX2FC_CQ_WQES_MAX;
   1807
   1808	return 0;
   1809}
   1810
   1811
   1812/**
   1813 * bnx2fc_ulp_start - cnic callback to initialize & start adapter instance
   1814 *
   1815 * @handle:	transport handle pointing to adapter structure
   1816 *
   1817 * This function maps adapter structure to pcidev structure and initiates
   1818 *	firmware handshake to enable/initialize on-chip FCoE components.
   1819 *	This bnx2fc - cnic interface api callback is used after following
   1820 *	conditions are met -
   1821 *	a) underlying network interface is up (marked by event NETDEV_UP
   1822 *		from netdev
   1823 *	b) bnx2fc adatper structure is registered.
   1824 */
   1825static void bnx2fc_ulp_start(void *handle)
   1826{
   1827	struct bnx2fc_hba *hba = handle;
   1828	struct bnx2fc_interface *interface;
   1829	struct fcoe_ctlr *ctlr;
   1830	struct fc_lport *lport;
   1831
   1832	mutex_lock(&bnx2fc_dev_lock);
   1833
   1834	if (!test_bit(BNX2FC_FLAG_FW_INIT_DONE, &hba->flags))
   1835		bnx2fc_fw_init(hba);
   1836
   1837	BNX2FC_MISC_DBG("bnx2fc started.\n");
   1838
   1839	list_for_each_entry(interface, &if_list, list) {
   1840		if (interface->hba == hba) {
   1841			ctlr = bnx2fc_to_ctlr(interface);
   1842			lport = ctlr->lp;
   1843			/* Kick off Fabric discovery*/
   1844			printk(KERN_ERR PFX "ulp_init: start discovery\n");
   1845			lport->tt.frame_send = bnx2fc_xmit;
   1846			bnx2fc_start_disc(interface);
   1847		}
   1848	}
   1849
   1850	mutex_unlock(&bnx2fc_dev_lock);
   1851}
   1852
   1853static void bnx2fc_port_shutdown(struct fc_lport *lport)
   1854{
   1855	BNX2FC_MISC_DBG("Entered %s\n", __func__);
   1856	fc_fabric_logoff(lport);
   1857	fc_lport_destroy(lport);
   1858}
   1859
   1860static void bnx2fc_stop(struct bnx2fc_interface *interface)
   1861{
   1862	struct fcoe_ctlr *ctlr = bnx2fc_to_ctlr(interface);
   1863	struct fc_lport *lport;
   1864	struct fc_lport *vport;
   1865
   1866	if (!test_bit(BNX2FC_FLAG_FW_INIT_DONE, &interface->hba->flags))
   1867		return;
   1868
   1869	lport = ctlr->lp;
   1870	bnx2fc_port_shutdown(lport);
   1871
   1872	mutex_lock(&lport->lp_mutex);
   1873	list_for_each_entry(vport, &lport->vports, list)
   1874		fc_host_port_type(vport->host) =
   1875					FC_PORTTYPE_UNKNOWN;
   1876	mutex_unlock(&lport->lp_mutex);
   1877	fc_host_port_type(lport->host) = FC_PORTTYPE_UNKNOWN;
   1878	fcoe_ctlr_link_down(ctlr);
   1879	fcoe_clean_pending_queue(lport);
   1880}
   1881
   1882static int bnx2fc_fw_init(struct bnx2fc_hba *hba)
   1883{
   1884#define BNX2FC_INIT_POLL_TIME		(1000 / HZ)
   1885	int rc = -1;
   1886	int i = HZ;
   1887
   1888	rc = bnx2fc_bind_adapter_devices(hba);
   1889	if (rc) {
   1890		printk(KERN_ALERT PFX
   1891			"bnx2fc_bind_adapter_devices failed - rc = %d\n", rc);
   1892		goto err_out;
   1893	}
   1894
   1895	rc = bnx2fc_send_fw_fcoe_init_msg(hba);
   1896	if (rc) {
   1897		printk(KERN_ALERT PFX
   1898			"bnx2fc_send_fw_fcoe_init_msg failed - rc = %d\n", rc);
   1899		goto err_unbind;
   1900	}
   1901
   1902	/*
   1903	 * Wait until the adapter init message is complete, and adapter
   1904	 * state is UP.
   1905	 */
   1906	while (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state) && i--)
   1907		msleep(BNX2FC_INIT_POLL_TIME);
   1908
   1909	if (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state)) {
   1910		printk(KERN_ERR PFX "bnx2fc_start: %s failed to initialize.  "
   1911				"Ignoring...\n",
   1912				hba->cnic->netdev->name);
   1913		rc = -1;
   1914		goto err_unbind;
   1915	}
   1916
   1917
   1918	set_bit(BNX2FC_FLAG_FW_INIT_DONE, &hba->flags);
   1919	return 0;
   1920
   1921err_unbind:
   1922	bnx2fc_unbind_adapter_devices(hba);
   1923err_out:
   1924	return rc;
   1925}
   1926
   1927static void bnx2fc_fw_destroy(struct bnx2fc_hba *hba)
   1928{
   1929	if (test_and_clear_bit(BNX2FC_FLAG_FW_INIT_DONE, &hba->flags)) {
   1930		if (bnx2fc_send_fw_fcoe_destroy_msg(hba) == 0) {
   1931			timer_setup(&hba->destroy_timer, bnx2fc_destroy_timer,
   1932				    0);
   1933			hba->destroy_timer.expires = BNX2FC_FW_TIMEOUT +
   1934								jiffies;
   1935			add_timer(&hba->destroy_timer);
   1936			wait_event_interruptible(hba->destroy_wait,
   1937					test_bit(BNX2FC_FLAG_DESTROY_CMPL,
   1938						 &hba->flags));
   1939			clear_bit(BNX2FC_FLAG_DESTROY_CMPL, &hba->flags);
   1940			/* This should never happen */
   1941			if (signal_pending(current))
   1942				flush_signals(current);
   1943
   1944			del_timer_sync(&hba->destroy_timer);
   1945		}
   1946		bnx2fc_unbind_adapter_devices(hba);
   1947	}
   1948}
   1949
   1950/**
   1951 * bnx2fc_ulp_stop - cnic callback to shutdown adapter instance
   1952 *
   1953 * @handle:	transport handle pointing to adapter structure
   1954 *
   1955 * Driver checks if adapter is already in shutdown mode, if not start
   1956 *	the shutdown process.
   1957 */
   1958static void bnx2fc_ulp_stop(void *handle)
   1959{
   1960	struct bnx2fc_hba *hba = handle;
   1961	struct bnx2fc_interface *interface;
   1962
   1963	printk(KERN_ERR "ULP_STOP\n");
   1964
   1965	mutex_lock(&bnx2fc_dev_lock);
   1966	if (!test_bit(BNX2FC_FLAG_FW_INIT_DONE, &hba->flags))
   1967		goto exit;
   1968	list_for_each_entry(interface, &if_list, list) {
   1969		if (interface->hba == hba)
   1970			bnx2fc_stop(interface);
   1971	}
   1972	BUG_ON(hba->num_ofld_sess != 0);
   1973
   1974	mutex_lock(&hba->hba_mutex);
   1975	clear_bit(ADAPTER_STATE_UP, &hba->adapter_state);
   1976	clear_bit(ADAPTER_STATE_GOING_DOWN,
   1977		  &hba->adapter_state);
   1978
   1979	clear_bit(ADAPTER_STATE_READY, &hba->adapter_state);
   1980	mutex_unlock(&hba->hba_mutex);
   1981
   1982	bnx2fc_fw_destroy(hba);
   1983exit:
   1984	mutex_unlock(&bnx2fc_dev_lock);
   1985}
   1986
   1987static void bnx2fc_start_disc(struct bnx2fc_interface *interface)
   1988{
   1989	struct fcoe_ctlr *ctlr = bnx2fc_to_ctlr(interface);
   1990	struct fc_lport *lport;
   1991	int wait_cnt = 0;
   1992
   1993	BNX2FC_MISC_DBG("Entered %s\n", __func__);
   1994	/* Kick off FIP/FLOGI */
   1995	if (!test_bit(BNX2FC_FLAG_FW_INIT_DONE, &interface->hba->flags)) {
   1996		printk(KERN_ERR PFX "Init not done yet\n");
   1997		return;
   1998	}
   1999
   2000	lport = ctlr->lp;
   2001	BNX2FC_HBA_DBG(lport, "calling fc_fabric_login\n");
   2002
   2003	if (!bnx2fc_link_ok(lport) && interface->enabled) {
   2004		BNX2FC_HBA_DBG(lport, "ctlr_link_up\n");
   2005		fcoe_ctlr_link_up(ctlr);
   2006		fc_host_port_type(lport->host) = FC_PORTTYPE_NPORT;
   2007		set_bit(ADAPTER_STATE_READY, &interface->hba->adapter_state);
   2008	}
   2009
   2010	/* wait for the FCF to be selected before issuing FLOGI */
   2011	while (!ctlr->sel_fcf) {
   2012		msleep(250);
   2013		/* give up after 3 secs */
   2014		if (++wait_cnt > 12)
   2015			break;
   2016	}
   2017
   2018	/* Reset max receive frame size to default */
   2019	if (fc_set_mfs(lport, BNX2FC_MFS))
   2020		return;
   2021
   2022	fc_lport_init(lport);
   2023	fc_fabric_login(lport);
   2024}
   2025
   2026
   2027/**
   2028 * bnx2fc_ulp_init - Initialize an adapter instance
   2029 *
   2030 * @dev :	cnic device handle
   2031 * Called from cnic_register_driver() context to initialize all
   2032 *	enumerated cnic devices. This routine allocates adapter structure
   2033 *	and other device specific resources.
   2034 */
   2035static void bnx2fc_ulp_init(struct cnic_dev *dev)
   2036{
   2037	struct bnx2fc_hba *hba;
   2038	int rc = 0;
   2039
   2040	BNX2FC_MISC_DBG("Entered %s\n", __func__);
   2041	/* bnx2fc works only when bnx2x is loaded */
   2042	if (!test_bit(CNIC_F_BNX2X_CLASS, &dev->flags) ||
   2043	    (dev->max_fcoe_conn == 0)) {
   2044		printk(KERN_ERR PFX "bnx2fc FCoE not supported on %s,"
   2045				    " flags: %lx fcoe_conn: %d\n",
   2046			dev->netdev->name, dev->flags, dev->max_fcoe_conn);
   2047		return;
   2048	}
   2049
   2050	hba = bnx2fc_hba_create(dev);
   2051	if (!hba) {
   2052		printk(KERN_ERR PFX "hba initialization failed\n");
   2053		return;
   2054	}
   2055
   2056	pr_info(PFX "FCoE initialized for %s.\n", dev->netdev->name);
   2057
   2058	/* Add HBA to the adapter list */
   2059	mutex_lock(&bnx2fc_dev_lock);
   2060	list_add_tail(&hba->list, &adapter_list);
   2061	adapter_count++;
   2062	mutex_unlock(&bnx2fc_dev_lock);
   2063
   2064	dev->fcoe_cap = &hba->fcoe_cap;
   2065	clear_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic);
   2066	rc = dev->register_device(dev, CNIC_ULP_FCOE,
   2067						(void *) hba);
   2068	if (rc)
   2069		printk(KERN_ERR PFX "register_device failed, rc = %d\n", rc);
   2070	else
   2071		set_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic);
   2072}
   2073
   2074/* Assumes rtnl_lock and the bnx2fc_dev_lock are already taken */
   2075static int __bnx2fc_disable(struct fcoe_ctlr *ctlr)
   2076{
   2077	struct bnx2fc_interface *interface = fcoe_ctlr_priv(ctlr);
   2078
   2079	if (interface->enabled) {
   2080		if (!ctlr->lp) {
   2081			pr_err(PFX "__bnx2fc_disable: lport not found\n");
   2082			return -ENODEV;
   2083		} else {
   2084			interface->enabled = false;
   2085			fcoe_ctlr_link_down(ctlr);
   2086			fcoe_clean_pending_queue(ctlr->lp);
   2087		}
   2088	}
   2089	return 0;
   2090}
   2091
   2092/*
   2093 * Deperecated: Use bnx2fc_enabled()
   2094 */
   2095static int bnx2fc_disable(struct net_device *netdev)
   2096{
   2097	struct bnx2fc_interface *interface;
   2098	struct fcoe_ctlr *ctlr;
   2099	int rc = 0;
   2100
   2101	rtnl_lock();
   2102	mutex_lock(&bnx2fc_dev_lock);
   2103
   2104	interface = bnx2fc_interface_lookup(netdev);
   2105	ctlr = bnx2fc_to_ctlr(interface);
   2106
   2107	if (!interface) {
   2108		rc = -ENODEV;
   2109		pr_err(PFX "bnx2fc_disable: interface not found\n");
   2110	} else {
   2111		rc = __bnx2fc_disable(ctlr);
   2112	}
   2113	mutex_unlock(&bnx2fc_dev_lock);
   2114	rtnl_unlock();
   2115	return rc;
   2116}
   2117
   2118static uint bnx2fc_npiv_create_vports(struct fc_lport *lport,
   2119				      struct cnic_fc_npiv_tbl *npiv_tbl)
   2120{
   2121	struct fc_vport_identifiers vpid;
   2122	uint i, created = 0;
   2123	u64 wwnn = 0;
   2124	char wwpn_str[32];
   2125	char wwnn_str[32];
   2126
   2127	if (npiv_tbl->count > MAX_NPIV_ENTRIES) {
   2128		BNX2FC_HBA_DBG(lport, "Exceeded count max of npiv table\n");
   2129		goto done;
   2130	}
   2131
   2132	/* Sanity check the first entry to make sure it's not 0 */
   2133	if (wwn_to_u64(npiv_tbl->wwnn[0]) == 0 &&
   2134	    wwn_to_u64(npiv_tbl->wwpn[0]) == 0) {
   2135		BNX2FC_HBA_DBG(lport, "First NPIV table entries invalid.\n");
   2136		goto done;
   2137	}
   2138
   2139	vpid.roles = FC_PORT_ROLE_FCP_INITIATOR;
   2140	vpid.vport_type = FC_PORTTYPE_NPIV;
   2141	vpid.disable = false;
   2142
   2143	for (i = 0; i < npiv_tbl->count; i++) {
   2144		wwnn = wwn_to_u64(npiv_tbl->wwnn[i]);
   2145		if (wwnn == 0) {
   2146			/*
   2147			 * If we get a 0 element from for the WWNN then assume
   2148			 * the WWNN should be the same as the physical port.
   2149			 */
   2150			wwnn = lport->wwnn;
   2151		}
   2152		vpid.node_name = wwnn;
   2153		vpid.port_name = wwn_to_u64(npiv_tbl->wwpn[i]);
   2154		scnprintf(vpid.symbolic_name, sizeof(vpid.symbolic_name),
   2155		    "NPIV[%u]:%016llx-%016llx",
   2156		    created, vpid.port_name, vpid.node_name);
   2157		fcoe_wwn_to_str(vpid.node_name, wwnn_str, sizeof(wwnn_str));
   2158		fcoe_wwn_to_str(vpid.port_name, wwpn_str, sizeof(wwpn_str));
   2159		BNX2FC_HBA_DBG(lport, "Creating vport %s:%s.\n", wwnn_str,
   2160		    wwpn_str);
   2161		if (fc_vport_create(lport->host, 0, &vpid))
   2162			created++;
   2163		else
   2164			BNX2FC_HBA_DBG(lport, "Failed to create vport\n");
   2165	}
   2166done:
   2167	return created;
   2168}
   2169
   2170static int __bnx2fc_enable(struct fcoe_ctlr *ctlr)
   2171{
   2172	struct bnx2fc_interface *interface = fcoe_ctlr_priv(ctlr);
   2173	struct bnx2fc_hba *hba;
   2174	struct cnic_fc_npiv_tbl *npiv_tbl;
   2175	struct fc_lport *lport;
   2176
   2177	if (!interface->enabled) {
   2178		if (!ctlr->lp) {
   2179			pr_err(PFX "__bnx2fc_enable: lport not found\n");
   2180			return -ENODEV;
   2181		} else if (!bnx2fc_link_ok(ctlr->lp)) {
   2182			fcoe_ctlr_link_up(ctlr);
   2183			interface->enabled = true;
   2184		}
   2185	}
   2186
   2187	/* Create static NPIV ports if any are contained in NVRAM */
   2188	hba = interface->hba;
   2189	lport = ctlr->lp;
   2190
   2191	if (!hba)
   2192		goto done;
   2193
   2194	if (!hba->cnic)
   2195		goto done;
   2196
   2197	if (!lport)
   2198		goto done;
   2199
   2200	if (!lport->host)
   2201		goto done;
   2202
   2203	if (!hba->cnic->get_fc_npiv_tbl)
   2204		goto done;
   2205
   2206	npiv_tbl = kzalloc(sizeof(struct cnic_fc_npiv_tbl), GFP_KERNEL);
   2207	if (!npiv_tbl)
   2208		goto done;
   2209
   2210	if (hba->cnic->get_fc_npiv_tbl(hba->cnic, npiv_tbl))
   2211		goto done_free;
   2212
   2213	bnx2fc_npiv_create_vports(lport, npiv_tbl);
   2214done_free:
   2215	kfree(npiv_tbl);
   2216done:
   2217	return 0;
   2218}
   2219
   2220/*
   2221 * Deprecated: Use bnx2fc_enabled()
   2222 */
   2223static int bnx2fc_enable(struct net_device *netdev)
   2224{
   2225	struct bnx2fc_interface *interface;
   2226	struct fcoe_ctlr *ctlr;
   2227	int rc = 0;
   2228
   2229	rtnl_lock();
   2230	mutex_lock(&bnx2fc_dev_lock);
   2231
   2232	interface = bnx2fc_interface_lookup(netdev);
   2233	ctlr = bnx2fc_to_ctlr(interface);
   2234	if (!interface) {
   2235		rc = -ENODEV;
   2236		pr_err(PFX "bnx2fc_enable: interface not found\n");
   2237	} else {
   2238		rc = __bnx2fc_enable(ctlr);
   2239	}
   2240
   2241	mutex_unlock(&bnx2fc_dev_lock);
   2242	rtnl_unlock();
   2243	return rc;
   2244}
   2245
   2246/**
   2247 * bnx2fc_ctlr_enabled() - Enable or disable an FCoE Controller
   2248 * @cdev: The FCoE Controller that is being enabled or disabled
   2249 *
   2250 * fcoe_sysfs will ensure that the state of 'enabled' has
   2251 * changed, so no checking is necessary here. This routine simply
   2252 * calls fcoe_enable or fcoe_disable, both of which are deprecated.
   2253 * When those routines are removed the functionality can be merged
   2254 * here.
   2255 */
   2256static int bnx2fc_ctlr_enabled(struct fcoe_ctlr_device *cdev)
   2257{
   2258	struct fcoe_ctlr *ctlr = fcoe_ctlr_device_priv(cdev);
   2259
   2260	switch (cdev->enabled) {
   2261	case FCOE_CTLR_ENABLED:
   2262		return __bnx2fc_enable(ctlr);
   2263	case FCOE_CTLR_DISABLED:
   2264		return __bnx2fc_disable(ctlr);
   2265	case FCOE_CTLR_UNUSED:
   2266	default:
   2267		return -ENOTSUPP;
   2268	}
   2269}
   2270
   2271enum bnx2fc_create_link_state {
   2272	BNX2FC_CREATE_LINK_DOWN,
   2273	BNX2FC_CREATE_LINK_UP,
   2274};
   2275
   2276/**
   2277 * _bnx2fc_create() - Create bnx2fc FCoE interface
   2278 * @netdev  :   The net_device object the Ethernet interface to create on
   2279 * @fip_mode:   The FIP mode for this creation
   2280 * @link_state: The ctlr link state on creation
   2281 *
   2282 * Called from either the libfcoe 'create' module parameter
   2283 * via fcoe_create or from fcoe_syfs's ctlr_create file.
   2284 *
   2285 * libfcoe's 'create' module parameter is deprecated so some
   2286 * consolidation of code can be done when that interface is
   2287 * removed.
   2288 *
   2289 * Returns: 0 for success
   2290 */
   2291static int _bnx2fc_create(struct net_device *netdev,
   2292			  enum fip_mode fip_mode,
   2293			  enum bnx2fc_create_link_state link_state)
   2294{
   2295	struct fcoe_ctlr_device *cdev;
   2296	struct fcoe_ctlr *ctlr;
   2297	struct bnx2fc_interface *interface;
   2298	struct bnx2fc_hba *hba;
   2299	struct net_device *phys_dev = netdev;
   2300	struct fc_lport *lport;
   2301	struct ethtool_drvinfo drvinfo;
   2302	int rc = 0;
   2303	int vlan_id = 0;
   2304
   2305	BNX2FC_MISC_DBG("Entered bnx2fc_create\n");
   2306	if (fip_mode != FIP_MODE_FABRIC) {
   2307		printk(KERN_ERR "fip mode not FABRIC\n");
   2308		return -EIO;
   2309	}
   2310
   2311	rtnl_lock();
   2312
   2313	mutex_lock(&bnx2fc_dev_lock);
   2314
   2315	if (!try_module_get(THIS_MODULE)) {
   2316		rc = -EINVAL;
   2317		goto mod_err;
   2318	}
   2319
   2320	/* obtain physical netdev */
   2321	if (is_vlan_dev(netdev))
   2322		phys_dev = vlan_dev_real_dev(netdev);
   2323
   2324	/* verify if the physical device is a netxtreme2 device */
   2325	if (phys_dev->ethtool_ops && phys_dev->ethtool_ops->get_drvinfo) {
   2326		memset(&drvinfo, 0, sizeof(drvinfo));
   2327		phys_dev->ethtool_ops->get_drvinfo(phys_dev, &drvinfo);
   2328		if (strncmp(drvinfo.driver, "bnx2x", strlen("bnx2x"))) {
   2329			printk(KERN_ERR PFX "Not a netxtreme2 device\n");
   2330			rc = -EINVAL;
   2331			goto netdev_err;
   2332		}
   2333	} else {
   2334		printk(KERN_ERR PFX "unable to obtain drv_info\n");
   2335		rc = -EINVAL;
   2336		goto netdev_err;
   2337	}
   2338
   2339	/* obtain interface and initialize rest of the structure */
   2340	hba = bnx2fc_hba_lookup(phys_dev);
   2341	if (!hba) {
   2342		rc = -ENODEV;
   2343		printk(KERN_ERR PFX "bnx2fc_create: hba not found\n");
   2344		goto netdev_err;
   2345	}
   2346
   2347	if (bnx2fc_interface_lookup(netdev)) {
   2348		rc = -EEXIST;
   2349		goto netdev_err;
   2350	}
   2351
   2352	interface = bnx2fc_interface_create(hba, netdev, fip_mode);
   2353	if (!interface) {
   2354		printk(KERN_ERR PFX "bnx2fc_interface_create failed\n");
   2355		rc = -ENOMEM;
   2356		goto netdev_err;
   2357	}
   2358
   2359	if (is_vlan_dev(netdev)) {
   2360		vlan_id = vlan_dev_vlan_id(netdev);
   2361		interface->vlan_enabled = 1;
   2362	}
   2363
   2364	ctlr = bnx2fc_to_ctlr(interface);
   2365	cdev = fcoe_ctlr_to_ctlr_dev(ctlr);
   2366	interface->vlan_id = vlan_id;
   2367	interface->tm_timeout = BNX2FC_TM_TIMEOUT;
   2368
   2369	interface->timer_work_queue =
   2370			create_singlethread_workqueue("bnx2fc_timer_wq");
   2371	if (!interface->timer_work_queue) {
   2372		printk(KERN_ERR PFX "ulp_init could not create timer_wq\n");
   2373		rc = -EINVAL;
   2374		goto ifput_err;
   2375	}
   2376
   2377	lport = bnx2fc_if_create(interface, &cdev->dev, 0);
   2378	if (!lport) {
   2379		printk(KERN_ERR PFX "Failed to create interface (%s)\n",
   2380			netdev->name);
   2381		rc = -EINVAL;
   2382		goto if_create_err;
   2383	}
   2384
   2385	/* Add interface to if_list */
   2386	list_add_tail(&interface->list, &if_list);
   2387
   2388	lport->boot_time = jiffies;
   2389
   2390	/* Make this master N_port */
   2391	ctlr->lp = lport;
   2392
   2393	if (link_state == BNX2FC_CREATE_LINK_UP)
   2394		cdev->enabled = FCOE_CTLR_ENABLED;
   2395	else
   2396		cdev->enabled = FCOE_CTLR_DISABLED;
   2397
   2398	if (link_state == BNX2FC_CREATE_LINK_UP &&
   2399	    !bnx2fc_link_ok(lport)) {
   2400		fcoe_ctlr_link_up(ctlr);
   2401		fc_host_port_type(lport->host) = FC_PORTTYPE_NPORT;
   2402		set_bit(ADAPTER_STATE_READY, &interface->hba->adapter_state);
   2403	}
   2404
   2405	BNX2FC_HBA_DBG(lport, "create: START DISC\n");
   2406	bnx2fc_start_disc(interface);
   2407
   2408	if (link_state == BNX2FC_CREATE_LINK_UP)
   2409		interface->enabled = true;
   2410
   2411	/*
   2412	 * Release from kref_init in bnx2fc_interface_setup, on success
   2413	 * lport should be holding a reference taken in bnx2fc_if_create
   2414	 */
   2415	bnx2fc_interface_put(interface);
   2416	/* put netdev that was held while calling dev_get_by_name */
   2417	mutex_unlock(&bnx2fc_dev_lock);
   2418	rtnl_unlock();
   2419	return 0;
   2420
   2421if_create_err:
   2422	destroy_workqueue(interface->timer_work_queue);
   2423ifput_err:
   2424	bnx2fc_net_cleanup(interface);
   2425	bnx2fc_interface_put(interface);
   2426	goto mod_err;
   2427netdev_err:
   2428	module_put(THIS_MODULE);
   2429mod_err:
   2430	mutex_unlock(&bnx2fc_dev_lock);
   2431	rtnl_unlock();
   2432	return rc;
   2433}
   2434
   2435/**
   2436 * bnx2fc_create() - Create a bnx2fc interface
   2437 * @netdev  : The net_device object the Ethernet interface to create on
   2438 * @fip_mode: The FIP mode for this creation
   2439 *
   2440 * Called from fcoe transport
   2441 *
   2442 * Returns: 0 for success
   2443 */
   2444static int bnx2fc_create(struct net_device *netdev, enum fip_mode fip_mode)
   2445{
   2446	return _bnx2fc_create(netdev, fip_mode, BNX2FC_CREATE_LINK_UP);
   2447}
   2448
   2449/**
   2450 * bnx2fc_ctlr_alloc() - Allocate a bnx2fc interface from fcoe_sysfs
   2451 * @netdev: The net_device to be used by the allocated FCoE Controller
   2452 *
   2453 * This routine is called from fcoe_sysfs. It will start the fcoe_ctlr
   2454 * in a link_down state. The allows the user an opportunity to configure
   2455 * the FCoE Controller from sysfs before enabling the FCoE Controller.
   2456 *
   2457 * Creating in with this routine starts the FCoE Controller in Fabric
   2458 * mode. The user can change to VN2VN or another mode before enabling.
   2459 */
   2460static int bnx2fc_ctlr_alloc(struct net_device *netdev)
   2461{
   2462	return _bnx2fc_create(netdev, FIP_MODE_FABRIC,
   2463			      BNX2FC_CREATE_LINK_DOWN);
   2464}
   2465
   2466/**
   2467 * bnx2fc_find_hba_for_cnic - maps cnic instance to bnx2fc hba instance
   2468 *
   2469 * @cnic:	Pointer to cnic device instance
   2470 *
   2471 **/
   2472static struct bnx2fc_hba *bnx2fc_find_hba_for_cnic(struct cnic_dev *cnic)
   2473{
   2474	struct bnx2fc_hba *hba;
   2475
   2476	/* Called with bnx2fc_dev_lock held */
   2477	list_for_each_entry(hba, &adapter_list, list) {
   2478		if (hba->cnic == cnic)
   2479			return hba;
   2480	}
   2481	return NULL;
   2482}
   2483
   2484static struct bnx2fc_interface *bnx2fc_interface_lookup(struct net_device
   2485							*netdev)
   2486{
   2487	struct bnx2fc_interface *interface;
   2488
   2489	/* Called with bnx2fc_dev_lock held */
   2490	list_for_each_entry(interface, &if_list, list) {
   2491		if (interface->netdev == netdev)
   2492			return interface;
   2493	}
   2494	return NULL;
   2495}
   2496
   2497static struct bnx2fc_hba *bnx2fc_hba_lookup(struct net_device
   2498						      *phys_dev)
   2499{
   2500	struct bnx2fc_hba *hba;
   2501
   2502	/* Called with bnx2fc_dev_lock held */
   2503	list_for_each_entry(hba, &adapter_list, list) {
   2504		if (hba->phys_dev == phys_dev)
   2505			return hba;
   2506	}
   2507	printk(KERN_ERR PFX "adapter_lookup: hba NULL\n");
   2508	return NULL;
   2509}
   2510
   2511/**
   2512 * bnx2fc_ulp_exit - shuts down adapter instance and frees all resources
   2513 *
   2514 * @dev:	cnic device handle
   2515 */
   2516static void bnx2fc_ulp_exit(struct cnic_dev *dev)
   2517{
   2518	struct bnx2fc_hba *hba;
   2519	struct bnx2fc_interface *interface, *tmp;
   2520
   2521	BNX2FC_MISC_DBG("Entered bnx2fc_ulp_exit\n");
   2522
   2523	if (!test_bit(CNIC_F_BNX2X_CLASS, &dev->flags)) {
   2524		printk(KERN_ERR PFX "bnx2fc port check: %s, flags: %lx\n",
   2525			dev->netdev->name, dev->flags);
   2526		return;
   2527	}
   2528
   2529	mutex_lock(&bnx2fc_dev_lock);
   2530	hba = bnx2fc_find_hba_for_cnic(dev);
   2531	if (!hba) {
   2532		printk(KERN_ERR PFX "bnx2fc_ulp_exit: hba not found, dev 0%p\n",
   2533		       dev);
   2534		mutex_unlock(&bnx2fc_dev_lock);
   2535		return;
   2536	}
   2537
   2538	list_del_init(&hba->list);
   2539	adapter_count--;
   2540
   2541	list_for_each_entry_safe(interface, tmp, &if_list, list)
   2542		/* destroy not called yet, move to quiesced list */
   2543		if (interface->hba == hba)
   2544			__bnx2fc_destroy(interface);
   2545	mutex_unlock(&bnx2fc_dev_lock);
   2546
   2547	bnx2fc_ulp_stop(hba);
   2548	/* unregister cnic device */
   2549	if (test_and_clear_bit(BNX2FC_CNIC_REGISTERED, &hba->reg_with_cnic))
   2550		hba->cnic->unregister_device(hba->cnic, CNIC_ULP_FCOE);
   2551	bnx2fc_hba_destroy(hba);
   2552}
   2553
   2554static void bnx2fc_rport_terminate_io(struct fc_rport *rport)
   2555{
   2556	/* This is a no-op */
   2557}
   2558
   2559/**
   2560 * bnx2fc_fcoe_reset - Resets the fcoe
   2561 *
   2562 * @shost: shost the reset is from
   2563 *
   2564 * Returns: always 0
   2565 */
   2566static int bnx2fc_fcoe_reset(struct Scsi_Host *shost)
   2567{
   2568	struct fc_lport *lport = shost_priv(shost);
   2569	fc_lport_reset(lport);
   2570	return 0;
   2571}
   2572
   2573
   2574static bool bnx2fc_match(struct net_device *netdev)
   2575{
   2576	struct net_device *phys_dev = netdev;
   2577
   2578	mutex_lock(&bnx2fc_dev_lock);
   2579	if (is_vlan_dev(netdev))
   2580		phys_dev = vlan_dev_real_dev(netdev);
   2581
   2582	if (bnx2fc_hba_lookup(phys_dev)) {
   2583		mutex_unlock(&bnx2fc_dev_lock);
   2584		return true;
   2585	}
   2586
   2587	mutex_unlock(&bnx2fc_dev_lock);
   2588	return false;
   2589}
   2590
   2591
   2592static struct fcoe_transport bnx2fc_transport = {
   2593	.name = {"bnx2fc"},
   2594	.attached = false,
   2595	.list = LIST_HEAD_INIT(bnx2fc_transport.list),
   2596	.alloc = bnx2fc_ctlr_alloc,
   2597	.match = bnx2fc_match,
   2598	.create = bnx2fc_create,
   2599	.destroy = bnx2fc_destroy,
   2600	.enable = bnx2fc_enable,
   2601	.disable = bnx2fc_disable,
   2602};
   2603
   2604/**
   2605 * bnx2fc_cpu_online - Create a receive thread for an  online CPU
   2606 *
   2607 * @cpu: cpu index for the online cpu
   2608 */
   2609static int bnx2fc_cpu_online(unsigned int cpu)
   2610{
   2611	struct bnx2fc_percpu_s *p;
   2612	struct task_struct *thread;
   2613
   2614	p = &per_cpu(bnx2fc_percpu, cpu);
   2615
   2616	thread = kthread_create_on_node(bnx2fc_percpu_io_thread,
   2617					(void *)p, cpu_to_node(cpu),
   2618					"bnx2fc_thread/%d", cpu);
   2619	if (IS_ERR(thread))
   2620		return PTR_ERR(thread);
   2621
   2622	/* bind thread to the cpu */
   2623	kthread_bind(thread, cpu);
   2624	p->iothread = thread;
   2625	wake_up_process(thread);
   2626	return 0;
   2627}
   2628
   2629static int bnx2fc_cpu_offline(unsigned int cpu)
   2630{
   2631	struct bnx2fc_percpu_s *p;
   2632	struct task_struct *thread;
   2633	struct bnx2fc_work *work, *tmp;
   2634
   2635	BNX2FC_MISC_DBG("destroying io thread for CPU %d\n", cpu);
   2636
   2637	/* Prevent any new work from being queued for this CPU */
   2638	p = &per_cpu(bnx2fc_percpu, cpu);
   2639	spin_lock_bh(&p->fp_work_lock);
   2640	thread = p->iothread;
   2641	p->iothread = NULL;
   2642
   2643	/* Free all work in the list */
   2644	list_for_each_entry_safe(work, tmp, &p->work_list, list) {
   2645		list_del_init(&work->list);
   2646		bnx2fc_process_cq_compl(work->tgt, work->wqe, work->rq_data,
   2647					work->num_rq, work->task);
   2648		kfree(work);
   2649	}
   2650
   2651	spin_unlock_bh(&p->fp_work_lock);
   2652
   2653	if (thread)
   2654		kthread_stop(thread);
   2655	return 0;
   2656}
   2657
   2658static int bnx2fc_slave_configure(struct scsi_device *sdev)
   2659{
   2660	if (!bnx2fc_queue_depth)
   2661		return 0;
   2662
   2663	scsi_change_queue_depth(sdev, bnx2fc_queue_depth);
   2664	return 0;
   2665}
   2666
   2667static enum cpuhp_state bnx2fc_online_state;
   2668
   2669/**
   2670 * bnx2fc_mod_init - module init entry point
   2671 *
   2672 * Initialize driver wide global data structures, and register
   2673 * with cnic module
   2674 **/
   2675static int __init bnx2fc_mod_init(void)
   2676{
   2677	struct fcoe_percpu_s *bg;
   2678	struct task_struct *l2_thread;
   2679	int rc = 0;
   2680	unsigned int cpu = 0;
   2681	struct bnx2fc_percpu_s *p;
   2682
   2683	printk(KERN_INFO PFX "%s", version);
   2684
   2685	/* register as a fcoe transport */
   2686	rc = fcoe_transport_attach(&bnx2fc_transport);
   2687	if (rc) {
   2688		printk(KERN_ERR "failed to register an fcoe transport, check "
   2689			"if libfcoe is loaded\n");
   2690		goto out;
   2691	}
   2692
   2693	INIT_LIST_HEAD(&adapter_list);
   2694	INIT_LIST_HEAD(&if_list);
   2695	mutex_init(&bnx2fc_dev_lock);
   2696	adapter_count = 0;
   2697
   2698	/* Attach FC transport template */
   2699	rc = bnx2fc_attach_transport();
   2700	if (rc)
   2701		goto detach_ft;
   2702
   2703	bnx2fc_wq = alloc_workqueue("bnx2fc", 0, 0);
   2704	if (!bnx2fc_wq) {
   2705		rc = -ENOMEM;
   2706		goto release_bt;
   2707	}
   2708
   2709	bg = &bnx2fc_global;
   2710	skb_queue_head_init(&bg->fcoe_rx_list);
   2711	l2_thread = kthread_run(bnx2fc_l2_rcv_thread,
   2712				(void *)bg,
   2713				"bnx2fc_l2_thread");
   2714	if (IS_ERR(l2_thread)) {
   2715		rc = PTR_ERR(l2_thread);
   2716		goto free_wq;
   2717	}
   2718	spin_lock_bh(&bg->fcoe_rx_list.lock);
   2719	bg->kthread = l2_thread;
   2720	spin_unlock_bh(&bg->fcoe_rx_list.lock);
   2721
   2722	for_each_possible_cpu(cpu) {
   2723		p = &per_cpu(bnx2fc_percpu, cpu);
   2724		INIT_LIST_HEAD(&p->work_list);
   2725		spin_lock_init(&p->fp_work_lock);
   2726	}
   2727
   2728	rc = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "scsi/bnx2fc:online",
   2729			       bnx2fc_cpu_online, bnx2fc_cpu_offline);
   2730	if (rc < 0)
   2731		goto stop_thread;
   2732	bnx2fc_online_state = rc;
   2733
   2734	cnic_register_driver(CNIC_ULP_FCOE, &bnx2fc_cnic_cb);
   2735	return 0;
   2736
   2737stop_thread:
   2738	kthread_stop(l2_thread);
   2739free_wq:
   2740	destroy_workqueue(bnx2fc_wq);
   2741release_bt:
   2742	bnx2fc_release_transport();
   2743detach_ft:
   2744	fcoe_transport_detach(&bnx2fc_transport);
   2745out:
   2746	return rc;
   2747}
   2748
   2749static void __exit bnx2fc_mod_exit(void)
   2750{
   2751	LIST_HEAD(to_be_deleted);
   2752	struct bnx2fc_hba *hba, *next;
   2753	struct fcoe_percpu_s *bg;
   2754	struct task_struct *l2_thread;
   2755	struct sk_buff *skb;
   2756
   2757	/*
   2758	 * NOTE: Since cnic calls register_driver routine rtnl_lock,
   2759	 * it will have higher precedence than bnx2fc_dev_lock.
   2760	 * unregister_device() cannot be called with bnx2fc_dev_lock
   2761	 * held.
   2762	 */
   2763	mutex_lock(&bnx2fc_dev_lock);
   2764	list_splice_init(&adapter_list, &to_be_deleted);
   2765	adapter_count = 0;
   2766	mutex_unlock(&bnx2fc_dev_lock);
   2767
   2768	/* Unregister with cnic */
   2769	list_for_each_entry_safe(hba, next, &to_be_deleted, list) {
   2770		list_del_init(&hba->list);
   2771		printk(KERN_ERR PFX "MOD_EXIT:destroy hba = 0x%p\n",
   2772		       hba);
   2773		bnx2fc_ulp_stop(hba);
   2774		/* unregister cnic device */
   2775		if (test_and_clear_bit(BNX2FC_CNIC_REGISTERED,
   2776				       &hba->reg_with_cnic))
   2777			hba->cnic->unregister_device(hba->cnic,
   2778							 CNIC_ULP_FCOE);
   2779		bnx2fc_hba_destroy(hba);
   2780	}
   2781	cnic_unregister_driver(CNIC_ULP_FCOE);
   2782
   2783	/* Destroy global thread */
   2784	bg = &bnx2fc_global;
   2785	spin_lock_bh(&bg->fcoe_rx_list.lock);
   2786	l2_thread = bg->kthread;
   2787	bg->kthread = NULL;
   2788	while ((skb = __skb_dequeue(&bg->fcoe_rx_list)) != NULL)
   2789		kfree_skb(skb);
   2790
   2791	spin_unlock_bh(&bg->fcoe_rx_list.lock);
   2792
   2793	if (l2_thread)
   2794		kthread_stop(l2_thread);
   2795
   2796	cpuhp_remove_state(bnx2fc_online_state);
   2797
   2798	destroy_workqueue(bnx2fc_wq);
   2799	/*
   2800	 * detach from scsi transport
   2801	 * must happen after all destroys are done
   2802	 */
   2803	bnx2fc_release_transport();
   2804
   2805	/* detach from fcoe transport */
   2806	fcoe_transport_detach(&bnx2fc_transport);
   2807}
   2808
   2809module_init(bnx2fc_mod_init);
   2810module_exit(bnx2fc_mod_exit);
   2811
   2812static struct fcoe_sysfs_function_template bnx2fc_fcoe_sysfs_templ = {
   2813	.set_fcoe_ctlr_enabled = bnx2fc_ctlr_enabled,
   2814	.get_fcoe_ctlr_link_fail = fcoe_ctlr_get_lesb,
   2815	.get_fcoe_ctlr_vlink_fail = fcoe_ctlr_get_lesb,
   2816	.get_fcoe_ctlr_miss_fka = fcoe_ctlr_get_lesb,
   2817	.get_fcoe_ctlr_symb_err = fcoe_ctlr_get_lesb,
   2818	.get_fcoe_ctlr_err_block = fcoe_ctlr_get_lesb,
   2819	.get_fcoe_ctlr_fcs_error = fcoe_ctlr_get_lesb,
   2820
   2821	.get_fcoe_fcf_selected = fcoe_fcf_get_selected,
   2822	.get_fcoe_fcf_vlan_id = bnx2fc_fcf_get_vlan_id,
   2823};
   2824
   2825static struct fc_function_template bnx2fc_transport_function = {
   2826	.show_host_node_name = 1,
   2827	.show_host_port_name = 1,
   2828	.show_host_supported_classes = 1,
   2829	.show_host_supported_fc4s = 1,
   2830	.show_host_active_fc4s = 1,
   2831	.show_host_maxframe_size = 1,
   2832
   2833	.show_host_port_id = 1,
   2834	.show_host_supported_speeds = 1,
   2835	.get_host_speed = fc_get_host_speed,
   2836	.show_host_speed = 1,
   2837	.show_host_port_type = 1,
   2838	.get_host_port_state = fc_get_host_port_state,
   2839	.show_host_port_state = 1,
   2840	.show_host_symbolic_name = 1,
   2841
   2842	.dd_fcrport_size = (sizeof(struct fc_rport_libfc_priv) +
   2843				sizeof(struct bnx2fc_rport)),
   2844	.show_rport_maxframe_size = 1,
   2845	.show_rport_supported_classes = 1,
   2846
   2847	.show_host_fabric_name = 1,
   2848	.show_starget_node_name = 1,
   2849	.show_starget_port_name = 1,
   2850	.show_starget_port_id = 1,
   2851	.set_rport_dev_loss_tmo = fc_set_rport_loss_tmo,
   2852	.show_rport_dev_loss_tmo = 1,
   2853	.get_fc_host_stats = bnx2fc_get_host_stats,
   2854
   2855	.issue_fc_host_lip = bnx2fc_fcoe_reset,
   2856
   2857	.terminate_rport_io = bnx2fc_rport_terminate_io,
   2858
   2859	.vport_create = bnx2fc_vport_create,
   2860	.vport_delete = bnx2fc_vport_destroy,
   2861	.vport_disable = bnx2fc_vport_disable,
   2862	.bsg_request = fc_lport_bsg_request,
   2863};
   2864
   2865static struct fc_function_template bnx2fc_vport_xport_function = {
   2866	.show_host_node_name = 1,
   2867	.show_host_port_name = 1,
   2868	.show_host_supported_classes = 1,
   2869	.show_host_supported_fc4s = 1,
   2870	.show_host_active_fc4s = 1,
   2871	.show_host_maxframe_size = 1,
   2872
   2873	.show_host_port_id = 1,
   2874	.show_host_supported_speeds = 1,
   2875	.get_host_speed = fc_get_host_speed,
   2876	.show_host_speed = 1,
   2877	.show_host_port_type = 1,
   2878	.get_host_port_state = fc_get_host_port_state,
   2879	.show_host_port_state = 1,
   2880	.show_host_symbolic_name = 1,
   2881
   2882	.dd_fcrport_size = (sizeof(struct fc_rport_libfc_priv) +
   2883				sizeof(struct bnx2fc_rport)),
   2884	.show_rport_maxframe_size = 1,
   2885	.show_rport_supported_classes = 1,
   2886
   2887	.show_host_fabric_name = 1,
   2888	.show_starget_node_name = 1,
   2889	.show_starget_port_name = 1,
   2890	.show_starget_port_id = 1,
   2891	.set_rport_dev_loss_tmo = fc_set_rport_loss_tmo,
   2892	.show_rport_dev_loss_tmo = 1,
   2893	.get_fc_host_stats = fc_get_host_stats,
   2894	.issue_fc_host_lip = bnx2fc_fcoe_reset,
   2895	.terminate_rport_io = fc_rport_terminate_io,
   2896	.bsg_request = fc_lport_bsg_request,
   2897};
   2898
   2899/*
   2900 * Additional scsi_host attributes.
   2901 */
   2902static ssize_t
   2903bnx2fc_tm_timeout_show(struct device *dev, struct device_attribute *attr,
   2904	char *buf)
   2905{
   2906	struct Scsi_Host *shost = class_to_shost(dev);
   2907	struct fc_lport *lport = shost_priv(shost);
   2908	struct fcoe_port *port = lport_priv(lport);
   2909	struct bnx2fc_interface *interface = port->priv;
   2910
   2911	sprintf(buf, "%u\n", interface->tm_timeout);
   2912	return strlen(buf);
   2913}
   2914
   2915static ssize_t
   2916bnx2fc_tm_timeout_store(struct device *dev,
   2917	struct device_attribute *attr, const char *buf, size_t count)
   2918{
   2919	struct Scsi_Host *shost = class_to_shost(dev);
   2920	struct fc_lport *lport = shost_priv(shost);
   2921	struct fcoe_port *port = lport_priv(lport);
   2922	struct bnx2fc_interface *interface = port->priv;
   2923	int rval, val;
   2924
   2925	rval = kstrtouint(buf, 10, &val);
   2926	if (rval)
   2927		return rval;
   2928	if (val > 255)
   2929		return -ERANGE;
   2930
   2931	interface->tm_timeout = (u8)val;
   2932	return strlen(buf);
   2933}
   2934
   2935static DEVICE_ATTR(tm_timeout, S_IRUGO|S_IWUSR, bnx2fc_tm_timeout_show,
   2936	bnx2fc_tm_timeout_store);
   2937
   2938static struct attribute *bnx2fc_host_attrs[] = {
   2939	&dev_attr_tm_timeout.attr,
   2940	NULL,
   2941};
   2942
   2943ATTRIBUTE_GROUPS(bnx2fc_host);
   2944
   2945/*
   2946 * scsi_host_template structure used while registering with SCSI-ml
   2947 */
   2948static struct scsi_host_template bnx2fc_shost_template = {
   2949	.module			= THIS_MODULE,
   2950	.name			= "QLogic Offload FCoE Initiator",
   2951	.queuecommand		= bnx2fc_queuecommand,
   2952	.eh_timed_out		= fc_eh_timed_out,
   2953	.eh_abort_handler	= bnx2fc_eh_abort,	  /* abts */
   2954	.eh_device_reset_handler = bnx2fc_eh_device_reset, /* lun reset */
   2955	.eh_target_reset_handler = bnx2fc_eh_target_reset, /* tgt reset */
   2956	.eh_host_reset_handler	= fc_eh_host_reset,
   2957	.slave_alloc		= fc_slave_alloc,
   2958	.change_queue_depth	= scsi_change_queue_depth,
   2959	.this_id		= -1,
   2960	.cmd_per_lun		= 3,
   2961	.sg_tablesize		= BNX2FC_MAX_BDS_PER_CMD,
   2962	.dma_boundary           = 0x7fff,
   2963	.max_sectors		= 0x3fbf,
   2964	.track_queue_depth	= 1,
   2965	.slave_configure	= bnx2fc_slave_configure,
   2966	.shost_groups		= bnx2fc_host_groups,
   2967	.cmd_size		= sizeof(struct bnx2fc_priv),
   2968};
   2969
   2970static struct libfc_function_template bnx2fc_libfc_fcn_templ = {
   2971	.frame_send		= bnx2fc_xmit,
   2972	.elsct_send		= bnx2fc_elsct_send,
   2973	.fcp_abort_io		= bnx2fc_abort_io,
   2974	.fcp_cleanup		= bnx2fc_cleanup,
   2975	.get_lesb		= fcoe_get_lesb,
   2976	.rport_event_callback	= bnx2fc_rport_event_handler,
   2977};
   2978
   2979/*
   2980 * bnx2fc_cnic_cb - global template of bnx2fc - cnic driver interface
   2981 *			structure carrying callback function pointers
   2982 */
   2983static struct cnic_ulp_ops bnx2fc_cnic_cb = {
   2984	.owner			= THIS_MODULE,
   2985	.cnic_init		= bnx2fc_ulp_init,
   2986	.cnic_exit		= bnx2fc_ulp_exit,
   2987	.cnic_start		= bnx2fc_ulp_start,
   2988	.cnic_stop		= bnx2fc_ulp_stop,
   2989	.indicate_kcqes		= bnx2fc_indicate_kcqe,
   2990	.indicate_netevent	= bnx2fc_indicate_netevent,
   2991	.cnic_get_stats		= bnx2fc_ulp_get_stats,
   2992};