xref: /openbmc/linux/drivers/scsi/fnic/fnic_fcs.c (revision e8e0929d)
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/skbuff.h>
21 #include <linux/interrupt.h>
22 #include <linux/spinlock.h>
23 #include <linux/if_ether.h>
24 #include <linux/if_vlan.h>
25 #include <linux/workqueue.h>
26 #include <scsi/fc/fc_els.h>
27 #include <scsi/fc/fc_fcoe.h>
28 #include <scsi/fc_frame.h>
29 #include <scsi/libfc.h>
30 #include "fnic_io.h"
31 #include "fnic.h"
32 #include "cq_enet_desc.h"
33 #include "cq_exch_desc.h"
34 
35 struct workqueue_struct *fnic_event_queue;
36 
37 void fnic_handle_link(struct work_struct *work)
38 {
39 	struct fnic *fnic = container_of(work, struct fnic, link_work);
40 	unsigned long flags;
41 	int old_link_status;
42 	u32 old_link_down_cnt;
43 
44 	spin_lock_irqsave(&fnic->fnic_lock, flags);
45 
46 	if (fnic->stop_rx_link_events) {
47 		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
48 		return;
49 	}
50 
51 	old_link_down_cnt = fnic->link_down_cnt;
52 	old_link_status = fnic->link_status;
53 	fnic->link_status = vnic_dev_link_status(fnic->vdev);
54 	fnic->link_down_cnt = vnic_dev_link_down_cnt(fnic->vdev);
55 
56 	if (old_link_status == fnic->link_status) {
57 		if (!fnic->link_status)
58 			/* DOWN -> DOWN */
59 			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
60 		else {
61 			if (old_link_down_cnt != fnic->link_down_cnt) {
62 				/* UP -> DOWN -> UP */
63 				fnic->lport->host_stats.link_failure_count++;
64 				spin_unlock_irqrestore(&fnic->fnic_lock, flags);
65 				FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
66 					     "link down\n");
67 				fc_linkdown(fnic->lport);
68 				FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
69 					     "link up\n");
70 				fc_linkup(fnic->lport);
71 			} else
72 				/* UP -> UP */
73 				spin_unlock_irqrestore(&fnic->fnic_lock, flags);
74 		}
75 	} else if (fnic->link_status) {
76 		/* DOWN -> UP */
77 		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
78 		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "link up\n");
79 		fc_linkup(fnic->lport);
80 	} else {
81 		/* UP -> DOWN */
82 		fnic->lport->host_stats.link_failure_count++;
83 		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
84 		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host, "link down\n");
85 		fc_linkdown(fnic->lport);
86 	}
87 
88 }
89 
90 /*
91  * This function passes incoming fabric frames to libFC
92  */
93 void fnic_handle_frame(struct work_struct *work)
94 {
95 	struct fnic *fnic = container_of(work, struct fnic, frame_work);
96 	struct fc_lport *lp = fnic->lport;
97 	unsigned long flags;
98 	struct sk_buff *skb;
99 	struct fc_frame *fp;
100 
101 	while ((skb = skb_dequeue(&fnic->frame_queue))) {
102 
103 		spin_lock_irqsave(&fnic->fnic_lock, flags);
104 		if (fnic->stop_rx_link_events) {
105 			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
106 			dev_kfree_skb(skb);
107 			return;
108 		}
109 		fp = (struct fc_frame *)skb;
110 		/* if Flogi resp frame, register the address */
111 		if (fr_flags(fp)) {
112 			vnic_dev_add_addr(fnic->vdev,
113 					  fnic->data_src_addr);
114 			fr_flags(fp) = 0;
115 		}
116 		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
117 
118 		fc_exch_recv(lp, fp);
119 	}
120 
121 }
122 
123 static inline void fnic_import_rq_fc_frame(struct sk_buff *skb,
124 					   u32 len, u8 sof, u8 eof)
125 {
126 	struct fc_frame *fp = (struct fc_frame *)skb;
127 
128 	skb_trim(skb, len);
129 	fr_eof(fp) = eof;
130 	fr_sof(fp) = sof;
131 }
132 
133 
134 static inline int fnic_import_rq_eth_pkt(struct sk_buff *skb, u32 len)
135 {
136 	struct fc_frame *fp;
137 	struct ethhdr *eh;
138 	struct vlan_ethhdr *vh;
139 	struct fcoe_hdr *fcoe_hdr;
140 	struct fcoe_crc_eof *ft;
141 	u32    transport_len = 0;
142 
143 	eh = (struct ethhdr *)skb->data;
144 	vh = (struct vlan_ethhdr *)skb->data;
145 	if (vh->h_vlan_proto == htons(ETH_P_8021Q) &&
146 	    vh->h_vlan_encapsulated_proto == htons(ETH_P_FCOE)) {
147 		skb_pull(skb, sizeof(struct vlan_ethhdr));
148 		transport_len += sizeof(struct vlan_ethhdr);
149 	} else if (eh->h_proto == htons(ETH_P_FCOE)) {
150 		transport_len += sizeof(struct ethhdr);
151 		skb_pull(skb, sizeof(struct ethhdr));
152 	} else
153 		return -1;
154 
155 	fcoe_hdr = (struct fcoe_hdr *)skb->data;
156 	if (FC_FCOE_DECAPS_VER(fcoe_hdr) != FC_FCOE_VER)
157 		return -1;
158 
159 	fp = (struct fc_frame *)skb;
160 	fc_frame_init(fp);
161 	fr_sof(fp) = fcoe_hdr->fcoe_sof;
162 	skb_pull(skb, sizeof(struct fcoe_hdr));
163 	transport_len += sizeof(struct fcoe_hdr);
164 
165 	ft = (struct fcoe_crc_eof *)(skb->data + len -
166 				     transport_len - sizeof(*ft));
167 	fr_eof(fp) = ft->fcoe_eof;
168 	skb_trim(skb, len - transport_len - sizeof(*ft));
169 	return 0;
170 }
171 
172 static inline int fnic_handle_flogi_resp(struct fnic *fnic,
173 					 struct fc_frame *fp)
174 {
175 	u8 mac[ETH_ALEN] = FC_FCOE_FLOGI_MAC;
176 	struct ethhdr *eth_hdr;
177 	struct fc_frame_header *fh;
178 	int ret = 0;
179 	unsigned long flags;
180 	struct fc_frame *old_flogi_resp = NULL;
181 
182 	fh = (struct fc_frame_header *)fr_hdr(fp);
183 
184 	spin_lock_irqsave(&fnic->fnic_lock, flags);
185 
186 	if (fnic->state == FNIC_IN_ETH_MODE) {
187 
188 		/*
189 		 * Check if oxid matches on taking the lock. A new Flogi
190 		 * issued by libFC might have changed the fnic cached oxid
191 		 */
192 		if (fnic->flogi_oxid != ntohs(fh->fh_ox_id)) {
193 			FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
194 				     "Flogi response oxid not"
195 				     " matching cached oxid, dropping frame"
196 				     "\n");
197 			ret = -1;
198 			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
199 			dev_kfree_skb_irq(fp_skb(fp));
200 			goto handle_flogi_resp_end;
201 		}
202 
203 		/* Drop older cached flogi response frame, cache this frame */
204 		old_flogi_resp = fnic->flogi_resp;
205 		fnic->flogi_resp = fp;
206 		fnic->flogi_oxid = FC_XID_UNKNOWN;
207 
208 		/*
209 		 * this frame is part of flogi get the src mac addr from this
210 		 * frame if the src mac is fcoui based then we mark the
211 		 * address mode flag to use fcoui base for dst mac addr
212 		 * otherwise we have to store the fcoe gateway addr
213 		 */
214 		eth_hdr = (struct ethhdr *)skb_mac_header(fp_skb(fp));
215 		memcpy(mac, eth_hdr->h_source, ETH_ALEN);
216 
217 		if (ntoh24(mac) == FC_FCOE_OUI)
218 			fnic->fcoui_mode = 1;
219 		else {
220 			fnic->fcoui_mode = 0;
221 			memcpy(fnic->dest_addr, mac, ETH_ALEN);
222 		}
223 
224 		/*
225 		 * Except for Flogi frame, all outbound frames from us have the
226 		 * Eth Src address as FC_FCOE_OUI"our_sid". Flogi frame uses
227 		 * the vnic MAC address as the Eth Src address
228 		 */
229 		fc_fcoe_set_mac(fnic->data_src_addr, fh->fh_d_id);
230 
231 		/* We get our s_id from the d_id of the flogi resp frame */
232 		fnic->s_id = ntoh24(fh->fh_d_id);
233 
234 		/* Change state to reflect transition from Eth to FC mode */
235 		fnic->state = FNIC_IN_ETH_TRANS_FC_MODE;
236 
237 	} else {
238 		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
239 			     "Unexpected fnic state %s while"
240 			     " processing flogi resp\n",
241 			     fnic_state_to_str(fnic->state));
242 		ret = -1;
243 		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
244 		dev_kfree_skb_irq(fp_skb(fp));
245 		goto handle_flogi_resp_end;
246 	}
247 
248 	spin_unlock_irqrestore(&fnic->fnic_lock, flags);
249 
250 	/* Drop older cached frame */
251 	if (old_flogi_resp)
252 		dev_kfree_skb_irq(fp_skb(old_flogi_resp));
253 
254 	/*
255 	 * send flogi reg request to firmware, this will put the fnic in
256 	 * in FC mode
257 	 */
258 	ret = fnic_flogi_reg_handler(fnic);
259 
260 	if (ret < 0) {
261 		int free_fp = 1;
262 		spin_lock_irqsave(&fnic->fnic_lock, flags);
263 		/*
264 		 * free the frame is some other thread is not
265 		 * pointing to it
266 		 */
267 		if (fnic->flogi_resp != fp)
268 			free_fp = 0;
269 		else
270 			fnic->flogi_resp = NULL;
271 
272 		if (fnic->state == FNIC_IN_ETH_TRANS_FC_MODE)
273 			fnic->state = FNIC_IN_ETH_MODE;
274 		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
275 		if (free_fp)
276 			dev_kfree_skb_irq(fp_skb(fp));
277 	}
278 
279  handle_flogi_resp_end:
280 	return ret;
281 }
282 
283 /* Returns 1 for a response that matches cached flogi oxid */
284 static inline int is_matching_flogi_resp_frame(struct fnic *fnic,
285 					       struct fc_frame *fp)
286 {
287 	struct fc_frame_header *fh;
288 	int ret = 0;
289 	u32 f_ctl;
290 
291 	fh = fc_frame_header_get(fp);
292 	f_ctl = ntoh24(fh->fh_f_ctl);
293 
294 	if (fnic->flogi_oxid == ntohs(fh->fh_ox_id) &&
295 	    fh->fh_r_ctl == FC_RCTL_ELS_REP &&
296 	    (f_ctl & (FC_FC_EX_CTX | FC_FC_SEQ_CTX)) == FC_FC_EX_CTX &&
297 	    fh->fh_type == FC_TYPE_ELS)
298 		ret = 1;
299 
300 	return ret;
301 }
302 
303 static void fnic_rq_cmpl_frame_recv(struct vnic_rq *rq, struct cq_desc
304 				    *cq_desc, struct vnic_rq_buf *buf,
305 				    int skipped __attribute__((unused)),
306 				    void *opaque)
307 {
308 	struct fnic *fnic = vnic_dev_priv(rq->vdev);
309 	struct sk_buff *skb;
310 	struct fc_frame *fp;
311 	unsigned int eth_hdrs_stripped;
312 	u8 type, color, eop, sop, ingress_port, vlan_stripped;
313 	u8 fcoe = 0, fcoe_sof, fcoe_eof;
314 	u8 fcoe_fc_crc_ok = 1, fcoe_enc_error = 0;
315 	u8 tcp_udp_csum_ok, udp, tcp, ipv4_csum_ok;
316 	u8 ipv6, ipv4, ipv4_fragment, rss_type, csum_not_calc;
317 	u8 fcs_ok = 1, packet_error = 0;
318 	u16 q_number, completed_index, bytes_written = 0, vlan, checksum;
319 	u32 rss_hash;
320 	u16 exchange_id, tmpl;
321 	u8 sof = 0;
322 	u8 eof = 0;
323 	u32 fcp_bytes_written = 0;
324 	unsigned long flags;
325 
326 	pci_unmap_single(fnic->pdev, buf->dma_addr, buf->len,
327 			 PCI_DMA_FROMDEVICE);
328 	skb = buf->os_buf;
329 	buf->os_buf = NULL;
330 
331 	cq_desc_dec(cq_desc, &type, &color, &q_number, &completed_index);
332 	if (type == CQ_DESC_TYPE_RQ_FCP) {
333 		cq_fcp_rq_desc_dec((struct cq_fcp_rq_desc *)cq_desc,
334 				   &type, &color, &q_number, &completed_index,
335 				   &eop, &sop, &fcoe_fc_crc_ok, &exchange_id,
336 				   &tmpl, &fcp_bytes_written, &sof, &eof,
337 				   &ingress_port, &packet_error,
338 				   &fcoe_enc_error, &fcs_ok, &vlan_stripped,
339 				   &vlan);
340 		eth_hdrs_stripped = 1;
341 
342 	} else if (type == CQ_DESC_TYPE_RQ_ENET) {
343 		cq_enet_rq_desc_dec((struct cq_enet_rq_desc *)cq_desc,
344 				    &type, &color, &q_number, &completed_index,
345 				    &ingress_port, &fcoe, &eop, &sop,
346 				    &rss_type, &csum_not_calc, &rss_hash,
347 				    &bytes_written, &packet_error,
348 				    &vlan_stripped, &vlan, &checksum,
349 				    &fcoe_sof, &fcoe_fc_crc_ok,
350 				    &fcoe_enc_error, &fcoe_eof,
351 				    &tcp_udp_csum_ok, &udp, &tcp,
352 				    &ipv4_csum_ok, &ipv6, &ipv4,
353 				    &ipv4_fragment, &fcs_ok);
354 		eth_hdrs_stripped = 0;
355 
356 	} else {
357 		/* wrong CQ type*/
358 		shost_printk(KERN_ERR, fnic->lport->host,
359 			     "fnic rq_cmpl wrong cq type x%x\n", type);
360 		goto drop;
361 	}
362 
363 	if (!fcs_ok || packet_error || !fcoe_fc_crc_ok || fcoe_enc_error) {
364 		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
365 			     "fnic rq_cmpl fcoe x%x fcsok x%x"
366 			     " pkterr x%x fcoe_fc_crc_ok x%x, fcoe_enc_err"
367 			     " x%x\n",
368 			     fcoe, fcs_ok, packet_error,
369 			     fcoe_fc_crc_ok, fcoe_enc_error);
370 		goto drop;
371 	}
372 
373 	if (eth_hdrs_stripped)
374 		fnic_import_rq_fc_frame(skb, fcp_bytes_written, sof, eof);
375 	else if (fnic_import_rq_eth_pkt(skb, bytes_written))
376 		goto drop;
377 
378 	fp = (struct fc_frame *)skb;
379 
380 	/*
381 	 * If frame is an ELS response that matches the cached FLOGI OX_ID,
382 	 * and is accept, issue flogi_reg_request copy wq request to firmware
383 	 * to register the S_ID and determine whether FC_OUI mode or GW mode.
384 	 */
385 	if (is_matching_flogi_resp_frame(fnic, fp)) {
386 		if (!eth_hdrs_stripped) {
387 			if (fc_frame_payload_op(fp) == ELS_LS_ACC) {
388 				fnic_handle_flogi_resp(fnic, fp);
389 				return;
390 			}
391 			/*
392 			 * Recd. Flogi reject. No point registering
393 			 * with fw, but forward to libFC
394 			 */
395 			goto forward;
396 		}
397 		goto drop;
398 	}
399 	if (!eth_hdrs_stripped)
400 		goto drop;
401 
402 forward:
403 	spin_lock_irqsave(&fnic->fnic_lock, flags);
404 	if (fnic->stop_rx_link_events) {
405 		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
406 		goto drop;
407 	}
408 	/* Use fr_flags to indicate whether succ. flogi resp or not */
409 	fr_flags(fp) = 0;
410 	fr_dev(fp) = fnic->lport;
411 	spin_unlock_irqrestore(&fnic->fnic_lock, flags);
412 
413 	skb_queue_tail(&fnic->frame_queue, skb);
414 	queue_work(fnic_event_queue, &fnic->frame_work);
415 
416 	return;
417 drop:
418 	dev_kfree_skb_irq(skb);
419 }
420 
421 static int fnic_rq_cmpl_handler_cont(struct vnic_dev *vdev,
422 				     struct cq_desc *cq_desc, u8 type,
423 				     u16 q_number, u16 completed_index,
424 				     void *opaque)
425 {
426 	struct fnic *fnic = vnic_dev_priv(vdev);
427 
428 	vnic_rq_service(&fnic->rq[q_number], cq_desc, completed_index,
429 			VNIC_RQ_RETURN_DESC, fnic_rq_cmpl_frame_recv,
430 			NULL);
431 	return 0;
432 }
433 
434 int fnic_rq_cmpl_handler(struct fnic *fnic, int rq_work_to_do)
435 {
436 	unsigned int tot_rq_work_done = 0, cur_work_done;
437 	unsigned int i;
438 	int err;
439 
440 	for (i = 0; i < fnic->rq_count; i++) {
441 		cur_work_done = vnic_cq_service(&fnic->cq[i], rq_work_to_do,
442 						fnic_rq_cmpl_handler_cont,
443 						NULL);
444 		if (cur_work_done) {
445 			err = vnic_rq_fill(&fnic->rq[i], fnic_alloc_rq_frame);
446 			if (err)
447 				shost_printk(KERN_ERR, fnic->lport->host,
448 					     "fnic_alloc_rq_frame cant alloc"
449 					     " frame\n");
450 		}
451 		tot_rq_work_done += cur_work_done;
452 	}
453 
454 	return tot_rq_work_done;
455 }
456 
457 /*
458  * This function is called once at init time to allocate and fill RQ
459  * buffers. Subsequently, it is called in the interrupt context after RQ
460  * buffer processing to replenish the buffers in the RQ
461  */
462 int fnic_alloc_rq_frame(struct vnic_rq *rq)
463 {
464 	struct fnic *fnic = vnic_dev_priv(rq->vdev);
465 	struct sk_buff *skb;
466 	u16 len;
467 	dma_addr_t pa;
468 
469 	len = FC_FRAME_HEADROOM + FC_MAX_FRAME + FC_FRAME_TAILROOM;
470 	skb = dev_alloc_skb(len);
471 	if (!skb) {
472 		FNIC_FCS_DBG(KERN_DEBUG, fnic->lport->host,
473 			     "Unable to allocate RQ sk_buff\n");
474 		return -ENOMEM;
475 	}
476 	skb_reset_mac_header(skb);
477 	skb_reset_transport_header(skb);
478 	skb_reset_network_header(skb);
479 	skb_put(skb, len);
480 	pa = pci_map_single(fnic->pdev, skb->data, len, PCI_DMA_FROMDEVICE);
481 	fnic_queue_rq_desc(rq, skb, pa, len);
482 	return 0;
483 }
484 
485 void fnic_free_rq_buf(struct vnic_rq *rq, struct vnic_rq_buf *buf)
486 {
487 	struct fc_frame *fp = buf->os_buf;
488 	struct fnic *fnic = vnic_dev_priv(rq->vdev);
489 
490 	pci_unmap_single(fnic->pdev, buf->dma_addr, buf->len,
491 			 PCI_DMA_FROMDEVICE);
492 
493 	dev_kfree_skb(fp_skb(fp));
494 	buf->os_buf = NULL;
495 }
496 
497 static inline int is_flogi_frame(struct fc_frame_header *fh)
498 {
499 	return fh->fh_r_ctl == FC_RCTL_ELS_REQ && *(u8 *)(fh + 1) == ELS_FLOGI;
500 }
501 
502 int fnic_send_frame(struct fnic *fnic, struct fc_frame *fp)
503 {
504 	struct vnic_wq *wq = &fnic->wq[0];
505 	struct sk_buff *skb;
506 	dma_addr_t pa;
507 	struct ethhdr *eth_hdr;
508 	struct vlan_ethhdr *vlan_hdr;
509 	struct fcoe_hdr *fcoe_hdr;
510 	struct fc_frame_header *fh;
511 	u32 tot_len, eth_hdr_len;
512 	int ret = 0;
513 	unsigned long flags;
514 
515 	fh = fc_frame_header_get(fp);
516 	skb = fp_skb(fp);
517 
518 	if (!fnic->vlan_hw_insert) {
519 		eth_hdr_len = sizeof(*vlan_hdr) + sizeof(*fcoe_hdr);
520 		vlan_hdr = (struct vlan_ethhdr *)skb_push(skb, eth_hdr_len);
521 		eth_hdr = (struct ethhdr *)vlan_hdr;
522 		vlan_hdr->h_vlan_proto = htons(ETH_P_8021Q);
523 		vlan_hdr->h_vlan_encapsulated_proto = htons(ETH_P_FCOE);
524 		vlan_hdr->h_vlan_TCI = htons(fnic->vlan_id);
525 		fcoe_hdr = (struct fcoe_hdr *)(vlan_hdr + 1);
526 	} else {
527 		eth_hdr_len = sizeof(*eth_hdr) + sizeof(*fcoe_hdr);
528 		eth_hdr = (struct ethhdr *)skb_push(skb, eth_hdr_len);
529 		eth_hdr->h_proto = htons(ETH_P_FCOE);
530 		fcoe_hdr = (struct fcoe_hdr *)(eth_hdr + 1);
531 	}
532 
533 	if (is_flogi_frame(fh)) {
534 		fc_fcoe_set_mac(eth_hdr->h_dest, fh->fh_d_id);
535 		memcpy(eth_hdr->h_source, fnic->mac_addr, ETH_ALEN);
536 	} else {
537 		if (fnic->fcoui_mode)
538 			fc_fcoe_set_mac(eth_hdr->h_dest, fh->fh_d_id);
539 		else
540 			memcpy(eth_hdr->h_dest, fnic->dest_addr, ETH_ALEN);
541 		memcpy(eth_hdr->h_source, fnic->data_src_addr, ETH_ALEN);
542 	}
543 
544 	tot_len = skb->len;
545 	BUG_ON(tot_len % 4);
546 
547 	memset(fcoe_hdr, 0, sizeof(*fcoe_hdr));
548 	fcoe_hdr->fcoe_sof = fr_sof(fp);
549 	if (FC_FCOE_VER)
550 		FC_FCOE_ENCAPS_VER(fcoe_hdr, FC_FCOE_VER);
551 
552 	pa = pci_map_single(fnic->pdev, eth_hdr, tot_len, PCI_DMA_TODEVICE);
553 
554 	spin_lock_irqsave(&fnic->wq_lock[0], flags);
555 
556 	if (!vnic_wq_desc_avail(wq)) {
557 		pci_unmap_single(fnic->pdev, pa,
558 				 tot_len, PCI_DMA_TODEVICE);
559 		ret = -1;
560 		goto fnic_send_frame_end;
561 	}
562 
563 	fnic_queue_wq_desc(wq, skb, pa, tot_len, fr_eof(fp),
564 			   fnic->vlan_hw_insert, fnic->vlan_id, 1, 1, 1);
565 fnic_send_frame_end:
566 	spin_unlock_irqrestore(&fnic->wq_lock[0], flags);
567 
568 	if (ret)
569 		dev_kfree_skb_any(fp_skb(fp));
570 
571 	return ret;
572 }
573 
574 /*
575  * fnic_send
576  * Routine to send a raw frame
577  */
578 int fnic_send(struct fc_lport *lp, struct fc_frame *fp)
579 {
580 	struct fnic *fnic = lport_priv(lp);
581 	struct fc_frame_header *fh;
582 	int ret = 0;
583 	enum fnic_state old_state;
584 	unsigned long flags;
585 	struct fc_frame *old_flogi = NULL;
586 	struct fc_frame *old_flogi_resp = NULL;
587 
588 	if (fnic->in_remove) {
589 		dev_kfree_skb(fp_skb(fp));
590 		ret = -1;
591 		goto fnic_send_end;
592 	}
593 
594 	fh = fc_frame_header_get(fp);
595 	/* if not an Flogi frame, send it out, this is the common case */
596 	if (!is_flogi_frame(fh))
597 		return fnic_send_frame(fnic, fp);
598 
599 	/* Flogi frame, now enter the state machine */
600 
601 	spin_lock_irqsave(&fnic->fnic_lock, flags);
602 again:
603 	/* Get any old cached frames, free them after dropping lock */
604 	old_flogi = fnic->flogi;
605 	fnic->flogi = NULL;
606 	old_flogi_resp = fnic->flogi_resp;
607 	fnic->flogi_resp = NULL;
608 
609 	fnic->flogi_oxid = FC_XID_UNKNOWN;
610 
611 	old_state = fnic->state;
612 	switch (old_state) {
613 	case FNIC_IN_FC_MODE:
614 	case FNIC_IN_ETH_TRANS_FC_MODE:
615 	default:
616 		fnic->state = FNIC_IN_FC_TRANS_ETH_MODE;
617 		vnic_dev_del_addr(fnic->vdev, fnic->data_src_addr);
618 		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
619 
620 		if (old_flogi) {
621 			dev_kfree_skb(fp_skb(old_flogi));
622 			old_flogi = NULL;
623 		}
624 		if (old_flogi_resp) {
625 			dev_kfree_skb(fp_skb(old_flogi_resp));
626 			old_flogi_resp = NULL;
627 		}
628 
629 		ret = fnic_fw_reset_handler(fnic);
630 
631 		spin_lock_irqsave(&fnic->fnic_lock, flags);
632 		if (fnic->state != FNIC_IN_FC_TRANS_ETH_MODE)
633 			goto again;
634 		if (ret) {
635 			fnic->state = old_state;
636 			spin_unlock_irqrestore(&fnic->fnic_lock, flags);
637 			dev_kfree_skb(fp_skb(fp));
638 			goto fnic_send_end;
639 		}
640 		old_flogi = fnic->flogi;
641 		fnic->flogi = fp;
642 		fnic->flogi_oxid = ntohs(fh->fh_ox_id);
643 		old_flogi_resp = fnic->flogi_resp;
644 		fnic->flogi_resp = NULL;
645 		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
646 		break;
647 
648 	case FNIC_IN_FC_TRANS_ETH_MODE:
649 		/*
650 		 * A reset is pending with the firmware. Store the flogi
651 		 * and its oxid. The transition out of this state happens
652 		 * only when Firmware completes the reset, either with
653 		 * success or failed. If success, transition to
654 		 * FNIC_IN_ETH_MODE, if fail, then transition to
655 		 * FNIC_IN_FC_MODE
656 		 */
657 		fnic->flogi = fp;
658 		fnic->flogi_oxid = ntohs(fh->fh_ox_id);
659 		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
660 		break;
661 
662 	case FNIC_IN_ETH_MODE:
663 		/*
664 		 * The fw/hw is already in eth mode. Store the oxid,
665 		 * and send the flogi frame out. The transition out of this
666 		 * state happens only we receive flogi response from the
667 		 * network, and the oxid matches the cached oxid when the
668 		 * flogi frame was sent out. If they match, then we issue
669 		 * a flogi_reg request and transition to state
670 		 * FNIC_IN_ETH_TRANS_FC_MODE
671 		 */
672 		fnic->flogi_oxid = ntohs(fh->fh_ox_id);
673 		spin_unlock_irqrestore(&fnic->fnic_lock, flags);
674 		ret = fnic_send_frame(fnic, fp);
675 		break;
676 	}
677 
678 fnic_send_end:
679 	if (old_flogi)
680 		dev_kfree_skb(fp_skb(old_flogi));
681 	if (old_flogi_resp)
682 		dev_kfree_skb(fp_skb(old_flogi_resp));
683 	return ret;
684 }
685 
686 static void fnic_wq_complete_frame_send(struct vnic_wq *wq,
687 					struct cq_desc *cq_desc,
688 					struct vnic_wq_buf *buf, void *opaque)
689 {
690 	struct sk_buff *skb = buf->os_buf;
691 	struct fc_frame *fp = (struct fc_frame *)skb;
692 	struct fnic *fnic = vnic_dev_priv(wq->vdev);
693 
694 	pci_unmap_single(fnic->pdev, buf->dma_addr,
695 			 buf->len, PCI_DMA_TODEVICE);
696 	dev_kfree_skb_irq(fp_skb(fp));
697 	buf->os_buf = NULL;
698 }
699 
700 static int fnic_wq_cmpl_handler_cont(struct vnic_dev *vdev,
701 				     struct cq_desc *cq_desc, u8 type,
702 				     u16 q_number, u16 completed_index,
703 				     void *opaque)
704 {
705 	struct fnic *fnic = vnic_dev_priv(vdev);
706 	unsigned long flags;
707 
708 	spin_lock_irqsave(&fnic->wq_lock[q_number], flags);
709 	vnic_wq_service(&fnic->wq[q_number], cq_desc, completed_index,
710 			fnic_wq_complete_frame_send, NULL);
711 	spin_unlock_irqrestore(&fnic->wq_lock[q_number], flags);
712 
713 	return 0;
714 }
715 
716 int fnic_wq_cmpl_handler(struct fnic *fnic, int work_to_do)
717 {
718 	unsigned int wq_work_done = 0;
719 	unsigned int i;
720 
721 	for (i = 0; i < fnic->raw_wq_count; i++) {
722 		wq_work_done  += vnic_cq_service(&fnic->cq[fnic->rq_count+i],
723 						 work_to_do,
724 						 fnic_wq_cmpl_handler_cont,
725 						 NULL);
726 	}
727 
728 	return wq_work_done;
729 }
730 
731 
732 void fnic_free_wq_buf(struct vnic_wq *wq, struct vnic_wq_buf *buf)
733 {
734 	struct fc_frame *fp = buf->os_buf;
735 	struct fnic *fnic = vnic_dev_priv(wq->vdev);
736 
737 	pci_unmap_single(fnic->pdev, buf->dma_addr,
738 			 buf->len, PCI_DMA_TODEVICE);
739 
740 	dev_kfree_skb(fp_skb(fp));
741 	buf->os_buf = NULL;
742 }
743