[PATCH] hid-elo: some systems cannot stomach work around

2013-09-25 Thread oliver
From: Oliver Neukum oneu...@suse.de

Some systems although they have firmware class 'M', which usually
needs a work around to not crash, must not be subjected to the
work around because the work around crashes them. They cannot be
told apart by their own device descriptor, but as they are part
of compound devices, can be identified by looking at their siblings.

V2: fixed formatting

Signed-off-by: Oliver Neukum oneu...@suse.de
---
 drivers/hid/hid-elo.c | 35 ++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/drivers/hid/hid-elo.c b/drivers/hid/hid-elo.c
index f042a6c..4e49462 100644
--- a/drivers/hid/hid-elo.c
+++ b/drivers/hid/hid-elo.c
@@ -181,7 +181,40 @@ fail:
  */
 static bool elo_broken_firmware(struct usb_device *dev)
 {
-   return use_fw_quirk  le16_to_cpu(dev-descriptor.bcdDevice) == 0x10d;
+   struct usb_device *hub = dev-parent;
+   struct usb_device *child = NULL;
+   u16 fw_lvl = le16_to_cpu(dev-descriptor.bcdDevice);
+   u16 child_vid, child_pid;
+   int i;
+
+   if (!use_fw_quirk)
+   return false;
+   if (fw_lvl != 0x10d)
+   return false;
+
+   /* iterate sibling devices of the touch controller */
+   usb_hub_for_each_child(hub, i, child) {
+   child_vid = le16_to_cpu(child-descriptor.idVendor);
+   child_pid = le16_to_cpu(child-descriptor.idProduct);
+
+   /*
+* If one of the devices below is present attached as a sibling 
of 
+* the touch controller then  this is a newer IBM 4820 monitor 
that 
+* does not need the IBM-requested workaround if fw level is
+* 0x010d - aka 'M'.
+* No other HW can have this combination.
+*/
+   if (child_vid==0x04b3) {
+   switch (child_pid) {
+   case 0x4676: /* 4820 21x Video */
+   case 0x4677: /* 4820 51x Video */
+   case 0x4678: /* 4820 2Lx Video */
+   case 0x4679: /* 4820 5Lx Video */
+   return false;
+   }
+   }
+   }
+   return true;
 }
 
 static int elo_probe(struct hid_device *hdev, const struct hid_device_id *id)
-- 
1.8.3.1

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] hid-elo: some systems cannot stomach work around

2013-09-25 Thread Jiri Kosina
On Wed, 25 Sep 2013, oli...@neukum.org wrote:

 Some systems although they have firmware class 'M', which usually
 needs a work around to not crash, must not be subjected to the
 work around because the work around crashes them. They cannot be
 told apart by their own device descriptor, but as they are part
 of compound devices, can be identified by looking at their siblings.

Applied, thanks.

-- 
Jiri Kosina
SUSE Labs
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] hid-elo: some systems cannot stomach work around

2013-09-24 Thread Jiri Kosina
On Mon, 9 Sep 2013, oli...@neukum.org wrote:

 From: Oliver Neukum oneu...@suse.de
 
 Some systems although they have firmware class 'M', which usually
 needs a work around to not crash, must not be subjected to the
 work around because the work around crashes them. They cannot be
 told apart by their own device descriptor, but as they are part
 of compound devices can be identified by looking at their siblings.

