Use USB_CTRL_SET_TIMEOUT and USB_CTRL_GET_TIMEOUT for USB control
messages instead of an arbitrary 1s timeout value.  This is particularly
useful for WUSB since in the worst case RF scanario, a WUSB device can
be unresponsive for up to 4s and still be connected.

Signed-off-by: Thomas Pugliese <thomas.pugli...@gmail.com>
---
 drivers/usb/host/hwa-hc.c       |   20 ++++++++++----------
 drivers/usb/wusbcore/cbaf.c     |    8 ++++----
 drivers/usb/wusbcore/security.c |   22 ++++++++++++----------
 drivers/usb/wusbcore/wa-hc.h    |    5 ++---
 drivers/usb/wusbcore/wa-rpipe.c |   10 +++++-----
 5 files changed, 33 insertions(+), 32 deletions(-)

diff --git a/drivers/usb/host/hwa-hc.c b/drivers/usb/host/hwa-hc.c
index a4ec9e6..8279097 100644
--- a/drivers/usb/host/hwa-hc.c
+++ b/drivers/usb/host/hwa-hc.c
@@ -86,7 +86,7 @@ static int __hwahc_set_cluster_id(struct hwahc *hwahc, u8 
cluster_id)
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        cluster_id,
                        wa->usb_iface->cur_altsetting->desc.bInterfaceNumber,
-                       NULL, 0, 1000 /* FIXME: arbitrary */);
+                       NULL, 0, USB_CTRL_SET_TIMEOUT);
        if (result < 0)
                dev_err(dev, "Cannot set WUSB Cluster ID to 0x%02x: %d\n",
                        cluster_id, result);
@@ -106,7 +106,7 @@ static int __hwahc_op_set_num_dnts(struct wusbhc *wusbhc, 
u8 interval, u8 slots)
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        interval << 8 | slots,
                        wa->usb_iface->cur_altsetting->desc.bInterfaceNumber,
-                       NULL, 0, 1000 /* FIXME: arbitrary */);
+                       NULL, 0, USB_CTRL_SET_TIMEOUT);
 }
 
 /*
@@ -281,7 +281,7 @@ static void __hwahc_op_wusbhc_stop(struct wusbhc *wusbhc, 
int delay)
                              USB_DIR_OUT | USB_TYPE_CLASS | 
USB_RECIP_INTERFACE,
                              delay * 1000,
                              iface_no,
-                             NULL, 0, 1000 /* FIXME: arbitrary */);
+                             NULL, 0, USB_CTRL_SET_TIMEOUT);
        if (ret == 0)
                msleep(delay);
 
@@ -310,7 +310,7 @@ static int __hwahc_op_bwa_set(struct wusbhc *wusbhc, s8 
stream_index,
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        stream_index,
                        wa->usb_iface->cur_altsetting->desc.bInterfaceNumber,
-                       NULL, 0, 1000 /* FIXME: arbitrary */);
+                       NULL, 0, USB_CTRL_SET_TIMEOUT);
        if (result < 0) {
                dev_err(dev, "Cannot set WUSB stream index: %d\n", result);
                goto out;
@@ -321,7 +321,7 @@ static int __hwahc_op_bwa_set(struct wusbhc *wusbhc, s8 
stream_index,
                        WUSB_REQ_SET_WUSB_MAS,
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        0, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber,
-                       mas_le, 32, 1000 /* FIXME: arbitrary */);
+                       mas_le, 32, USB_CTRL_SET_TIMEOUT);
        if (result < 0)
                dev_err(dev, "Cannot set WUSB MAS allocation: %d\n", result);
 out:
