psrtype |= 1 << 29;
 
        for (p = 0; p < adapter->num_rx_pools; p++)
-               IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(adapter->num_vfs + p),
+               IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(VMDQ_P(p)),
                                psrtype);
 }
 
        vmdctl = IXGBE_READ_REG(hw, IXGBE_VT_CTL);
        vmdctl |= IXGBE_VMD_CTL_VMDQ_EN;
        vmdctl &= ~IXGBE_VT_CTL_POOL_MASK;
-       vmdctl |= (adapter->num_vfs << IXGBE_VT_CTL_POOL_SHIFT);
+       vmdctl |= VMDQ_P(0) << IXGBE_VT_CTL_POOL_SHIFT;
        vmdctl |= IXGBE_VT_CTL_REPLEN;
        IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vmdctl);
 
-       vf_shift = adapter->num_vfs % 32;
-       reg_offset = (adapter->num_vfs >= 32) ? 1 : 0;
+       vf_shift = VMDQ_P(0) % 32;
+       reg_offset = (VMDQ_P(0) >= 32) ? 1 : 0;
 
        /* Enable only the PF's pool for Tx/Rx */
        IXGBE_WRITE_REG(hw, IXGBE_VFRE(reg_offset), (~0) << vf_shift);
        IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);
 
        /* Map PF MAC address in RAR Entry 0 to first pool following VFs */
-       hw->mac.ops.set_vmdq(hw, 0, adapter->num_vfs);
+       hw->mac.ops.set_vmdq(hw, 0, VMDQ_P(0));
 
        /*
         * Set up VF register offsets for selected VT Mode,
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_hw *hw = &adapter->hw;
-       int pool_ndx = adapter->num_vfs;
 
        /* add VID to filter table */
-       hw->mac.ops.set_vfta(&adapter->hw, vid, pool_ndx, true);
+       hw->mac.ops.set_vfta(&adapter->hw, vid, VMDQ_P(0), true);
        set_bit(vid, adapter->active_vlans);
 
        return 0;
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_hw *hw = &adapter->hw;
-       int pool_ndx = adapter->num_vfs;
 
        /* remove VID from filter table */
-       hw->mac.ops.set_vfta(&adapter->hw, vid, pool_ndx, false);
+       hw->mac.ops.set_vfta(&adapter->hw, vid, VMDQ_P(0), false);
        clear_bit(vid, adapter->active_vlans);
 
        return 0;
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_hw *hw = &adapter->hw;
-       unsigned int vfn = adapter->num_vfs;
        unsigned int rar_entries = IXGBE_MAX_PF_MACVLANS;
        int count = 0;
 
                        if (!rar_entries)
                                break;
                        hw->mac.ops.set_rar(hw, rar_entries--, ha->addr,
-                                           vfn, IXGBE_RAH_AV);
+                                           VMDQ_P(0), IXGBE_RAH_AV);
                        count++;
                }
        }
                vmolr |= IXGBE_VMOLR_ROPE;
        }
 
-       if (adapter->num_vfs) {
+       if (adapter->num_vfs)
                ixgbe_restore_vf_multicasts(adapter);
-               vmolr |= IXGBE_READ_REG(hw, IXGBE_VMOLR(adapter->num_vfs)) &
+
+       if (hw->mac.type != ixgbe_mac_82598EB) {
+               vmolr |= IXGBE_READ_REG(hw, IXGBE_VMOLR(VMDQ_P(0))) &
                         ~(IXGBE_VMOLR_MPE | IXGBE_VMOLR_ROMPE |
                           IXGBE_VMOLR_ROPE);
-               IXGBE_WRITE_REG(hw, IXGBE_VMOLR(adapter->num_vfs), vmolr);
+               IXGBE_WRITE_REG(hw, IXGBE_VMOLR(VMDQ_P(0)), vmolr);
        }
 
        /* This is useful for sniffing bad packets. */
        clear_bit(__IXGBE_IN_SFP_INIT, &adapter->state);
 
        /* reprogram the RAR[0] in case user changed it. */
-       hw->mac.ops.set_rar(hw, 0, hw->mac.addr, adapter->num_vfs,
-                           IXGBE_RAH_AV);
+       hw->mac.ops.set_rar(hw, 0, hw->mac.addr, VMDQ_P(0), IXGBE_RAH_AV);
 }
 
 /**
        memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
        memcpy(hw->mac.addr, addr->sa_data, netdev->addr_len);
 
-       hw->mac.ops.set_rar(hw, 0, hw->mac.addr, adapter->num_vfs,
-                           IXGBE_RAH_AV);
+       hw->mac.ops.set_rar(hw, 0, hw->mac.addr, VMDQ_P(0), IXGBE_RAH_AV);
 
        return 0;
 }