On 9/26/20 9:18 PM, William Breathitt Gray wrote:
+static ssize_t counter_comp_u8_store(struct device *dev,
+                                    struct device_attribute *attr,
+                                    const char *buf, size_t len)
+{
+       const struct counter_attribute *const a = to_counter_attribute(attr);
+       struct counter_device *const counter = dev_get_drvdata(dev);
+       struct counter_count *const count = a->parent;
+       struct counter_synapse *const synapse = a->comp.priv;
+       const struct counter_available *const avail = a->comp.priv;
+       int err;
+       bool bool_data;
+       u8 data;
+
+       switch (a->comp.type) {
+       case COUNTER_COMP_BOOL:
+               err = kstrtobool(buf, &bool_data);
+               data = bool_data;
+               break;
+       case COUNTER_COMP_FUNCTION:
+               err = find_in_string_array(&data, count->functions_list,
+                                          count->num_functions, buf,
+                                          counter_function_str);
+               break;
+       case COUNTER_COMP_SYNAPSE_ACTION:
+               err = find_in_string_array(&data, synapse->actions_list,
+                                          synapse->num_actions, buf,
+                                          counter_synapse_action_str);
+               break;
+       case COUNTER_COMP_ENUM:
+               err = __sysfs_match_string(avail->strs, avail->num_items, buf);
+               data = err;
+               break;
+       case COUNTER_COMP_COUNT_MODE:
+               err = find_in_string_array(&data, avail->enums,
+                                          avail->num_items, buf,
+                                          counter_count_mode_str);
+               break;
+       default:
+               err = kstrtou8(buf, 0, &data);
+               break;
+       }

In this function, return values are not always errors. So it would make
sense to call the err variable ret instead and check for ret < 0 below.

Setting enums to a value with index > 0 fails currently because of this.

+       if (err)
+               return err;
+
+       switch (a->scope) {
+       case COUNTER_SCOPE_DEVICE:
+               err = a->comp.device_u8_write(counter, data);
+               break;
+       case COUNTER_SCOPE_SIGNAL:
+               err = a->comp.signal_u8_write(counter, a->parent, data);
+               break;
+       case COUNTER_SCOPE_COUNT:
+               if (a->comp.type == COUNTER_COMP_SYNAPSE_ACTION)
+                       err = a->comp.action_write(counter, count, synapse,
+                                                  data);
+               else
+                       err = a->comp.count_u8_write(counter, count, data);
+               break;
+       }
+       if (err)
+               return err;
+
+       return len;
+}

Reply via email to