aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/igbvf
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/intel/igbvf')
-rw-r--r--drivers/net/ethernet/intel/igbvf/defines.h1
-rw-r--r--drivers/net/ethernet/intel/igbvf/igbvf.h2
-rw-r--r--drivers/net/ethernet/intel/igbvf/netdev.c41
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"
51char igbvf_driver_name[] = "igbvf"; 51char igbvf_driver_name[] = "igbvf";
52const char igbvf_driver_version[] = DRV_VERSION; 52const char igbvf_driver_version[] = DRV_VERSION;
53static const char igbvf_driver_string[] = 53static 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
118static inline void igbvf_rx_checksum_adv(struct igbvf_adapter *adapter, 125static 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 **/
1081static int __devinit igbvf_alloc_queues(struct igbvf_adapter *adapter) 1101static 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 **/
1533static int __devinit igbvf_sw_init(struct igbvf_adapter *adapter) 1553static 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 **/
2601static int __devinit igbvf_probe(struct pci_dev *pdev, 2621static 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 **/
2797static void __devexit igbvf_remove(struct pci_dev *pdev) 2820static 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,