What a mess ... :/

 
 Signed-off-by: Oliver Neukum oneu...@suse.de
 ---
  drivers/hid/hid-elo.c | 35 ++-
  1 file changed, 34 insertions(+), 1 deletion(-)
 
 diff --git a/drivers/hid/hid-elo.c b/drivers/hid/hid-elo.c
 index f042a6c..64ac53e 100644
 --- a/drivers/hid/hid-elo.c
 +++ b/drivers/hid/hid-elo.c
 @@ -181,7 +181,40 @@ fail:
   */
  static bool elo_broken_firmware(struct usb_device *dev)
  {
 - return use_fw_quirk  le16_to_cpu(dev-descriptor.bcdDevice) == 0x10d;
 + struct usb_device *hub = dev-parent;
 + struct usb_device *child = NULL;
 + u16 fw_lvl = le16_to_cpu(dev-descriptor.bcdDevice);
 + u16 child_vid, child_pid;
 + int i;
 +
 + if (!use_fw_quirk)
 + return false;
 + if (fw_lvl != 0x10d)
 + return false;
 +
 + /*iterate sibling devices of the touch controller*/

Could you please resubmit with comment reformated (spaces before/after 
asterisk)?

 + usb_hub_for_each_child(hub, i, child) {
 + child_vid = le16_to_cpu(child-descriptor.idVendor);
 + child_pid = le16_to_cpu(child-descriptor.idProduct);
 +
 + /*
 +  * If one of the devices below is present attached as a sibling 
 of 
 +  * the touch controller then  this is a newer IBM 4820 monitor 
 that 
 +  * does not need the IBM-requested workaround if fw level is
 +  * 0x010d - aka 'M'.
 +  * No other HW can have this combination.
 + */
 + if (child_vid==0x04b3) {
 + switch (child_pid) {
 + case 0x4676: /*4820 21x Video*/
 + case 0x4677: /*4820 51x Video*/
 + case 0x4678: /*4820 2Lx Video*/
 + case 0x4679: /*4820 5Lx Video*/

Here as well.

Thanks,

-- 
Jiri Kosina
SUSE Labs
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] hid-elo: some systems cannot stomach work around

2013-09-09 Thread oliver
From: Oliver Neukum oneu...@suse.de

Some systems although they have firmware class 'M', which usually
needs a work around to not crash, must not be subjected to the
work around because the work around crashes them. They cannot be
told apart by their own device descriptor, but as they are part
of compound devices can be identified by looking at their siblings.

Signed-off-by: Oliver Neukum oneu...@suse.de
---
 drivers/hid/hid-elo.c | 35 ++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/drivers/hid/hid-elo.c b/drivers/hid/hid-elo.c
index f042a6c..64ac53e 100644
--- a/drivers/hid/hid-elo.c
+++ b/drivers/hid/hid-elo.c
@@ -181,7 +181,40 @@ fail:
  */
 static bool elo_broken_firmware(struct usb_device *dev)
 {
-   return use_fw_quirk  le16_to_cpu(dev-descriptor.bcdDevice) == 0x10d;
+   struct usb_device *hub = dev-parent;
+   struct usb_device *child = NULL;
+   u16 fw_lvl = le16_to_cpu(dev-descriptor.bcdDevice);
+   u16 child_vid, child_pid;
+   int i;
+
+   if (!use_fw_quirk)
+   return false;
+   if (fw_lvl != 0x10d)
+   return false;
+
+   /*iterate sibling devices of the touch controller*/
+   usb_hub_for_each_child(hub, i, child) {
+   child_vid = le16_to_cpu(child-descriptor.idVendor);
+   child_pid = le16_to_cpu(child-descriptor.idProduct);
+
+   /*
+* If one of the devices below is present attached as a sibling 
of 
+* the touch controller then  this is a newer IBM 4820 monitor 
that 
+* does not need the IBM-requested workaround if fw level is
+* 0x010d - aka 'M'.
+* No other HW can have this combination.
+   */
+   if (child_vid==0x04b3) {
+   switch (child_pid) {
+   case 0x4676: /*4820 21x Video*/
+   case 0x4677: /*4820 51x Video*/
+   case 0x4678: /*4820 2Lx Video*/
+   case 0x4679: /*4820 5Lx Video*/
+   return false;
+   }
+   }
+   }
+   return true;
 }
 
 static int elo_probe(struct hid_device *hdev, const struct hid_device_id *id)
-- 
1.8.3.1

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html