return err;
 }
 
-static int alloc_4k(struct mlx5_core_dev *dev, u64 *addr)
+static int alloc_4k(struct mlx5_core_dev *dev, u64 *addr, u16 func_id)
 {
-       struct fw_page *fp;
+       struct fw_page *fp = NULL;
+       struct fw_page *iter;
        unsigned n;
 
-       if (list_empty(&dev->priv.free_list))
+       list_for_each_entry(iter, &dev->priv.free_list, list) {
+               if (iter->func_id != func_id)
+                       continue;
+               fp = iter;
+       }
+
+       if (list_empty(&dev->priv.free_list) || !fp)
                return -ENOMEM;
 
-       fp = list_entry(dev->priv.free_list.next, struct fw_page, list);
        n = find_first_bit(&fp->bitmask, 8 * sizeof(fp->bitmask));
        if (n >= MLX5_NUM_4K_IN_PAGE) {
                mlx5_core_warn(dev, "alloc 4k bug\n");
 
        for (i = 0; i < npages; i++) {
 retry:
-               err = alloc_4k(dev, &addr);
+               err = alloc_4k(dev, &addr, func_id);
                if (err) {
                        if (err == -ENOMEM)
                                err = alloc_system_page(dev, func_id);