From b698cb5a83fd2effc1f7ef388e6739ab11aab2bf Mon Sep 17 00:00:00 2001
From: Pawel Szewczyk
Date: Fri, 26 Jun 2015 12:58:00 +0200
Subject: [PATCH] gadget: Implement gadget rm on libsubg backend
Change-Id: I49e1f9877597fce7f290786caaa4c678eff7c024
Signed-off-by: Pawel Szewczyk
---
source/gadget/src/gadget.c | 8 ++++++-
source/gadget/src/gadget_libusbg.c | 49 +++++++++++++++++++++++++++++++++++++-
2 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/source/gadget/src/gadget.c b/source/gadget/src/gadget.c
index b7d3fac..8078dce 100644
--- a/source/gadget/src/gadget.c
+++ b/source/gadget/src/gadget.c
@@ -192,7 +192,13 @@ out:
static int gt_gadget_rm_help(void *data)
{
- printf("Gadget rm help.\n");
+ printf("usage: %s rm [OPTIONS] NAME \n"
+ "Remove gadget of specified name\n"
+ "\n"
+ "Options:\n"
+ " -f, --force\tDisable gadget if it was enabled\n"
+ " -r, --recursive\tRemove configs and functions recursively\n",
+ program_name);
return -1;
}
diff --git a/source/gadget/src/gadget_libusbg.c b/source/gadget/src/gadget_libusbg.c
index ee0e55e..c2c651c 100644
--- a/source/gadget/src/gadget_libusbg.c
+++ b/source/gadget/src/gadget_libusbg.c
@@ -75,6 +75,53 @@ err_usbg:
return -1;
}
+static int rm_func(void *data)
+{
+ struct gt_gadget_rm_data *dt;
+ int usbg_ret;
+ usbg_udc *u;
+ usbg_gadget *g;
+ int opts = 0;
+
+ dt = (struct gt_gadget_rm_data *)data;
+
+ g = usbg_get_gadget(backend_ctx.libusbg_state, dt->name);
+ if (g == NULL) {
+ fprintf(stderr, "Gadget '%s' not found\n", dt->name);
+ goto err;
+ }
+
+ u = usbg_get_gadget_udc(g);
+
+ if (u) {
+ if (!(dt->opts & GT_FORCE)) {
+ fprintf(stderr, "Gadget is enabled, disable it first or use --force option\n");
+ goto err;
+ }
+
+ usbg_ret = usbg_disable_gadget(g);
+ if (usbg_ret != USBG_SUCCESS) {
+ fprintf(stderr, "Error on disable gadget: %s : %s\n",
+ usbg_error_name(usbg_ret), usbg_strerror(usbg_ret));
+ goto err;
+ }
+ }
+
+ if (dt->opts & GT_RECURSIVE)
+ opts |= USBG_RM_RECURSE;
+
+ usbg_ret = usbg_rm_gadget(g, opts);
+ if (usbg_ret != USBG_SUCCESS){
+ fprintf(stderr, "Error on gadget remove: %s : %s\n",
+ usbg_error_name(usbg_ret), usbg_strerror(usbg_ret));
+ goto err;
+ }
+
+ return 0;
+err:
+ return -1;
+}
+
static int enable_func(void *data)
{
struct gt_gadget_enable_data *dt;
@@ -110,7 +157,7 @@ static int enable_func(void *data)
struct gt_gadget_backend gt_gadget_backend_libusbg = {
.create = create_func,
- .rm = NULL,
+ .rm = rm_func,
.get = NULL,
.set = NULL,
.enable = enable_func,
--
2.7.4