mmc: rtsx_pci: Enable MMC_CAP_ERASE to allow erase/discard/trim requests
[linux/fpc-iii.git] / drivers / usb / gadget / function / u_ether_configfs.h
blob4f47289fcf7cee45e93e8f9171a19390f91ee49f
1 /*
2 * u_ether_configfs.h
4 * Utility definitions for configfs support in USB Ethernet functions
6 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
7 * http://www.samsung.com
9 * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
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.
16 #ifndef __U_ETHER_CONFIGFS_H
17 #define __U_ETHER_CONFIGFS_H
19 #define USB_ETHERNET_CONFIGFS_ITEM(_f_) \
20 static void _f_##_attr_release(struct config_item *item) \
21 { \
22 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
24 usb_put_function_instance(&opts->func_inst); \
25 } \
27 static struct configfs_item_operations _f_##_item_ops = { \
28 .release = _f_##_attr_release, \
31 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_DEV_ADDR(_f_) \
32 static ssize_t _f_##_opts_dev_addr_show(struct config_item *item, \
33 char *page) \
34 { \
35 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
36 int result; \
38 mutex_lock(&opts->lock); \
39 result = gether_get_dev_addr(opts->net, page, PAGE_SIZE); \
40 mutex_unlock(&opts->lock); \
42 return result; \
43 } \
45 static ssize_t _f_##_opts_dev_addr_store(struct config_item *item, \
46 const char *page, size_t len)\
47 { \
48 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
49 int ret; \
51 mutex_lock(&opts->lock); \
52 if (opts->refcnt) { \
53 mutex_unlock(&opts->lock); \
54 return -EBUSY; \
55 } \
57 ret = gether_set_dev_addr(opts->net, page); \
58 mutex_unlock(&opts->lock); \
59 if (!ret) \
60 ret = len; \
61 return ret; \
62 } \
64 CONFIGFS_ATTR(_f_##_opts_, dev_addr)
66 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_HOST_ADDR(_f_) \
67 static ssize_t _f_##_opts_host_addr_show(struct config_item *item, \
68 char *page) \
69 { \
70 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
71 int result; \
73 mutex_lock(&opts->lock); \
74 result = gether_get_host_addr(opts->net, page, PAGE_SIZE); \
75 mutex_unlock(&opts->lock); \
77 return result; \
78 } \
80 static ssize_t _f_##_opts_host_addr_store(struct config_item *item, \
81 const char *page, size_t len)\
82 { \
83 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
84 int ret; \
86 mutex_lock(&opts->lock); \
87 if (opts->refcnt) { \
88 mutex_unlock(&opts->lock); \
89 return -EBUSY; \
90 } \
92 ret = gether_set_host_addr(opts->net, page); \
93 mutex_unlock(&opts->lock); \
94 if (!ret) \
95 ret = len; \
96 return ret; \
97 } \
99 CONFIGFS_ATTR(_f_##_opts_, host_addr)
101 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(_f_) \
102 static ssize_t _f_##_opts_qmult_show(struct config_item *item, \
103 char *page) \
105 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
106 unsigned qmult; \
108 mutex_lock(&opts->lock); \
109 qmult = gether_get_qmult(opts->net); \
110 mutex_unlock(&opts->lock); \
111 return sprintf(page, "%d", qmult); \
114 static ssize_t _f_##_opts_qmult_store(struct config_item *item, \
115 const char *page, size_t len)\
117 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
118 u8 val; \
119 int ret; \
121 mutex_lock(&opts->lock); \
122 if (opts->refcnt) { \
123 ret = -EBUSY; \
124 goto out; \
127 ret = kstrtou8(page, 0, &val); \
128 if (ret) \
129 goto out; \
131 gether_set_qmult(opts->net, val); \
132 ret = len; \
133 out: \
134 mutex_unlock(&opts->lock); \
135 return ret; \
138 CONFIGFS_ATTR(_f_##_opts_, qmult)
140 #define USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(_f_) \
141 static ssize_t _f_##_opts_ifname_show(struct config_item *item, \
142 char *page) \
144 struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
145 int ret; \
147 mutex_lock(&opts->lock); \
148 ret = gether_get_ifname(opts->net, page, PAGE_SIZE); \
149 mutex_unlock(&opts->lock); \
151 return ret; \
154 CONFIGFS_ATTR_RO(_f_##_opts_, ifname)
156 #endif /* __U_ETHER_CONFIGFS_H */