From 03ab6394f1bf20e58ed437726f979366d0740de8 Mon Sep 17 00:00:00 2001 From: David DSH Date: Tue, 15 Nov 2016 18:50:24 -0800 Subject: RT8168: Add power control sysfs knobs Add low power modes control knobs via sysfs Bug 1828585 Change-Id: If9fbd678399c811177f4550f54ef7be88070b795 Signed-off-by: David DSH Reviewed-on: http://git-master/r/1254366 GVS: Gerrit_Virtual_Submit Reviewed-by: Vinayak Pane Signed-off-by: Vladislav Zhurba Reviewed-on: https://git-master.nvidia.com/r/1679175 Reviewed-by: svc-mobile-coverity Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/net/ethernet/realtek/r8168_n.c | 89 ++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/drivers/net/ethernet/realtek/r8168_n.c b/drivers/net/ethernet/realtek/r8168_n.c index 31b4a5cfd..53f2627e6 100644 --- a/drivers/net/ethernet/realtek/r8168_n.c +++ b/drivers/net/ethernet/realtek/r8168_n.c @@ -35,6 +35,7 @@ * This driver is modified from r8169.c in Linux kernel 2.6.18 */ +#include #include #include #include @@ -681,6 +682,92 @@ struct rtl8168_counters { u16 tx_underun; }; +/* SysFS node */ +static int power_saver_flag; +static struct kobject *rt8168_ps_kobj; +static ssize_t show_power_saver(struct kobject *dev, + struct kobj_attribute *attr, char *buf) { + ssize_t ret; + ret = snprintf(buf, PAGE_SIZE, "%u\n", power_saver_flag); + return ret; +} + +static ssize_t set_power_saver(struct kobject *dev, + struct kobj_attribute *attr, const char *buf, size_t count) { + sscanf(buf, "%d", &power_saver_flag); + + if (!power_saver_flag) { + pr_debug("rt8168_power mode is set to big spender"); + aspm = 0; + s5wol = 0; + eee_enable = 0; + } else { + pr_debug("rt8168_power mode is set to no waste"); +#ifdef CONFIG_R8168_ASPM + aspm = 1; +#else + aspm = 0; +#endif +#ifdef CONFIG_R8168_S5WOL + s5wol = 1; +#else + s5wol = 0; +#endif +#ifdef ENABLE_EEE + eee_enable = 1; +#else + eee_enable = 0; +#endif + } + + return count; +} + +static const struct kobj_attribute rt8168_psaver_attr[] = { + __ATTR(mode, S_IRUGO | S_IWUSR | S_IWGRP, show_power_saver, set_power_saver), +}; + +static int rtl8168_sysfs_register(void) +{ + int ret, i; + + if (!kernel_kobj) { + pr_err("kernel_kobj is NULL\n"); + return -1; + } + + rt8168_ps_kobj = kobject_create_and_add("rt8168_power", kernel_kobj); + + if (!rt8168_ps_kobj) { + pr_err("unable to create rt8168_power_saver kernel object!\n"); + return -1; + } + + for (i = 0; i < ARRAY_SIZE(rt8168_psaver_attr); i++) { + ret = sysfs_create_file(rt8168_ps_kobj, + &rt8168_psaver_attr[i].attr); + + if (ret) + pr_err("failed to create %s\n", + rt8168_psaver_attr[i].attr.name); + } + + return ret; +} + +static int rtl8168_sysfs_remove(void) +{ + int i; + + if (!rt8168_ps_kobj) + return -1; + + for (i = 0; i < ARRAY_SIZE(rt8168_psaver_attr); i++) + sysfs_remove_file(rt8168_ps_kobj, &rt8168_psaver_attr[i].attr); + + return 0; +} + #ifdef ENABLE_R8168_PROCFS /**************************************************************************** * -----------------------------PROCFS STUFF------------------------- @@ -25066,6 +25153,7 @@ rtl8168_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) } printk(KERN_INFO "%s: This product is covered by one or more of the following patents: US6,570,884, US6,115,776, and US6,327,625.\n", MODULENAME); + rtl8168_sysfs_register(); device_set_wakeup_enable(&pdev->dev, tp->wol_enabled); @@ -25103,6 +25191,7 @@ void __devexit rtl8168_remove_one(struct pci_dev *pdev) #ifdef CONFIG_R8168_NAPI RTL_NAPI_DEL(tp); #endif + rtl8168_sysfs_remove(); if (tp->DASH) rtl8168_driver_stop(tp); -- cgit v1.2.2