The mapping as follows: E_RANGE -> ERANGE E_UNDEF -> ENODATA E_TOOLONG -> E2BIG SET_DEFAULT -> ERESTART As a side effect it fixes a bug in spk_var_store() where return code was mistakenly compared to negative value instead of positive. Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> --- drivers/staging/speakup/kobjects.c | 6 +++--- drivers/staging/speakup/speakup.h | 5 ----- drivers/staging/speakup/varhandlers.c | 26 +++++++++++++------------- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/drivers/staging/speakup/kobjects.c b/drivers/staging/speakup/kobjects.c index d0f660b..d6d9264 100644 --- a/drivers/staging/speakup/kobjects.c +++ b/drivers/staging/speakup/kobjects.c @@ -619,7 +619,7 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, len = E_SET; value = simple_strtol(cp, NULL, 10); ret = spk_set_num_var(value, param, len); - if (ret == E_RANGE) { + if (ret == -ERANGE) { var_data = param->data; pr_warn("value for %s out of range, expect %d to %d\n", attr->attr.name, @@ -637,7 +637,7 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, cp = (char *) buf; cp[len] = '\0'; ret = spk_set_string_var(buf, param, len); - if (ret == E_TOOLONG) + if (ret == -E2BIG) pr_warn("value too long for %s\n", attr->attr.name); break; @@ -670,7 +670,7 @@ ssize_t spk_var_store(struct kobject *kobj, struct kobj_attribute *attr, } spk_unlock(flags); - if (ret == SET_DEFAULT) + if (ret == -ERESTART) pr_info("%s reset to default value\n", attr->attr.name); return count; } diff --git a/drivers/staging/speakup/speakup.h b/drivers/staging/speakup/speakup.h index 1e5691c..c387a02 100644 --- a/drivers/staging/speakup/speakup.h +++ b/drivers/staging/speakup/speakup.h @@ -44,11 +44,6 @@ #define IS_CHAR(x, type) (spk_chartab[((u_char)x)]&type) #define IS_TYPE(x, type) ((spk_chartab[((u_char)x)]&type) == type) -#define SET_DEFAULT -4 -#define E_RANGE -3 -#define E_TOOLONG -2 -#define E_UNDEF -1 - extern int speakup_thread(void *data); extern void spk_reset_default_chars(void); extern void spk_reset_default_chartab(void); diff --git a/drivers/staging/speakup/varhandlers.c b/drivers/staging/speakup/varhandlers.c index 0a237da..be61a4e 100644 --- a/drivers/staging/speakup/varhandlers.c +++ b/drivers/staging/speakup/varhandlers.c @@ -184,19 +184,19 @@ int spk_set_num_var(int input, struct st_var_header *var, int how) char buf[32]; char *cp; struct var_t *var_data = var->data; + if (var_data == NULL) - return E_UNDEF; + return -ENODATA; if (how == E_NEW_DEFAULT) { if (input < var_data->u.n.low || input > var_data->u.n.high) - ret = E_RANGE; - else - var_data->u.n.default_val = input; - return ret; + return -ERANGE; + var_data->u.n.default_val = input; + return 0; } if (how == E_DEFAULT) { val = var_data->u.n.default_val; - ret = SET_DEFAULT; + ret = -ERESTART; } else { if (how == E_SET) val = input; @@ -207,7 +207,7 @@ int spk_set_num_var(int input, struct st_var_header *var, int how) else if (how == E_DEC) val -= input; if (val < var_data->u.n.low || val > var_data->u.n.high) - return E_RANGE; + return -ERANGE; } var_data->u.n.value = val; if (var->var_type == VAR_TIME && p_val != NULL) { @@ -246,25 +246,25 @@ int spk_set_num_var(int input, struct st_var_header *var, int how) int spk_set_string_var(const char *page, struct st_var_header *var, int len) { - int ret = 0; struct var_t *var_data = var->data; + if (var_data == NULL) - return E_UNDEF; + return -ENODATA; if (len > MAXVARLEN) - return -E_TOOLONG; + return -E2BIG; if (!len) { if (!var_data->u.s.default_val) return 0; - ret = SET_DEFAULT; if (!var->p_val) var->p_val = var_data->u.s.default_val; if (var->p_val != var_data->u.s.default_val) strcpy((char *)var->p_val, var_data->u.s.default_val); + return -ERESTART; } else if (var->p_val) strcpy((char *)var->p_val, page); else - return -E_TOOLONG; - return ret; + return -E2BIG; + return 0; } /* spk_set_mask_bits sets or clears the punc/delim/repeat bits, -- 1.8.2.rc0.22.gb3600c3 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel