#define MVPP22_RSS_TABLE_ENTRIES       32
 
 /* BM constants */
-#define MVPP2_BM_POOLS_NUM             8
 #define MVPP2_BM_LONG_BUF_NUM          1024
 #define MVPP2_BM_SHORT_BUF_NUM         2048
 #define MVPP2_BM_POOL_SIZE_MAX         (16*1024 - MVPP2_BM_POOL_PTR_ALIGN/4)
 #define MVPP2_BM_POOL_PTR_ALIGN                128
-#define MVPP2_BM_SWF_LONG_POOL(port)   ((port > 2) ? 2 : port)
-#define MVPP2_BM_SWF_SHORT_POOL                3
 
 /* BM cookie (32 bits) definition */
 #define MVPP2_BM_COOKIE_POOL_OFFS      8
 #define MVPP2_BM_COOKIE_CPU_OFFS       24
 
+#define MVPP2_BM_SHORT_FRAME_SIZE              512
+#define MVPP2_BM_LONG_FRAME_SIZE               2048
 /* BM short pool packet size
  * These value assure that for SWF the total number
  * of bytes allocated for each buffer will be 512
  */
-#define MVPP2_BM_SHORT_PKT_SIZE                MVPP2_RX_MAX_PKT_SIZE(512)
+#define MVPP2_BM_SHORT_PKT_SIZE        MVPP2_RX_MAX_PKT_SIZE(MVPP2_BM_SHORT_FRAME_SIZE)
+#define MVPP2_BM_LONG_PKT_SIZE MVPP2_RX_MAX_PKT_SIZE(MVPP2_BM_LONG_FRAME_SIZE)
 
 #define MVPP21_ADDR_SPACE_SZ           0
 #define MVPP22_ADDR_SPACE_SZ           SZ_64K
 #define MVPP2_MAX_THREADS              8
 #define MVPP2_MAX_QVECS                        MVPP2_MAX_THREADS
 
-enum mvpp2_bm_type {
-       MVPP2_BM_FREE,
-       MVPP2_BM_SWF_LONG,
-       MVPP2_BM_SWF_SHORT
+enum mvpp2_bm_pool_log_num {
+       MVPP2_BM_SHORT,
+       MVPP2_BM_LONG,
+       MVPP2_BM_POOLS_NUM
 };
 
+static struct {
+       int pkt_size;
+       int buf_num;
+} mvpp2_pools[MVPP2_BM_POOLS_NUM];
+
 /* GMAC MIB Counters register definitions */
 #define MVPP21_MIB_COUNTERS_OFFSET             0x1000
 #define MVPP21_MIB_COUNTERS_PORT_SZ            0x400
 struct mvpp2_bm_pool {
        /* Pool number in the range 0-7 */
        int id;
-       enum mvpp2_bm_type type;
 
        /* Buffer Pointers Pool External (BPPE) size */
        int size;
        val |= MVPP2_BM_START_MASK;
        mvpp2_write(priv, MVPP2_BM_POOL_CTRL_REG(bm_pool->id), val);
 
-       bm_pool->type = MVPP2_BM_FREE;
        bm_pool->size = size;
        bm_pool->pkt_size = 0;
        bm_pool->buf_num = 0;
        return 0;
 }
 
+static void mvpp2_setup_bm_pool(void)
+{
+       /* Short pool */
+       mvpp2_pools[MVPP2_BM_SHORT].buf_num  = MVPP2_BM_SHORT_BUF_NUM;
+       mvpp2_pools[MVPP2_BM_SHORT].pkt_size = MVPP2_BM_SHORT_PKT_SIZE;
+
+       /* Long pool */
+       mvpp2_pools[MVPP2_BM_LONG].buf_num  = MVPP2_BM_LONG_BUF_NUM;
+       mvpp2_pools[MVPP2_BM_LONG].pkt_size = MVPP2_BM_LONG_PKT_SIZE;
+}
+
 /* Attach long pool to rxq */
 static void mvpp2_rxq_long_pool_set(struct mvpp2_port *port,
                                    int lrxq, int long_pool)
        bm_pool->buf_num += i;
 
        netdev_dbg(port->dev,
-                  "%s pool %d: pkt_size=%4d, buf_size=%4d, total_size=%4d\n",
-                  bm_pool->type == MVPP2_BM_SWF_SHORT ? "short" : " long",
+                  "pool %d: pkt_size=%4d, buf_size=%4d, total_size=%4d\n",
                   bm_pool->id, bm_pool->pkt_size, buf_size, total_size);
 
        netdev_dbg(port->dev,
-                  "%s pool %d: %d of %d buffers added\n",
-                  bm_pool->type == MVPP2_BM_SWF_SHORT ? "short" : " long",
+                  "pool %d: %d of %d buffers added\n",
                   bm_pool->id, i, buf_num);
        return i;
 }
  * pool pointer on success
  */
 static struct mvpp2_bm_pool *
