|
@@ -350,33 +350,15 @@ static ssize_t qlcnic_sysfs_write_mem(struct file *filp, struct kobject *kobj,
|
|
|
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,
|
|
@@ -464,23 +446,21 @@ static ssize_t qlcnic_sysfs_read_pm_config(struct file *filp,
|
|
|
{
|
|
|
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;
|
|
|
|
|
@@ -494,7 +474,6 @@ static ssize_t qlcnic_sysfs_read_pm_config(struct file *filp,
|
|
|
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;
|
|
@@ -507,7 +486,7 @@ static int validate_esw_config(struct qlcnic_adapter *adapter,
|
|
|
|
|
|
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)
|
|
@@ -642,23 +621,21 @@ static ssize_t qlcnic_sysfs_read_esw_config(struct file *file,
|
|
|
{
|
|
|
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;
|
|
|
|
|
@@ -741,23 +718,24 @@ static ssize_t qlcnic_sysfs_read_npar_config(struct file *file,
|
|
|
{
|
|
|
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;
|
|
@@ -783,7 +761,6 @@ static ssize_t qlcnic_sysfs_get_port_stats(struct file *file,
|
|
|
{
|
|
|
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;
|
|
|
|
|
@@ -793,7 +770,7 @@ static ssize_t qlcnic_sysfs_get_port_stats(struct file *file,
|
|
|
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);
|
|
@@ -884,13 +861,12 @@ static ssize_t qlcnic_sysfs_clear_port_stats(struct file *file,
|
|
|
|
|
|
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,
|
|
@@ -914,17 +890,12 @@ static ssize_t qlcnic_sysfs_read_pci_config(struct file *file,
|
|
|
{
|
|
|
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;
|
|
|
|
|
@@ -935,7 +906,8 @@ static ssize_t qlcnic_sysfs_read_pci_config(struct file *file,
|
|
|
}
|
|
|
|
|
|
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;
|