static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw);
 static s32 e1000_setup_link_82571(struct e1000_hw *hw);
 static void e1000_clear_hw_cntrs_82571(struct e1000_hw *hw);
+static void e1000_clear_vfta_82571(struct e1000_hw *hw);
 static bool e1000_check_mng_mode_82574(struct e1000_hw *hw);
 static s32 e1000_led_on_82574(struct e1000_hw *hw);
 static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw);
 
        /* Disabling VLAN filtering */
        e_dbg("Initializing the IEEE VLAN\n");
-       e1000e_clear_vfta(hw);
+       mac->ops.clear_vfta(hw);
 
        /* Setup the receive address. */
        /*
 }
 
 /**
- *  e1000e_clear_vfta - Clear VLAN filter table
+ *  e1000_clear_vfta_82571 - Clear VLAN filter table
  *  @hw: pointer to the HW structure
  *
  *  Clears the register array which contains the VLAN filter table by
  *  setting all the values to 0.
  **/
-void e1000e_clear_vfta(struct e1000_hw *hw)
+static void e1000_clear_vfta_82571(struct e1000_hw *hw)
 {
        u32 offset;
        u32 vfta_value = 0;
        /* .led_on: mac type dependent */
        .led_off                = e1000e_led_off_generic,
        .update_mc_addr_list    = e1000_update_mc_addr_list_82571,
+       .write_vfta             = e1000_write_vfta_generic,
+       .clear_vfta             = e1000_clear_vfta_82571,
        .reset_hw               = e1000_reset_hw_82571,
        .init_hw                = e1000_init_hw_82571,
        .setup_link             = e1000_setup_link_82571,
 
 extern s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw);
 extern s32 e1000e_copper_link_setup_igp(struct e1000_hw *hw);
 extern s32 e1000e_setup_link(struct e1000_hw *hw);
-extern void e1000e_clear_vfta(struct e1000_hw *hw);
+extern void e1000_clear_vfta_generic(struct e1000_hw *hw);
 extern void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count);
 extern void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw,
                                               u8 *mc_addr_list,
 extern s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw);
 extern s32 e1000e_force_mac_fc(struct e1000_hw *hw);
 extern s32 e1000e_blink_led(struct e1000_hw *hw);
-extern void e1000e_write_vfta(struct e1000_hw *hw, u32 offset, u32 value);
+extern void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value);
 extern void e1000e_reset_adaptive(struct e1000_hw *hw);
 extern void e1000e_update_adaptive(struct e1000_hw *hw);
 
 
 
        /* Disabling VLAN filtering */
        e_dbg("Initializing the IEEE VLAN\n");
-       e1000e_clear_vfta(hw);
+       mac->ops.clear_vfta(hw);
 
        /* Setup the receive address. */
        e1000e_init_rx_addrs(hw, mac->rar_entry_count);
        .led_on                 = e1000e_led_on_generic,
        .led_off                = e1000e_led_off_generic,
        .update_mc_addr_list    = e1000e_update_mc_addr_list_generic,
+       .write_vfta             = e1000_write_vfta_generic,
+       .clear_vfta             = e1000_clear_vfta_generic,
        .reset_hw               = e1000_reset_hw_80003es2lan,
        .init_hw                = e1000_init_hw_80003es2lan,
        .setup_link             = e1000e_setup_link,
 
        s32  (*check_for_link)(struct e1000_hw *);
        s32  (*cleanup_led)(struct e1000_hw *);
        void (*clear_hw_cntrs)(struct e1000_hw *);
+       void (*clear_vfta)(struct e1000_hw *);
        s32  (*get_bus_info)(struct e1000_hw *);
        s32  (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *);
        s32  (*led_on)(struct e1000_hw *);
        s32  (*setup_link)(struct e1000_hw *);
        s32  (*setup_physical_interface)(struct e1000_hw *);
        s32  (*setup_led)(struct e1000_hw *);
+       void (*write_vfta)(struct e1000_hw *, u32, u32);
 };
 
 /* Function pointers for the PHY. */
 
 }
 
 /**
- *  e1000e_write_vfta - Write value to VLAN filter table
+ *  e1000_clear_vfta_generic - Clear VLAN filter table
+ *  @hw: pointer to the HW structure
+ *
+ *  Clears the register array which contains the VLAN filter table by
+ *  setting all the values to 0.
+ **/
+void e1000_clear_vfta_generic(struct e1000_hw *hw)
+{
+       u32 offset;
+
+       for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) {
+               E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, 0);
+               e1e_flush();
+       }
+}
+
+/**
+ *  e1000_write_vfta_generic - Write value to VLAN filter table
  *  @hw: pointer to the HW structure
  *  @offset: register offset in VLAN filter table
  *  @value: register value written to VLAN filter table
  *  Writes value at the given offset in the register array which stores
  *  the VLAN filter table.
  **/
-void e1000e_write_vfta(struct e1000_hw *hw, u32 offset, u32 value)
+void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value)
 {
        E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value);
        e1e_flush();
 
             E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
            (vid == adapter->mng_vlan_id))
                return;
+
        /* add VID to filter table */
-       index = (vid >> 5) & 0x7F;
-       vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
-       vfta |= (1 << (vid & 0x1F));
-       e1000e_write_vfta(hw, index, vfta);
+       if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
+               index = (vid >> 5) & 0x7F;
+               vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
+               vfta |= (1 << (vid & 0x1F));
+               hw->mac.ops.write_vfta(hw, index, vfta);
+       }
 }
 
 static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
        }
 
        /* remove VID from filter table */
-       index = (vid >> 5) & 0x7F;
-       vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
-       vfta &= ~(1 << (vid & 0x1F));
-       e1000e_write_vfta(hw, index, vfta);
+       if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
+               index = (vid >> 5) & 0x7F;
+               vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
+               vfta &= ~(1 << (vid & 0x1F));
+               hw->mac.ops.write_vfta(hw, index, vfta);
+       }
 }
 
 static void e1000_update_mng_vlan(struct e1000_adapter *adapter)