640b7e4fc2479e73626f758cc23bd22695ff4644
[linux-3.10.git] / drivers / net / wireless / bcmdhd / dhd_custom_sysfs_tegra_ping.c
1 /*
2  * drivers/net/wireless/bcmdhd/dhd_custom_sysfs_tegra_ping.c
3  *
4  * NVIDIA Tegra Sysfs for BCMDHD driver
5  *
6  * Copyright (C) 2014 NVIDIA Corporation. All rights reserved.
7  *
8  * This software is licensed under the terms of the GNU General Public
9  * License version 2, as published by the Free Software Foundation, and
10  * may be copied, distributed, and modified under those terms.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  */
18
19 #include "dhd_custom_sysfs_tegra.h"
20
21 static void
22 ping_work_func(struct work_struct *work);
23
24 static unsigned int ping_rate_ms = 0 * 1000;
25 static unsigned int ping_size = 32;
26 static unsigned long ping_src_addr;
27 static unsigned long ping_dst_addr;
28 static DECLARE_DELAYED_WORK(ping_work, ping_work_func);
29
30 static void
31 ping_work_func(struct work_struct *work)
32 {
33         struct delayed_work *dwork = to_delayed_work(work);
34
35 //      pr_info("%s\n", __func__);
36
37         /* create ping request */
38
39         /* send ping request */
40
41         /* log ping request */
42
43         /* schedule next ping */
44         schedule_delayed_work(&ping_work,
45                 msecs_to_jiffies(ping_rate_ms));
46
47 }
48
49 void
50 tegra_sysfs_histogram_ping_work_start(void)
51 {
52 //      pr_info("%s\n", __func__);
53         if (ping_rate_ms > 0)
54                 schedule_delayed_work(&ping_work,
55                         msecs_to_jiffies(ping_rate_ms));
56 }
57
58 void
59 tegra_sysfs_histogram_ping_work_stop(void)
60 {
61 //      pr_info("%s\n", __func__);
62         cancel_delayed_work_sync(&ping_work);
63 }
64
65 ssize_t
66 tegra_sysfs_histogram_ping_show(struct device *dev,
67         struct device_attribute *attr,
68         char *buf)
69 {
70 #if 1
71         static int i;
72
73 //      pr_info("%s\n", __func__);
74
75         if (!i) {
76                 i++;
77                 strcpy(buf, "dummy ping!");
78                 return strlen(buf);
79         } else {
80                 i = 0;
81                 return 0;
82         }
83 #else
84
85         /* print histogram of ping request / reply */
86
87 #endif
88 }
89
90 ssize_t
91 tegra_sysfs_histogram_ping_store(struct device *dev,
92         struct device_attribute *attr,
93         const char *buf, size_t count)
94 {
95         int err;
96         unsigned int uint, a, b, c, d;
97
98 //      pr_info("%s\n", __func__);
99
100         if (strncmp(buf, "enable", 6) == 0) {
101                 pr_info("%s: starting ping delayed work...\n", __func__);
102                 tegra_sysfs_histogram_ping_work_start();
103         } else if (strncmp(buf, "disable", 7) == 0) {
104                 pr_info("%s: stopping ping delayed work...\n", __func__);
105                 tegra_sysfs_histogram_ping_work_stop();
106         } else if (strncmp(buf, "rate ", 5) == 0) {
107                 err = kstrtouint(buf + 5, 0, &uint);
108                 if (err < 0) {
109                         pr_err("%s: invalid ping rate (ms)\n", __func__);
110                         return count;
111                 }
112                 pr_info("%s: set ping rate (ms) %u\n", __func__, uint);
113                 ping_rate_ms = uint;
114         } else if (strncmp(buf, "size ", 5) == 0) {
115                 err = kstrtouint(buf + 5, 0, &uint);
116                 if (err < 0) {
117                         pr_err("%s: invalid ping size\n", __func__);
118                         return count;
119                 }
120                 pr_info("%s: set ping size %u\n", __func__, uint);
121                 ping_size = uint;
122         } else if (strncmp(buf, "src ", 4) == 0) {
123                 if (sscanf(buf + 4, "%u.%u.%u.%u", &a, &b, &c, &d) != 4) {
124                         pr_err("%s: invalid ping src address\n", __func__);
125                         return count;
126                 }
127                 pr_info("%s: set ping src %u.%d.%d.%d\n", __func__,
128                         a, b, c, d);
129                 ping_src_addr = (((unsigned long) a) << 24)
130                         | (((unsigned long) b) << 16)
131                         | (((unsigned long) c) << 8)
132                         | (((unsigned long) d) << 0);
133         } else if (strncmp(buf, "dst ", 4) == 0) {
134                 if (sscanf(buf + 4, "%u.%u.%u.%u", &a, &b, &c, &d) != 4) {
135                         pr_err("%s: invalid ping dst address\n", __func__);
136                         return count;
137                 }
138                 pr_info("%s: set ping dst %u.%d.%d.%d\n", __func__,
139                         a, b, c, d);
140                 ping_dst_addr = (((unsigned long) a) << 24)
141                         | (((unsigned long) b) << 16)
142                         | (((unsigned long) c) << 8)
143                         | (((unsigned long) d) << 0);
144         } else {
145                 pr_err("%s: unknown command\n", __func__);
146         }
147
148         return count;
149 }