Skip to content

Commit 4b187fc

Browse files
Andrzej PietrasiewiczFelipe Balbi
Andrzej Pietrasiewicz
authored and
Felipe Balbi
committed
usb: gadget: FunctionFS: add devices management code
This will be required in order to use the new function interface (usb_get_function_instance/usb_put_function_instance) Signed-off-by: Andrzej Pietrasiewicz <[email protected]> Signed-off-by: Kyunmgin Park <[email protected]> Acked-by: Michal Nazarewicz <[email protected]> Signed-off-by: Felipe Balbi <[email protected]>
1 parent e72c39c commit 4b187fc

File tree

4 files changed

+314
-137
lines changed

4 files changed

+314
-137
lines changed

drivers/usb/gadget/f_fs.c

Lines changed: 231 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ enum ffs_state {
9090

9191
/*
9292
* We've got descriptors and strings. We are or have called
93-
* functionfs_ready_callback(). functionfs_bind() may have
93+
* ffs_ready(). functionfs_bind() may have
9494
* been called but we don't know.
9595
*
9696
* This is the only state in which operations on epfiles may
@@ -103,7 +103,7 @@ enum ffs_state {
103103
* we encounter an unrecoverable error. The only
104104
* unrecoverable error is situation when after reading strings
105105
* from user space we fail to initialise epfiles or
106-
* functionfs_ready_callback() returns with error (<0).
106+
* ffs_ready() returns with error (<0).
107107
*
108108
* In this state no open(2), read(2) or write(2) (both on ep0
109109
* as well as epfile) may succeed (at this point epfiles are
@@ -361,6 +361,15 @@ ffs_sb_create_file(struct super_block *sb, const char *name, void *data,
361361
const struct file_operations *fops,
362362
struct dentry **dentry_p);
363363

364+
/* Devices management *******************************************************/
365+
366+
DEFINE_MUTEX(ffs_lock);
367+
368+
static struct ffs_dev *ffs_find_dev(const char *name);
369+
static void *ffs_acquire_dev(const char *dev_name);
370+
static void ffs_release_dev(struct ffs_data *ffs_data);
371+
static int ffs_ready(struct ffs_data *ffs);
372+
static void ffs_closed(struct ffs_data *ffs);
364373

365374
/* Misc helper functions ****************************************************/
366375

@@ -486,7 +495,7 @@ static ssize_t ffs_ep0_write(struct file *file, const char __user *buf,
486495
ffs->state = FFS_ACTIVE;
487496
mutex_unlock(&ffs->mutex);
488497

489-
ret = functionfs_ready_callback(ffs);
498+
ret = ffs_ready(ffs);
490499
if (unlikely(ret < 0)) {
491500
ffs->state = FFS_CLOSING;
492501
return ret;
@@ -1218,7 +1227,7 @@ ffs_fs_mount(struct file_system_type *t, int flags,
12181227
return ERR_PTR(-ENOMEM);
12191228
}
12201229

1221-
ffs_dev = functionfs_acquire_dev_callback(dev_name);
1230+
ffs_dev = ffs_acquire_dev(dev_name);
12221231
if (IS_ERR(ffs_dev)) {
12231232
ffs_data_put(ffs);
12241233
return ERR_CAST(ffs_dev);
@@ -1228,7 +1237,7 @@ ffs_fs_mount(struct file_system_type *t, int flags,
12281237

12291238
rv = mount_nodev(t, flags, &data, ffs_sb_fill);
12301239
if (IS_ERR(rv) && data.ffs_data) {
1231-
functionfs_release_dev_callback(data.ffs_data);
1240+
ffs_release_dev(data.ffs_data);
12321241
ffs_data_put(data.ffs_data);
12331242
}
12341243
return rv;
@@ -1241,7 +1250,7 @@ ffs_fs_kill_sb(struct super_block *sb)
12411250

12421251
kill_litter_super(sb);
12431252
if (sb->s_fs_info) {
1244-
functionfs_release_dev_callback(sb->s_fs_info);
1253+
ffs_release_dev(sb->s_fs_info);
12451254
ffs_data_put(sb->s_fs_info);
12461255
}
12471256
}
@@ -1354,7 +1363,7 @@ static void ffs_data_clear(struct ffs_data *ffs)
13541363
ENTER();
13551364

13561365
if (test_and_clear_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags))
1357-
functionfs_closed_callback(ffs);
1366+
ffs_closed(ffs);
13581367

13591368
BUG_ON(ffs->gadget);
13601369

@@ -2466,6 +2475,221 @@ static int ffs_func_revmap_intf(struct ffs_function *func, u8 intf)
24662475
}
24672476

24682477

2478+
/* Devices management *******************************************************/
2479+
2480+
static LIST_HEAD(ffs_devices);
2481+
2482+
static struct ffs_dev *_ffs_find_dev(const char *name)
2483+
{
2484+
struct ffs_dev *dev;
2485+
2486+
list_for_each_entry(dev, &ffs_devices, entry) {
2487+
if (!dev->name || !name)
2488+
continue;
2489+
if (strcmp(dev->name, name) == 0)
2490+
return dev;
2491+
}
2492+
2493+
return NULL;
2494+
}
2495+
2496+
/*
2497+
* ffs_lock must be taken by the caller of this function
2498+
*/
2499+
static struct ffs_dev *ffs_get_single_dev(void)
2500+
{
2501+
struct ffs_dev *dev;
2502+
2503+
if (list_is_singular(&ffs_devices)) {
2504+
dev = list_first_entry(&ffs_devices, struct ffs_dev, entry);
2505+
if (dev->single)
2506+
return dev;
2507+
}
2508+
2509+
return NULL;
2510+
}
2511+
2512+
/*
2513+
* ffs_lock must be taken by the caller of this function
2514+
*/
2515+
static struct ffs_dev *ffs_find_dev(const char *name)
2516+
{
2517+
struct ffs_dev *dev;
2518+
2519+
dev = ffs_get_single_dev();
2520+
if (dev)
2521+
return dev;
2522+
2523+
return _ffs_find_dev(name);
2524+
}
2525+
2526+
/*
2527+
* ffs_lock must be taken by the caller of this function
2528+
*/
2529+
struct ffs_dev *ffs_alloc_dev(void)
2530+
{
2531+
struct ffs_dev *dev;
2532+
int ret;
2533+
2534+
if (ffs_get_single_dev())
2535+
return ERR_PTR(-EBUSY);
2536+
2537+
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
2538+
if (!dev)
2539+
return ERR_PTR(-ENOMEM);
2540+
2541+
if (list_empty(&ffs_devices)) {
2542+
ret = functionfs_init();
2543+
if (ret) {
2544+
kfree(dev);
2545+
return ERR_PTR(ret);
2546+
}
2547+
}
2548+
2549+
list_add(&dev->entry, &ffs_devices);
2550+
2551+
return dev;
2552+
}
2553+
2554+
/*
2555+
* ffs_lock must be taken by the caller of this function
2556+
* The caller is responsible for "name" being available whenever f_fs needs it
2557+
*/
2558+
static int _ffs_name_dev(struct ffs_dev *dev, const char *name)
2559+
{
2560+
struct ffs_dev *existing;
2561+
2562+
existing = _ffs_find_dev(name);
2563+
if (existing)
2564+
return -EBUSY;
2565+
2566+
dev->name = name;
2567+
2568+
return 0;
2569+
}
2570+
2571+
/*
2572+
* The caller is responsible for "name" being available whenever f_fs needs it
2573+
*/
2574+
int ffs_name_dev(struct ffs_dev *dev, const char *name)
2575+
{
2576+
int ret;
2577+
2578+
ffs_dev_lock();
2579+
ret = _ffs_name_dev(dev, name);
2580+
ffs_dev_unlock();
2581+
2582+
return ret;
2583+
}
2584+
2585+
int ffs_single_dev(struct ffs_dev *dev)
2586+
{
2587+
int ret;
2588+
2589+
ret = 0;
2590+
ffs_dev_lock();
2591+
2592+
if (!list_is_singular(&ffs_devices))
2593+
ret = -EBUSY;
2594+
else
2595+
dev->single = true;
2596+
2597+
ffs_dev_unlock();
2598+
return ret;
2599+
}
2600+
2601+
/*
2602+
* ffs_lock must be taken by the caller of this function
2603+
*/
2604+
void ffs_free_dev(struct ffs_dev *dev)
2605+
{
2606+
list_del(&dev->entry);
2607+
kfree(dev);
2608+
if (list_empty(&ffs_devices))
2609+
functionfs_cleanup();
2610+
}
2611+
2612+
static void *ffs_acquire_dev(const char *dev_name)
2613+
{
2614+
struct ffs_dev *ffs_dev;
2615+
2616+
ENTER();
2617+
ffs_dev_lock();
2618+
2619+
ffs_dev = ffs_find_dev(dev_name);
2620+
if (!ffs_dev)
2621+
ffs_dev = ERR_PTR(-ENODEV);
2622+
else if (ffs_dev->mounted)
2623+
ffs_dev = ERR_PTR(-EBUSY);
2624+
else
2625+
ffs_dev->mounted = true;
2626+
2627+
ffs_dev_unlock();
2628+
return ffs_dev;
2629+
}
2630+
2631+
static void ffs_release_dev(struct ffs_data *ffs_data)
2632+
{
2633+
struct ffs_dev *ffs_dev;
2634+
2635+
ENTER();
2636+
ffs_dev_lock();
2637+
2638+
ffs_dev = ffs_data->private_data;
2639+
if (ffs_dev)
2640+
ffs_dev->mounted = false;
2641+
2642+
ffs_dev_unlock();
2643+
}
2644+
2645+
static int ffs_ready(struct ffs_data *ffs)
2646+
{
2647+
struct ffs_dev *ffs_obj;
2648+
int ret = 0;
2649+
2650+
ENTER();
2651+
ffs_dev_lock();
2652+
2653+
ffs_obj = ffs->private_data;
2654+
if (!ffs_obj) {
2655+
ret = -EINVAL;
2656+
goto done;
2657+
}
2658+
if (WARN_ON(ffs_obj->desc_ready)) {
2659+
ret = -EBUSY;
2660+
goto done;
2661+
}
2662+
2663+
ffs_obj->desc_ready = true;
2664+
ffs_obj->ffs_data = ffs;
2665+
2666+
if (ffs_obj->ffs_ready_callback)
2667+
ret = ffs_obj->ffs_ready_callback(ffs);
2668+
2669+
done:
2670+
ffs_dev_unlock();
2671+
return ret;
2672+
}
2673+
2674+
static void ffs_closed(struct ffs_data *ffs)
2675+
{
2676+
struct ffs_dev *ffs_obj;
2677+
2678+
ENTER();
2679+
ffs_dev_lock();
2680+
2681+
ffs_obj = ffs->private_data;
2682+
if (!ffs_obj)
2683+
goto done;
2684+
2685+
ffs_obj->desc_ready = false;
2686+
2687+
if (ffs_obj->ffs_closed_callback)
2688+
ffs_obj->ffs_closed_callback(ffs);
2689+
done:
2690+
ffs_dev_unlock();
2691+
}
2692+
24692693
/* Misc helper functions ****************************************************/
24702694

24712695
static int ffs_mutex_lock(struct mutex *mutex, unsigned nonblock)

0 commit comments

Comments
 (0)