diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igbvf')
| -rw-r--r-- | drivers/net/ethernet/intel/igbvf/defines.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igbvf/igbvf.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igbvf/netdev.c | 41 |
3 files changed, 34 insertions, 10 deletions
diff --git a/drivers/net/ethernet/intel/igbvf/defines.h b/drivers/net/ethernet/intel/igbvf/defines.h index 3e18045d8f89..d9fa999b1685 100644 --- a/drivers/net/ethernet/intel/igbvf/defines.h +++ b/drivers/net/ethernet/intel/igbvf/defines.h | |||
| @@ -46,6 +46,7 @@ | |||
| 46 | #define E1000_RXD_ERR_SE 0x02 /* Symbol Error */ | 46 | #define E1000_RXD_ERR_SE 0x02 /* Symbol Error */ |
| 47 | #define E1000_RXD_SPC_VLAN_MASK 0x0FFF /* VLAN ID is in lower 12 bits */ | 47 | #define E1000_RXD_SPC_VLAN_MASK 0x0FFF /* VLAN ID is in lower 12 bits */ |
| 48 | 48 | ||
| 49 | #define E1000_RXDEXT_STATERR_LB 0x00040000 | ||
| 49 | #define E1000_RXDEXT_STATERR_CE 0x01000000 | 50 | #define E1000_RXDEXT_STATERR_CE 0x01000000 |
| 50 | #define E1000_RXDEXT_STATERR_SE 0x02000000 | 51 | #define E1000_RXDEXT_STATERR_SE 0x02000000 |
| 51 | #define E1000_RXDEXT_STATERR_SEQ 0x04000000 | 52 | #define E1000_RXDEXT_STATERR_SEQ 0x04000000 |
diff --git a/drivers/net/ethernet/intel/igbvf/igbvf.h b/drivers/net/ethernet/intel/igbvf/igbvf.h index a895e2f7b34d..fdca7b672776 100644 --- a/drivers/net/ethernet/intel/igbvf/igbvf.h +++ b/drivers/net/ethernet/intel/igbvf/igbvf.h | |||
| @@ -295,7 +295,7 @@ struct igbvf_info { | |||
| 295 | 295 | ||
| 296 | /* hardware capability, feature, and workaround flags */ | 296 | /* hardware capability, feature, and workaround flags */ |
| 297 | #define IGBVF_FLAG_RX_CSUM_DISABLED (1 << 0) | 297 | #define IGBVF_FLAG_RX_CSUM_DISABLED (1 << 0) |
| 298 | 298 | #define IGBVF_FLAG_RX_LB_VLAN_BSWAP (1 << 1) | |
| 299 | #define IGBVF_RX_DESC_ADV(R, i) \ | 299 | #define IGBVF_RX_DESC_ADV(R, i) \ |
| 300 | (&((((R).desc))[i].rx_desc)) | 300 | (&((((R).desc))[i].rx_desc)) |
| 301 | #define IGBVF_TX_DESC_ADV(R, i) \ | 301 | #define IGBVF_TX_DESC_ADV(R, i) \ |
diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c index 0ac11f527a84..277f5dfe3d90 100644 --- a/drivers/net/ethernet/intel/igbvf/netdev.c +++ b/drivers/net/ethernet/intel/igbvf/netdev.c | |||
| @@ -47,7 +47,7 @@ | |||
| 47 | 47 | ||
| 48 | #include "igbvf.h" | 48 | #include "igbvf.h" |
| 49 | 49 | ||
| 50 | #define DRV_VERSION "2.0.1-k" | 50 | #define DRV_VERSION "2.0.2-k" |
| 51 | char igbvf_driver_name[] = "igbvf"; | 51 | char igbvf_driver_name[] = "igbvf"; |
| 52 | const char igbvf_driver_version[] = DRV_VERSION; | 52 | const char igbvf_driver_version[] = DRV_VERSION; |
| 53 | static const char igbvf_driver_string[] = | 53 | static const char igbvf_driver_string[] = |
| @@ -107,12 +107,19 @@ static void igbvf_receive_skb(struct igbvf_adapter *adapter, | |||
| 107 | struct sk_buff *skb, | 107 | struct sk_buff *skb, |
| 108 | u32 status, u16 vlan) | 108 | u32 status, u16 vlan) |
| 109 | { | 109 | { |
| 110 | u16 vid; | ||
| 111 | |||
| 110 | if (status & E1000_RXD_STAT_VP) { | 112 | if (status & E1000_RXD_STAT_VP) { |
| 111 | u16 vid = le16_to_cpu(vlan) & E1000_RXD_SPC_VLAN_MASK; | 113 | if ((adapter->flags & IGBVF_FLAG_RX_LB_VLAN_BSWAP) && |
| 114 | (status & E1000_RXDEXT_STATERR_LB)) | ||
| 115 | vid = be16_to_cpu(vlan) & E1000_RXD_SPC_VLAN_MASK; | ||
| 116 | else | ||
| 117 | vid = le16_to_cpu(vlan) & E1000_RXD_SPC_VLAN_MASK; | ||
| 112 | if (test_bit(vid, adapter->active_vlans)) | 118 | if (test_bit(vid, adapter->active_vlans)) |
| 113 | __vlan_hwaccel_put_tag(skb, vid); | 119 | __vlan_hwaccel_put_tag(skb, vid); |
| 114 | } | 120 | } |
| 115 | netif_receive_skb(skb); | 121 | |
| 122 | napi_gro_receive(&adapter->rx_ring->napi, skb); | ||
| 116 | } | 123 | } |
| 117 | 124 | ||
| 118 | static inline void igbvf_rx_checksum_adv(struct igbvf_adapter *adapter, | 125 | static inline void igbvf_rx_checksum_adv(struct igbvf_adapter *adapter, |
| @@ -184,6 +191,13 @@ static void igbvf_alloc_rx_buffers(struct igbvf_ring *rx_ring, | |||
| 184 | buffer_info->page_offset, | 191 | buffer_info->page_offset, |
| 185 | PAGE_SIZE / 2, | 192 | PAGE_SIZE / 2, |
| 186 | DMA_FROM_DEVICE); | 193 | DMA_FROM_DEVICE); |
| 194 | if (dma_mapping_error(&pdev->dev, | ||
| 195 | buffer_info->page_dma)) { | ||
| 196 | __free_page(buffer_info->page); | ||
| 197 | buffer_info->page = NULL; | ||
| 198 | dev_err(&pdev->dev, "RX DMA map failed\n"); | ||
| 199 | break; | ||
| 200 | } | ||
| 187 | } | 201 | } |
| 188 | 202 | ||
| 189 | if (!buffer_info->skb) { | 203 | if (!buffer_info->skb) { |
| @@ -197,6 +211,12 @@ static void igbvf_alloc_rx_buffers(struct igbvf_ring *rx_ring, | |||
| 197 | buffer_info->dma = dma_map_single(&pdev->dev, skb->data, | 211 | buffer_info->dma = dma_map_single(&pdev->dev, skb->data, |
| 198 | bufsz, | 212 | bufsz, |
| 199 | DMA_FROM_DEVICE); | 213 | DMA_FROM_DEVICE); |
| 214 | if (dma_mapping_error(&pdev->dev, buffer_info->dma)) { | ||
| 215 | dev_kfree_skb(buffer_info->skb); | ||
| 216 | buffer_info->skb = NULL; | ||
| 217 | dev_err(&pdev->dev, "RX DMA map failed\n"); | ||
| 218 | goto no_buffers; | ||
| 219 | } | ||
| 200 | } | 220 | } |
| 201 | /* Refresh the desc even if buffer_addrs didn't change because | 221 | /* Refresh the desc even if buffer_addrs didn't change because |
| 202 | * each write-back erases this info. */ | 222 | * each write-back erases this info. */ |
| @@ -1078,7 +1098,7 @@ out: | |||
| 1078 | * igbvf_alloc_queues - Allocate memory for all rings | 1098 | * igbvf_alloc_queues - Allocate memory for all rings |
| 1079 | * @adapter: board private structure to initialize | 1099 | * @adapter: board private structure to initialize |
| 1080 | **/ | 1100 | **/ |
| 1081 | static int __devinit igbvf_alloc_queues(struct igbvf_adapter *adapter) | 1101 | static int igbvf_alloc_queues(struct igbvf_adapter *adapter) |
| 1082 | { | 1102 | { |
| 1083 | struct net_device *netdev = adapter->netdev; | 1103 | struct net_device *netdev = adapter->netdev; |
| 1084 | 1104 | ||
| @@ -1530,7 +1550,7 @@ void igbvf_reinit_locked(struct igbvf_adapter *adapter) | |||
| 1530 | * Fields are initialized based on PCI device information and | 1550 | * Fields are initialized based on PCI device information and |
| 1531 | * OS network device settings (MTU size). | 1551 | * OS network device settings (MTU size). |
| 1532 | **/ | 1552 | **/ |
| 1533 | static int __devinit igbvf_sw_init(struct igbvf_adapter *adapter) | 1553 | static int igbvf_sw_init(struct igbvf_adapter *adapter) |
| 1534 | { | 1554 | { |
| 1535 | struct net_device *netdev = adapter->netdev; | 1555 | struct net_device *netdev = adapter->netdev; |
| 1536 | s32 rc; | 1556 | s32 rc; |
| @@ -2598,8 +2618,7 @@ static const struct net_device_ops igbvf_netdev_ops = { | |||
| 2598 | * The OS initialization, configuring of the adapter private structure, | 2618 | * The OS initialization, configuring of the adapter private structure, |
| 2599 | * and a hardware reset occur. | 2619 | * and a hardware reset occur. |
| 2600 | **/ | 2620 | **/ |
| 2601 | static int __devinit igbvf_probe(struct pci_dev *pdev, | 2621 | static int igbvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
| 2602 | const struct pci_device_id *ent) | ||
| 2603 | { | 2622 | { |
| 2604 | struct net_device *netdev; | 2623 | struct net_device *netdev; |
| 2605 | struct igbvf_adapter *adapter; | 2624 | struct igbvf_adapter *adapter; |
| @@ -2754,6 +2773,10 @@ static int __devinit igbvf_probe(struct pci_dev *pdev, | |||
| 2754 | /* reset the hardware with the new settings */ | 2773 | /* reset the hardware with the new settings */ |
| 2755 | igbvf_reset(adapter); | 2774 | igbvf_reset(adapter); |
| 2756 | 2775 | ||
| 2776 | /* set hardware-specific flags */ | ||
| 2777 | if (adapter->hw.mac.type == e1000_vfadapt_i350) | ||
| 2778 | adapter->flags |= IGBVF_FLAG_RX_LB_VLAN_BSWAP; | ||
| 2779 | |||
| 2757 | strcpy(netdev->name, "eth%d"); | 2780 | strcpy(netdev->name, "eth%d"); |
| 2758 | err = register_netdev(netdev); | 2781 | err = register_netdev(netdev); |
| 2759 | if (err) | 2782 | if (err) |
| @@ -2794,7 +2817,7 @@ err_dma: | |||
| 2794 | * Hot-Plug event, or because the driver is going to be removed from | 2817 | * Hot-Plug event, or because the driver is going to be removed from |
| 2795 | * memory. | 2818 | * memory. |
| 2796 | **/ | 2819 | **/ |
| 2797 | static void __devexit igbvf_remove(struct pci_dev *pdev) | 2820 | static void igbvf_remove(struct pci_dev *pdev) |
| 2798 | { | 2821 | { |
| 2799 | struct net_device *netdev = pci_get_drvdata(pdev); | 2822 | struct net_device *netdev = pci_get_drvdata(pdev); |
| 2800 | struct igbvf_adapter *adapter = netdev_priv(netdev); | 2823 | struct igbvf_adapter *adapter = netdev_priv(netdev); |
| @@ -2851,7 +2874,7 @@ static struct pci_driver igbvf_driver = { | |||
| 2851 | .name = igbvf_driver_name, | 2874 | .name = igbvf_driver_name, |
| 2852 | .id_table = igbvf_pci_tbl, | 2875 | .id_table = igbvf_pci_tbl, |
| 2853 | .probe = igbvf_probe, | 2876 | .probe = igbvf_probe, |
| 2854 | .remove = __devexit_p(igbvf_remove), | 2877 | .remove = igbvf_remove, |
| 2855 | #ifdef CONFIG_PM | 2878 | #ifdef CONFIG_PM |
| 2856 | /* Power Management Hooks */ | 2879 | /* Power Management Hooks */ |
| 2857 | .suspend = igbvf_suspend, | 2880 | .suspend = igbvf_suspend, |
