mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 21:44:27 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			393 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			393 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/Embedded/src/GbE/kcompat.h
 | |
| +++ b/Embedded/src/GbE/kcompat.h
 | |
| @@ -590,6 +590,10 @@ static inline void _kc_synchronize_irq()
 | |
|  #define ETHTOOL_OPS_COMPAT
 | |
|  #endif
 | |
|  
 | |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))
 | |
| +#define HAVE_NETIF_MSG 1
 | |
| +#endif
 | |
| +
 | |
|  #ifndef HAVE_NETIF_MSG
 | |
|  #define HAVE_NETIF_MSG 1
 | |
|  enum {
 | |
| --- a/Embedded/src/GbE/iegbe_main.c
 | |
| +++ b/Embedded/src/GbE/iegbe_main.c
 | |
| @@ -159,9 +159,9 @@ static void iegbe_smartspeed(struct iegb
 | |
|  static inline int iegbe_82547_fifo_workaround(struct iegbe_adapter *adapter,
 | |
|                            struct sk_buff *skb);
 | |
|  
 | |
| -static void iegbe_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp);
 | |
| -static void iegbe_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid);
 | |
| -static void iegbe_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
 | |
| +static bool iegbe_vlan_used(struct iegbe_adapter *adapter);
 | |
| +static int iegbe_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid);
 | |
| +static int iegbe_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
 | |
|  static void iegbe_restore_vlan(struct iegbe_adapter *adapter);
 | |
|  
 | |
