|
@@ -91,6 +91,10 @@ unsigned int nes_debug_level = 0;
|
|
module_param_named(debug_level, nes_debug_level, uint, 0644);
|
|
module_param_named(debug_level, nes_debug_level, uint, 0644);
|
|
MODULE_PARM_DESC(debug_level, "Enable debug output level");
|
|
MODULE_PARM_DESC(debug_level, "Enable debug output level");
|
|
|
|
|
|
|
|
+unsigned int wqm_quanta = 0x10000;
|
|
|
|
+module_param(wqm_quanta, int, 0644);
|
|
|
|
+MODULE_PARM_DESC(wqm_quanta, "WQM quanta");
|
|
|
|
+
|
|
LIST_HEAD(nes_adapter_list);
|
|
LIST_HEAD(nes_adapter_list);
|
|
static LIST_HEAD(nes_dev_list);
|
|
static LIST_HEAD(nes_dev_list);
|
|
|
|
|
|
@@ -557,6 +561,7 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i
|
|
goto bail5;
|
|
goto bail5;
|
|
}
|
|
}
|
|
nesdev->nesadapter->et_rx_coalesce_usecs_irq = interrupt_mod_interval;
|
|
nesdev->nesadapter->et_rx_coalesce_usecs_irq = interrupt_mod_interval;
|
|
|
|
+ nesdev->nesadapter->wqm_quanta = wqm_quanta;
|
|
|
|
|
|
/* nesdev->base_doorbell_index =
|
|
/* nesdev->base_doorbell_index =
|
|
nesdev->nesadapter->pd_config_base[PCI_FUNC(nesdev->pcidev->devfn)]; */
|
|
nesdev->nesadapter->pd_config_base[PCI_FUNC(nesdev->pcidev->devfn)]; */
|
|
@@ -1069,6 +1074,55 @@ static ssize_t nes_store_idx_data(struct device_driver *ddp,
|
|
return strnlen(buf, count);
|
|
return strnlen(buf, count);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * nes_show_wqm_quanta
|
|
|
|
+ */
|
|
|
|
+static ssize_t nes_show_wqm_quanta(struct device_driver *ddp, char *buf)
|
|
|
|
+{
|
|
|
|
+ u32 wqm_quanta_value = 0xdead;
|
|
|
|
+ u32 i = 0;
|
|
|
|
+ struct nes_device *nesdev;
|
|
|
|
+
|
|
|
|
+ list_for_each_entry(nesdev, &nes_dev_list, list) {
|
|
|
|
+ if (i == ee_flsh_adapter) {
|
|
|
|
+ wqm_quanta_value = nesdev->nesadapter->wqm_quanta;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ i++;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return snprintf(buf, PAGE_SIZE, "0x%X\n", wqm_quanta);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * nes_store_wqm_quanta
|
|
|
|
+ */
|
|
|
|
+static ssize_t nes_store_wqm_quanta(struct device_driver *ddp,
|
|
|
|
+ const char *buf, size_t count)
|
|
|
|
+{
|
|
|
|
+ unsigned long wqm_quanta_value;
|
|
|
|
+ u32 wqm_config1;
|
|
|
|
+ u32 i = 0;
|
|
|
|
+ struct nes_device *nesdev;
|
|
|
|
+
|
|
|
|
+ strict_strtoul(buf, 0, &wqm_quanta_value);
|
|
|
|
+ list_for_each_entry(nesdev, &nes_dev_list, list) {
|
|
|
|
+ if (i == ee_flsh_adapter) {
|
|
|
|
+ nesdev->nesadapter->wqm_quanta = wqm_quanta_value;
|
|
|
|
+ wqm_config1 = nes_read_indexed(nesdev,
|
|
|
|
+ NES_IDX_WQM_CONFIG1);
|
|
|
|
+ nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG1,
|
|
|
|
+ ((wqm_quanta_value << 1) |
|
|
|
|
+ (wqm_config1 & 0x00000001)));
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ i++;
|
|
|
|
+ }
|
|
|
|
+ return strnlen(buf, count);
|
|
|
|
+}
|
|
|
|
+
|
|
static DRIVER_ATTR(adapter, S_IRUSR | S_IWUSR,
|
|
static DRIVER_ATTR(adapter, S_IRUSR | S_IWUSR,
|
|
nes_show_adapter, nes_store_adapter);
|
|
nes_show_adapter, nes_store_adapter);
|
|
static DRIVER_ATTR(eeprom_cmd, S_IRUSR | S_IWUSR,
|
|
static DRIVER_ATTR(eeprom_cmd, S_IRUSR | S_IWUSR,
|
|
@@ -1087,6 +1141,8 @@ static DRIVER_ATTR(idx_addr, S_IRUSR | S_IWUSR,
|
|
nes_show_idx_addr, nes_store_idx_addr);
|
|
nes_show_idx_addr, nes_store_idx_addr);
|
|
static DRIVER_ATTR(idx_data, S_IRUSR | S_IWUSR,
|
|
static DRIVER_ATTR(idx_data, S_IRUSR | S_IWUSR,
|
|
nes_show_idx_data, nes_store_idx_data);
|
|
nes_show_idx_data, nes_store_idx_data);
|
|
|
|
+static DRIVER_ATTR(wqm_quanta, S_IRUSR | S_IWUSR,
|
|
|
|
+ nes_show_wqm_quanta, nes_store_wqm_quanta);
|
|
|
|
|
|
static int nes_create_driver_sysfs(struct pci_driver *drv)
|
|
static int nes_create_driver_sysfs(struct pci_driver *drv)
|
|
{
|
|
{
|
|
@@ -1100,6 +1156,7 @@ static int nes_create_driver_sysfs(struct pci_driver *drv)
|
|
error |= driver_create_file(&drv->driver, &driver_attr_nonidx_data);
|
|
error |= driver_create_file(&drv->driver, &driver_attr_nonidx_data);
|
|
error |= driver_create_file(&drv->driver, &driver_attr_idx_addr);
|
|
error |= driver_create_file(&drv->driver, &driver_attr_idx_addr);
|
|
error |= driver_create_file(&drv->driver, &driver_attr_idx_data);
|
|
error |= driver_create_file(&drv->driver, &driver_attr_idx_data);
|
|
|
|
+ error |= driver_create_file(&drv->driver, &driver_attr_wqm_quanta);
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1114,6 +1171,7 @@ static void nes_remove_driver_sysfs(struct pci_driver *drv)
|
|
driver_remove_file(&drv->driver, &driver_attr_nonidx_data);
|
|
driver_remove_file(&drv->driver, &driver_attr_nonidx_data);
|
|
driver_remove_file(&drv->driver, &driver_attr_idx_addr);
|
|
driver_remove_file(&drv->driver, &driver_attr_idx_addr);
|
|
driver_remove_file(&drv->driver, &driver_attr_idx_data);
|
|
driver_remove_file(&drv->driver, &driver_attr_idx_data);
|
|
|
|
+ driver_remove_file(&drv->driver, &driver_attr_wqm_quanta);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|