team->mode = &__team_no_mode;
 }
 
-static void __team_adjust_ops(struct team *team, int en_port_count)
+static void team_adjust_ops(struct team *team)
 {
        /*
         * To avoid checks in rx/tx skb paths, ensure here that non-null and
         * correct ops are always set.
         */
 
-       if (!en_port_count || !team_is_mode_set(team) ||
+       if (!team->en_port_count || !team_is_mode_set(team) ||
            !team->mode->ops->transmit)
                team->ops.transmit = team_dummy_transmit;
        else
                team->ops.transmit = team->mode->ops->transmit;
 
-       if (!en_port_count || !team_is_mode_set(team) ||
+       if (!team->en_port_count || !team_is_mode_set(team) ||
            !team->mode->ops->receive)
                team->ops.receive = team_dummy_receive;
        else
                team->ops.receive = team->mode->ops->receive;
 }
 
-static void team_adjust_ops(struct team *team)
-{
-       __team_adjust_ops(team, team->en_port_count);
-}
-
 /*
  * We can benefit from the fact that it's ensured no port is present
  * at the time of mode change. Therefore no packets are in fly so there's no
        hlist_del_rcu(&port->hlist);
        __reconstruct_port_hlist(team, port->index);
        port->index = -1;
-       team_queue_override_port_del(team, port);
-       __team_adjust_ops(team, team->en_port_count - 1);
-       /*
-        * Wait until readers see adjusted ops. This ensures that
-        * readers never see team->en_port_count == 0
-        */
-       synchronize_rcu();
        team->en_port_count--;
+       team_queue_override_port_del(team, port);
+       team_adjust_ops(team);
 }
 
 #define TEAM_VLAN_FEATURES (NETIF_F_ALL_CSUM | NETIF_F_SG | \
 
        struct team_port *port;
        int port_index;
 
-       port_index = rr_priv(team)->sent_packets++ % team->en_port_count;
+       port_index = team_num_to_port_index(team,
+                                           rr_priv(team)->sent_packets++);
        port = team_get_port_by_index_rcu(team, port_index);
        port = team_get_first_port_txable_rcu(team, port);
        if (unlikely(!port))
 
                        return port;
        return NULL;
 }
+
+static inline int team_num_to_port_index(struct team *team, int num)
+{
+       int en_port_count = ACCESS_ONCE(team->en_port_count);
+
+       if (unlikely(!en_port_count))
+               return 0;
+       return num % en_port_count;
+}
+
 static inline struct team_port *team_get_port_by_index_rcu(struct team *team,
                                                           int port_index)
 {