@@ -2482,12 +2482,74 @@ static void ixgbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
2482
2482
hw -> mac .ops .set_vfta (& adapter -> hw , vid , pool_ndx , false);
2483
2483
}
2484
2484
2485
+ /**
2486
+ * ixgbe_vlan_filter_disable - helper to disable hw vlan filtering
2487
+ * @adapter: driver data
2488
+ */
2489
+ static void ixgbe_vlan_filter_disable (struct ixgbe_adapter * adapter )
2490
+ {
2491
+ struct ixgbe_hw * hw = & adapter -> hw ;
2492
+ u32 vlnctrl = IXGBE_READ_REG (hw , IXGBE_VLNCTRL );
2493
+ int i , j ;
2494
+
2495
+ switch (hw -> mac .type ) {
2496
+ case ixgbe_mac_82598EB :
2497
+ vlnctrl &= ~(IXGBE_VLNCTRL_VME | IXGBE_VLNCTRL_VFE );
2498
+ vlnctrl &= ~IXGBE_VLNCTRL_CFIEN ;
2499
+ IXGBE_WRITE_REG (hw , IXGBE_VLNCTRL , vlnctrl );
2500
+ break ;
2501
+ case ixgbe_mac_82599EB :
2502
+ vlnctrl &= ~IXGBE_VLNCTRL_VFE ;
2503
+ vlnctrl &= ~IXGBE_VLNCTRL_CFIEN ;
2504
+ IXGBE_WRITE_REG (hw , IXGBE_VLNCTRL , vlnctrl );
2505
+ for (i = 0 ; i < adapter -> num_rx_queues ; i ++ ) {
2506
+ j = adapter -> rx_ring [i ]-> reg_idx ;
2507
+ vlnctrl = IXGBE_READ_REG (hw , IXGBE_RXDCTL (j ));
2508
+ vlnctrl &= ~IXGBE_RXDCTL_VME ;
2509
+ IXGBE_WRITE_REG (hw , IXGBE_RXDCTL (j ), vlnctrl );
2510
+ }
2511
+ break ;
2512
+ default :
2513
+ break ;
2514
+ }
2515
+ }
2516
+
2517
+ /**
2518
+ * ixgbe_vlan_filter_enable - helper to enable hw vlan filtering
2519
+ * @adapter: driver data
2520
+ */
2521
+ static void ixgbe_vlan_filter_enable (struct ixgbe_adapter * adapter )
2522
+ {
2523
+ struct ixgbe_hw * hw = & adapter -> hw ;
2524
+ u32 vlnctrl = IXGBE_READ_REG (hw , IXGBE_VLNCTRL );
2525
+ int i , j ;
2526
+
2527
+ switch (hw -> mac .type ) {
2528
+ case ixgbe_mac_82598EB :
2529
+ vlnctrl |= IXGBE_VLNCTRL_VME | IXGBE_VLNCTRL_VFE ;
2530
+ vlnctrl &= ~IXGBE_VLNCTRL_CFIEN ;
2531
+ IXGBE_WRITE_REG (hw , IXGBE_VLNCTRL , vlnctrl );
2532
+ break ;
2533
+ case ixgbe_mac_82599EB :
2534
+ vlnctrl |= IXGBE_VLNCTRL_VFE ;
2535
+ vlnctrl &= ~IXGBE_VLNCTRL_CFIEN ;
2536
+ IXGBE_WRITE_REG (hw , IXGBE_VLNCTRL , vlnctrl );
2537
+ for (i = 0 ; i < adapter -> num_rx_queues ; i ++ ) {
2538
+ j = adapter -> rx_ring [i ]-> reg_idx ;
2539
+ vlnctrl = IXGBE_READ_REG (hw , IXGBE_RXDCTL (j ));
2540
+ vlnctrl |= IXGBE_RXDCTL_VME ;
2541
+ IXGBE_WRITE_REG (hw , IXGBE_RXDCTL (j ), vlnctrl );
2542
+ }
2543
+ break ;
2544
+ default :
2545
+ break ;
2546
+ }
2547
+ }
2548
+
2485
2549
static void ixgbe_vlan_rx_register (struct net_device * netdev ,
2486
2550
struct vlan_group * grp )
2487
2551
{
2488
2552
struct ixgbe_adapter * adapter = netdev_priv (netdev );
2489
- u32 ctrl ;
2490
- int i , j ;
2491
2553
2492
2554
if (!test_bit (__IXGBE_DOWN , & adapter -> state ))
2493
2555
ixgbe_irq_disable (adapter );
@@ -2498,25 +2560,7 @@ static void ixgbe_vlan_rx_register(struct net_device *netdev,
2498
2560
* still receive traffic from a DCB-enabled host even if we're
2499
2561
* not in DCB mode.
2500
2562
*/
2501
- ctrl = IXGBE_READ_REG (& adapter -> hw , IXGBE_VLNCTRL );
2502
-
2503
- /* Disable CFI check */
2504
- ctrl &= ~IXGBE_VLNCTRL_CFIEN ;
2505
-
2506
- /* enable VLAN tag stripping */
2507
- if (adapter -> hw .mac .type == ixgbe_mac_82598EB ) {
2508
- ctrl |= IXGBE_VLNCTRL_VME ;
2509
- } else if (adapter -> hw .mac .type == ixgbe_mac_82599EB ) {
2510
- for (i = 0 ; i < adapter -> num_rx_queues ; i ++ ) {
2511
- u32 ctrl ;
2512
- j = adapter -> rx_ring [i ]-> reg_idx ;
2513
- ctrl = IXGBE_READ_REG (& adapter -> hw , IXGBE_RXDCTL (j ));
2514
- ctrl |= IXGBE_RXDCTL_VME ;
2515
- IXGBE_WRITE_REG (& adapter -> hw , IXGBE_RXDCTL (j ), ctrl );
2516
- }
2517
- }
2518
-
2519
- IXGBE_WRITE_REG (& adapter -> hw , IXGBE_VLNCTRL , ctrl );
2563
+ ixgbe_vlan_filter_enable (adapter );
2520
2564
2521
2565
ixgbe_vlan_rx_add_vid (netdev , 0 );
2522
2566
@@ -2551,30 +2595,29 @@ void ixgbe_set_rx_mode(struct net_device *netdev)
2551
2595
{
2552
2596
struct ixgbe_adapter * adapter = netdev_priv (netdev );
2553
2597
struct ixgbe_hw * hw = & adapter -> hw ;
2554
- u32 fctrl , vlnctrl ;
2598
+ u32 fctrl ;
2555
2599
2556
2600
/* Check for Promiscuous and All Multicast modes */
2557
2601
2558
2602
fctrl = IXGBE_READ_REG (hw , IXGBE_FCTRL );
2559
- vlnctrl = IXGBE_READ_REG (hw , IXGBE_VLNCTRL );
2560
2603
2561
2604
if (netdev -> flags & IFF_PROMISC ) {
2562
2605
hw -> addr_ctrl .user_set_promisc = 1 ;
2563
2606
fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE );
2564
- vlnctrl &= ~IXGBE_VLNCTRL_VFE ;
2607
+ /* don't hardware filter vlans in promisc mode */
2608
+ ixgbe_vlan_filter_disable (adapter );
2565
2609
} else {
2566
2610
if (netdev -> flags & IFF_ALLMULTI ) {
2567
2611
fctrl |= IXGBE_FCTRL_MPE ;
2568
2612
fctrl &= ~IXGBE_FCTRL_UPE ;
2569
2613
} else {
2570
2614
fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE );
2571
2615
}
2572
- vlnctrl |= IXGBE_VLNCTRL_VFE ;
2616
+ ixgbe_vlan_filter_enable ( adapter ) ;
2573
2617
hw -> addr_ctrl .user_set_promisc = 0 ;
2574
2618
}
2575
2619
2576
2620
IXGBE_WRITE_REG (hw , IXGBE_FCTRL , fctrl );
2577
- IXGBE_WRITE_REG (hw , IXGBE_VLNCTRL , vlnctrl );
2578
2621
2579
2622
/* reprogram secondary unicast list */
2580
2623
hw -> mac .ops .update_uc_addr_list (hw , netdev );
@@ -2641,7 +2684,7 @@ static void ixgbe_napi_disable_all(struct ixgbe_adapter *adapter)
2641
2684
static void ixgbe_configure_dcb (struct ixgbe_adapter * adapter )
2642
2685
{
2643
2686
struct ixgbe_hw * hw = & adapter -> hw ;
2644
- u32 txdctl , vlnctrl ;
2687
+ u32 txdctl ;
2645
2688
int i , j ;
2646
2689
2647
2690
ixgbe_dcb_check_config (& adapter -> dcb_cfg );
@@ -2659,22 +2702,8 @@ static void ixgbe_configure_dcb(struct ixgbe_adapter *adapter)
2659
2702
IXGBE_WRITE_REG (hw , IXGBE_TXDCTL (j ), txdctl );
2660
2703
}
2661
2704
/* Enable VLAN tag insert/strip */
2662
- vlnctrl = IXGBE_READ_REG (hw , IXGBE_VLNCTRL );
2663
- if (hw -> mac .type == ixgbe_mac_82598EB ) {
2664
- vlnctrl |= IXGBE_VLNCTRL_VME | IXGBE_VLNCTRL_VFE ;
2665
- vlnctrl &= ~IXGBE_VLNCTRL_CFIEN ;
2666
- IXGBE_WRITE_REG (hw , IXGBE_VLNCTRL , vlnctrl );
2667
- } else if (hw -> mac .type == ixgbe_mac_82599EB ) {
2668
- vlnctrl |= IXGBE_VLNCTRL_VFE ;
2669
- vlnctrl &= ~IXGBE_VLNCTRL_CFIEN ;
2670
- IXGBE_WRITE_REG (hw , IXGBE_VLNCTRL , vlnctrl );
2671
- for (i = 0 ; i < adapter -> num_rx_queues ; i ++ ) {
2672
- j = adapter -> rx_ring [i ]-> reg_idx ;
2673
- vlnctrl = IXGBE_READ_REG (hw , IXGBE_RXDCTL (j ));
2674
- vlnctrl |= IXGBE_RXDCTL_VME ;
2675
- IXGBE_WRITE_REG (hw , IXGBE_RXDCTL (j ), vlnctrl );
2676
- }
2677
- }
2705
+ ixgbe_vlan_filter_enable (adapter );
2706
+
2678
2707
hw -> mac .ops .set_vfta (& adapter -> hw , 0 , 0 , true);
2679
2708
}
2680
2709
0 commit comments