1 // SPDX-License-Identifier: GPL-2.0
5 * Utility definitions for configfs support in USB Ethernet functions
7 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
8 * http://www.samsung.com
10 * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com>
13 #ifndef __U_ETHER_CONFIGFS_H
14 #define __U_ETHER_CONFIGFS_H
16 #define USB_ETHERNET_CONFIGFS_ITEM(_f_) \
17 static void _f_##_attr_release(struct config_item *item) \
19 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
21 usb_put_function_instance(&opts->func_inst); \
24 static struct configfs_item_operations _f_##_item_ops = { \
25 .release = _f_##_attr_release, \
28 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_DEV_ADDR(_f_) \
29 static ssize_t _f_##_opts_dev_addr_show(struct config_item *item, \
32 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
35 mutex_lock(&opts->lock); \
36 result = gether_get_dev_addr(opts->net, page, PAGE_SIZE); \
37 mutex_unlock(&opts->lock); \
42 static ssize_t _f_##_opts_dev_addr_store(struct config_item *item, \
43 const char *page, size_t len)\
45 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
48 mutex_lock(&opts->lock); \
50 mutex_unlock(&opts->lock); \
54 ret = gether_set_dev_addr(opts->net, page); \
55 mutex_unlock(&opts->lock); \
61 CONFIGFS_ATTR(_f_##_opts_, dev_addr)
63 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_HOST_ADDR(_f_) \
64 static ssize_t _f_##_opts_host_addr_show(struct config_item *item, \
67 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
70 mutex_lock(&opts->lock); \
71 result = gether_get_host_addr(opts->net, page, PAGE_SIZE); \
72 mutex_unlock(&opts->lock); \
77 static ssize_t _f_##_opts_host_addr_store(struct config_item *item, \
78 const char *page, size_t len)\
80 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
83 mutex_lock(&opts->lock); \
85 mutex_unlock(&opts->lock); \
89 ret = gether_set_host_addr(opts->net, page); \
90 mutex_unlock(&opts->lock); \
96 CONFIGFS_ATTR(_f_##_opts_, host_addr)
98 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(_f_) \
99 static ssize_t _f_##_opts_qmult_show(struct config_item *item, \
102 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
105 mutex_lock(&opts->lock); \
106 qmult = gether_get_qmult(opts->net); \
107 mutex_unlock(&opts->lock); \
108 return sprintf(page, "%d\n", qmult); \
111 static ssize_t _f_##_opts_qmult_store(struct config_item *item, \
112 const char *page, size_t len)\
114 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
118 mutex_lock(&opts->lock); \
119 if (opts->refcnt) { \
124 ret = kstrtou8(page, 0, &val); \
128 gether_set_qmult(opts->net, val); \
131 mutex_unlock(&opts->lock); \
135 CONFIGFS_ATTR(_f_##_opts_, qmult)
137 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(_f_) \
138 static ssize_t _f_##_opts_ifname_show(struct config_item *item, \
141 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
144 mutex_lock(&opts->lock); \
145 ret = gether_get_ifname(opts->net, page, PAGE_SIZE); \
146 mutex_unlock(&opts->lock); \
151 CONFIGFS_ATTR_RO(_f_##_opts_, ifname)
153 #define USB_ETHER_CONFIGFS_ITEM_ATTR_U8_RW(_f_, _n_) \
154 static ssize_t _f_##_opts_##_n_##_show(struct config_item *item,\
157 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
160 mutex_lock(&opts->lock); \
161 ret = sprintf(page, "%02x\n", opts->_n_); \
162 mutex_unlock(&opts->lock); \
167 static ssize_t _f_##_opts_##_n_##_store(struct config_item *item,\
171 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
175 mutex_lock(&opts->lock); \
176 ret = sscanf(page, "%02hhx", &val); \
181 mutex_unlock(&opts->lock); \
186 CONFIGFS_ATTR(_f_##_opts_, _n_)
188 #endif /* __U_ETHER_CONFIGFS_H */