@@ -355,7 +355,7 @@ static int __hwahc_op_mmcie_add(struct wusbhc *wusbhc, u8 
interval,
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        interval << 8 | repeat_cnt,
                        handle << 8 | iface_no,
-                       wuie, wuie->bLength, 1000 /* FIXME: arbitrary */);
+                       wuie, wuie->bLength, USB_CTRL_SET_TIMEOUT);
 }
 
 /*
@@ -372,7 +372,7 @@ static int __hwahc_op_mmcie_rm(struct wusbhc *wusbhc, u8 
handle)
                        WUSB_REQ_REMOVE_MMC_IE,
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        0, handle << 8 | iface_no,
-                       NULL, 0, 1000 /* FIXME: arbitrary */);
+                       NULL, 0, USB_CTRL_SET_TIMEOUT);
 }
 
 /*
@@ -415,7 +415,7 @@ static int __hwahc_op_dev_info_set(struct wusbhc *wusbhc,
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        0, wusb_dev->port_idx << 8 | iface_no,
                        dev_info, sizeof(struct hwa_dev_info),
-                       1000 /* FIXME: arbitrary */);
+                       USB_CTRL_SET_TIMEOUT);
        kfree(dev_info);
        return ret;
 }
@@ -455,7 +455,7 @@ static int __hwahc_dev_set_key(struct wusbhc *wusbhc, u8 
port_idx, u32 tkid,
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        USB_DT_KEY << 8 | key_idx,
                        port_idx << 8 | iface_no,
-                       keyd, keyd_len, 1000 /* FIXME: arbitrary */);
+                       keyd, keyd_len, USB_CTRL_SET_TIMEOUT);
 
        kzfree(keyd); /* clear keys etc. */
        return result;
@@ -497,7 +497,7 @@ static int __hwahc_op_set_ptk(struct wusbhc *wusbhc, u8 
port_idx, u32 tkid,
                        USB_REQ_SET_ENCRYPTION,
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        encryption_value, port_idx << 8 | iface_no,
-                       NULL, 0, 1000 /* FIXME: arbitrary */);
+                       NULL, 0, USB_CTRL_SET_TIMEOUT);
        if (result < 0)
                dev_err(wusbhc->dev, "Can't set host's WUSB encryption for "
                        "port index %u to %s (value %d): %d\n", port_idx,
diff --git a/drivers/usb/wusbcore/cbaf.c b/drivers/usb/wusbcore/cbaf.c
index f06ed82..56310fc 100644
--- a/drivers/usb/wusbcore/cbaf.c
+++ b/drivers/usb/wusbcore/cbaf.c
@@ -144,7 +144,7 @@ static int cbaf_check(struct cbaf *cbaf)
                CBAF_REQ_GET_ASSOCIATION_INFORMATION,
                USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                0, cbaf->usb_iface->cur_altsetting->desc.bInterfaceNumber,
-               cbaf->buffer, cbaf->buffer_size, 1000 /* FIXME: arbitrary */);
+               cbaf->buffer, cbaf->buffer_size, USB_CTRL_GET_TIMEOUT);
        if (result < 0) {
                dev_err(dev, "Cannot get available association types: %d\n",
                        result);
@@ -265,7 +265,7 @@ static int cbaf_send_host_info(struct cbaf *cbaf)
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        0x0101,
                        cbaf->usb_iface->cur_altsetting->desc.bInterfaceNumber,
-                       hi, hi_size, 1000 /* FIXME: arbitrary */);
+                       hi, hi_size, USB_CTRL_SET_TIMEOUT);
 }
 
 /*
@@ -288,7 +288,7 @@ static int cbaf_cdid_get(struct cbaf *cbaf)
                CBAF_REQ_GET_ASSOCIATION_REQUEST,
                USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                0x0200, cbaf->usb_iface->cur_altsetting->desc.bInterfaceNumber,
-               di, cbaf->buffer_size, 1000 /* FIXME: arbitrary */);
+               di, cbaf->buffer_size, USB_CTRL_GET_TIMEOUT);
        if (result < 0) {
                dev_err(dev, "Cannot request device information: %d\n", result);
                return result;
@@ -536,7 +536,7 @@ static int cbaf_cc_upload(struct cbaf *cbaf)
                CBAF_REQ_SET_ASSOCIATION_RESPONSE,
                USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                0x0201, cbaf->usb_iface->cur_altsetting->desc.bInterfaceNumber,
-               ccd, sizeof(*ccd), 1000 /* FIXME: arbitrary */);
+               ccd, sizeof(*ccd), USB_CTRL_SET_TIMEOUT);
 
        return result;
 }
