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

fnic_fcs.c (39425B)


      1/*
      2 * Copyright 2008 Cisco Systems, Inc.  All rights reserved.
      3 * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
      4 *
      5 * This program is free software; you may redistribute it and/or modify
      6 * it under the terms of the GNU General Public License as published by
      7 * the Free Software Foundation; version 2 of the License.
      8 *
      9 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     10 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     11 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     12 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
     13 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
     14 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     15 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     16 * SOFTWARE.
     17 */
     18#include <linux/errno.h>
     19#include <linux/pci.h>
     20#include <linux/slab.h>
     21#include <linux/skbuff.h>
     22#include <linux/interrupt.h>
     23#include <linux/spinlock.h>
     24#include <linux/if_ether.h>
     25#include <linux/if_vlan.h>
     26#include <linux/workqueue.h>
     27#include <scsi/fc/fc_fip.h>
     28#include <scsi/fc/fc_els.h>
     29#include <scsi/fc/fc_fcoe.h>
     30#include <scsi/fc_frame.h>
     31#include <scsi/libfc.h>
     32#include "fnic_io.h"
     33#include "fnic.h"
     34#include "fnic_fip.h"
     35#include "cq_enet_desc.h"
     36#include "cq_exch_desc.h"
     37
     38static u8 fcoe_all_fcfs[ETH_ALEN] = FIP_ALL_FCF_MACS;
     39struct workqueue_struct *fnic_fip_queue;
     40struct workqueue_struct *fnic_event_queue;
     41
     42static void fnic_set_eth_mode(struct fnic *);
     43static void fnic_fcoe_send_vlan_req(struct fnic *fnic);
     44static void fnic_fcoe_start_fcf_disc(struct fnic *fnic);
     45static void fnic_fcoe_process_vlan_resp(struct fnic *fnic, struct sk_buff *);
     46static int fnic_fcoe_vlan_check(struct fnic *fnic, u16 flag);
     47static int fnic_fcoe_handle_fip_frame(struct fnic *fnic, struct sk_buff *skb);
     48
     49void fnic_handle_link(struct work_struct *work)
     50{
     51	struct fnic *fnic = container_of(work, struct fnic, link_work);
     52	unsigned long flags;
     53	int old_link_status;
     54	u32 old_link_down_cnt;
     55	u64 old_port_speed, new_port_speed;
     56
     57	spin_lock_irqsave(&fnic->fnic_lock, flags);
     58
     59	fnic->link_events = 1;      /* less work to just set everytime*/
     60
     61	if (fnic->stop_rx_link_events) {
     62		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
     63		return;
     64	}
     65
     66	old_link_down_cnt = fnic->link_down_cnt;
     67	old_link_status = fnic->link_status;
     68	old_port_speed = atomic64_read(
     69			&fnic->fnic_stats.misc_stats.current_port_speed);
     70
     71	fnic->link_status = vnic_dev_link_status(fnic->vdev);
     72	fnic->link_down_cnt = vnic_dev_link_down_cnt(fnic->vdev);
     73
     74	new_port_speed = vnic_dev_port_speed(fnic->vdev);
     75	atomic64_set(&fnic->fnic_stats.misc_stats.current_port_speed,
     76			new_port_speed);
     77	if (old_port_speed != new_port_speed)
     78		FNIC_MAIN_DBG(KERN_INFO, fnic->lport->host,
     79				"Current vnic speed set to :  %llu\n",
     80				new_port_speed);
     81
     82	switch (vnic_dev_port_speed(fnic->vdev)) {
     83	case DCEM_PORTSPEED_10G:
     84		fc_host_speed(fnic->lport->host)   = FC_PORTSPEED_10GBIT;
     85		fnic->lport->link_supported_speeds = FC_PORTSPEED_10GBIT;
     86		break;
     87	case DCEM_PORTSPEED_20G:
     88		fc_host_speed(fnic->lport->host)   = FC_PORTSPEED_20GBIT;
     89		fnic->lport->link_supported_speeds = FC_PORTSPEED_20GBIT;
     90		break;
     91	case DCEM_PORTSPEED_25G:
     92		fc_host_speed(fnic->lport->host)   = FC_PORTSPEED_25GBIT;
     93		fnic->lport->link_supported_speeds = FC_PORTSPEED_25GBIT;
     94		break;
     95	case DCEM_PORTSPEED_40G:
     96	case DCEM_PORTSPEED_4x10G:
     97		fc_host_speed(fnic->lport->host)   = FC_PORTSPEED_40GBIT;
     98		fnic->lport->link_supported_speeds = FC_PORTSPEED_40GBIT;
     99		break;
    100	case DCEM_PORTSPEED_100G:
    101		fc_host_speed(fnic->lport->host)   = FC_PORTSPEED_100GBIT;
    102		fnic->lport->link_supported_speeds = FC_PORTSPEED_100GBIT;
    103		break;
    104	default:
    105		fc_host_speed(fnic->lport->host)   = FC_PORTSPEED_UNKNOWN;
    106		fnic->lport->link_supported_speeds = FC_PORTSPEED_UNKNOWN;
    107		break;
    108	}
    109
    110	if (old_link_status == fnic->link_status) {
    111		if (!fnic->link_status) {
    112			/* DOWN -> DOWN */
    113			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    114			fnic_fc_trace_set_data(fnic->lport->host->host_no,
    115				FNIC_FC_LE, "Link Status: DOWN->DOWN",
    116				strlen("Link Status: DOWN->DOWN"));
    117		} else {
    118			if (old_link_down_cnt != fnic->link_down_cnt) {
    119				/* UP -> DOWN -> UP */
    120				fnic->lport->host_stats.link_failure_count++;
    121				spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    122				fnic_fc_trace_set_data(
    123					fnic->lport->host->host_no,
    124					FNIC_FC_LE,
    125					"Link Status:UP_DOWN_UP",
    126					strlen("Link_Status:UP_DOWN_UP")
    127					);
    128				FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
    129					     "link down\n");
    130				fcoe_ctlr_link_down(&fnic->ctlr);
    131				if (fnic->config.flags & VFCF_FIP_CAPABLE) {
    132					/* start FCoE VLAN discovery */
    133					fnic_fc_trace_set_data(
    134						fnic->lport->host->host_no,
    135						FNIC_FC_LE,
    136						"Link Status: UP_DOWN_UP_VLAN",
    137						strlen(
    138						"Link Status: UP_DOWN_UP_VLAN")
    139						);
    140					fnic_fcoe_send_vlan_req(fnic);
    141					return;
    142				}
    143				FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
    144					     "link up\n");
    145				fcoe_ctlr_link_up(&fnic->ctlr);
    146			} else {
    147				/* UP -> UP */
    148				spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    149				fnic_fc_trace_set_data(
    150					fnic->lport->host->host_no, FNIC_FC_LE,
    151					"Link Status: UP_UP",
    152					strlen("Link Status: UP_UP"));
    153			}
    154		}
    155	} else if (fnic->link_status) {
    156		/* DOWN -> UP */
    157		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    158		if (fnic->config.flags & VFCF_FIP_CAPABLE) {
    159			/* start FCoE VLAN discovery */
    160				fnic_fc_trace_set_data(
    161				fnic->lport->host->host_no,
    162				FNIC_FC_LE, "Link Status: DOWN_UP_VLAN",
    163				strlen("Link Status: DOWN_UP_VLAN"));
    164			fnic_fcoe_send_vlan_req(fnic);
    165			return;
    166		}
    167		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "link up\n");
    168		fnic_fc_trace_set_data(fnic->lport->host->host_no, FNIC_FC_LE,
    169			"Link Status: DOWN_UP", strlen("Link Status: DOWN_UP"));
    170		fcoe_ctlr_link_up(&fnic->ctlr);
    171	} else {
    172		/* UP -> DOWN */
    173		fnic->lport->host_stats.link_failure_count++;
    174		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    175		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "link down\n");
    176		fnic_fc_trace_set_data(
    177			fnic->lport->host->host_no, FNIC_FC_LE,
    178			"Link Status: UP_DOWN",
    179			strlen("Link Status: UP_DOWN"));
    180		if (fnic->config.flags & VFCF_FIP_CAPABLE) {
    181			FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
    182				"deleting fip-timer during link-down\n");
    183			del_timer_sync(&fnic->fip_timer);
    184		}
    185		fcoe_ctlr_link_down(&fnic->ctlr);
    186	}
    187
    188}
    189
    190/*
    191 * This function passes incoming fabric frames to libFC
    192 */
    193void fnic_handle_frame(struct work_struct *work)
    194{
    195	struct fnic *fnic = container_of(work, struct fnic, frame_work);
    196	struct fc_lport *lp = fnic->lport;
    197	unsigned long flags;
    198	struct sk_buff *skb;
    199	struct fc_frame *fp;
    200
    201	while ((skb = skb_dequeue(&fnic->frame_queue))) {
    202
    203		spin_lock_irqsave(&fnic->fnic_lock, flags);
    204		if (fnic->stop_rx_link_events) {
    205			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    206			dev_kfree_skb(skb);
    207			return;
    208		}
    209		fp = (struct fc_frame *)skb;
    210
    211		/*
    212		 * If we're in a transitional state, just re-queue and return.
    213		 * The queue will be serviced when we get to a stable state.
    214		 */
    215		if (fnic->state != FNIC_IN_FC_MODE &&
    216		    fnic->state != FNIC_IN_ETH_MODE) {
    217			skb_queue_head(&fnic->frame_queue, skb);
    218			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    219			return;
    220		}
    221		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    222
    223		fc_exch_recv(lp, fp);
    224	}
    225}
    226
    227void fnic_fcoe_evlist_free(struct fnic *fnic)
    228{
    229	struct fnic_event *fevt = NULL;
    230	struct fnic_event *next = NULL;
    231	unsigned long flags;
    232
    233	spin_lock_irqsave(&fnic->fnic_lock, flags);
    234	if (list_empty(&fnic->evlist)) {
    235		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    236		return;
    237	}
    238
    239	list_for_each_entry_safe(fevt, next, &fnic->evlist, list) {
    240		list_del(&fevt->list);
    241		kfree(fevt);
    242	}
    243	spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    244}
    245
    246void fnic_handle_event(struct work_struct *work)
    247{
    248	struct fnic *fnic = container_of(work, struct fnic, event_work);
    249	struct fnic_event *fevt = NULL;
    250	struct fnic_event *next = NULL;
    251	unsigned long flags;
    252
    253	spin_lock_irqsave(&fnic->fnic_lock, flags);
    254	if (list_empty(&fnic->evlist)) {
    255		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    256		return;
    257	}
    258
    259	list_for_each_entry_safe(fevt, next, &fnic->evlist, list) {
    260		if (fnic->stop_rx_link_events) {
    261			list_del(&fevt->list);
    262			kfree(fevt);
    263			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    264			return;
    265		}
    266		/*
    267		 * If we're in a transitional state, just re-queue and return.
    268		 * The queue will be serviced when we get to a stable state.
    269		 */
    270		if (fnic->state != FNIC_IN_FC_MODE &&
    271		    fnic->state != FNIC_IN_ETH_MODE) {
    272			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    273			return;
    274		}
    275
    276		list_del(&fevt->list);
    277		switch (fevt->event) {
    278		case FNIC_EVT_START_VLAN_DISC:
    279			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    280			fnic_fcoe_send_vlan_req(fnic);
    281			spin_lock_irqsave(&fnic->fnic_lock, flags);
    282			break;
    283		case FNIC_EVT_START_FCF_DISC:
    284			FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
    285				  "Start FCF Discovery\n");
    286			fnic_fcoe_start_fcf_disc(fnic);
    287			break;
    288		default:
    289			FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
    290				  "Unknown event 0x%x\n", fevt->event);
    291			break;
    292		}
    293		kfree(fevt);
    294	}
    295	spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    296}
    297
    298/**
    299 * is_fnic_fip_flogi_reject() - Check if the Received FIP FLOGI frame is rejected
    300 * @fip: The FCoE controller that received the frame
    301 * @skb: The received FIP frame
    302 *
    303 * Returns non-zero if the frame is rejected with unsupported cmd with
    304 * insufficient resource els explanation.
    305 */
    306static inline int is_fnic_fip_flogi_reject(struct fcoe_ctlr *fip,
    307					 struct sk_buff *skb)
    308{
    309	struct fc_lport *lport = fip->lp;
    310	struct fip_header *fiph;
    311	struct fc_frame_header *fh = NULL;
    312	struct fip_desc *desc;
    313	struct fip_encaps *els;
    314	u16 op;
    315	u8 els_op;
    316	u8 sub;
    317
    318	size_t rlen;
    319	size_t dlen = 0;
    320
    321	if (skb_linearize(skb))
    322		return 0;
    323
    324	if (skb->len < sizeof(*fiph))
    325		return 0;
    326
    327	fiph = (struct fip_header *)skb->data;
    328	op = ntohs(fiph->fip_op);
    329	sub = fiph->fip_subcode;
    330
    331	if (op != FIP_OP_LS)
    332		return 0;
    333
    334	if (sub != FIP_SC_REP)
    335		return 0;
    336
    337	rlen = ntohs(fiph->fip_dl_len) * 4;
    338	if (rlen + sizeof(*fiph) > skb->len)
    339		return 0;
    340
    341	desc = (struct fip_desc *)(fiph + 1);
    342	dlen = desc->fip_dlen * FIP_BPW;
    343
    344	if (desc->fip_dtype == FIP_DT_FLOGI) {
    345
    346		if (dlen < sizeof(*els) + sizeof(*fh) + 1)
    347			return 0;
    348
    349		els = (struct fip_encaps *)desc;
    350		fh = (struct fc_frame_header *)(els + 1);
    351
    352		if (!fh)
    353			return 0;
    354
    355		/*
    356		 * ELS command code, reason and explanation should be = Reject,
    357		 * unsupported command and insufficient resource
    358		 */
    359		els_op = *(u8 *)(fh + 1);
    360		if (els_op == ELS_LS_RJT) {
    361			shost_printk(KERN_INFO, lport->host,
    362				  "Flogi Request Rejected by Switch\n");
    363			return 1;
    364		}
    365		shost_printk(KERN_INFO, lport->host,
    366				"Flogi Request Accepted by Switch\n");
    367	}
    368	return 0;
    369}
    370
    371static void fnic_fcoe_send_vlan_req(struct fnic *fnic)
    372{
    373	struct fcoe_ctlr *fip = &fnic->ctlr;
    374	struct fnic_stats *fnic_stats = &fnic->fnic_stats;
    375	struct sk_buff *skb;
    376	char *eth_fr;
    377	struct fip_vlan *vlan;
    378	u64 vlan_tov;
    379
    380	fnic_fcoe_reset_vlans(fnic);
    381	fnic->set_vlan(fnic, 0);
    382
    383	if (printk_ratelimit())
    384		FNIC_FCS_DBG(KERN_INFO, fnic->lport->host,
    385			  "Sending VLAN request...\n");
    386
    387	skb = dev_alloc_skb(sizeof(struct fip_vlan));
    388	if (!skb)
    389		return;
    390
    391	eth_fr = (char *)skb->data;
    392	vlan = (struct fip_vlan *)eth_fr;
    393
    394	memset(vlan, 0, sizeof(*vlan));
    395	memcpy(vlan->eth.h_source, fip->ctl_src_addr, ETH_ALEN);
    396	memcpy(vlan->eth.h_dest, fcoe_all_fcfs, ETH_ALEN);
    397	vlan->eth.h_proto = htons(ETH_P_FIP);
    398
    399	vlan->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER);
    400	vlan->fip.fip_op = htons(FIP_OP_VLAN);
    401	vlan->fip.fip_subcode = FIP_SC_VL_REQ;
    402	vlan->fip.fip_dl_len = htons(sizeof(vlan->desc) / FIP_BPW);
    403
    404	vlan->desc.mac.fd_desc.fip_dtype = FIP_DT_MAC;
    405	vlan->desc.mac.fd_desc.fip_dlen = sizeof(vlan->desc.mac) / FIP_BPW;
    406	memcpy(&vlan->desc.mac.fd_mac, fip->ctl_src_addr, ETH_ALEN);
    407
    408	vlan->desc.wwnn.fd_desc.fip_dtype = FIP_DT_NAME;
    409	vlan->desc.wwnn.fd_desc.fip_dlen = sizeof(vlan->desc.wwnn) / FIP_BPW;
    410	put_unaligned_be64(fip->lp->wwnn, &vlan->desc.wwnn.fd_wwn);
    411	atomic64_inc(&fnic_stats->vlan_stats.vlan_disc_reqs);
    412
    413	skb_put(skb, sizeof(*vlan));
    414	skb->protocol = htons(ETH_P_FIP);
    415	skb_reset_mac_header(skb);
    416	skb_reset_network_header(skb);
    417	fip->send(fip, skb);
    418
    419	/* set a timer so that we can retry if there no response */
    420	vlan_tov = jiffies + msecs_to_jiffies(FCOE_CTLR_FIPVLAN_TOV);
    421	mod_timer(&fnic->fip_timer, round_jiffies(vlan_tov));
    422}
    423
    424static void fnic_fcoe_process_vlan_resp(struct fnic *fnic, struct sk_buff *skb)
    425{
    426	struct fcoe_ctlr *fip = &fnic->ctlr;
    427	struct fip_header *fiph;
    428	struct fip_desc *desc;
    429	struct fnic_stats *fnic_stats = &fnic->fnic_stats;
    430	u16 vid;
    431	size_t rlen;
    432	size_t dlen;
    433	struct fcoe_vlan *vlan;
    434	u64 sol_time;
    435	unsigned long flags;
    436
    437	FNIC_FCS_DBG(KERN_INFO, fnic->lport->host,
    438		  "Received VLAN response...\n");
    439
    440	fiph = (struct fip_header *) skb->data;
    441
    442	FNIC_FCS_DBG(KERN_INFO, fnic->lport->host,
    443		  "Received VLAN response... OP 0x%x SUB_OP 0x%x\n",
    444		  ntohs(fiph->fip_op), fiph->fip_subcode);
    445
    446	rlen = ntohs(fiph->fip_dl_len) * 4;
    447	fnic_fcoe_reset_vlans(fnic);
    448	spin_lock_irqsave(&fnic->vlans_lock, flags);
    449	desc = (struct fip_desc *)(fiph + 1);
    450	while (rlen > 0) {
    451		dlen = desc->fip_dlen * FIP_BPW;
    452		switch (desc->fip_dtype) {
    453		case FIP_DT_VLAN:
    454			vid = ntohs(((struct fip_vlan_desc *)desc)->fd_vlan);
    455			shost_printk(KERN_INFO, fnic->lport->host,
    456				  "process_vlan_resp: FIP VLAN %d\n", vid);
    457			vlan = kzalloc(sizeof(*vlan), GFP_ATOMIC);
    458			if (!vlan) {
    459				/* retry from timer */
    460				spin_unlock_irqrestore(&fnic->vlans_lock,
    461							flags);
    462				goto out;
    463			}
    464			vlan->vid = vid & 0x0fff;
    465			vlan->state = FIP_VLAN_AVAIL;
    466			list_add_tail(&vlan->list, &fnic->vlans);
    467			break;
    468		}
    469		desc = (struct fip_desc *)((char *)desc + dlen);
    470		rlen -= dlen;
    471	}
    472
    473	/* any VLAN descriptors present ? */
    474	if (list_empty(&fnic->vlans)) {
    475		/* retry from timer */
    476		atomic64_inc(&fnic_stats->vlan_stats.resp_withno_vlanID);
    477		FNIC_FCS_DBG(KERN_INFO, fnic->lport->host,
    478			  "No VLAN descriptors in FIP VLAN response\n");
    479		spin_unlock_irqrestore(&fnic->vlans_lock, flags);
    480		goto out;
    481	}
    482
    483	vlan = list_first_entry(&fnic->vlans, struct fcoe_vlan, list);
    484	fnic->set_vlan(fnic, vlan->vid);
    485	vlan->state = FIP_VLAN_SENT; /* sent now */
    486	vlan->sol_count++;
    487	spin_unlock_irqrestore(&fnic->vlans_lock, flags);
    488
    489	/* start the solicitation */
    490	fcoe_ctlr_link_up(fip);
    491
    492	sol_time = jiffies + msecs_to_jiffies(FCOE_CTLR_START_DELAY);
    493	mod_timer(&fnic->fip_timer, round_jiffies(sol_time));
    494out:
    495	return;
    496}
    497
    498static void fnic_fcoe_start_fcf_disc(struct fnic *fnic)
    499{
    500	unsigned long flags;
    501	struct fcoe_vlan *vlan;
    502	u64 sol_time;
    503
    504	spin_lock_irqsave(&fnic->vlans_lock, flags);
    505	vlan = list_first_entry(&fnic->vlans, struct fcoe_vlan, list);
    506	fnic->set_vlan(fnic, vlan->vid);
    507	vlan->state = FIP_VLAN_SENT; /* sent now */
    508	vlan->sol_count = 1;
    509	spin_unlock_irqrestore(&fnic->vlans_lock, flags);
    510
    511	/* start the solicitation */
    512	fcoe_ctlr_link_up(&fnic->ctlr);
    513
    514	sol_time = jiffies + msecs_to_jiffies(FCOE_CTLR_START_DELAY);
    515	mod_timer(&fnic->fip_timer, round_jiffies(sol_time));
    516}
    517
    518static int fnic_fcoe_vlan_check(struct fnic *fnic, u16 flag)
    519{
    520	unsigned long flags;
    521	struct fcoe_vlan *fvlan;
    522
    523	spin_lock_irqsave(&fnic->vlans_lock, flags);
    524	if (list_empty(&fnic->vlans)) {
    525		spin_unlock_irqrestore(&fnic->vlans_lock, flags);
    526		return -EINVAL;
    527	}
    528
    529	fvlan = list_first_entry(&fnic->vlans, struct fcoe_vlan, list);
    530	if (fvlan->state == FIP_VLAN_USED) {
    531		spin_unlock_irqrestore(&fnic->vlans_lock, flags);
    532		return 0;
    533	}
    534
    535	if (fvlan->state == FIP_VLAN_SENT) {
    536		fvlan->state = FIP_VLAN_USED;
    537		spin_unlock_irqrestore(&fnic->vlans_lock, flags);
    538		return 0;
    539	}
    540	spin_unlock_irqrestore(&fnic->vlans_lock, flags);
    541	return -EINVAL;
    542}
    543
    544static void fnic_event_enq(struct fnic *fnic, enum fnic_evt ev)
    545{
    546	struct fnic_event *fevt;
    547	unsigned long flags;
    548
    549	fevt = kmalloc(sizeof(*fevt), GFP_ATOMIC);
    550	if (!fevt)
    551		return;
    552
    553	fevt->fnic = fnic;
    554	fevt->event = ev;
    555
    556	spin_lock_irqsave(&fnic->fnic_lock, flags);
    557	list_add_tail(&fevt->list, &fnic->evlist);
    558	spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    559
    560	schedule_work(&fnic->event_work);
    561}
    562
    563static int fnic_fcoe_handle_fip_frame(struct fnic *fnic, struct sk_buff *skb)
    564{
    565	struct fip_header *fiph;
    566	int ret = 1;
    567	u16 op;
    568	u8 sub;
    569
    570	if (!skb || !(skb->data))
    571		return -1;
    572
    573	if (skb_linearize(skb))
    574		goto drop;
    575
    576	fiph = (struct fip_header *)skb->data;
    577	op = ntohs(fiph->fip_op);
    578	sub = fiph->fip_subcode;
    579
    580	if (FIP_VER_DECAPS(fiph->fip_ver) != FIP_VER)
    581		goto drop;
    582
    583	if (ntohs(fiph->fip_dl_len) * FIP_BPW + sizeof(*fiph) > skb->len)
    584		goto drop;
    585
    586	if (op == FIP_OP_DISC && sub == FIP_SC_ADV) {
    587		if (fnic_fcoe_vlan_check(fnic, ntohs(fiph->fip_flags)))
    588			goto drop;
    589		/* pass it on to fcoe */
    590		ret = 1;
    591	} else if (op == FIP_OP_VLAN && sub == FIP_SC_VL_NOTE) {
    592		/* set the vlan as used */
    593		fnic_fcoe_process_vlan_resp(fnic, skb);
    594		ret = 0;
    595	} else if (op == FIP_OP_CTRL && sub == FIP_SC_CLR_VLINK) {
    596		/* received CVL request, restart vlan disc */
    597		fnic_event_enq(fnic, FNIC_EVT_START_VLAN_DISC);
    598		/* pass it on to fcoe */
    599		ret = 1;
    600	}
    601drop:
    602	return ret;
    603}
    604
    605void fnic_handle_fip_frame(struct work_struct *work)
    606{
    607	struct fnic *fnic = container_of(work, struct fnic, fip_frame_work);
    608	struct fnic_stats *fnic_stats = &fnic->fnic_stats;
    609	unsigned long flags;
    610	struct sk_buff *skb;
    611	struct ethhdr *eh;
    612
    613	while ((skb = skb_dequeue(&fnic->fip_frame_queue))) {
    614		spin_lock_irqsave(&fnic->fnic_lock, flags);
    615		if (fnic->stop_rx_link_events) {
    616			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    617			dev_kfree_skb(skb);
    618			return;
    619		}
    620		/*
    621		 * If we're in a transitional state, just re-queue and return.
    622		 * The queue will be serviced when we get to a stable state.
    623		 */
    624		if (fnic->state != FNIC_IN_FC_MODE &&
    625		    fnic->state != FNIC_IN_ETH_MODE) {
    626			skb_queue_head(&fnic->fip_frame_queue, skb);
    627			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    628			return;
    629		}
    630		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    631		eh = (struct ethhdr *)skb->data;
    632		if (eh->h_proto == htons(ETH_P_FIP)) {
    633			skb_pull(skb, sizeof(*eh));
    634			if (fnic_fcoe_handle_fip_frame(fnic, skb) <= 0) {
    635				dev_kfree_skb(skb);
    636				continue;
    637			}
    638			/*
    639			 * If there's FLOGI rejects - clear all
    640			 * fcf's & restart from scratch
    641			 */
    642			if (is_fnic_fip_flogi_reject(&fnic->ctlr, skb)) {
    643				atomic64_inc(
    644					&fnic_stats->vlan_stats.flogi_rejects);
    645				shost_printk(KERN_INFO, fnic->lport->host,
    646					  "Trigger a Link down - VLAN Disc\n");
    647				fcoe_ctlr_link_down(&fnic->ctlr);
    648				/* start FCoE VLAN discovery */
    649				fnic_fcoe_send_vlan_req(fnic);
    650				dev_kfree_skb(skb);
    651				continue;
    652			}
    653			fcoe_ctlr_recv(&fnic->ctlr, skb);
    654			continue;
    655		}
    656	}
    657}
    658
    659/**
    660 * fnic_import_rq_eth_pkt() - handle received FCoE or FIP frame.
    661 * @fnic:	fnic instance.
    662 * @skb:	Ethernet Frame.
    663 */
    664static inline int fnic_import_rq_eth_pkt(struct fnic *fnic, struct sk_buff *skb)
    665{
    666	struct fc_frame *fp;
    667	struct ethhdr *eh;
    668	struct fcoe_hdr *fcoe_hdr;
    669	struct fcoe_crc_eof *ft;
    670
    671	/*
    672	 * Undo VLAN encapsulation if present.
    673	 */
    674	eh = (struct ethhdr *)skb->data;
    675	if (eh->h_proto == htons(ETH_P_8021Q)) {
    676		memmove((u8 *)eh + VLAN_HLEN, eh, ETH_ALEN * 2);
    677		eh = skb_pull(skb, VLAN_HLEN);
    678		skb_reset_mac_header(skb);
    679	}
    680	if (eh->h_proto == htons(ETH_P_FIP)) {
    681		if (!(fnic->config.flags & VFCF_FIP_CAPABLE)) {
    682			printk(KERN_ERR "Dropped FIP frame, as firmware "
    683					"uses non-FIP mode, Enable FIP "
    684					"using UCSM\n");
    685			goto drop;
    686		}
    687		if ((fnic_fc_trace_set_data(fnic->lport->host->host_no,
    688			FNIC_FC_RECV|0x80, (char *)skb->data, skb->len)) != 0) {
    689			printk(KERN_ERR "fnic ctlr frame trace error!!!");
    690		}
    691		skb_queue_tail(&fnic->fip_frame_queue, skb);
    692		queue_work(fnic_fip_queue, &fnic->fip_frame_work);
    693		return 1;		/* let caller know packet was used */
    694	}
    695	if (eh->h_proto != htons(ETH_P_FCOE))
    696		goto drop;
    697	skb_set_network_header(skb, sizeof(*eh));
    698	skb_pull(skb, sizeof(*eh));
    699
    700	fcoe_hdr = (struct fcoe_hdr *)skb->data;
    701	if (FC_FCOE_DECAPS_VER(fcoe_hdr) != FC_FCOE_VER)
    702		goto drop;
    703
    704	fp = (struct fc_frame *)skb;
    705	fc_frame_init(fp);
    706	fr_sof(fp) = fcoe_hdr->fcoe_sof;
    707	skb_pull(skb, sizeof(struct fcoe_hdr));
    708	skb_reset_transport_header(skb);
    709
    710	ft = (struct fcoe_crc_eof *)(skb->data + skb->len - sizeof(*ft));
    711	fr_eof(fp) = ft->fcoe_eof;
    712	skb_trim(skb, skb->len - sizeof(*ft));
    713	return 0;
    714drop:
    715	dev_kfree_skb_irq(skb);
    716	return -1;
    717}
    718
    719/**
    720 * fnic_update_mac_locked() - set data MAC address and filters.
    721 * @fnic:	fnic instance.
    722 * @new:	newly-assigned FCoE MAC address.
    723 *
    724 * Called with the fnic lock held.
    725 */
    726void fnic_update_mac_locked(struct fnic *fnic, u8 *new)
    727{
    728	u8 *ctl = fnic->ctlr.ctl_src_addr;
    729	u8 *data = fnic->data_src_addr;
    730
    731	if (is_zero_ether_addr(new))
    732		new = ctl;
    733	if (ether_addr_equal(data, new))
    734		return;
    735	FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "update_mac %pM\n", new);
    736	if (!is_zero_ether_addr(data) && !ether_addr_equal(data, ctl))
    737		vnic_dev_del_addr(fnic->vdev, data);
    738	memcpy(data, new, ETH_ALEN);
    739	if (!ether_addr_equal(new, ctl))
    740		vnic_dev_add_addr(fnic->vdev, new);
    741}
    742
    743/**
    744 * fnic_update_mac() - set data MAC address and filters.
    745 * @lport:	local port.
    746 * @new:	newly-assigned FCoE MAC address.
    747 */
    748void fnic_update_mac(struct fc_lport *lport, u8 *new)
    749{
    750	struct fnic *fnic = lport_priv(lport);
    751
    752	spin_lock_irq(&fnic->fnic_lock);
    753	fnic_update_mac_locked(fnic, new);
    754	spin_unlock_irq(&fnic->fnic_lock);
    755}
    756
    757/**
    758 * fnic_set_port_id() - set the port_ID after successful FLOGI.
    759 * @lport:	local port.
    760 * @port_id:	assigned FC_ID.
    761 * @fp:		received frame containing the FLOGI accept or NULL.
    762 *
    763 * This is called from libfc when a new FC_ID has been assigned.
    764 * This causes us to reset the firmware to FC_MODE and setup the new MAC
    765 * address and FC_ID.
    766 *
    767 * It is also called with FC_ID 0 when we're logged off.
    768 *
    769 * If the FC_ID is due to point-to-point, fp may be NULL.
    770 */
    771void fnic_set_port_id(struct fc_lport *lport, u32 port_id, struct fc_frame *fp)
    772{
    773	struct fnic *fnic = lport_priv(lport);
    774	u8 *mac;
    775	int ret;
    776
    777	FNIC_FCS_DBG(KERN_DEBUG, lport->host, "set port_id %x fp %p\n",
    778		     port_id, fp);
    779
    780	/*
    781	 * If we're clearing the FC_ID, change to use the ctl_src_addr.
    782	 * Set ethernet mode to send FLOGI.
    783	 */
    784	if (!port_id) {
    785		fnic_update_mac(lport, fnic->ctlr.ctl_src_addr);
    786		fnic_set_eth_mode(fnic);
    787		return;
    788	}
    789
    790	if (fp) {
    791		mac = fr_cb(fp)->granted_mac;
    792		if (is_zero_ether_addr(mac)) {
    793			/* non-FIP - FLOGI already accepted - ignore return */
    794			fcoe_ctlr_recv_flogi(&fnic->ctlr, lport, fp);
    795		}
    796		fnic_update_mac(lport, mac);
    797	}
    798
    799	/* Change state to reflect transition to FC mode */
    800	spin_lock_irq(&fnic->fnic_lock);
    801	if (fnic->state == FNIC_IN_ETH_MODE || fnic->state == FNIC_IN_FC_MODE)
    802		fnic->state = FNIC_IN_ETH_TRANS_FC_MODE;
    803	else {
    804		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
    805			     "Unexpected fnic state %s while"
    806			     " processing flogi resp\n",
    807			     fnic_state_to_str(fnic->state));
    808		spin_unlock_irq(&fnic->fnic_lock);
    809		return;
    810	}
    811	spin_unlock_irq(&fnic->fnic_lock);
    812
    813	/*
    814	 * Send FLOGI registration to firmware to set up FC mode.
    815	 * The new address will be set up when registration completes.
    816	 */
    817	ret = fnic_flogi_reg_handler(fnic, port_id);
    818
    819	if (ret < 0) {
    820		spin_lock_irq(&fnic->fnic_lock);
    821		if (fnic->state == FNIC_IN_ETH_TRANS_FC_MODE)
    822			fnic->state = FNIC_IN_ETH_MODE;
    823		spin_unlock_irq(&fnic->fnic_lock);
    824	}
    825}
    826
    827static void fnic_rq_cmpl_frame_recv(struct vnic_rq *rq, struct cq_desc
    828				    *cq_desc, struct vnic_rq_buf *buf,
    829				    int skipped __attribute__((unused)),
    830				    void *opaque)
    831{
    832	struct fnic *fnic = vnic_dev_priv(rq->vdev);
    833	struct sk_buff *skb;
    834	struct fc_frame *fp;
    835	struct fnic_stats *fnic_stats = &fnic->fnic_stats;
    836	u8 type, color, eop, sop, ingress_port, vlan_stripped;
    837	u8 fcoe = 0, fcoe_sof, fcoe_eof;
    838	u8 fcoe_fc_crc_ok = 1, fcoe_enc_error = 0;
    839	u8 tcp_udp_csum_ok, udp, tcp, ipv4_csum_ok;
    840	u8 ipv6, ipv4, ipv4_fragment, rss_type, csum_not_calc;
    841	u8 fcs_ok = 1, packet_error = 0;
    842	u16 q_number, completed_index, bytes_written = 0, vlan, checksum;
    843	u32 rss_hash;
    844	u16 exchange_id, tmpl;
    845	u8 sof = 0;
    846	u8 eof = 0;
    847	u32 fcp_bytes_written = 0;
    848	unsigned long flags;
    849
    850	dma_unmap_single(&fnic->pdev->dev, buf->dma_addr, buf->len,
    851			 DMA_FROM_DEVICE);
    852	skb = buf->os_buf;
    853	fp = (struct fc_frame *)skb;
    854	buf->os_buf = NULL;
    855
    856	cq_desc_dec(cq_desc, &type, &color, &q_number, &completed_index);
    857	if (type == CQ_DESC_TYPE_RQ_FCP) {
    858		cq_fcp_rq_desc_dec((struct cq_fcp_rq_desc *)cq_desc,
    859				   &type, &color, &q_number, &completed_index,
    860				   &eop, &sop, &fcoe_fc_crc_ok, &exchange_id,
    861				   &tmpl, &fcp_bytes_written, &sof, &eof,
    862				   &ingress_port, &packet_error,
    863				   &fcoe_enc_error, &fcs_ok, &vlan_stripped,
    864				   &vlan);
    865		skb_trim(skb, fcp_bytes_written);
    866		fr_sof(fp) = sof;
    867		fr_eof(fp) = eof;
    868
    869	} else if (type == CQ_DESC_TYPE_RQ_ENET) {
    870		cq_enet_rq_desc_dec((struct cq_enet_rq_desc *)cq_desc,
    871				    &type, &color, &q_number, &completed_index,
    872				    &ingress_port, &fcoe, &eop, &sop,
    873				    &rss_type, &csum_not_calc, &rss_hash,
    874				    &bytes_written, &packet_error,
    875				    &vlan_stripped, &vlan, &checksum,
    876				    &fcoe_sof, &fcoe_fc_crc_ok,
    877				    &fcoe_enc_error, &fcoe_eof,
    878				    &tcp_udp_csum_ok, &udp, &tcp,
    879				    &ipv4_csum_ok, &ipv6, &ipv4,
    880				    &ipv4_fragment, &fcs_ok);
    881		skb_trim(skb, bytes_written);
    882		if (!fcs_ok) {
    883			atomic64_inc(&fnic_stats->misc_stats.frame_errors);
    884			FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
    885				     "fcs error.  dropping packet.\n");
    886			goto drop;
    887		}
    888		if (fnic_import_rq_eth_pkt(fnic, skb))
    889			return;
    890
    891	} else {
    892		/* wrong CQ type*/
    893		shost_printk(KERN_ERR, fnic->lport->host,
    894			     "fnic rq_cmpl wrong cq type x%x\n", type);
    895		goto drop;
    896	}
    897
    898	if (!fcs_ok || packet_error || !fcoe_fc_crc_ok || fcoe_enc_error) {
    899		atomic64_inc(&fnic_stats->misc_stats.frame_errors);
    900		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
    901			     "fnic rq_cmpl fcoe x%x fcsok x%x"
    902			     " pkterr x%x fcoe_fc_crc_ok x%x, fcoe_enc_err"
    903			     " x%x\n",
    904			     fcoe, fcs_ok, packet_error,
    905			     fcoe_fc_crc_ok, fcoe_enc_error);
    906		goto drop;
    907	}
    908
    909	spin_lock_irqsave(&fnic->fnic_lock, flags);
    910	if (fnic->stop_rx_link_events) {
    911		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    912		goto drop;
    913	}
    914	fr_dev(fp) = fnic->lport;
    915	spin_unlock_irqrestore(&fnic->fnic_lock, flags);
    916	if ((fnic_fc_trace_set_data(fnic->lport->host->host_no, FNIC_FC_RECV,
    917					(char *)skb->data, skb->len)) != 0) {
    918		printk(KERN_ERR "fnic ctlr frame trace error!!!");
    919	}
    920
    921	skb_queue_tail(&fnic->frame_queue, skb);
    922	queue_work(fnic_event_queue, &fnic->frame_work);
    923
    924	return;
    925drop:
    926	dev_kfree_skb_irq(skb);
    927}
    928
    929static int fnic_rq_cmpl_handler_cont(struct vnic_dev *vdev,
    930				     struct cq_desc *cq_desc, u8 type,
    931				     u16 q_number, u16 completed_index,
    932				     void *opaque)
    933{
    934	struct fnic *fnic = vnic_dev_priv(vdev);
    935
    936	vnic_rq_service(&fnic->rq[q_number], cq_desc, completed_index,
    937			VNIC_RQ_RETURN_DESC, fnic_rq_cmpl_frame_recv,
    938			NULL);
    939	return 0;
    940}
    941
    942int fnic_rq_cmpl_handler(struct fnic *fnic, int rq_work_to_do)
    943{
    944	unsigned int tot_rq_work_done = 0, cur_work_done;
    945	unsigned int i;
    946	int err;
    947
    948	for (i = 0; i < fnic->rq_count; i++) {
    949		cur_work_done = vnic_cq_service(&fnic->cq[i], rq_work_to_do,
    950						fnic_rq_cmpl_handler_cont,
    951						NULL);
    952		if (cur_work_done) {
    953			err = vnic_rq_fill(&fnic->rq[i], fnic_alloc_rq_frame);
    954			if (err)
    955				shost_printk(KERN_ERR, fnic->lport->host,
    956					     "fnic_alloc_rq_frame can't alloc"
    957					     " frame\n");
    958		}
    959		tot_rq_work_done += cur_work_done;
    960	}
    961
    962	return tot_rq_work_done;
    963}
    964
    965/*
    966 * This function is called once at init time to allocate and fill RQ
    967 * buffers. Subsequently, it is called in the interrupt context after RQ
    968 * buffer processing to replenish the buffers in the RQ
    969 */
    970int fnic_alloc_rq_frame(struct vnic_rq *rq)
    971{
    972	struct fnic *fnic = vnic_dev_priv(rq->vdev);
    973	struct sk_buff *skb;
    974	u16 len;
    975	dma_addr_t pa;
    976	int r;
    977
    978	len = FC_FRAME_HEADROOM + FC_MAX_FRAME + FC_FRAME_TAILROOM;
    979	skb = dev_alloc_skb(len);
    980	if (!skb) {
    981		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
    982			     "Unable to allocate RQ sk_buff\n");
    983		return -ENOMEM;
    984	}
    985	skb_reset_mac_header(skb);
    986	skb_reset_transport_header(skb);
    987	skb_reset_network_header(skb);
    988	skb_put(skb, len);
    989	pa = dma_map_single(&fnic->pdev->dev, skb->data, len, DMA_FROM_DEVICE);
    990	if (dma_mapping_error(&fnic->pdev->dev, pa)) {
    991		r = -ENOMEM;
    992		printk(KERN_ERR "PCI mapping failed with error %d\n", r);
    993		goto free_skb;
    994	}
    995
    996	fnic_queue_rq_desc(rq, skb, pa, len);
    997	return 0;
    998
    999free_skb:
   1000	kfree_skb(skb);
   1001	return r;
   1002}
   1003
   1004void fnic_free_rq_buf(struct vnic_rq *rq, struct vnic_rq_buf *buf)
   1005{
   1006	struct fc_frame *fp = buf->os_buf;
   1007	struct fnic *fnic = vnic_dev_priv(rq->vdev);
   1008
   1009	dma_unmap_single(&fnic->pdev->dev, buf->dma_addr, buf->len,
   1010			 DMA_FROM_DEVICE);
   1011
   1012	dev_kfree_skb(fp_skb(fp));
   1013	buf->os_buf = NULL;
   1014}
   1015
   1016/**
   1017 * fnic_eth_send() - Send Ethernet frame.
   1018 * @fip:	fcoe_ctlr instance.
   1019 * @skb:	Ethernet Frame, FIP, without VLAN encapsulation.
   1020 */
   1021void fnic_eth_send(struct fcoe_ctlr *fip, struct sk_buff *skb)
   1022{
   1023	struct fnic *fnic = fnic_from_ctlr(fip);
   1024	struct vnic_wq *wq = &fnic->wq[0];
   1025	dma_addr_t pa;
   1026	struct ethhdr *eth_hdr;
   1027	struct vlan_ethhdr *vlan_hdr;
   1028	unsigned long flags;
   1029
   1030	if (!fnic->vlan_hw_insert) {
   1031		eth_hdr = (struct ethhdr *)skb_mac_header(skb);
   1032		vlan_hdr = skb_push(skb, sizeof(*vlan_hdr) - sizeof(*eth_hdr));
   1033		memcpy(vlan_hdr, eth_hdr, 2 * ETH_ALEN);
   1034		vlan_hdr->h_vlan_proto = htons(ETH_P_8021Q);
   1035		vlan_hdr->h_vlan_encapsulated_proto = eth_hdr->h_proto;
   1036		vlan_hdr->h_vlan_TCI = htons(fnic->vlan_id);
   1037		if ((fnic_fc_trace_set_data(fnic->lport->host->host_no,
   1038			FNIC_FC_SEND|0x80, (char *)eth_hdr, skb->len)) != 0) {
   1039			printk(KERN_ERR "fnic ctlr frame trace error!!!");
   1040		}
   1041	} else {
   1042		if ((fnic_fc_trace_set_data(fnic->lport->host->host_no,
   1043			FNIC_FC_SEND|0x80, (char *)skb->data, skb->len)) != 0) {
   1044			printk(KERN_ERR "fnic ctlr frame trace error!!!");
   1045		}
   1046	}
   1047
   1048	pa = dma_map_single(&fnic->pdev->dev, skb->data, skb->len,
   1049			DMA_TO_DEVICE);
   1050	if (dma_mapping_error(&fnic->pdev->dev, pa)) {
   1051		printk(KERN_ERR "DMA mapping failed\n");
   1052		goto free_skb;
   1053	}
   1054
   1055	spin_lock_irqsave(&fnic->wq_lock[0], flags);
   1056	if (!vnic_wq_desc_avail(wq))
   1057		goto irq_restore;
   1058
   1059	fnic_queue_wq_eth_desc(wq, skb, pa, skb->len,
   1060			       0 /* hw inserts cos value */,
   1061			       fnic->vlan_id, 1);
   1062	spin_unlock_irqrestore(&fnic->wq_lock[0], flags);
   1063	return;
   1064
   1065irq_restore:
   1066	spin_unlock_irqrestore(&fnic->wq_lock[0], flags);
   1067	dma_unmap_single(&fnic->pdev->dev, pa, skb->len, DMA_TO_DEVICE);
   1068free_skb:
   1069	kfree_skb(skb);
   1070}
   1071
   1072/*
   1073 * Send FC frame.
   1074 */
   1075static int fnic_send_frame(struct fnic *fnic, struct fc_frame *fp)
   1076{
   1077	struct vnic_wq *wq = &fnic->wq[0];
   1078	struct sk_buff *skb;
   1079	dma_addr_t pa;
   1080	struct ethhdr *eth_hdr;
   1081	struct vlan_ethhdr *vlan_hdr;
   1082	struct fcoe_hdr *fcoe_hdr;
   1083	struct fc_frame_header *fh;
   1084	u32 tot_len, eth_hdr_len;
   1085	int ret = 0;
   1086	unsigned long flags;
   1087
   1088	fh = fc_frame_header_get(fp);
   1089	skb = fp_skb(fp);
   1090
   1091	if (unlikely(fh->fh_r_ctl == FC_RCTL_ELS_REQ) &&
   1092	    fcoe_ctlr_els_send(&fnic->ctlr, fnic->lport, skb))
   1093		return 0;
   1094
   1095	if (!fnic->vlan_hw_insert) {
   1096		eth_hdr_len = sizeof(*vlan_hdr) + sizeof(*fcoe_hdr);
   1097		vlan_hdr = skb_push(skb, eth_hdr_len);
   1098		eth_hdr = (struct ethhdr *)vlan_hdr;
   1099		vlan_hdr->h_vlan_proto = htons(ETH_P_8021Q);
   1100		vlan_hdr->h_vlan_encapsulated_proto = htons(ETH_P_FCOE);
   1101		vlan_hdr->h_vlan_TCI = htons(fnic->vlan_id);
   1102		fcoe_hdr = (struct fcoe_hdr *)(vlan_hdr + 1);
   1103	} else {
   1104		eth_hdr_len = sizeof(*eth_hdr) + sizeof(*fcoe_hdr);
   1105		eth_hdr = skb_push(skb, eth_hdr_len);
   1106		eth_hdr->h_proto = htons(ETH_P_FCOE);
   1107		fcoe_hdr = (struct fcoe_hdr *)(eth_hdr + 1);
   1108	}
   1109
   1110	if (fnic->ctlr.map_dest)
   1111		fc_fcoe_set_mac(eth_hdr->h_dest, fh->fh_d_id);
   1112	else
   1113		memcpy(eth_hdr->h_dest, fnic->ctlr.dest_addr, ETH_ALEN);
   1114	memcpy(eth_hdr->h_source, fnic->data_src_addr, ETH_ALEN);
   1115
   1116	tot_len = skb->len;
   1117	BUG_ON(tot_len % 4);
   1118
   1119	memset(fcoe_hdr, 0, sizeof(*fcoe_hdr));
   1120	fcoe_hdr->fcoe_sof = fr_sof(fp);
   1121	if (FC_FCOE_VER)
   1122		FC_FCOE_ENCAPS_VER(fcoe_hdr, FC_FCOE_VER);
   1123
   1124	pa = dma_map_single(&fnic->pdev->dev, eth_hdr, tot_len, DMA_TO_DEVICE);
   1125	if (dma_mapping_error(&fnic->pdev->dev, pa)) {
   1126		ret = -ENOMEM;
   1127		printk(KERN_ERR "DMA map failed with error %d\n", ret);
   1128		goto free_skb_on_err;
   1129	}
   1130
   1131	if ((fnic_fc_trace_set_data(fnic->lport->host->host_no, FNIC_FC_SEND,
   1132				(char *)eth_hdr, tot_len)) != 0) {
   1133		printk(KERN_ERR "fnic ctlr frame trace error!!!");
   1134	}
   1135
   1136	spin_lock_irqsave(&fnic->wq_lock[0], flags);
   1137
   1138	if (!vnic_wq_desc_avail(wq)) {
   1139		dma_unmap_single(&fnic->pdev->dev, pa, tot_len, DMA_TO_DEVICE);
   1140		ret = -1;
   1141		goto irq_restore;
   1142	}
   1143
   1144	fnic_queue_wq_desc(wq, skb, pa, tot_len, fr_eof(fp),
   1145			   0 /* hw inserts cos value */,
   1146			   fnic->vlan_id, 1, 1, 1);
   1147
   1148irq_restore:
   1149	spin_unlock_irqrestore(&fnic->wq_lock[0], flags);
   1150
   1151free_skb_on_err:
   1152	if (ret)
   1153		dev_kfree_skb_any(fp_skb(fp));
   1154
   1155	return ret;
   1156}
   1157
   1158/*
   1159 * fnic_send
   1160 * Routine to send a raw frame
   1161 */
   1162int fnic_send(struct fc_lport *lp, struct fc_frame *fp)
   1163{
   1164	struct fnic *fnic = lport_priv(lp);
   1165	unsigned long flags;
   1166
   1167	if (fnic->in_remove) {
   1168		dev_kfree_skb(fp_skb(fp));
   1169		return -1;
   1170	}
   1171
   1172	/*
   1173	 * Queue frame if in a transitional state.
   1174	 * This occurs while registering the Port_ID / MAC address after FLOGI.
   1175	 */
   1176	spin_lock_irqsave(&fnic->fnic_lock, flags);
   1177	if (fnic->state != FNIC_IN_FC_MODE && fnic->state != FNIC_IN_ETH_MODE) {
   1178		skb_queue_tail(&fnic->tx_queue, fp_skb(fp));
   1179		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
   1180		return 0;
   1181	}
   1182	spin_unlock_irqrestore(&fnic->fnic_lock, flags);
   1183
   1184	return fnic_send_frame(fnic, fp);
   1185}
   1186
   1187/**
   1188 * fnic_flush_tx() - send queued frames.
   1189 * @fnic: fnic device
   1190 *
   1191 * Send frames that were waiting to go out in FC or Ethernet mode.
   1192 * Whenever changing modes we purge queued frames, so these frames should
   1193 * be queued for the stable mode that we're in, either FC or Ethernet.
   1194 *
   1195 * Called without fnic_lock held.
   1196 */
   1197void fnic_flush_tx(struct fnic *fnic)
   1198{
   1199	struct sk_buff *skb;
   1200	struct fc_frame *fp;
   1201
   1202	while ((skb = skb_dequeue(&fnic->tx_queue))) {
   1203		fp = (struct fc_frame *)skb;
   1204		fnic_send_frame(fnic, fp);
   1205	}
   1206}
   1207
   1208/**
   1209 * fnic_set_eth_mode() - put fnic into ethernet mode.
   1210 * @fnic: fnic device
   1211 *
   1212 * Called without fnic lock held.
   1213 */
   1214static void fnic_set_eth_mode(struct fnic *fnic)
   1215{
   1216	unsigned long flags;
   1217	enum fnic_state old_state;
   1218	int ret;
   1219
   1220	spin_lock_irqsave(&fnic->fnic_lock, flags);
   1221again:
   1222	old_state = fnic->state;
   1223	switch (old_state) {
   1224	case FNIC_IN_FC_MODE:
   1225	case FNIC_IN_ETH_TRANS_FC_MODE:
   1226	default:
   1227		fnic->state = FNIC_IN_FC_TRANS_ETH_MODE;
   1228		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
   1229
   1230		ret = fnic_fw_reset_handler(fnic);
   1231
   1232		spin_lock_irqsave(&fnic->fnic_lock, flags);
   1233		if (fnic->state != FNIC_IN_FC_TRANS_ETH_MODE)
   1234			goto again;
   1235		if (ret)
   1236			fnic->state = old_state;
   1237		break;
   1238
   1239	case FNIC_IN_FC_TRANS_ETH_MODE:
   1240	case FNIC_IN_ETH_MODE:
   1241		break;
   1242	}
   1243	spin_unlock_irqrestore(&fnic->fnic_lock, flags);
   1244}
   1245
   1246static void fnic_wq_complete_frame_send(struct vnic_wq *wq,
   1247					struct cq_desc *cq_desc,
   1248					struct vnic_wq_buf *buf, void *opaque)
   1249{
   1250	struct sk_buff *skb = buf->os_buf;
   1251	struct fc_frame *fp = (struct fc_frame *)skb;
   1252	struct fnic *fnic = vnic_dev_priv(wq->vdev);
   1253
   1254	dma_unmap_single(&fnic->pdev->dev, buf->dma_addr, buf->len,
   1255			 DMA_TO_DEVICE);
   1256	dev_kfree_skb_irq(fp_skb(fp));
   1257	buf->os_buf = NULL;
   1258}
   1259
   1260static int fnic_wq_cmpl_handler_cont(struct vnic_dev *vdev,
   1261				     struct cq_desc *cq_desc, u8 type,
   1262				     u16 q_number, u16 completed_index,
   1263				     void *opaque)
   1264{
   1265	struct fnic *fnic = vnic_dev_priv(vdev);
   1266	unsigned long flags;
   1267
   1268	spin_lock_irqsave(&fnic->wq_lock[q_number], flags);
   1269	vnic_wq_service(&fnic->wq[q_number], cq_desc, completed_index,
   1270			fnic_wq_complete_frame_send, NULL);
   1271	spin_unlock_irqrestore(&fnic->wq_lock[q_number], flags);
   1272
   1273	return 0;
   1274}
   1275
   1276int fnic_wq_cmpl_handler(struct fnic *fnic, int work_to_do)
   1277{
   1278	unsigned int wq_work_done = 0;
   1279	unsigned int i;
   1280
   1281	for (i = 0; i < fnic->raw_wq_count; i++) {
   1282		wq_work_done  += vnic_cq_service(&fnic->cq[fnic->rq_count+i],
   1283						 work_to_do,
   1284						 fnic_wq_cmpl_handler_cont,
   1285						 NULL);
   1286	}
   1287
   1288	return wq_work_done;
   1289}
   1290
   1291
   1292void fnic_free_wq_buf(struct vnic_wq *wq, struct vnic_wq_buf *buf)
   1293{
   1294	struct fc_frame *fp = buf->os_buf;
   1295	struct fnic *fnic = vnic_dev_priv(wq->vdev);
   1296
   1297	dma_unmap_single(&fnic->pdev->dev, buf->dma_addr, buf->len,
   1298			 DMA_TO_DEVICE);
   1299
   1300	dev_kfree_skb(fp_skb(fp));
   1301	buf->os_buf = NULL;
   1302}
   1303
   1304void fnic_fcoe_reset_vlans(struct fnic *fnic)
   1305{
   1306	unsigned long flags;
   1307	struct fcoe_vlan *vlan;
   1308	struct fcoe_vlan *next;
   1309
   1310	/*
   1311	 * indicate a link down to fcoe so that all fcf's are free'd
   1312	 * might not be required since we did this before sending vlan
   1313	 * discovery request
   1314	 */
   1315	spin_lock_irqsave(&fnic->vlans_lock, flags);
   1316	if (!list_empty(&fnic->vlans)) {
   1317		list_for_each_entry_safe(vlan, next, &fnic->vlans, list) {
   1318			list_del(&vlan->list);
   1319			kfree(vlan);
   1320		}
   1321	}
   1322	spin_unlock_irqrestore(&fnic->vlans_lock, flags);
   1323}
   1324
   1325void fnic_handle_fip_timer(struct fnic *fnic)
   1326{
   1327	unsigned long flags;
   1328	struct fcoe_vlan *vlan;
   1329	struct fnic_stats *fnic_stats = &fnic->fnic_stats;
   1330	u64 sol_time;
   1331
   1332	spin_lock_irqsave(&fnic->fnic_lock, flags);
   1333	if (fnic->stop_rx_link_events) {
   1334		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
   1335		return;
   1336	}
   1337	spin_unlock_irqrestore(&fnic->fnic_lock, flags);
   1338
   1339	if (fnic->ctlr.mode == FIP_MODE_NON_FIP)
   1340		return;
   1341
   1342	spin_lock_irqsave(&fnic->vlans_lock, flags);
   1343	if (list_empty(&fnic->vlans)) {
   1344		spin_unlock_irqrestore(&fnic->vlans_lock, flags);
   1345		/* no vlans available, try again */
   1346		if (unlikely(fnic_log_level & FNIC_FCS_LOGGING))
   1347			if (printk_ratelimit())
   1348				shost_printk(KERN_DEBUG, fnic->lport->host,
   1349						"Start VLAN Discovery\n");
   1350		fnic_event_enq(fnic, FNIC_EVT_START_VLAN_DISC);
   1351		return;
   1352	}
   1353
   1354	vlan = list_first_entry(&fnic->vlans, struct fcoe_vlan, list);
   1355	FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
   1356		  "fip_timer: vlan %d state %d sol_count %d\n",
   1357		  vlan->vid, vlan->state, vlan->sol_count);
   1358	switch (vlan->state) {
   1359	case FIP_VLAN_USED:
   1360		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
   1361			  "FIP VLAN is selected for FC transaction\n");
   1362		spin_unlock_irqrestore(&fnic->vlans_lock, flags);
   1363		break;
   1364	case FIP_VLAN_FAILED:
   1365		spin_unlock_irqrestore(&fnic->vlans_lock, flags);
   1366		/* if all vlans are in failed state, restart vlan disc */
   1367		if (unlikely(fnic_log_level & FNIC_FCS_LOGGING))
   1368			if (printk_ratelimit())
   1369				shost_printk(KERN_DEBUG, fnic->lport->host,
   1370					  "Start VLAN Discovery\n");
   1371		fnic_event_enq(fnic, FNIC_EVT_START_VLAN_DISC);
   1372		break;
   1373	case FIP_VLAN_SENT:
   1374		if (vlan->sol_count >= FCOE_CTLR_MAX_SOL) {
   1375			/*
   1376			 * no response on this vlan, remove  from the list.
   1377			 * Try the next vlan
   1378			 */
   1379			FNIC_FCS_DBG(KERN_INFO, fnic->lport->host,
   1380				  "Dequeue this VLAN ID %d from list\n",
   1381				  vlan->vid);
   1382			list_del(&vlan->list);
   1383			kfree(vlan);
   1384			vlan = NULL;
   1385			if (list_empty(&fnic->vlans)) {
   1386				/* we exhausted all vlans, restart vlan disc */
   1387				spin_unlock_irqrestore(&fnic->vlans_lock,
   1388							flags);
   1389				FNIC_FCS_DBG(KERN_INFO, fnic->lport->host,
   1390					  "fip_timer: vlan list empty, "
   1391					  "trigger vlan disc\n");
   1392				fnic_event_enq(fnic, FNIC_EVT_START_VLAN_DISC);
   1393				return;
   1394			}
   1395			/* check the next vlan */
   1396			vlan = list_first_entry(&fnic->vlans, struct fcoe_vlan,
   1397							list);
   1398			fnic->set_vlan(fnic, vlan->vid);
   1399			vlan->state = FIP_VLAN_SENT; /* sent now */
   1400		}
   1401		spin_unlock_irqrestore(&fnic->vlans_lock, flags);
   1402		atomic64_inc(&fnic_stats->vlan_stats.sol_expiry_count);
   1403		vlan->sol_count++;
   1404		sol_time = jiffies + msecs_to_jiffies
   1405					(FCOE_CTLR_START_DELAY);
   1406		mod_timer(&fnic->fip_timer, round_jiffies(sol_time));
   1407		break;
   1408	}
   1409}