Merge remote-tracking branch 'rockchip/for-next'
[deliverable/linux.git] / drivers / usb / gadget / function / u_ether_configfs.h
CommitLineData
aa83c6ad
AP
1/*
2 * u_ether_configfs.h
3 *
4 * Utility definitions for configfs support in USB Ethernet functions
5 *
6 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
7 * http://www.samsung.com
8 *
9 * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 */
15
16#ifndef __U_ETHER_CONFIGFS_H
17#define __U_ETHER_CONFIGFS_H
18
19#define USB_ETHERNET_CONFIGFS_ITEM(_f_) \
aa83c6ad
AP
20 static void _f_##_attr_release(struct config_item *item) \
21 { \
22 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
23 \
24 usb_put_function_instance(&opts->func_inst); \
25 } \
26 \
27 static struct configfs_item_operations _f_##_item_ops = { \
28 .release = _f_##_attr_release, \
aa83c6ad
AP
29 }
30
31#define USB_ETHERNET_CONFIGFS_ITEM_ATTR_DEV_ADDR(_f_) \
f9a63da3 32 static ssize_t _f_##_opts_dev_addr_show(struct config_item *item, \
aa83c6ad
AP
33 char *page) \
34 { \
f9a63da3 35 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
aa83c6ad
AP
36 int result; \
37 \
38 mutex_lock(&opts->lock); \
39 result = gether_get_dev_addr(opts->net, page, PAGE_SIZE); \
40 mutex_unlock(&opts->lock); \
41 \
42 return result; \
43 } \
44 \
f9a63da3 45 static ssize_t _f_##_opts_dev_addr_store(struct config_item *item, \
aa83c6ad
AP
46 const char *page, size_t len)\
47 { \
f9a63da3 48 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
aa83c6ad
AP
49 int ret; \
50 \
51 mutex_lock(&opts->lock); \
52 if (opts->refcnt) { \
53 mutex_unlock(&opts->lock); \
54 return -EBUSY; \
55 } \
56 \
57 ret = gether_set_dev_addr(opts->net, page); \
58 mutex_unlock(&opts->lock); \
59 if (!ret) \
60 ret = len; \
61 return ret; \
62 } \
63 \
f9a63da3 64 CONFIGFS_ATTR(_f_##_opts_, dev_addr)
aa83c6ad
AP
65
66#define USB_ETHERNET_CONFIGFS_ITEM_ATTR_HOST_ADDR(_f_) \
f9a63da3 67 static ssize_t _f_##_opts_host_addr_show(struct config_item *item, \
aa83c6ad
AP
68 char *page) \
69 { \
f9a63da3 70 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
aa83c6ad
AP
71 int result; \
72 \
73 mutex_lock(&opts->lock); \
74 result = gether_get_host_addr(opts->net, page, PAGE_SIZE); \
75 mutex_unlock(&opts->lock); \
76 \
77 return result; \
78 } \
79 \
f9a63da3 80 static ssize_t _f_##_opts_host_addr_store(struct config_item *item, \
aa83c6ad
AP
81 const char *page, size_t len)\
82 { \
f9a63da3 83 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
aa83c6ad
AP
84 int ret; \
85 \
86 mutex_lock(&opts->lock); \
87 if (opts->refcnt) { \
88 mutex_unlock(&opts->lock); \
89 return -EBUSY; \
90 } \
91 \
92 ret = gether_set_host_addr(opts->net, page); \
93 mutex_unlock(&opts->lock); \
94 if (!ret) \
95 ret = len; \
96 return ret; \
97 } \
98 \
f9a63da3 99 CONFIGFS_ATTR(_f_##_opts_, host_addr)
aa83c6ad
AP
100
101#define USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(_f_) \
f9a63da3 102 static ssize_t _f_##_opts_qmult_show(struct config_item *item, \
aa83c6ad
AP
103 char *page) \
104 { \
f9a63da3 105 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
aa83c6ad
AP
106 unsigned qmult; \
107 \
108 mutex_lock(&opts->lock); \
109 qmult = gether_get_qmult(opts->net); \
110 mutex_unlock(&opts->lock); \
111 return sprintf(page, "%d", qmult); \
112 } \
113 \
f9a63da3 114 static ssize_t _f_##_opts_qmult_store(struct config_item *item, \
aa83c6ad
AP
115 const char *page, size_t len)\
116 { \
f9a63da3 117 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
aa83c6ad
AP
118 u8 val; \
119 int ret; \
120 \
121 mutex_lock(&opts->lock); \
122 if (opts->refcnt) { \
123 ret = -EBUSY; \
124 goto out; \
125 } \
126 \
127 ret = kstrtou8(page, 0, &val); \
128 if (ret) \
129 goto out; \
130 \
131 gether_set_qmult(opts->net, val); \
132 ret = len; \
133out: \
134 mutex_unlock(&opts->lock); \
135 return ret; \
136 } \
137 \
f9a63da3 138 CONFIGFS_ATTR(_f_##_opts_, qmult)
aa83c6ad
AP
139
140#define USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(_f_) \
f9a63da3 141 static ssize_t _f_##_opts_ifname_show(struct config_item *item, \
aa83c6ad
AP
142 char *page) \
143 { \
f9a63da3 144 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
aa83c6ad
AP
145 int ret; \
146 \
147 mutex_lock(&opts->lock); \
148 ret = gether_get_ifname(opts->net, page, PAGE_SIZE); \
149 mutex_unlock(&opts->lock); \
150 \
151 return ret; \
152 } \
153 \
f9a63da3 154 CONFIGFS_ATTR_RO(_f_##_opts_, ifname)
aa83c6ad
AP
155
156#endif /* __U_ETHER_CONFIGFS_H */
This page took 0.227397 seconds and 5 git commands to generate.