Hi Roger, Thanks for your working. I'll review, test and apply it on next week because I'm on vacation now. Thanks, Chanwoo Choi On Tue, Jul 7, 2015 at 3:06 PM, Roger Quadros <rogerq@xxxxxx> wrote: > Users of find_cable_index_by_name() will cause a kernel hang > as the while loop counter is never incremented and end condition > is never reached. > > extcon_get_cable_state() and extcon_set_cable_state() are broken > because they use cable index instead of cable id. This causes > the first cable state (cable.0) to be always invalid in sysfs > or extcon_get_cable_state() users. > > Introduce a new function find_cable_id_by_name() that fixes > both of the above issues. > > Fixes: commit 73b6ecdb93e8 ("extcon: Redefine the unique id of supported external connectors without 'enum extcon' type") > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > Signed-off-by: Roger Quadros <rogerq@xxxxxx> > --- > drivers/extcon/extcon.c | 38 +++++++++++++++++++++++++++++--------- > 1 file changed, 29 insertions(+), 9 deletions(-) > > diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c > index 76157ab..987dd3c 100644 > --- a/drivers/extcon/extcon.c > +++ b/drivers/extcon/extcon.c > @@ -124,22 +124,34 @@ static int find_cable_index_by_id(struct extcon_dev *edev, const unsigned int id > return -EINVAL; > } > > -static int find_cable_index_by_name(struct extcon_dev *edev, const char *name) > +static int find_cable_id_by_name(struct extcon_dev *edev, const char *name) > { > - unsigned int id = EXTCON_NONE; > + unsigned int id = -EINVAL; > int i = 0; > > - if (edev->max_supported == 0) > - return -EINVAL; > - > - /* Find the the number of extcon cable */ > + /* Find the id of extcon cable */ > while (extcon_name[i]) { > if (!strncmp(extcon_name[i], name, CABLE_NAME_MAX)) { > id = i; > break; > } > + > + i++; > } > > + return id; > +}; > + > +static int find_cable_index_by_name(struct extcon_dev *edev, const char *name) > +{ > + unsigned int id = EXTCON_NONE; > + > + if (edev->max_supported == 0) > + return -EINVAL; > + > + /* Find the the number of extcon cable */ > + id = find_cable_id_by_name(edev, name); > + > if (id == EXTCON_NONE) > return -EINVAL; > > @@ -228,9 +240,11 @@ static ssize_t cable_state_show(struct device *dev, > struct extcon_cable *cable = container_of(attr, struct extcon_cable, > attr_state); > > + int i = cable->cable_index; > + > return sprintf(buf, "%d\n", > extcon_get_cable_state_(cable->edev, > - cable->cable_index)); > + cable->edev->supported_cable[i])); > } > > /** > @@ -341,6 +355,9 @@ int extcon_get_cable_state_(struct extcon_dev *edev, const unsigned int id) > { > int index; > > + if (id == EXTCON_NONE) > + return -EINVAL; > + > index = find_cable_index_by_id(edev, id); > if (index < 0) > return index; > @@ -361,7 +378,7 @@ EXPORT_SYMBOL_GPL(extcon_get_cable_state_); > */ > int extcon_get_cable_state(struct extcon_dev *edev, const char *cable_name) > { > - return extcon_get_cable_state_(edev, find_cable_index_by_name > + return extcon_get_cable_state_(edev, find_cable_id_by_name > (edev, cable_name)); > } > EXPORT_SYMBOL_GPL(extcon_get_cable_state); > @@ -380,6 +397,9 @@ int extcon_set_cable_state_(struct extcon_dev *edev, unsigned int id, > u32 state; > int index; > > + if (id == EXTCON_NONE) > + return -EINVAL; > + > index = find_cable_index_by_id(edev, id); > if (index < 0) > return index; > @@ -404,7 +424,7 @@ EXPORT_SYMBOL_GPL(extcon_set_cable_state_); > int extcon_set_cable_state(struct extcon_dev *edev, > const char *cable_name, bool cable_state) > { > - return extcon_set_cable_state_(edev, find_cable_index_by_name > + return extcon_set_cable_state_(edev, find_cable_id_by_name > (edev, cable_name), cable_state); > } > EXPORT_SYMBOL_GPL(extcon_set_cable_state); > -- > 2.1.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html