|  static int iegbe_notify_reboot(struct notifier_block *,
 | |
| @@ -324,8 +324,8 @@ static void iegbe_update_mng_vlan(struct
 | |
|          struct net_device *netdev = adapter->netdev;
 | |
|  	u16 vid = hw->mng_cookie.vlan_id;
 | |
|          u16 old_vid = adapter->mng_vlan_id;
 | |
| -        if (adapter->vlgrp) {
 | |
| -                if (!vlan_group_get_device(adapter->vlgrp, vid)) {
 | |
| +        if (iegbe_vlan_used(adapter)) {
 | |
| +                if (!test_bit(old_vid, adapter->active_vlans)) {
 | |
|  			if (hw->mng_cookie.status &
 | |
|                                  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) {
 | |
|                                  iegbe_vlan_rx_add_vid(netdev, vid);
 | |
| @@ -335,7 +335,7 @@ static void iegbe_update_mng_vlan(struct
 | |
|  
 | |
|                          if ((old_vid != (u16)E1000_MNG_VLAN_NONE) &&
 | |
|                                          (vid != old_vid) &&
 | |
| -                            !vlan_group_get_device(adapter->vlgrp, old_vid))
 | |
| +                            !test_bit(old_vid, adapter->active_vlans))
 | |
|                                  iegbe_vlan_rx_kill_vid(netdev, old_vid);
 | |
|                  } else
 | |
|                          adapter->mng_vlan_id = vid;
 | |
| @@ -736,7 +736,6 @@ static const struct net_device_ops iegbe
 | |
|  	.ndo_do_ioctl		= iegbe_ioctl,
 | |
|  	.ndo_validate_addr	= eth_validate_addr,
 | |
|  
 | |
| -	.ndo_vlan_rx_register	= iegbe_vlan_rx_register,
 | |
|  	.ndo_vlan_rx_add_vid	= iegbe_vlan_rx_add_vid,
 | |
|  	.ndo_vlan_rx_kill_vid	= iegbe_vlan_rx_kill_vid,
 | |
|  #ifdef CONFIG_NET_POLL_CONTROLLER
 | |
| @@ -767,7 +766,6 @@ static int __devinit iegbe_probe(struct
 | |
|  	u16 eeprom_data = 0;
 | |
|  	u16 eeprom_apme_mask = E1000_EEPROM_APME;
 | |
|  	int bars; 
 | |
| -	DECLARE_MAC_BUF(mac);
 | |
|  
 | |
|  	bars = pci_select_bars(pdev, IORESOURCE_MEM);
 | |
|  	err = pci_enable_device(pdev);
 | |
| @@ -1247,8 +1245,7 @@ static int iegbe_close(struct net_device
 | |
|  
 | |
|  	if ((hw->mng_cookie.status &
 | |
|  			  E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
 | |
| -	     !(adapter->vlgrp &&
 | |
| -	       vlan_group_get_device(adapter->vlgrp, adapter->mng_vlan_id))) {
 | |
| +	     !test_bit(adapter->mng_vlan_id, adapter->active_vlans)) {
 | |
|  		iegbe_vlan_rx_kill_vid(netdev, adapter->mng_vlan_id);
 | |
|  	}
 | |
|  	return 0;
 | |
| @@ -2163,11 +2160,13 @@ static void iegbe_set_rx_mode(struct net
 | |
|  	struct iegbe_hw *hw = &adapter->hw;
 | |
|  	struct netdev_hw_addr *ha;
 | |
|  	bool use_uc = false;
 | |
| +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
 | |
|  	struct dev_addr_list *mc_ptr;
 | |
| -	u32 rctl;
 | |
|  	u32 hash_value;
 | |
| -	int i, rar_entries = E1000_RAR_ENTRIES;
 | |
|  int mta_reg_count = E1000_NUM_MTA_REGISTERS;
 | |
| +#endif
 | |
| +	u32 rctl;
 | |
| +	int i, rar_entries = E1000_RAR_ENTRIES;
 | |
|  
 | |
|  	/* reserve RAR[14] for LAA over-write work-around */
 | |
|  	if (hw->mac_type == iegbe_82571)
 | |
| @@ -2220,6 +2219,7 @@ int mta_reg_count = E1000_NUM_MTA_REGIST
 | |
|  
 | |
|  	WARN_ON(i == rar_entries);
 | |
|  
 | |
| +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
 | |
|  	mc_ptr = netdev->mc_list;
 | |
|  
 | |
|  	for (; i < rar_entries; i++) {
 | |
| @@ -2247,6 +2247,7 @@ int mta_reg_count = E1000_NUM_MTA_REGIST
 | |
|  		hash_value = iegbe_hash_mc_addr(hw, mc_ptr->da_addr);
 | |
|  		iegbe_mta_set(hw, hash_value);
 | |
|  	}
 | |
| +#endif
 | |
|  
 | |
|  	if (hw->mac_type == iegbe_82542_rev2_0)
 | |
|  		iegbe_leave_82542_rst(adapter);
 | |
| @@ -2821,14 +2822,14 @@ static int iegbe_tx_map(struct iegbe_ada
 | |
|               * Avoid terminating buffers within evenly-aligned
 | |
|               * dwords. */
 | |
|              if(unlikely(adapter->pcix_82544 &&
 | |
| -			   !((unsigned long)(frag->page+offset+size-1) & 4) &&
 | |
| +			   !((unsigned long)(frag->page.p+offset+size-1) & 4) &&
 | |
|  			   size > 4))
 | |
|  				size -= 4;
 | |
|  
 | |
|              buffer_info->length = size;
 | |
|              buffer_info->dma =
 | |
|                  pci_map_page(adapter->pdev,
 | |
| -                    frag->page,
 | |
| +                    frag->page.p,
 | |
|                      offset,
 | |
|                      size,
 | |
|                      PCI_DMA_TODEVICE);
 | |
| @@ -3131,7 +3132,7 @@ static int iegbe_xmit_frame(struct sk_bu
 | |
|  		}
 | |
|  	}
 | |
|  
 | |
| -	if (unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
 | |
| +	if (unlikely(iegbe_vlan_used(adapter) && vlan_tx_tag_present(skb))) {
 | |
|  		tx_flags |= E1000_TX_FLAGS_VLAN;
 | |
|  		tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
 | |
|  	}
 | |
| @@ -3832,10 +3833,12 @@ static bool iegbe_clean_rx_irq(struct ie
 | |
|  
 | |
|  		skb->protocol = eth_type_trans(skb, netdev);
 | |
|  
 | |
| -		if (unlikely(adapter->vlgrp &&
 | |
| +		if (unlikely(iegbe_vlan_used(adapter) &&
 | |
|  			    (status & E1000_RXD_STAT_VP))) {
 | |
| -			vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
 | |
| -						 le16_to_cpu(rx_desc->special));
 | |
| +			u16 vid;
 | |
| +
 | |
| +			vid = le16_to_cpu(rx_desc->special);
 | |
| +			__vlan_hwaccel_put_tag(skb, vid);
 | |
|  		} else {
 | |
|  			netif_receive_skb(skb);
 | |
|  		}
 | |
| @@ -3986,9 +3989,10 @@ copydone:
 | |
|  			   cpu_to_le16(E1000_RXDPS_HDRSTAT_HDRSP)))
 | |
|              adapter->rx_hdr_split++;
 | |
|  
 | |
| -        if(unlikely(adapter->vlgrp && (staterr & E1000_RXD_STAT_VP))) {
 | |
| -            vlan_hwaccel_receive_skb(skb, adapter->vlgrp,
 | |
| -				le16_to_cpu(rx_desc->wb.middle.vlan));
 | |
| +        if(unlikely(iegbe_vlan_used(adapter) && (staterr & E1000_RXD_STAT_VP))) {
 | |
| +	    u16 vid;
 | |
| +	    vid = le16_to_cpu(rx_desc->wb.middle.vlan);
 | |
| +	    __vlan_hwaccel_put_tag(skb, vid);
 | |
|          } else {
 | |
|              netif_receive_skb(skb);
 | |
|          }
 | |
| @@ -4496,17 +4500,25 @@ iegbe_io_write(struct iegbe_hw *hw, unsi
 | |
|      outl(value, port);
 | |
|  }
 | |
|  
 | |
| -static void iegbe_vlan_rx_register(struct net_device *netdev,
 | |
| -				   struct vlan_group *grp)
 | |
| +static bool iegbe_vlan_used(struct iegbe_adapter *adapter)
 | |
| +{
 | |
| +	u16 vid;
 | |
| +
 | |
| +	for_each_set_bit(vid, adapter->active_vlans, VLAN_N_VID)
 | |
| +		return true;
 | |
| +
 | |
| +	return false;
 | |
| +}
 | |
| +
 | |
| +static void iegbe_vlan_mode(struct net_device *netdev, bool vlan_on)
 | |
|  {
 | |
|      struct iegbe_adapter *adapter = netdev_priv(netdev);
 | |
|      uint32_t ctrl, rctl;
 | |
|  
 | |
|  	if (!test_bit(__E1000_DOWN, &adapter->flags))
 | |
|      iegbe_irq_disable(adapter);
 | |
| -    adapter->vlgrp = grp;
 | |
|  
 | |
| -    if(grp) {
 | |
| +    if(vlan_on) {
 | |
|          /* enable VLAN tag insert/strip */
 | |
|          ctrl = E1000_READ_REG(&adapter->hw, CTRL);
 | |
|          ctrl |= E1000_CTRL_VME;
 | |
| @@ -4538,30 +4550,37 @@ static void iegbe_vlan_rx_register(struc
 | |
|      iegbe_irq_enable(adapter);
 | |
|  }
 | |
|  
 | |
| -static void iegbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
 | |
| +static int iegbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
 | |
|  {
 | |
|      struct iegbe_adapter *adapter = netdev_priv(netdev);
 | |
|      uint32_t vfta, index;
 | |
|      if((adapter->hw.mng_cookie.status &
 | |
|          E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
 | |
|          (vid == adapter->mng_vlan_id)) {
 | |
| -        return;
 | |
| +        return 0;
 | |
|      }
 | |
| +
 | |
| +    if (!iegbe_vlan_used(adapter))
 | |
| +	iegbe_vlan_mode(netdev, true);
 | |
| +
 | |
|      /* add VID to filter table */
 | |
|      index = (vid >> 0x5) & 0x7F;
 | |
|      vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);
 | |
|      vfta |= (0x1 << (vid & 0x1F));
 | |
|      iegbe_write_vfta(&adapter->hw, index, vfta);
 | |
| +
 | |
| +    set_bit(vid, adapter->active_vlans);
 | |
| +
 | |
| +    return 0;
 | |
|  }
 | |
|  
 | |
| -static void iegbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
 | |
| +static int iegbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
 | |
|  {
 | |
|  	struct iegbe_adapter *adapter = netdev_priv(netdev);
 | |
|  	u32 vfta, index;
 | |
|  
 | |
|  	if (!test_bit(__E1000_DOWN, &adapter->flags))
 | |
|  	iegbe_irq_disable(adapter);
 | |
| -	vlan_group_set_device(adapter->vlgrp, vid, NULL);
 | |
|  	if (!test_bit(__E1000_DOWN, &adapter->flags))
 | |
|  	iegbe_irq_enable(adapter);
 | |
|  
 | |
| @@ -4570,21 +4589,26 @@ static void iegbe_vlan_rx_kill_vid(struc
 | |
|  	vfta = E1000_READ_REG_ARRAY(&adapter->hw, VFTA, index);
 | |
|  	vfta &= ~(0x1 << (vid & 0x1F));
 | |
|  	iegbe_write_vfta(&adapter->hw, index, vfta);
 | |
| +
 | |
| +	clear_bit(vid, adapter->active_vlans);
 | |
| +
 | |
| +	if (!iegbe_vlan_used(adapter))
 | |
| +		iegbe_vlan_mode(netdev, false);
 | |
| +
 | |
| +	return 0;
 | |
|  }
 | |
|  
 | |
|  static void iegbe_restore_vlan(struct iegbe_adapter *adapter)
 | |
|  {
 | |
| -	iegbe_vlan_rx_register(adapter->netdev, adapter->vlgrp);
 | |
| -
 | |
| -	if (adapter->vlgrp) {
 | |
|  		u16 vid;
 | |
| -		for (vid = 0x0; vid < VLAN_GROUP_ARRAY_LEN; vid++) {
 | |
| -			if (!vlan_group_get_device(adapter->vlgrp, vid))
 | |
| -				continue;
 | |
| +
 | |
| +	if (!iegbe_vlan_used(adapter))
 | |
| +		return;
 | |
| +
 | |
| +	iegbe_vlan_mode(adapter->netdev, true);
 | |
| +	for_each_set_bit(vid, adapter->active_vlans, VLAN_N_VID)
 | |
|  			iegbe_vlan_rx_add_vid(adapter->netdev, vid);
 | |
|  		}
 | |
| -	}
 | |
| -}
 | |
|  
 | |
|  
 | |
|  int iegbe_set_spd_dplx(struct iegbe_adapter *adapter, u16 spddplx)
 | |
| @@ -4864,10 +4888,11 @@ iegbe_resume(struct pci_dev *pdev)
 | |
|      default:
 | |
|          break;
 | |
|      }
 | |
| -#endif
 | |
|  
 | |
|      return 0x0;
 | |
|  }
 | |
| +#endif
 | |
| +
 | |
|  
 | |
|  #ifdef CONFIG_NET_POLL_CONTROLLER
 | |
|  /*
 | |
| --- a/Embedded/src/GbE/iegbe_ethtool.c
 | |
| +++ b/Embedded/src/GbE/iegbe_ethtool.c
 | |
| @@ -327,6 +327,7 @@ iegbe_set_pauseparam(struct net_device *
 | |
|      return 0;
 | |
|  }
 | |
|  
 | |
| +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
 | |
|  static uint32_t
 | |
|  iegbe_get_rx_csum(struct net_device *netdev)
 | |
|  {
 | |
| @@ -392,6 +393,7 @@ iegbe_set_tso(struct net_device *netdev,
 | |
|      return 0;
 | |
|  } 
 | |
|  #endif /* NETIF_F_TSO */
 | |
| +#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)) */
 | |
|  
 | |
|  static uint32_t
 | |
|  iegbe_get_msglevel(struct net_device *netdev)
 | |
| @@ -807,6 +809,7 @@ err_setup_rx:
 | |
|              E1000_82542_##R : E1000_##R;                           \
 | |
|          return 1;         }  }
 | |
|  
 | |
| +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
 | |
|  static int
 | |
|  iegbe_reg_test(struct iegbe_adapter *adapter, uint64_t *data)
 | |
|  {
 | |
| @@ -1710,6 +1713,7 @@ iegbe_diag_test(struct net_device *netde
 | |
|      }
 | |
|      msleep_interruptible(0xfa0);
 | |
|  }
 | |
| +#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)) */
 | |
|  
 | |
|  static void
 | |
|  iegbe_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
 | |
| @@ -1812,6 +1816,7 @@ iegbe_set_wol(struct net_device *netdev,
 | |
|  /* bit defines for adapter->led_status */
 | |
|  #define E1000_LED_ON        0
 | |
|  
 | |
| +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
 | |
|  static void
 | |
|  iegbe_led_blink_callback(unsigned long data)
 | |
|  {
 | |
| @@ -1864,6 +1869,7 @@ iegbe_phys_id(struct net_device *netdev,
 | |
|  
 | |
|      return 0;
 | |
|  }
 | |
| +#endif
 | |
|  
 | |
|  static int
 | |
|  iegbe_nway_reset(struct net_device *netdev)
 | |
| @@ -1876,11 +1882,13 @@ iegbe_nway_reset(struct net_device *netd
 | |
|      return 0;
 | |
|  }
 | |
|  
 | |
| +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
 | |
|  static int 
 | |
|  iegbe_get_stats_count(struct net_device *netdev)
 | |
|  {
 | |
|      return E1000_STATS_LEN;
 | |
|  }
 | |
| +#endif
 | |
|  
 | |
|  static void 
 | |
|  iegbe_get_ethtool_stats(struct net_device *netdev, 
 | |
| @@ -1936,6 +1944,8 @@ struct ethtool_ops iegbe_ethtool_ops = {
 | |
|      .set_ringparam          = iegbe_set_ringparam,
 | |
|      .get_pauseparam        = iegbe_get_pauseparam,
 | |
|      .set_pauseparam        = iegbe_set_pauseparam,
 | |
| +
 | |
| +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0))
 | |
|      .get_rx_csum        = iegbe_get_rx_csum,
 | |
|      .set_rx_csum        = iegbe_set_rx_csum,
 | |
|      .get_tx_csum            = iegbe_get_tx_csum,
 | |
| @@ -1946,11 +1956,13 @@ struct ethtool_ops iegbe_ethtool_ops = {
 | |
|      .get_tso        = ethtool_op_get_tso,
 | |
|      .set_tso        = iegbe_set_tso,
 | |
|  #endif
 | |
| +
 | |
|      .self_test_count        = iegbe_diag_test_count,
 | |
|      .self_test              = iegbe_diag_test,
 | |
| -    .get_strings            = iegbe_get_strings,
 | |
|      .phys_id                = iegbe_phys_id,
 | |
|      .get_stats_count        = iegbe_get_stats_count,
 | |
| +#endif
 | |
| +    .get_strings            = iegbe_get_strings,
 | |
|      .get_ethtool_stats      = iegbe_get_ethtool_stats,
 | |
|  };
 | |
|  
 | |
| --- a/Embedded/src/GbE/gcu_main.c
 | |
| +++ b/Embedded/src/GbE/gcu_main.c
 | |
| @@ -93,7 +93,7 @@ static struct pci_driver gcu_driver = {
 | |
|  };
 | |
|  
 | |
|  static struct gcu_adapter *global_adapter = 0;
 | |
| -static spinlock_t global_adapter_spinlock = SPIN_LOCK_UNLOCKED;
 | |
| +static DEFINE_SPINLOCK(global_adapter_spinlock);
 | |
|  static unsigned long g_intflags = 0;
 | |
|  
 | |
|  MODULE_AUTHOR("Intel(R) Corporation");
 | |
| --- a/Embedded/src/GbE/iegbe.h
 | |
| +++ b/Embedded/src/GbE/iegbe.h
 | |
| @@ -257,7 +257,7 @@ struct iegbe_adapter {
 | |
|  	struct timer_list tx_fifo_stall_timer;
 | |
|  	struct timer_list watchdog_timer;
 | |
|  	struct timer_list phy_info_timer;
 | |
| -	struct vlan_group *vlgrp;
 | |
| +	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
 | |
|      	uint16_t mng_vlan_id;
 | |
|  	uint32_t bd_number;
 | |
|  	uint32_t rx_buffer_len;
 |