}
 
 static void _rocker_neigh_add(struct rocker *rocker,
+                             enum switchdev_trans trans,
                              struct rocker_neigh_tbl_entry *entry)
 {
-       entry->index = rocker->neigh_tbl_next_index++;
+       entry->index = rocker->neigh_tbl_next_index;
+       if (trans == SWITCHDEV_TRANS_PREPARE)
+               return;
+       rocker->neigh_tbl_next_index++;
        entry->ref_count++;
        hash_add(rocker->neigh_tbl, &entry->entry,
                 be32_to_cpu(entry->ip_addr));
                              enum switchdev_trans trans,
                              struct rocker_neigh_tbl_entry *entry)
 {
+       if (trans == SWITCHDEV_TRANS_PREPARE)
+               return;
        if (--entry->ref_count == 0) {
                hash_del(&entry->entry);
                rocker_port_kfree(rocker_port, trans, entry);
 }
 
 static void _rocker_neigh_update(struct rocker_neigh_tbl_entry *entry,
+                                enum switchdev_trans trans,
                                 u8 *eth_dst, bool ttl_check)
 {
        if (eth_dst) {
                ether_addr_copy(entry->eth_dst, eth_dst);
                entry->ttl_check = ttl_check;
-       } else {
+       } else if (trans != SWITCHDEV_TRANS_PREPARE) {
                entry->ref_count++;
        }
 }
                entry->dev = rocker_port->dev;
                ether_addr_copy(entry->eth_dst, eth_dst);
                entry->ttl_check = true;
-               _rocker_neigh_add(rocker, entry);
+               _rocker_neigh_add(rocker, trans, entry);
        } else if (removing) {
                memcpy(entry, found, sizeof(*entry));
                _rocker_neigh_del(rocker_port, trans, found);
        } else if (updating) {
-               _rocker_neigh_update(found, eth_dst, true);
+               _rocker_neigh_update(found, trans, eth_dst, true);
                memcpy(entry, found, sizeof(*entry));
        } else {
                err = -ENOENT;
        if (adding) {
                entry->ip_addr = ip_addr;
                entry->dev = rocker_port->dev;
-               _rocker_neigh_add(rocker, entry);
+               _rocker_neigh_add(rocker, trans, entry);
                *index = entry->index;
                resolved = false;
        } else if (removing) {
                _rocker_neigh_del(rocker_port, trans, found);
        } else if (updating) {
-               _rocker_neigh_update(found, NULL, false);
+               _rocker_neigh_update(found, trans, NULL, false);
                resolved = !is_zero_ether_addr(found->eth_dst);
        } else {
                err = -ENOENT;