29 #include <linux/if_ether.h>
31 #include <linux/if_vlan.h>
46 static inline void ixgbe_fcoe_clear_ddp(
struct ixgbe_fcoe_ddp *ddp)
81 adapter = netdev_priv(netdev);
82 fcoe = &adapter->fcoe;
90 spin_lock_bh(&fcoe->
lock);
102 spin_unlock_bh(&fcoe->
lock);
114 ixgbe_fcoe_clear_ddp(ddp);
142 unsigned int firstoff = 0;
143 unsigned int lastsize;
144 unsigned int thisoff = 0;
145 unsigned int thislen = 0;
146 u32 fcbuff, fcdmarw, fcfltrw, fcrxctl;
152 adapter = netdev_priv(netdev);
154 e_warn(drv,
"xid=0x%x out-of-range\n", xid);
163 fcoe = &adapter->fcoe;
166 e_err(drv,
"xid 0x%x w/ non-null sgl=%p nents=%d\n",
170 ixgbe_fcoe_clear_ddp(ddp);
174 e_warn(drv,
"No ddp_pool resources allocated\n");
179 if (!ddp_pool->
pool) {
180 e_warn(drv,
"xid=0x%x no ddp pool for fcoe\n", xid);
187 e_err(drv,
"xid 0x%x DMA map error\n", xid);
194 e_err(drv,
"failed allocated ddp context\n");
195 goto out_noddp_unmap;
214 thislen =
min((bufflen - thisoff), len);
219 if ((j != 0) && (thisoff))
226 if (((i != (dmacount - 1)) || (thislen != len))
227 && ((thislen + thisoff) != bufflen))
230 ddp->
udl[
j] = (
u64)(addr - thisoff);
240 lastsize = thisoff + thislen;
246 if (lastsize == bufflen) {
275 spin_lock_bh(&fcoe->
lock);
295 spin_unlock_bh(&fcoe->
lock);
301 ixgbe_fcoe_clear_ddp(ddp);
327 return ixgbe_fcoe_ddp_setup(netdev, xid, sgl, sgc, 0);
348 return ixgbe_fcoe_ddp_setup(netdev, xid, sgl, sgc, 1);
398 fcoe = &adapter->fcoe;
470 u32 fcoe_sof_eof = 0;
474 if (skb_is_gso(skb) && (skb_shinfo(skb)->gso_type !=
SKB_GSO_FCOE)) {
475 dev_err(tx_ring->
dev,
"Wrong gso type %d:expecting SKB_GSO_FCOE\n",
476 skb_shinfo(skb)->gso_type);
481 skb_set_network_header(skb, skb->
mac_len);
482 skb_set_transport_header(skb, skb->
mac_len +
501 dev_warn(tx_ring->
dev,
"unknown sof = 0x%x\n", sof);
527 dev_warn(tx_ring->
dev,
"unknown eof = 0x%x\n", eof);
540 if (skb_is_gso(skb)) {
541 *hdr_len += skb_transport_offset(skb) +
545 skb_shinfo(skb)->gso_size);
558 vlan_macip_lens = skb_transport_offset(skb) +
560 vlan_macip_lens |= (skb_transport_offset(skb) - 4)
571 static void ixgbe_fcoe_dma_pool_free(
struct ixgbe_fcoe *fcoe,
unsigned int cpu)
581 static int ixgbe_fcoe_dma_pool_alloc(
struct ixgbe_fcoe *fcoe,
589 snprintf(pool_name, 32,
"ixgbe_fcoe_ddp_%d", cpu);
597 ddp_pool->
pool = pool;
616 int i, fcoe_q, fcoe_i;
640 fcoe_q = adapter->
rx_ring[fcoe_i]->reg_idx;
686 ixgbe_fcoe_dma_pool_free(fcoe, cpu);
721 e_err(drv,
"failed to allocate extra DDP buffer\n");
727 e_err(drv,
"failed to map extra DDP buffer\n");
737 int err = ixgbe_fcoe_dma_pool_alloc(fcoe, dev, cpu);
741 e_err(drv,
"failed to alloc DDP pool on cpu:%d\n", cpu);
749 static int ixgbe_fcoe_ddp_enable(
struct ixgbe_adapter *adapter)
759 e_err(drv,
"failed to allocate percpu DDP resources\n");
768 static void ixgbe_fcoe_ddp_disable(
struct ixgbe_adapter *adapter)
772 adapter->
netdev->fcoe_ddp_xid = 0;
802 e_info(drv,
"Enabling FCoE offload features.\n");
803 if (netif_running(netdev))
807 ixgbe_fcoe_ddp_enable(adapter);
818 if (netif_running(netdev))
842 e_info(drv,
"Disabling FCoE offload features.\n");
843 if (netif_running(netdev))
847 ixgbe_fcoe_ddp_disable(adapter);
859 if (netif_running(netdev))
885 case NETDEV_FCOE_WWNN:
888 case NETDEV_FCOE_WWPN:
895 if ((prefix != 0xffff) &&
896 is_valid_ether_addr(mac->
san_addr)) {
897 *wwn = ((
u64) prefix << 48) |
919 struct netdev_fcoe_hbainfo *
info)
935 snprintf(info->manufacturer,
sizeof(info->manufacturer),
936 "Intel Corporation");
944 for (i = 0; i < 8; i++)
945 pci_read_config_byte(adapter->
pdev, pos + i, &buf[i]);
947 snprintf(info->serial_number,
sizeof(info->serial_number),
948 "%02X%02X%02X%02X%02X%02X%02X%02X",
949 buf[7], buf[6], buf[5], buf[4],
950 buf[3], buf[2], buf[1], buf[0]);
952 snprintf(info->serial_number,
sizeof(info->serial_number),
957 sizeof(info->hardware_version),
961 sizeof(info->driver_version),
967 sizeof(info->firmware_version),
985 sizeof(info->model_description),
987 ixgbe_default_device_descr);
1000 #ifdef CONFIG_IXGBE_DCB
1001 return netdev_get_prio_tc_map(adapter->
netdev, adapter->fcoe.up);