|
@@ -60,7 +60,8 @@ MODULE_LICENSE("GPL");
|
|
|
|
|
|
#define CHAOSKEY_BUF_LEN 64 /* max size of USB full speed packet */
|
|
|
|
|
|
-#define NAK_TIMEOUT (HZ) /* stall/wait timeout for device */
|
|
|
+#define NAK_TIMEOUT (HZ) /* normal stall/wait timeout */
|
|
|
+#define ALEA_FIRST_TIMEOUT (HZ*3) /* first stall/wait timeout for Alea */
|
|
|
|
|
|
#ifdef CONFIG_USB_DYNAMIC_MINORS
|
|
|
#define USB_CHAOSKEY_MINOR_BASE 0
|
|
@@ -88,6 +89,7 @@ struct chaoskey {
|
|
|
int open; /* open count */
|
|
|
bool present; /* device not disconnected */
|
|
|
bool reading; /* ongoing IO */
|
|
|
+ bool reads_started; /* track first read for Alea */
|
|
|
int size; /* size of buf */
|
|
|
int valid; /* bytes of buf read */
|
|
|
int used; /* bytes of buf consumed */
|
|
@@ -192,6 +194,9 @@ static int chaoskey_probe(struct usb_interface *interface,
|
|
|
|
|
|
dev->in_ep = in_ep;
|
|
|
|
|
|
+ if (udev->descriptor.idVendor != ALEA_VENDOR_ID)
|
|
|
+ dev->reads_started = 1;
|
|
|
+
|
|
|
dev->size = size;
|
|
|
dev->present = 1;
|
|
|
|
|
@@ -361,6 +366,7 @@ static int _chaoskey_fill(struct chaoskey *dev)
|
|
|
{
|
|
|
DEFINE_WAIT(wait);
|
|
|
int result;
|
|
|
+ bool started;
|
|
|
|
|
|
usb_dbg(dev->interface, "fill");
|
|
|
|
|
@@ -393,10 +399,17 @@ static int _chaoskey_fill(struct chaoskey *dev)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ /* The first read on the Alea takes a little under 2 seconds.
|
|
|
+ * Reads after the first read take only a few microseconds
|
|
|
+ * though. Presumably the entropy-generating circuit needs
|
|
|
+ * time to ramp up. So, we wait longer on the first read.
|
|
|
+ */
|
|
|
+ started = dev->reads_started;
|
|
|
+ dev->reads_started = true;
|
|
|
result = wait_event_interruptible_timeout(
|
|
|
dev->wait_q,
|
|
|
!dev->reading,
|
|
|
- NAK_TIMEOUT);
|
|
|
+ (started ? NAK_TIMEOUT : ALEA_FIRST_TIMEOUT) );
|
|
|
|
|
|
if (result < 0)
|
|
|
goto out;
|