diff --git a/drivers/usb/wusbcore/security.c b/drivers/usb/wusbcore/security.c
index 4c40d0d..790c0b5 100644
--- a/drivers/usb/wusbcore/security.c
+++ b/drivers/usb/wusbcore/security.c
@@ -165,7 +165,7 @@ static int wusb_dev_set_encryption(struct usb_device 
*usb_dev, int value)
        result = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
                        USB_REQ_SET_ENCRYPTION,
                        USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-                       value, 0, NULL, 0, 1000 /* FIXME: arbitrary */);
+                       value, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
        if (result < 0)
                dev_err(dev, "Can't set device's WUSB encryption to "
                        "%s (value %d): %d\n",
@@ -191,7 +191,7 @@ static int wusb_dev_set_gtk(struct wusbhc *wusbhc, struct 
wusb_dev *wusb_dev)
                USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
                USB_DT_KEY << 8 | key_index, 0,
                &wusbhc->gtk.descr, wusbhc->gtk.descr.bLength,
-               1000);
+               USB_CTRL_SET_TIMEOUT);
 }
 
 
@@ -301,8 +301,9 @@ int wusb_dev_update_address(struct wusbhc *wusbhc, struct 
wusb_dev *wusb_dev)
 
        /* Set address 0 */
        result = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
-                                USB_REQ_SET_ADDRESS, 0,
-                                0, 0, NULL, 0, 1000 /* FIXME: arbitrary */);
+                       USB_REQ_SET_ADDRESS,
+                       USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
+                        0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
        if (result < 0) {
                dev_err(dev, "auth failed: can't set address 0: %d\n",
                        result);
@@ -316,9 +317,10 @@ int wusb_dev_update_address(struct wusbhc *wusbhc, struct 
wusb_dev *wusb_dev)
 
        /* Set new (authenticated) address. */
        result = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0),
-                                USB_REQ_SET_ADDRESS, 0,
-                                new_address, 0, NULL, 0,
-                                1000 /* FIXME: arbitrary */);
+                       USB_REQ_SET_ADDRESS,
+                       USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
+                       new_address, 0, NULL, 0,
+                       USB_CTRL_SET_TIMEOUT);
        if (result < 0) {
                dev_err(dev, "auth failed: can't set address %u: %d\n",
                        new_address, result);
@@ -381,7 +383,7 @@ int wusb_dev_4way_handshake(struct wusbhc *wusbhc, struct 
wusb_dev *wusb_dev,
                usb_dev, usb_sndctrlpipe(usb_dev, 0),
                USB_REQ_SET_HANDSHAKE,
                USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-               1, 0, &hs[0], sizeof(hs[0]), 1000 /* FIXME: arbitrary */);
+               1, 0, &hs[0], sizeof(hs[0]), USB_CTRL_SET_TIMEOUT);
        if (result < 0) {
                dev_err(dev, "Handshake1: request failed: %d\n", result);
                goto error_hs1;
@@ -392,7 +394,7 @@ int wusb_dev_4way_handshake(struct wusbhc *wusbhc, struct 
wusb_dev *wusb_dev,
                usb_dev, usb_rcvctrlpipe(usb_dev, 0),
                USB_REQ_GET_HANDSHAKE,
                USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-               2, 0, &hs[1], sizeof(hs[1]), 1000 /* FIXME: arbitrary */);
+               2, 0, &hs[1], sizeof(hs[1]), USB_CTRL_GET_TIMEOUT);
        if (result < 0) {
                dev_err(dev, "Handshake2: request failed: %d\n", result);
                goto error_hs2;
@@ -469,7 +471,7 @@ int wusb_dev_4way_handshake(struct wusbhc *wusbhc, struct 
wusb_dev *wusb_dev,
                usb_dev, usb_sndctrlpipe(usb_dev, 0),
                USB_REQ_SET_HANDSHAKE,
                USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE,
-               3, 0, &hs[2], sizeof(hs[2]), 1000 /* FIXME: arbitrary */);
+               3, 0, &hs[2], sizeof(hs[2]), USB_CTRL_SET_TIMEOUT);
        if (result < 0) {
                dev_err(dev, "Handshake3: request failed: %d\n", result);
                goto error_hs3;
diff --git a/drivers/usb/wusbcore/wa-hc.h b/drivers/usb/wusbcore/wa-hc.h
index 5b6ae3a..b93d2cb 100644
--- a/drivers/usb/wusbcore/wa-hc.h
+++ b/drivers/usb/wusbcore/wa-hc.h
@@ -366,7 +366,7 @@ static inline int __wa_feature(struct wahc *wa, unsigned 
op, u16 feature)
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                        feature,
                        wa->usb_iface->cur_altsetting->desc.bInterfaceNumber,
-                       NULL, 0, 1000 /* FIXME: arbitrary */);
+                       NULL, 0, USB_CTRL_SET_TIMEOUT);
 }
 
 