-mvpp2_bm_pool_use(struct mvpp2_port *port, int pool, enum mvpp2_bm_type type,
-                 int pkt_size)
+mvpp2_bm_pool_use(struct mvpp2_port *port, unsigned pool, int pkt_size)
 {
        struct mvpp2_bm_pool *new_pool = &port->priv->bm_pools[pool];
        int num;
 
-       if (new_pool->type != MVPP2_BM_FREE && new_pool->type != type) {
-               netdev_err(port->dev, "mixing pool types is forbidden\n");
+       if (pool >= MVPP2_BM_POOLS_NUM) {
+               netdev_err(port->dev, "Invalid pool %d\n", pool);
                return NULL;
        }
 
-       if (new_pool->type == MVPP2_BM_FREE)
-               new_pool->type = type;
-
        /* Allocate buffers in case BM pool is used as long pool, but packet
         * size doesn't match MTU or BM pool hasn't being used yet
         */
-       if (((type == MVPP2_BM_SWF_LONG) && (pkt_size > new_pool->pkt_size)) ||
-           (new_pool->pkt_size == 0)) {
+       if (new_pool->pkt_size == 0) {
                int pkts_num;
 
                /* Set default buffer number or free all the buffers in case
                 */
                pkts_num = new_pool->buf_num;
                if (pkts_num == 0)
-                       pkts_num = type == MVPP2_BM_SWF_LONG ?
-                                  MVPP2_BM_LONG_BUF_NUM :
-                                  MVPP2_BM_SHORT_BUF_NUM;
+                       pkts_num = mvpp2_pools[pool].buf_num;
                else
                        mvpp2_bm_bufs_free(port->dev->dev.parent,
                                           port->priv, new_pool);
 
        if (!port->pool_long) {
                port->pool_long =
-                      mvpp2_bm_pool_use(port, MVPP2_BM_SWF_LONG_POOL(port->id),
-                                        MVPP2_BM_SWF_LONG,
-                                        port->pkt_size);
+                       mvpp2_bm_pool_use(port, MVPP2_BM_LONG,
+                                         mvpp2_pools[MVPP2_BM_LONG].pkt_size);
                if (!port->pool_long)
                        return -ENOMEM;
 
 
        if (!port->pool_short) {
                port->pool_short =
-                       mvpp2_bm_pool_use(port, MVPP2_BM_SWF_SHORT_POOL,
-                                         MVPP2_BM_SWF_SHORT,
-                                         MVPP2_BM_SHORT_PKT_SIZE);
+                       mvpp2_bm_pool_use(port, MVPP2_BM_SHORT,
+                                         mvpp2_pools[MVPP2_BM_SHORT].pkt_size);
                if (!port->pool_short)
                        return -ENOMEM;
 
        struct mvpp2_port *port = netdev_priv(dev);
        struct mvpp2_bm_pool *port_pool = port->pool_long;
        int num, pkts_num = port_pool->buf_num;
-       int pkt_size = MVPP2_RX_PKT_SIZE(mtu);
 
        /* Update BM pool with new buffer size */
        mvpp2_bm_bufs_free(dev->dev.parent, port->priv, port_pool);
                return -EIO;
        }
 
-       port_pool->pkt_size = pkt_size;
-       port_pool->frag_size = SKB_DATA_ALIGN(MVPP2_RX_BUF_SIZE(pkt_size)) +
-               MVPP2_SKB_SHINFO_SIZE;
        num = mvpp2_bm_bufs_add(port, port_pool, pkts_num);
        if (num != pkts_num) {
                WARN(1, "pool %d: %d of %d allocated\n",
                     port_pool->id, num, pkts_num);
                return -EIO;
        }
-
-       mvpp2_bm_pool_bufsize_set(port->priv, port_pool,
-                                 MVPP2_RX_BUF_SIZE(port_pool->pkt_size));
        dev->mtu = mtu;
        netdev_update_features(dev);
        return 0;
                        priv->sysctrl_base = NULL;
        }
 
+       mvpp2_setup_bm_pool();
+
        for (i = 0; i < MVPP2_MAX_THREADS; i++) {
                u32 addr_space_sz;