*/
 
 #include <linux/slab.h>
-#include <linux/vmalloc.h>
 #include <linux/interrupt.h>
 
 #include "qlcnic.h"
        u32 pci_func_count = qlcnic_get_pci_func_count(adapter);
        struct qlcnic_pci_func_cfg *pci_cfg;
        struct qlcnic_pci_info *pci_info;
-       size_t pci_info_sz, pci_cfg_sz;
+       size_t pci_cfg_sz;
        int i, ret;
 
        pci_cfg_sz = pci_func_count * sizeof(*pci_cfg);
        if (size != pci_cfg_sz)
                return QL_STATUS_INVALID_PARAM;
 
-       pci_info_sz = pci_func_count * sizeof(*pci_info);
-       pci_info = vmalloc(pci_info_sz);
+       pci_info = kcalloc(pci_func_count, sizeof(*pci_info), GFP_KERNEL);
        if (!pci_info)
                return -ENOMEM;
 
-       memset(pci_info, 0, pci_info_sz);
-       memset(buf, 0, pci_cfg_sz);
-       pci_cfg = (struct qlcnic_pci_func_cfg *)buf;
-
        ret = qlcnic_get_pci_info(adapter, pci_info);
        if (ret) {
-               vfree(pci_info);
+               kfree(pci_info);
                return ret;
        }
 
+       pci_cfg = (struct qlcnic_pci_func_cfg *)buf;
        for (i = 0; i < pci_func_count; i++) {
                pci_cfg[i].pci_func = pci_info[i].id;
                pci_cfg[i].func_type = pci_info[i].type;
+               pci_cfg[i].func_state = 0;
                pci_cfg[i].port_num = pci_info[i].default_port;
                pci_cfg[i].min_bw = pci_info[i].tx_min_bw;
                pci_cfg[i].max_bw = pci_info[i].tx_max_bw;
                memcpy(&pci_cfg[i].def_mac_addr, &pci_info[i].mac, ETH_ALEN);
        }
 
-       vfree(pci_info);
+       kfree(pci_info);
        return size;
 }