spin_unlock_irqrestore(&port->priv->mss_spinlock, flags);
 }
 
+/* disable/enable flow control for BM pool on all ports */
+static void mvpp2_bm_pool_update_priv_fc(struct mvpp2 *priv, bool en)
+{
+       struct mvpp2_port *port;
+       int i;
+
+       for (i = 0; i < priv->port_count; i++) {
+               port = priv->port_list[i];
+               if (port->priv->percpu_pools) {
+                       for (i = 0; i < port->nrxqs; i++)
+                               mvpp2_bm_pool_update_fc(port, &port->priv->bm_pools[i],
+                                                       port->tx_fc & en);
+               } else {
+                       mvpp2_bm_pool_update_fc(port, port->pool_long, port->tx_fc & en);
+                       mvpp2_bm_pool_update_fc(port, port->pool_short, port->tx_fc & en);
+               }
+       }
+}
+
 static int mvpp2_enable_global_fc(struct mvpp2 *priv)
 {
        int val, timeout = 0;
  */
 static int mvpp2_bm_switch_buffers(struct mvpp2 *priv, bool percpu)
 {
+       bool change_percpu = (percpu != priv->percpu_pools);
        int numbufs = MVPP2_BM_POOLS_NUM, i;
        struct mvpp2_port *port = NULL;
        bool status[MVPP2_MAX_PORTS];
        if (priv->percpu_pools)
                numbufs = port->nrxqs * 2;
 
+       if (change_percpu)
+               mvpp2_bm_pool_update_priv_fc(priv, false);
+
        for (i = 0; i < numbufs; i++)
                mvpp2_bm_pool_destroy(port->dev->dev.parent, priv, &priv->bm_pools[i]);
 
                        mvpp2_open(port->dev);
        }
 
+       if (change_percpu)
+               mvpp2_bm_pool_update_priv_fc(priv, true);
+
        return 0;
 }