1 /*******************************************************************************
3 Intel 10 Gigabit PCI Express Linux driver
4 Copyright(c) 1999 - 2013 Intel Corporation.
6 This program is free software; you can redistribute it and/or modify it
7 under the terms and conditions of the GNU General Public License,
8 version 2, as published by the Free Software Foundation.
10 This program is distributed in the hope it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 You should have received a copy of the GNU General Public License along with
16 this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
19 The full GNU General Public License is included in this distribution in
20 the file called "COPYING".
25 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
27 *******************************************************************************/
30 #include <linux/if_ether.h>
31 #include <linux/gfp.h>
32 #include <linux/if_vlan.h>
33 #include <scsi/scsi_cmnd.h>
34 #include <scsi/scsi_device.h>
35 #include <scsi/fc/fc_fs.h>
36 #include <scsi/fc/fc_fcoe.h>
37 #include <scsi/libfc.h>
38 #include <scsi/libfcoe.h>
41 * ixgbe_fcoe_clear_ddp - clear the given ddp context
42 * @ddp: ptr to the ixgbe_fcoe_ddp
47 static inline void ixgbe_fcoe_clear_ddp(struct ixgbe_fcoe_ddp *ddp)
58 * ixgbe_fcoe_ddp_put - free the ddp context for a given xid
59 * @netdev: the corresponding net_device
60 * @xid: the xid that corresponding ddp will be freed
62 * This is the implementation of net_device_ops.ndo_fcoe_ddp_done
63 * and it is expected to be called by ULD, i.e., FCP layer of libfc
64 * to release the corresponding ddp context when the I/O is done.
66 * Returns : data length already ddp-ed in bytes
68 int ixgbe_fcoe_ddp_put(struct net_device *netdev, u16 xid)
71 struct ixgbe_fcoe *fcoe;
72 struct ixgbe_adapter *adapter;
73 struct ixgbe_fcoe_ddp *ddp;
79 if (xid >= IXGBE_FCOE_DDP_MAX)
82 adapter = netdev_priv(netdev);
83 fcoe = &adapter->fcoe;
84 ddp = &fcoe->ddp[xid];
89 /* if there an error, force to invalidate ddp context */
91 spin_lock_bh(&fcoe->lock);
92 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCFLT, 0);
93 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCFLTRW,
94 (xid | IXGBE_FCFLTRW_WE));
95 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCBUFF, 0);
96 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCDMARW,
97 (xid | IXGBE_FCDMARW_WE));
99 /* guaranteed to be invalidated after 100us */
100 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCDMARW,
101 (xid | IXGBE_FCDMARW_RE));
102 fcbuff = IXGBE_READ_REG(&adapter->hw, IXGBE_FCBUFF);
103 spin_unlock_bh(&fcoe->lock);
104 if (fcbuff & IXGBE_FCBUFF_VALID)
108 dma_unmap_sg(&adapter->pdev->dev, ddp->sgl, ddp->sgc,
111 dma_pool_free(ddp->pool, ddp->udl, ddp->udp);
115 ixgbe_fcoe_clear_ddp(ddp);
122 * ixgbe_fcoe_ddp_setup - called to set up ddp context
123 * @netdev: the corresponding net_device
124 * @xid: the exchange id requesting ddp
125 * @sgl: the scatter-gather list for this request
126 * @sgc: the number of scatter-gather items
128 * Returns : 1 for success and 0 for no ddp
130 static int ixgbe_fcoe_ddp_setup(struct net_device *netdev, u16 xid,
131 struct scatterlist *sgl, unsigned int sgc,
134 struct ixgbe_adapter *adapter;
136 struct ixgbe_fcoe *fcoe;
137 struct ixgbe_fcoe_ddp *ddp;
138 struct ixgbe_fcoe_ddp_pool *ddp_pool;
139 struct scatterlist *sg;
140 unsigned int i, j, dmacount;
142 static const unsigned int bufflen = IXGBE_FCBUFF_MIN;
143 unsigned int firstoff = 0;
144 unsigned int lastsize;
145 unsigned int thisoff = 0;
146 unsigned int thislen = 0;
147 u32 fcbuff, fcdmarw, fcfltrw, fcrxctl;
153 adapter = netdev_priv(netdev);
154 if (xid >= IXGBE_FCOE_DDP_MAX) {
155 e_warn(drv, "xid=0x%x out-of-range\n", xid);
159 /* no DDP if we are already down or resetting */
160 if (test_bit(__IXGBE_DOWN, &adapter->state) ||
161 test_bit(__IXGBE_RESETTING, &adapter->state))
164 fcoe = &adapter->fcoe;
165 ddp = &fcoe->ddp[xid];
167 e_err(drv, "xid 0x%x w/ non-null sgl=%p nents=%d\n",
168 xid, ddp->sgl, ddp->sgc);
171 ixgbe_fcoe_clear_ddp(ddp);
174 if (!fcoe->ddp_pool) {
175 e_warn(drv, "No ddp_pool resources allocated\n");
179 ddp_pool = per_cpu_ptr(fcoe->ddp_pool, get_cpu());
180 if (!ddp_pool->pool) {
181 e_warn(drv, "xid=0x%x no ddp pool for fcoe\n", xid);
185 /* setup dma from scsi command sgl */
186 dmacount = dma_map_sg(&adapter->pdev->dev, sgl, sgc, DMA_FROM_DEVICE);
188 e_err(drv, "xid 0x%x DMA map error\n", xid);
192 /* alloc the udl from per cpu ddp pool */
193 ddp->udl = dma_pool_alloc(ddp_pool->pool, GFP_ATOMIC, &ddp->udp);
195 e_err(drv, "failed allocated ddp context\n");
196 goto out_noddp_unmap;
198 ddp->pool = ddp_pool->pool;
203 for_each_sg(sgl, sg, dmacount, i) {
204 addr = sg_dma_address(sg);
205 len = sg_dma_len(sg);
207 /* max number of buffers allowed in one DDP context */
208 if (j >= IXGBE_BUFFCNT_MAX) {
213 /* get the offset of length of current buffer */
214 thisoff = addr & ((dma_addr_t)bufflen - 1);
215 thislen = min((bufflen - thisoff), len);
217 * all but the 1st buffer (j == 0)
218 * must be aligned on bufflen
220 if ((j != 0) && (thisoff))
223 * all but the last buffer
224 * ((i == (dmacount - 1)) && (thislen == len))
225 * must end at bufflen
227 if (((i != (dmacount - 1)) || (thislen != len))
228 && ((thislen + thisoff) != bufflen))
231 ddp->udl[j] = (u64)(addr - thisoff);
232 /* only the first buffer may have none-zero offset */
240 /* only the last buffer may have non-full bufflen */
241 lastsize = thisoff + thislen;
244 * lastsize can not be buffer len.
245 * If it is then adding another buffer with lastsize = 1.
247 if (lastsize == bufflen) {
248 if (j >= IXGBE_BUFFCNT_MAX) {
249 ddp_pool->noddp_ext_buff++;
253 ddp->udl[j] = (u64)(fcoe->extra_ddp_buffer_dma);
259 fcbuff = (IXGBE_FCBUFF_4KB << IXGBE_FCBUFF_BUFFSIZE_SHIFT);
260 fcbuff |= ((j & 0xff) << IXGBE_FCBUFF_BUFFCNT_SHIFT);
261 fcbuff |= (firstoff << IXGBE_FCBUFF_OFFSET_SHIFT);
262 /* Set WRCONTX bit to allow DDP for target */
264 fcbuff |= (IXGBE_FCBUFF_WRCONTX);
265 fcbuff |= (IXGBE_FCBUFF_VALID);
268 fcdmarw |= IXGBE_FCDMARW_WE;
269 fcdmarw |= (lastsize << IXGBE_FCDMARW_LASTSIZE_SHIFT);
272 fcfltrw |= IXGBE_FCFLTRW_WE;
274 /* program DMA context */
276 spin_lock_bh(&fcoe->lock);
278 /* turn on last frame indication for target mode as FCP_RSPtarget is
279 * supposed to send FCP_RSP when it is done. */
280 if (target_mode && !test_bit(__IXGBE_FCOE_TARGET, &fcoe->mode)) {
281 set_bit(__IXGBE_FCOE_TARGET, &fcoe->mode);
282 fcrxctl = IXGBE_READ_REG(hw, IXGBE_FCRXCTRL);
283 fcrxctl |= IXGBE_FCRXCTRL_LASTSEQH;
284 IXGBE_WRITE_REG(hw, IXGBE_FCRXCTRL, fcrxctl);
287 IXGBE_WRITE_REG(hw, IXGBE_FCPTRL, ddp->udp & DMA_BIT_MASK(32));
288 IXGBE_WRITE_REG(hw, IXGBE_FCPTRH, (u64)ddp->udp >> 32);
289 IXGBE_WRITE_REG(hw, IXGBE_FCBUFF, fcbuff);
290 IXGBE_WRITE_REG(hw, IXGBE_FCDMARW, fcdmarw);
291 /* program filter context */
292 IXGBE_WRITE_REG(hw, IXGBE_FCPARAM, 0);
293 IXGBE_WRITE_REG(hw, IXGBE_FCFLT, IXGBE_FCFLT_VALID);
294 IXGBE_WRITE_REG(hw, IXGBE_FCFLTRW, fcfltrw);
296 spin_unlock_bh(&fcoe->lock);
301 dma_pool_free(ddp->pool, ddp->udl, ddp->udp);
302 ixgbe_fcoe_clear_ddp(ddp);
305 dma_unmap_sg(&adapter->pdev->dev, sgl, sgc, DMA_FROM_DEVICE);
312 * ixgbe_fcoe_ddp_get - called to set up ddp context in initiator mode
313 * @netdev: the corresponding net_device
314 * @xid: the exchange id requesting ddp
315 * @sgl: the scatter-gather list for this request
316 * @sgc: the number of scatter-gather items
318 * This is the implementation of net_device_ops.ndo_fcoe_ddp_setup
319 * and is expected to be called from ULD, e.g., FCP layer of libfc
320 * to set up ddp for the corresponding xid of the given sglist for
321 * the corresponding I/O.
323 * Returns : 1 for success and 0 for no ddp
325 int ixgbe_fcoe_ddp_get(struct net_device *netdev, u16 xid,
326 struct scatterlist *sgl, unsigned int sgc)
328 return ixgbe_fcoe_ddp_setup(netdev, xid, sgl, sgc, 0);
332 * ixgbe_fcoe_ddp_target - called to set up ddp context in target mode
333 * @netdev: the corresponding net_device
334 * @xid: the exchange id requesting ddp
335 * @sgl: the scatter-gather list for this request
336 * @sgc: the number of scatter-gather items
338 * This is the implementation of net_device_ops.ndo_fcoe_ddp_target
339 * and is expected to be called from ULD, e.g., FCP layer of libfc
340 * to set up ddp for the corresponding xid of the given sglist for
341 * the corresponding I/O. The DDP in target mode is a write I/O request
342 * from the initiator.
344 * Returns : 1 for success and 0 for no ddp
346 int ixgbe_fcoe_ddp_target(struct net_device *netdev, u16 xid,
347 struct scatterlist *sgl, unsigned int sgc)
349 return ixgbe_fcoe_ddp_setup(netdev, xid, sgl, sgc, 1);
353 * ixgbe_fcoe_ddp - check ddp status and mark it done
354 * @adapter: ixgbe adapter
355 * @rx_desc: advanced rx descriptor
356 * @skb: the skb holding the received data
358 * This checks ddp status.
360 * Returns : < 0 indicates an error or not a FCiE ddp, 0 indicates
361 * not passing the skb to ULD, > 0 indicates is the length of data
364 int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
365 union ixgbe_adv_rx_desc *rx_desc,
369 struct ixgbe_fcoe *fcoe;
370 struct ixgbe_fcoe_ddp *ddp;
371 struct fc_frame_header *fh;
372 struct fcoe_crc_eof *crc;
373 __le32 fcerr = ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_ERR_FCERR);
378 if (fcerr == cpu_to_le32(IXGBE_FCERR_BADCRC))
379 skb->ip_summed = CHECKSUM_NONE;
381 skb->ip_summed = CHECKSUM_UNNECESSARY;
383 if (eth_hdr(skb)->h_proto == htons(ETH_P_8021Q))
384 fh = (struct fc_frame_header *)(skb->data +
385 sizeof(struct vlan_hdr) + sizeof(struct fcoe_hdr));
387 fh = (struct fc_frame_header *)(skb->data +
388 sizeof(struct fcoe_hdr));
390 fctl = ntoh24(fh->fh_f_ctl);
391 if (fctl & FC_FC_EX_CTX)
392 xid = be16_to_cpu(fh->fh_ox_id);
394 xid = be16_to_cpu(fh->fh_rx_id);
396 if (xid >= IXGBE_FCOE_DDP_MAX)
399 fcoe = &adapter->fcoe;
400 ddp = &fcoe->ddp[xid];
404 ddp_err = ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_ERR_FCEOFE |
405 IXGBE_RXDADV_ERR_FCERR);
409 switch (ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_STAT_FCSTAT)) {
410 /* return 0 to bypass going to ULD for DDPed data */
411 case cpu_to_le32(IXGBE_RXDADV_STAT_FCSTAT_DDP):
412 /* update length of DDPed data */
413 ddp->len = le32_to_cpu(rx_desc->wb.lower.hi_dword.rss);
416 /* unmap the sg list when FCPRSP is received */
417 case cpu_to_le32(IXGBE_RXDADV_STAT_FCSTAT_FCPRSP):
418 dma_unmap_sg(&adapter->pdev->dev, ddp->sgl,
419 ddp->sgc, DMA_FROM_DEVICE);
424 /* if DDP length is present pass it through to ULD */
425 case cpu_to_le32(IXGBE_RXDADV_STAT_FCSTAT_NODDP):
426 /* update length of DDPed data */
427 ddp->len = le32_to_cpu(rx_desc->wb.lower.hi_dword.rss);
431 /* no match will return as an error */
432 case cpu_to_le32(IXGBE_RXDADV_STAT_FCSTAT_NOMTCH):
437 /* In target mode, check the last data frame of the sequence.
438 * For DDP in target mode, data is already DDPed but the header
439 * indication of the last data frame ould allow is to tell if we
440 * got all the data and the ULP can send FCP_RSP back, as this is
441 * not a full fcoe frame, we fill the trailer here so it won't be
442 * dropped by the ULP stack.
444 if ((fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA) &&
445 (fctl & FC_FC_END_SEQ)) {
447 crc = (struct fcoe_crc_eof *)skb_put(skb, sizeof(*crc));
448 crc->fcoe_eof = FC_EOF_T;
455 * ixgbe_fso - ixgbe FCoE Sequence Offload (FSO)
456 * @tx_ring: tx desc ring
457 * @first: first tx_buffer structure containing skb, tx_flags, and protocol
458 * @hdr_len: hdr_len to be returned
460 * This sets up large send offload for FCoE
462 * Returns : 0 indicates success, < 0 for error
464 int ixgbe_fso(struct ixgbe_ring *tx_ring,
465 struct ixgbe_tx_buffer *first,
468 struct sk_buff *skb = first->skb;
469 struct fc_frame_header *fh;
471 u32 fcoe_sof_eof = 0;
475 if (skb_is_gso(skb) && (skb_shinfo(skb)->gso_type != SKB_GSO_FCOE)) {
476 dev_err(tx_ring->dev, "Wrong gso type %d:expecting SKB_GSO_FCOE\n",
477 skb_shinfo(skb)->gso_type);
481 /* resets the header to point fcoe/fc */
482 skb_set_network_header(skb, skb->mac_len);
483 skb_set_transport_header(skb, skb->mac_len +
484 sizeof(struct fcoe_hdr));
486 /* sets up SOF and ORIS */
487 sof = ((struct fcoe_hdr *)skb_network_header(skb))->fcoe_sof;
490 fcoe_sof_eof = IXGBE_ADVTXD_FCOEF_ORIS;
493 fcoe_sof_eof = IXGBE_ADVTXD_FCOEF_SOF |
494 IXGBE_ADVTXD_FCOEF_ORIS;
499 fcoe_sof_eof = IXGBE_ADVTXD_FCOEF_SOF;
502 dev_warn(tx_ring->dev, "unknown sof = 0x%x\n", sof);
506 /* the first byte of the last dword is EOF */
507 skb_copy_bits(skb, skb->len - 4, &eof, 1);
508 /* sets up EOF and ORIE */
511 fcoe_sof_eof |= IXGBE_ADVTXD_FCOEF_EOF_N;
516 fcoe_sof_eof |= IXGBE_ADVTXD_FCOEF_EOF_N |
517 IXGBE_ADVTXD_FCOEF_ORIE;
519 fcoe_sof_eof |= IXGBE_ADVTXD_FCOEF_EOF_T;
522 fcoe_sof_eof |= IXGBE_ADVTXD_FCOEF_EOF_NI;
525 fcoe_sof_eof |= IXGBE_ADVTXD_FCOEF_EOF_A;
528 dev_warn(tx_ring->dev, "unknown eof = 0x%x\n", eof);
532 /* sets up PARINC indicating data offset */
533 fh = (struct fc_frame_header *)skb_transport_header(skb);
534 if (fh->fh_f_ctl[2] & FC_FC_REL_OFF)
535 fcoe_sof_eof |= IXGBE_ADVTXD_FCOEF_PARINC;
537 /* include trailer in headlen as it is replicated per frame */
538 *hdr_len = sizeof(struct fcoe_crc_eof);
540 /* hdr_len includes fc_hdr if FCoE LSO is enabled */
541 if (skb_is_gso(skb)) {
542 *hdr_len += skb_transport_offset(skb) +
543 sizeof(struct fc_frame_header);
544 /* update gso_segs and bytecount */
545 first->gso_segs = DIV_ROUND_UP(skb->len - *hdr_len,
546 skb_shinfo(skb)->gso_size);
547 first->bytecount += (first->gso_segs - 1) * *hdr_len;
548 first->tx_flags |= IXGBE_TX_FLAGS_TSO;
551 /* set flag indicating FCOE to ixgbe_tx_map call */
552 first->tx_flags |= IXGBE_TX_FLAGS_FCOE | IXGBE_TX_FLAGS_CC;
554 /* mss_l4len_id: use 0 for FSO as TSO, no need for L4LEN */
555 mss_l4len_idx = skb_shinfo(skb)->gso_size << IXGBE_ADVTXD_MSS_SHIFT;
557 /* vlan_macip_lens: HEADLEN, MACLEN, VLAN tag */
558 vlan_macip_lens = skb_transport_offset(skb) +
559 sizeof(struct fc_frame_header);
560 vlan_macip_lens |= (skb_transport_offset(skb) - 4)
561 << IXGBE_ADVTXD_MACLEN_SHIFT;
562 vlan_macip_lens |= first->tx_flags & IXGBE_TX_FLAGS_VLAN_MASK;
564 /* write context desc */
565 ixgbe_tx_ctxtdesc(tx_ring, vlan_macip_lens, fcoe_sof_eof,
566 IXGBE_ADVTXT_TUCMD_FCOE, mss_l4len_idx);
571 static void ixgbe_fcoe_dma_pool_free(struct ixgbe_fcoe *fcoe, unsigned int cpu)
573 struct ixgbe_fcoe_ddp_pool *ddp_pool;
575 ddp_pool = per_cpu_ptr(fcoe->ddp_pool, cpu);
577 dma_pool_destroy(ddp_pool->pool);
578 ddp_pool->pool = NULL;
581 static int ixgbe_fcoe_dma_pool_alloc(struct ixgbe_fcoe *fcoe,
585 struct ixgbe_fcoe_ddp_pool *ddp_pool;
586 struct dma_pool *pool;
589 snprintf(pool_name, 32, "ixgbe_fcoe_ddp_%u", cpu);
591 pool = dma_pool_create(pool_name, dev, IXGBE_FCPTR_MAX,
592 IXGBE_FCPTR_ALIGN, PAGE_SIZE);
596 ddp_pool = per_cpu_ptr(fcoe->ddp_pool, cpu);
597 ddp_pool->pool = pool;
599 ddp_pool->noddp_ext_buff = 0;
605 * ixgbe_configure_fcoe - configures registers for fcoe at start
606 * @adapter: ptr to ixgbe adapter
608 * This sets up FCoE related registers
612 void ixgbe_configure_fcoe(struct ixgbe_adapter *adapter)
614 struct ixgbe_ring_feature *fcoe = &adapter->ring_feature[RING_F_FCOE];
615 struct ixgbe_hw *hw = &adapter->hw;
616 int i, fcoe_q, fcoe_i;
619 /* Minimal functionality for FCoE requires at least CRC offloads */
620 if (!(adapter->netdev->features & NETIF_F_FCOE_CRC))
623 /* Enable L2 EtherType filter for FCoE, needed for FCoE CRC and DDP */
624 etqf = ETH_P_FCOE | IXGBE_ETQF_FCOE | IXGBE_ETQF_FILTER_EN;
625 if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) {
626 etqf |= IXGBE_ETQF_POOL_ENABLE;
627 etqf |= VMDQ_P(0) << IXGBE_ETQF_POOL_SHIFT;
629 IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_FCOE), etqf);
630 IXGBE_WRITE_REG(hw, IXGBE_ETQS(IXGBE_ETQF_FILTER_FCOE), 0);
632 /* leave registers un-configured if FCoE is disabled */
633 if (!(adapter->flags & IXGBE_FLAG_FCOE_ENABLED))
636 /* Use one or more Rx queues for FCoE by redirection table */
637 for (i = 0; i < IXGBE_FCRETA_SIZE; i++) {
638 fcoe_i = fcoe->offset + (i % fcoe->indices);
639 fcoe_i &= IXGBE_FCRETA_ENTRY_MASK;
640 fcoe_q = adapter->rx_ring[fcoe_i]->reg_idx;
641 IXGBE_WRITE_REG(hw, IXGBE_FCRETA(i), fcoe_q);
643 IXGBE_WRITE_REG(hw, IXGBE_FCRECTL, IXGBE_FCRECTL_ENA);
645 /* Enable L2 EtherType filter for FIP */
646 etqf = ETH_P_FIP | IXGBE_ETQF_FILTER_EN;
647 if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) {
648 etqf |= IXGBE_ETQF_POOL_ENABLE;
649 etqf |= VMDQ_P(0) << IXGBE_ETQF_POOL_SHIFT;
651 IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_FIP), etqf);
653 /* Send FIP frames to the first FCoE queue */
654 fcoe_q = adapter->rx_ring[fcoe->offset]->reg_idx;
655 IXGBE_WRITE_REG(hw, IXGBE_ETQS(IXGBE_ETQF_FILTER_FIP),
656 IXGBE_ETQS_QUEUE_EN |
657 (fcoe_q << IXGBE_ETQS_RX_QUEUE_SHIFT));
659 /* Configure FCoE Rx control */
660 IXGBE_WRITE_REG(hw, IXGBE_FCRXCTRL,
661 IXGBE_FCRXCTRL_FCCRCBO |
662 (FC_FCOE_VER << IXGBE_FCRXCTRL_FCOEVER_SHIFT));
666 * ixgbe_free_fcoe_ddp_resources - release all fcoe ddp context resources
667 * @adapter : ixgbe adapter
669 * Cleans up outstanding ddp context resources
673 void ixgbe_free_fcoe_ddp_resources(struct ixgbe_adapter *adapter)
675 struct ixgbe_fcoe *fcoe = &adapter->fcoe;
678 /* do nothing if no DDP pools were allocated */
682 for (i = 0; i < IXGBE_FCOE_DDP_MAX; i++)
683 ixgbe_fcoe_ddp_put(adapter->netdev, i);
685 for_each_possible_cpu(cpu)
686 ixgbe_fcoe_dma_pool_free(fcoe, cpu);
688 dma_unmap_single(&adapter->pdev->dev,
689 fcoe->extra_ddp_buffer_dma,
692 kfree(fcoe->extra_ddp_buffer);
694 fcoe->extra_ddp_buffer = NULL;
695 fcoe->extra_ddp_buffer_dma = 0;
699 * ixgbe_setup_fcoe_ddp_resources - setup all fcoe ddp context resources
700 * @adapter: ixgbe adapter
702 * Sets up ddp context resouces
704 * Returns : 0 indicates success or -EINVAL on failure
706 int ixgbe_setup_fcoe_ddp_resources(struct ixgbe_adapter *adapter)
708 struct ixgbe_fcoe *fcoe = &adapter->fcoe;
709 struct device *dev = &adapter->pdev->dev;
714 /* do nothing if no DDP pools were allocated */
718 /* Extra buffer to be shared by all DDPs for HW work around */
719 buffer = kmalloc(IXGBE_FCBUFF_MIN, GFP_ATOMIC);
723 dma = dma_map_single(dev, buffer, IXGBE_FCBUFF_MIN, DMA_FROM_DEVICE);
724 if (dma_mapping_error(dev, dma)) {
725 e_err(drv, "failed to map extra DDP buffer\n");
730 fcoe->extra_ddp_buffer = buffer;
731 fcoe->extra_ddp_buffer_dma = dma;
733 /* allocate pci pool for each cpu */
734 for_each_possible_cpu(cpu) {
735 int err = ixgbe_fcoe_dma_pool_alloc(fcoe, dev, cpu);
739 e_err(drv, "failed to alloc DDP pool on cpu:%d\n", cpu);
740 ixgbe_free_fcoe_ddp_resources(adapter);
747 static int ixgbe_fcoe_ddp_enable(struct ixgbe_adapter *adapter)
749 struct ixgbe_fcoe *fcoe = &adapter->fcoe;
751 if (!(adapter->flags & IXGBE_FLAG_FCOE_CAPABLE))
754 fcoe->ddp_pool = alloc_percpu(struct ixgbe_fcoe_ddp_pool);
756 if (!fcoe->ddp_pool) {
757 e_err(drv, "failed to allocate percpu DDP resources\n");
761 adapter->netdev->fcoe_ddp_xid = IXGBE_FCOE_DDP_MAX - 1;
766 static void ixgbe_fcoe_ddp_disable(struct ixgbe_adapter *adapter)
768 struct ixgbe_fcoe *fcoe = &adapter->fcoe;
770 adapter->netdev->fcoe_ddp_xid = 0;
775 free_percpu(fcoe->ddp_pool);
776 fcoe->ddp_pool = NULL;
780 * ixgbe_fcoe_enable - turn on FCoE offload feature
781 * @netdev: the corresponding netdev
783 * Turns on FCoE offload feature in 82599.
785 * Returns : 0 indicates success or -EINVAL on failure
787 int ixgbe_fcoe_enable(struct net_device *netdev)
789 struct ixgbe_adapter *adapter = netdev_priv(netdev);
790 struct ixgbe_fcoe *fcoe = &adapter->fcoe;
792 atomic_inc(&fcoe->refcnt);
794 if (!(adapter->flags & IXGBE_FLAG_FCOE_CAPABLE))
797 if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED)
800 e_info(drv, "Enabling FCoE offload features.\n");
802 if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
803 e_warn(probe, "Enabling FCoE on PF will disable legacy VFs\n");
805 if (netif_running(netdev))
806 netdev->netdev_ops->ndo_stop(netdev);
808 /* Allocate per CPU memory to track DDP pools */
809 ixgbe_fcoe_ddp_enable(adapter);
811 /* enable FCoE and notify stack */
812 adapter->flags |= IXGBE_FLAG_FCOE_ENABLED;
813 netdev->features |= NETIF_F_FCOE_MTU;
814 netdev_features_change(netdev);
816 /* release existing queues and reallocate them */
817 ixgbe_clear_interrupt_scheme(adapter);
818 ixgbe_init_interrupt_scheme(adapter);
820 if (netif_running(netdev))
821 netdev->netdev_ops->ndo_open(netdev);
827 * ixgbe_fcoe_disable - turn off FCoE offload feature
828 * @netdev: the corresponding netdev
830 * Turns off FCoE offload feature in 82599.
832 * Returns : 0 indicates success or -EINVAL on failure
834 int ixgbe_fcoe_disable(struct net_device *netdev)
836 struct ixgbe_adapter *adapter = netdev_priv(netdev);
838 if (!atomic_dec_and_test(&adapter->fcoe.refcnt))
841 if (!(adapter->flags & IXGBE_FLAG_FCOE_ENABLED))
844 e_info(drv, "Disabling FCoE offload features.\n");
845 if (netif_running(netdev))
846 netdev->netdev_ops->ndo_stop(netdev);
848 /* Free per CPU memory to track DDP pools */
849 ixgbe_fcoe_ddp_disable(adapter);
851 /* disable FCoE and notify stack */
852 adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;
853 netdev->features &= ~NETIF_F_FCOE_MTU;
855 netdev_features_change(netdev);
857 /* release existing queues and reallocate them */
858 ixgbe_clear_interrupt_scheme(adapter);
859 ixgbe_init_interrupt_scheme(adapter);
861 if (netif_running(netdev))
862 netdev->netdev_ops->ndo_open(netdev);
868 * ixgbe_fcoe_get_wwn - get world wide name for the node or the port
869 * @netdev : ixgbe adapter
870 * @wwn : the world wide name
871 * @type: the type of world wide name
873 * Returns the node or port world wide name if both the prefix and the san
874 * mac address are valid, then the wwn is formed based on the NAA-2 for
875 * IEEE Extended name identifier (ref. to T10 FC-LS Spec., Sec. 15.3).
877 * Returns : 0 on success
879 int ixgbe_fcoe_get_wwn(struct net_device *netdev, u64 *wwn, int type)
883 struct ixgbe_adapter *adapter = netdev_priv(netdev);
884 struct ixgbe_mac_info *mac = &adapter->hw.mac;
887 case NETDEV_FCOE_WWNN:
888 prefix = mac->wwnn_prefix;
890 case NETDEV_FCOE_WWPN:
891 prefix = mac->wwpn_prefix;
897 if ((prefix != 0xffff) &&
898 is_valid_ether_addr(mac->san_addr)) {
899 *wwn = ((u64) prefix << 48) |
900 ((u64) mac->san_addr[0] << 40) |
901 ((u64) mac->san_addr[1] << 32) |
902 ((u64) mac->san_addr[2] << 24) |
903 ((u64) mac->san_addr[3] << 16) |
904 ((u64) mac->san_addr[4] << 8) |
905 ((u64) mac->san_addr[5]);
912 * ixgbe_fcoe_get_hbainfo - get FCoE HBA information
913 * @netdev : ixgbe adapter
914 * @info : HBA information
916 * Returns ixgbe HBA information
918 * Returns : 0 on success
920 int ixgbe_fcoe_get_hbainfo(struct net_device *netdev,
921 struct netdev_fcoe_hbainfo *info)
923 struct ixgbe_adapter *adapter = netdev_priv(netdev);
924 struct ixgbe_hw *hw = &adapter->hw;
931 /* Don't return information on unsupported devices */
932 if (hw->mac.type != ixgbe_mac_82599EB &&
933 hw->mac.type != ixgbe_mac_X540)
937 snprintf(info->manufacturer, sizeof(info->manufacturer),
938 "Intel Corporation");
942 /* Get the PCI-e Device Serial Number Capability */
943 pos = pci_find_ext_capability(adapter->pdev, PCI_EXT_CAP_ID_DSN);
946 for (i = 0; i < 8; i++)
947 pci_read_config_byte(adapter->pdev, pos + i, &buf[i]);
949 snprintf(info->serial_number, sizeof(info->serial_number),
950 "%02X%02X%02X%02X%02X%02X%02X%02X",
951 buf[7], buf[6], buf[5], buf[4],
952 buf[3], buf[2], buf[1], buf[0]);
954 snprintf(info->serial_number, sizeof(info->serial_number),
957 /* Hardware Version */
958 snprintf(info->hardware_version,
959 sizeof(info->hardware_version),
960 "Rev %d", hw->revision_id);
961 /* Driver Name/Version */
962 snprintf(info->driver_version,
963 sizeof(info->driver_version),
966 ixgbe_driver_version);
967 /* Firmware Version */
968 snprintf(info->firmware_version,
969 sizeof(info->firmware_version),
971 (adapter->eeprom_verh << 16) |
972 adapter->eeprom_verl);
975 if (hw->mac.type == ixgbe_mac_82599EB) {
976 snprintf(info->model,
980 snprintf(info->model,
985 /* Model Description */
986 snprintf(info->model_description,
987 sizeof(info->model_description),
989 ixgbe_default_device_descr);
995 * ixgbe_fcoe_get_tc - get the current TC that fcoe is mapped to
996 * @adapter - pointer to the device adapter structure
998 * Return : TC that FCoE is mapped to
1000 u8 ixgbe_fcoe_get_tc(struct ixgbe_adapter *adapter)
1002 #ifdef CONFIG_IXGBE_DCB
1003 return netdev_get_prio_tc_map(adapter->netdev, adapter->fcoe.up);