return size;
 }
 
-static u32 qlcnic_get_pci_func_count(struct qlcnic_adapter *adapter)
-{
-       struct qlcnic_hardware_context *ahw = adapter->ahw;
-       u32 count = 0;
-
-       if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
-               return ahw->total_nic_func;
-
-       if (ahw->total_pci_func <= QLC_DEFAULT_VNIC_COUNT)
-               count = QLC_DEFAULT_VNIC_COUNT;
-       else
-               count = ahw->max_vnic_func;
-
-       return count;
-}
-
 int qlcnic_is_valid_nic_func(struct qlcnic_adapter *adapter, u8 pci_func)
 {
-       u32 pci_func_count = qlcnic_get_pci_func_count(adapter);
        int i;
 
-       for (i = 0; i < pci_func_count; i++) {
+       for (i = 0; i < adapter->ahw->max_vnic_func; i++) {
                if (adapter->npars[i].pci_func == pci_func)
                        return i;
        }
-
-       return -1;
+       return -EINVAL;
 }
 
 static int validate_pm_config(struct qlcnic_adapter *adapter,
 {
        struct device *dev = container_of(kobj, struct device, kobj);
        struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
-       u32 pci_func_count = qlcnic_get_pci_func_count(adapter);
        struct qlcnic_pm_func_cfg *pm_cfg;
-       int i, pm_cfg_size;
        u8 pci_func;
+       u32 count;
+       int i;
 
-       pm_cfg_size = pci_func_count * sizeof(*pm_cfg);
-       if (size != pm_cfg_size)
-               return QL_STATUS_INVALID_PARAM;
-
-       memset(buf, 0, pm_cfg_size);
+       memset(buf, 0, size);
        pm_cfg = (struct qlcnic_pm_func_cfg *)buf;
-
-       for (i = 0; i < pci_func_count; i++) {
+       count = size / sizeof(struct qlcnic_pm_func_cfg);
+       for (i = 0; i < adapter->ahw->total_nic_func; i++) {
                pci_func = adapter->npars[i].pci_func;
-               if (!adapter->npars[i].active)
+               if (pci_func >= count) {
+                       dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n",
+                               __func__, adapter->ahw->total_nic_func, count);
                        continue;
-
+               }
                if (!adapter->npars[i].eswitch_status)
                        continue;
 
 static int validate_esw_config(struct qlcnic_adapter *adapter,
                               struct qlcnic_esw_func_cfg *esw_cfg, int count)
 {
-       u32 pci_func_count = qlcnic_get_pci_func_count(adapter);
        struct qlcnic_hardware_context *ahw = adapter->ahw;
        int i, ret;
        u32 op_mode;
 
        for (i = 0; i < count; i++) {
                pci_func = esw_cfg[i].pci_func;
-               if (pci_func >= pci_func_count)
+               if (pci_func >= ahw->max_vnic_func)
                        return QL_STATUS_INVALID_PARAM;
 
                if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC)
 {
        struct device *dev = container_of(kobj, struct device, kobj);
        struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
-       u32 pci_func_count = qlcnic_get_pci_func_count(adapter);
        struct qlcnic_esw_func_cfg *esw_cfg;
-       size_t esw_cfg_size;
-       u8 i, pci_func;
-
-       esw_cfg_size = pci_func_count * sizeof(*esw_cfg);
-       if (size != esw_cfg_size)
-               return QL_STATUS_INVALID_PARAM;
+       u8 pci_func;
+       u32 count;
+       int i;
 
-       memset(buf, 0, esw_cfg_size);
+       memset(buf, 0, size);
        esw_cfg = (struct qlcnic_esw_func_cfg *)buf;
-
-       for (i = 0; i < pci_func_count; i++) {
+       count = size / sizeof(struct qlcnic_esw_func_cfg);
+       for (i = 0; i < adapter->ahw->total_nic_func; i++) {
                pci_func = adapter->npars[i].pci_func;
-               if (!adapter->npars[i].active)
+               if (pci_func >= count) {
+                       dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n",
+                               __func__, adapter->ahw->total_nic_func, count);
                        continue;
-
+               }
                if (!adapter->npars[i].eswitch_status)
                        continue;
 
 {
        struct device *dev = container_of(kobj, struct device, kobj);
        struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
-       u32 pci_func_count = qlcnic_get_pci_func_count(adapter);
        struct qlcnic_npar_func_cfg *np_cfg;
        struct qlcnic_info nic_info;
-       size_t np_cfg_size;
        int i, ret;
-
-       np_cfg_size = pci_func_count * sizeof(*np_cfg);
-       if (size != np_cfg_size)
-               return QL_STATUS_INVALID_PARAM;
+       u32 count;
 
        memset(&nic_info, 0, sizeof(struct qlcnic_info));
-       memset(buf, 0, np_cfg_size);
+       memset(buf, 0, size);
        np_cfg = (struct qlcnic_npar_func_cfg *)buf;
 
-       for (i = 0; i < pci_func_count; i++) {
+       count = size / sizeof(struct qlcnic_npar_func_cfg);
+       for (i = 0; i < adapter->ahw->total_nic_func; i++) {
                if (qlcnic_is_valid_nic_func(adapter, i) < 0)
                        continue;
+               if (adapter->npars[i].pci_func >= count) {
+                       dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n",
+                               __func__, adapter->ahw->total_nic_func, count);
+                       continue;
+               }
                ret = qlcnic_get_nic_info(adapter, &nic_info, i);
                if (ret)
                        return ret;
 {
        struct device *dev = container_of(kobj, struct device, kobj);
        struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
-       u32 pci_func_count = qlcnic_get_pci_func_count(adapter);
        struct qlcnic_esw_statistics port_stats;
        int ret;
 
        if (size != sizeof(struct qlcnic_esw_statistics))
                return QL_STATUS_INVALID_PARAM;
 
-       if (offset >= pci_func_count)
+       if (offset >= adapter->ahw->max_vnic_func)
                return QL_STATUS_INVALID_PARAM;
 
        memset(&port_stats, 0, size);
 
        struct device *dev = container_of(kobj, struct device, kobj);
        struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
-       u32 pci_func_count = qlcnic_get_pci_func_count(adapter);
        int ret;
 
        if (qlcnic_83xx_check(adapter))
                return QLC_STATUS_UNSUPPORTED_CMD;
 
-       if (offset >= pci_func_count)
+       if (offset >= adapter->ahw->max_vnic_func)
                return QL_STATUS_INVALID_PARAM;
 
        ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_PORT, offset,
 {
        struct device *dev = container_of(kobj, struct device, kobj);
        struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
-       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_cfg_sz;
        int i, ret;
+       u32 count;
 
-       pci_cfg_sz = pci_func_count * sizeof(*pci_cfg);
-       if (size != pci_cfg_sz)
-               return QL_STATUS_INVALID_PARAM;
-
-       pci_info = kcalloc(pci_func_count, sizeof(*pci_info), GFP_KERNEL);
+       pci_info = kcalloc(size, sizeof(*pci_info), GFP_KERNEL);
        if (!pci_info)
                return -ENOMEM;
 
        }
 
        pci_cfg = (struct qlcnic_pci_func_cfg *)buf;
-       for (i = 0; i < pci_func_count; i++) {
+       count = size / sizeof(struct qlcnic_pci_func_cfg);
+       for (i = 0; i < 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;