@@ -400,8 +400,7 @@ s32 __wa_get_status(struct wahc *wa)
                USB_REQ_GET_STATUS,
                USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
                0, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber,
-               &wa->status, sizeof(wa->status),
-               1000 /* FIXME: arbitrary */);
+               &wa->status, sizeof(wa->status), USB_CTRL_GET_TIMEOUT);
        if (result >= 0)
                result = wa->status;
        return result;
diff --git a/drivers/usb/wusbcore/wa-rpipe.c b/drivers/usb/wusbcore/wa-rpipe.c
index b48e74c..accdd15 100644
--- a/drivers/usb/wusbcore/wa-rpipe.c
+++ b/drivers/usb/wusbcore/wa-rpipe.c
@@ -80,7 +80,7 @@ static int __rpipe_get_descr(struct wahc *wa,
                USB_REQ_GET_DESCRIPTOR,
                USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_RPIPE,
                USB_DT_RPIPE<<8, index, descr, sizeof(*descr),
-               1000 /* FIXME: arbitrary */);
+               USB_CTRL_GET_TIMEOUT);
        if (result < 0) {
                dev_err(dev, "rpipe %u: get descriptor failed: %d\n",
                        index, (int)result);
@@ -118,7 +118,7 @@ static int __rpipe_set_descr(struct wahc *wa,
                USB_REQ_SET_DESCRIPTOR,
                USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_RPIPE,
                USB_DT_RPIPE<<8, index, descr, sizeof(*descr),
-               HZ / 10);
+               USB_CTRL_SET_TIMEOUT);
        if (result < 0) {
                dev_err(dev, "rpipe %u: set descriptor failed: %d\n",
                        index, (int)result);
@@ -237,7 +237,7 @@ static int __rpipe_reset(struct wahc *wa, unsigned index)
                wa->usb_dev, usb_sndctrlpipe(wa->usb_dev, 0),
                USB_REQ_RPIPE_RESET,
                USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_RPIPE,
-               0, index, NULL, 0, 1000 /* FIXME: arbitrary */);
+               0, index, NULL, 0, USB_CTRL_SET_TIMEOUT);
        if (result < 0)
                dev_err(dev, "rpipe %u: reset failed: %d\n",
                        index, result);
@@ -527,7 +527,7 @@ void rpipe_ep_disable(struct wahc *wa, struct 
usb_host_endpoint *ep)
                        wa->usb_dev, usb_rcvctrlpipe(wa->usb_dev, 0),
                        USB_REQ_RPIPE_ABORT,
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_RPIPE,
-                       0, index, NULL, 0, 1000 /* FIXME: arbitrary */);
+                       0, index, NULL, 0, USB_CTRL_SET_TIMEOUT);
                rpipe_put(rpipe);
        }
        mutex_unlock(&wa->rpipe_mutex);
@@ -548,7 +548,7 @@ void rpipe_clear_feature_stalled(struct wahc *wa, struct 
usb_host_endpoint *ep)
                        wa->usb_dev, usb_rcvctrlpipe(wa->usb_dev, 0),
                        USB_REQ_CLEAR_FEATURE,
                        USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_RPIPE,
-                       RPIPE_STALL, index, NULL, 0, 1000);
+                       RPIPE_STALL, index, NULL, 0, USB_CTRL_SET_TIMEOUT);
        }
        mutex_unlock(&wa->rpipe_mutex);
 }
-- 
1.7.10.4

--
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

Reply via email to