xref: /OK3568_Linux_fs/kernel/drivers/usb/misc/chaoskey.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * chaoskey - driver for ChaosKey device from Altus Metrum.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This device provides true random numbers using a noise source based
6*4882a593Smuzhiyun  * on a reverse-biased p-n junction in avalanche breakdown. More
7*4882a593Smuzhiyun  * details can be found at http://chaoskey.org
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * The driver connects to the kernel hardware RNG interface to provide
10*4882a593Smuzhiyun  * entropy for /dev/random and other kernel activities. It also offers
11*4882a593Smuzhiyun  * a separate /dev/ entry to allow for direct access to the random
12*4882a593Smuzhiyun  * bit stream.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * Copyright © 2015 Keith Packard <keithp@keithp.com>
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <linux/module.h>
18*4882a593Smuzhiyun #include <linux/slab.h>
19*4882a593Smuzhiyun #include <linux/usb.h>
20*4882a593Smuzhiyun #include <linux/wait.h>
21*4882a593Smuzhiyun #include <linux/hw_random.h>
22*4882a593Smuzhiyun #include <linux/mutex.h>
23*4882a593Smuzhiyun #include <linux/uaccess.h>
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun static struct usb_driver chaoskey_driver;
26*4882a593Smuzhiyun static struct usb_class_driver chaoskey_class;
27*4882a593Smuzhiyun static int chaoskey_rng_read(struct hwrng *rng, void *data,
28*4882a593Smuzhiyun 			     size_t max, bool wait);
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define usb_dbg(usb_if, format, arg...) \
31*4882a593Smuzhiyun 	dev_dbg(&(usb_if)->dev, format, ## arg)
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define usb_err(usb_if, format, arg...) \
34*4882a593Smuzhiyun 	dev_err(&(usb_if)->dev, format, ## arg)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* Version Information */
37*4882a593Smuzhiyun #define DRIVER_AUTHOR	"Keith Packard, keithp@keithp.com"
38*4882a593Smuzhiyun #define DRIVER_DESC	"Altus Metrum ChaosKey driver"
39*4882a593Smuzhiyun #define DRIVER_SHORT	"chaoskey"
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun MODULE_AUTHOR(DRIVER_AUTHOR);
42*4882a593Smuzhiyun MODULE_DESCRIPTION(DRIVER_DESC);
43*4882a593Smuzhiyun MODULE_LICENSE("GPL");
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define CHAOSKEY_VENDOR_ID	0x1d50	/* OpenMoko */
46*4882a593Smuzhiyun #define CHAOSKEY_PRODUCT_ID	0x60c6	/* ChaosKey */
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define ALEA_VENDOR_ID		0x12d8	/* Araneus */
49*4882a593Smuzhiyun #define ALEA_PRODUCT_ID		0x0001	/* Alea I */
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define CHAOSKEY_BUF_LEN	64	/* max size of USB full speed packet */
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define NAK_TIMEOUT (HZ)		/* normal stall/wait timeout */
54*4882a593Smuzhiyun #define ALEA_FIRST_TIMEOUT (HZ*3)	/* first stall/wait timeout for Alea */
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #ifdef CONFIG_USB_DYNAMIC_MINORS
57*4882a593Smuzhiyun #define USB_CHAOSKEY_MINOR_BASE 0
58*4882a593Smuzhiyun #else
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /* IOWARRIOR_MINOR_BASE + 16, not official yet */
61*4882a593Smuzhiyun #define USB_CHAOSKEY_MINOR_BASE 224
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun static const struct usb_device_id chaoskey_table[] = {
65*4882a593Smuzhiyun 	{ USB_DEVICE(CHAOSKEY_VENDOR_ID, CHAOSKEY_PRODUCT_ID) },
66*4882a593Smuzhiyun 	{ USB_DEVICE(ALEA_VENDOR_ID, ALEA_PRODUCT_ID) },
67*4882a593Smuzhiyun 	{ },
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun MODULE_DEVICE_TABLE(usb, chaoskey_table);
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun static void chaos_read_callback(struct urb *urb);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun /* Driver-local specific stuff */
74*4882a593Smuzhiyun struct chaoskey {
75*4882a593Smuzhiyun 	struct usb_interface *interface;
76*4882a593Smuzhiyun 	char in_ep;
77*4882a593Smuzhiyun 	struct mutex lock;
78*4882a593Smuzhiyun 	struct mutex rng_lock;
79*4882a593Smuzhiyun 	int open;			/* open count */
80*4882a593Smuzhiyun 	bool present;			/* device not disconnected */
81*4882a593Smuzhiyun 	bool reading;			/* ongoing IO */
82*4882a593Smuzhiyun 	bool reads_started;		/* track first read for Alea */
83*4882a593Smuzhiyun 	int size;			/* size of buf */
84*4882a593Smuzhiyun 	int valid;			/* bytes of buf read */
85*4882a593Smuzhiyun 	int used;			/* bytes of buf consumed */
86*4882a593Smuzhiyun 	char *name;			/* product + serial */
87*4882a593Smuzhiyun 	struct hwrng hwrng;		/* Embedded struct for hwrng */
88*4882a593Smuzhiyun 	int hwrng_registered;		/* registered with hwrng API */
89*4882a593Smuzhiyun 	wait_queue_head_t wait_q;	/* for timeouts */
90*4882a593Smuzhiyun 	struct urb *urb;		/* for performing IO */
91*4882a593Smuzhiyun 	char *buf;
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun 
chaoskey_free(struct chaoskey * dev)94*4882a593Smuzhiyun static void chaoskey_free(struct chaoskey *dev)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 	if (dev) {
97*4882a593Smuzhiyun 		usb_dbg(dev->interface, "free");
98*4882a593Smuzhiyun 		usb_free_urb(dev->urb);
99*4882a593Smuzhiyun 		kfree(dev->name);
100*4882a593Smuzhiyun 		kfree(dev->buf);
101*4882a593Smuzhiyun 		usb_put_intf(dev->interface);
102*4882a593Smuzhiyun 		kfree(dev);
103*4882a593Smuzhiyun 	}
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun 
chaoskey_probe(struct usb_interface * interface,const struct usb_device_id * id)106*4882a593Smuzhiyun static int chaoskey_probe(struct usb_interface *interface,
107*4882a593Smuzhiyun 			  const struct usb_device_id *id)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun 	struct usb_device *udev = interface_to_usbdev(interface);
110*4882a593Smuzhiyun 	struct usb_host_interface *altsetting = interface->cur_altsetting;
111*4882a593Smuzhiyun 	struct usb_endpoint_descriptor *epd;
112*4882a593Smuzhiyun 	int in_ep;
113*4882a593Smuzhiyun 	struct chaoskey *dev;
114*4882a593Smuzhiyun 	int result = -ENOMEM;
115*4882a593Smuzhiyun 	int size;
116*4882a593Smuzhiyun 	int res;
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	usb_dbg(interface, "probe %s-%s", udev->product, udev->serial);
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	/* Find the first bulk IN endpoint and its packet size */
121*4882a593Smuzhiyun 	res = usb_find_bulk_in_endpoint(altsetting, &epd);
122*4882a593Smuzhiyun 	if (res) {
123*4882a593Smuzhiyun 		usb_dbg(interface, "no IN endpoint found");
124*4882a593Smuzhiyun 		return res;
125*4882a593Smuzhiyun 	}
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	in_ep = usb_endpoint_num(epd);
128*4882a593Smuzhiyun 	size = usb_endpoint_maxp(epd);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	/* Validate endpoint and size */
131*4882a593Smuzhiyun 	if (size <= 0) {
132*4882a593Smuzhiyun 		usb_dbg(interface, "invalid size (%d)", size);
133*4882a593Smuzhiyun 		return -ENODEV;
134*4882a593Smuzhiyun 	}
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	if (size > CHAOSKEY_BUF_LEN) {
137*4882a593Smuzhiyun 		usb_dbg(interface, "size reduced from %d to %d\n",
138*4882a593Smuzhiyun 			size, CHAOSKEY_BUF_LEN);
139*4882a593Smuzhiyun 		size = CHAOSKEY_BUF_LEN;
140*4882a593Smuzhiyun 	}
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	/* Looks good, allocate and initialize */
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	dev = kzalloc(sizeof(struct chaoskey), GFP_KERNEL);
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 	if (dev == NULL)
147*4882a593Smuzhiyun 		goto out;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	dev->interface = usb_get_intf(interface);
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	dev->buf = kmalloc(size, GFP_KERNEL);
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	if (dev->buf == NULL)
154*4882a593Smuzhiyun 		goto out;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	dev->urb = usb_alloc_urb(0, GFP_KERNEL);
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	if (!dev->urb)
159*4882a593Smuzhiyun 		goto out;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	usb_fill_bulk_urb(dev->urb,
162*4882a593Smuzhiyun 		udev,
163*4882a593Smuzhiyun 		usb_rcvbulkpipe(udev, in_ep),
164*4882a593Smuzhiyun 		dev->buf,
165*4882a593Smuzhiyun 		size,
166*4882a593Smuzhiyun 		chaos_read_callback,
167*4882a593Smuzhiyun 		dev);
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	/* Construct a name using the product and serial values. Each
170*4882a593Smuzhiyun 	 * device needs a unique name for the hwrng code
171*4882a593Smuzhiyun 	 */
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	if (udev->product && udev->serial) {
174*4882a593Smuzhiyun 		dev->name = kasprintf(GFP_KERNEL, "%s-%s", udev->product,
175*4882a593Smuzhiyun 				      udev->serial);
176*4882a593Smuzhiyun 		if (dev->name == NULL)
177*4882a593Smuzhiyun 			goto out;
178*4882a593Smuzhiyun 	}
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	dev->in_ep = in_ep;
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	if (le16_to_cpu(udev->descriptor.idVendor) != ALEA_VENDOR_ID)
183*4882a593Smuzhiyun 		dev->reads_started = true;
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 	dev->size = size;
186*4882a593Smuzhiyun 	dev->present = true;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	init_waitqueue_head(&dev->wait_q);
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	mutex_init(&dev->lock);
191*4882a593Smuzhiyun 	mutex_init(&dev->rng_lock);
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	usb_set_intfdata(interface, dev);
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	result = usb_register_dev(interface, &chaoskey_class);
196*4882a593Smuzhiyun 	if (result) {
197*4882a593Smuzhiyun 		usb_err(interface, "Unable to allocate minor number.");
198*4882a593Smuzhiyun 		goto out;
199*4882a593Smuzhiyun 	}
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	dev->hwrng.name = dev->name ? dev->name : chaoskey_driver.name;
202*4882a593Smuzhiyun 	dev->hwrng.read = chaoskey_rng_read;
203*4882a593Smuzhiyun 	dev->hwrng.quality = 1024;
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	dev->hwrng_registered = (hwrng_register(&dev->hwrng) == 0);
206*4882a593Smuzhiyun 	if (!dev->hwrng_registered)
207*4882a593Smuzhiyun 		usb_err(interface, "Unable to register with hwrng");
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	usb_enable_autosuspend(udev);
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	usb_dbg(interface, "chaoskey probe success, size %d", dev->size);
212*4882a593Smuzhiyun 	return 0;
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun out:
215*4882a593Smuzhiyun 	usb_set_intfdata(interface, NULL);
216*4882a593Smuzhiyun 	chaoskey_free(dev);
217*4882a593Smuzhiyun 	return result;
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun 
chaoskey_disconnect(struct usb_interface * interface)220*4882a593Smuzhiyun static void chaoskey_disconnect(struct usb_interface *interface)
221*4882a593Smuzhiyun {
222*4882a593Smuzhiyun 	struct chaoskey	*dev;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	usb_dbg(interface, "disconnect");
225*4882a593Smuzhiyun 	dev = usb_get_intfdata(interface);
226*4882a593Smuzhiyun 	if (!dev) {
227*4882a593Smuzhiyun 		usb_dbg(interface, "disconnect failed - no dev");
228*4882a593Smuzhiyun 		return;
229*4882a593Smuzhiyun 	}
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	if (dev->hwrng_registered)
232*4882a593Smuzhiyun 		hwrng_unregister(&dev->hwrng);
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	usb_deregister_dev(interface, &chaoskey_class);
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	usb_set_intfdata(interface, NULL);
237*4882a593Smuzhiyun 	mutex_lock(&dev->lock);
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	dev->present = false;
240*4882a593Smuzhiyun 	usb_poison_urb(dev->urb);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	if (!dev->open) {
243*4882a593Smuzhiyun 		mutex_unlock(&dev->lock);
244*4882a593Smuzhiyun 		chaoskey_free(dev);
245*4882a593Smuzhiyun 	} else
246*4882a593Smuzhiyun 		mutex_unlock(&dev->lock);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	usb_dbg(interface, "disconnect done");
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun 
chaoskey_open(struct inode * inode,struct file * file)251*4882a593Smuzhiyun static int chaoskey_open(struct inode *inode, struct file *file)
252*4882a593Smuzhiyun {
253*4882a593Smuzhiyun 	struct chaoskey *dev;
254*4882a593Smuzhiyun 	struct usb_interface *interface;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	/* get the interface from minor number and driver information */
257*4882a593Smuzhiyun 	interface = usb_find_interface(&chaoskey_driver, iminor(inode));
258*4882a593Smuzhiyun 	if (!interface)
259*4882a593Smuzhiyun 		return -ENODEV;
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	usb_dbg(interface, "open");
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	dev = usb_get_intfdata(interface);
264*4882a593Smuzhiyun 	if (!dev) {
265*4882a593Smuzhiyun 		usb_dbg(interface, "open (dev)");
266*4882a593Smuzhiyun 		return -ENODEV;
267*4882a593Smuzhiyun 	}
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun 	file->private_data = dev;
270*4882a593Smuzhiyun 	mutex_lock(&dev->lock);
271*4882a593Smuzhiyun 	++dev->open;
272*4882a593Smuzhiyun 	mutex_unlock(&dev->lock);
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	usb_dbg(interface, "open success");
275*4882a593Smuzhiyun 	return 0;
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun 
chaoskey_release(struct inode * inode,struct file * file)278*4882a593Smuzhiyun static int chaoskey_release(struct inode *inode, struct file *file)
279*4882a593Smuzhiyun {
280*4882a593Smuzhiyun 	struct chaoskey *dev = file->private_data;
281*4882a593Smuzhiyun 	struct usb_interface *interface;
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	if (dev == NULL)
284*4882a593Smuzhiyun 		return -ENODEV;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	interface = dev->interface;
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	usb_dbg(interface, "release");
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	mutex_lock(&dev->lock);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	usb_dbg(interface, "open count at release is %d", dev->open);
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 	if (dev->open <= 0) {
295*4882a593Smuzhiyun 		usb_dbg(interface, "invalid open count (%d)", dev->open);
296*4882a593Smuzhiyun 		mutex_unlock(&dev->lock);
297*4882a593Smuzhiyun 		return -ENODEV;
298*4882a593Smuzhiyun 	}
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	--dev->open;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	if (!dev->present) {
303*4882a593Smuzhiyun 		if (dev->open == 0) {
304*4882a593Smuzhiyun 			mutex_unlock(&dev->lock);
305*4882a593Smuzhiyun 			chaoskey_free(dev);
306*4882a593Smuzhiyun 		} else
307*4882a593Smuzhiyun 			mutex_unlock(&dev->lock);
308*4882a593Smuzhiyun 	} else
309*4882a593Smuzhiyun 		mutex_unlock(&dev->lock);
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	usb_dbg(interface, "release success");
312*4882a593Smuzhiyun 	return 0;
313*4882a593Smuzhiyun }
314*4882a593Smuzhiyun 
chaos_read_callback(struct urb * urb)315*4882a593Smuzhiyun static void chaos_read_callback(struct urb *urb)
316*4882a593Smuzhiyun {
317*4882a593Smuzhiyun 	struct chaoskey *dev = urb->context;
318*4882a593Smuzhiyun 	int status = urb->status;
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	usb_dbg(dev->interface, "callback status (%d)", status);
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	if (status == 0)
323*4882a593Smuzhiyun 		dev->valid = urb->actual_length;
324*4882a593Smuzhiyun 	else
325*4882a593Smuzhiyun 		dev->valid = 0;
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	dev->used = 0;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 	/* must be seen first before validity is announced */
330*4882a593Smuzhiyun 	smp_wmb();
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	dev->reading = false;
333*4882a593Smuzhiyun 	wake_up(&dev->wait_q);
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun /* Fill the buffer. Called with dev->lock held
337*4882a593Smuzhiyun  */
_chaoskey_fill(struct chaoskey * dev)338*4882a593Smuzhiyun static int _chaoskey_fill(struct chaoskey *dev)
339*4882a593Smuzhiyun {
340*4882a593Smuzhiyun 	DEFINE_WAIT(wait);
341*4882a593Smuzhiyun 	int result;
342*4882a593Smuzhiyun 	bool started;
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 	usb_dbg(dev->interface, "fill");
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun 	/* Return immediately if someone called before the buffer was
347*4882a593Smuzhiyun 	 * empty */
348*4882a593Smuzhiyun 	if (dev->valid != dev->used) {
349*4882a593Smuzhiyun 		usb_dbg(dev->interface, "not empty yet (valid %d used %d)",
350*4882a593Smuzhiyun 			dev->valid, dev->used);
351*4882a593Smuzhiyun 		return 0;
352*4882a593Smuzhiyun 	}
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	/* Bail if the device has been removed */
355*4882a593Smuzhiyun 	if (!dev->present) {
356*4882a593Smuzhiyun 		usb_dbg(dev->interface, "device not present");
357*4882a593Smuzhiyun 		return -ENODEV;
358*4882a593Smuzhiyun 	}
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 	/* Make sure the device is awake */
361*4882a593Smuzhiyun 	result = usb_autopm_get_interface(dev->interface);
362*4882a593Smuzhiyun 	if (result) {
363*4882a593Smuzhiyun 		usb_dbg(dev->interface, "wakeup failed (result %d)", result);
364*4882a593Smuzhiyun 		return result;
365*4882a593Smuzhiyun 	}
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 	dev->reading = true;
368*4882a593Smuzhiyun 	result = usb_submit_urb(dev->urb, GFP_KERNEL);
369*4882a593Smuzhiyun 	if (result < 0) {
370*4882a593Smuzhiyun 		result = usb_translate_errors(result);
371*4882a593Smuzhiyun 		dev->reading = false;
372*4882a593Smuzhiyun 		goto out;
373*4882a593Smuzhiyun 	}
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun 	/* The first read on the Alea takes a little under 2 seconds.
376*4882a593Smuzhiyun 	 * Reads after the first read take only a few microseconds
377*4882a593Smuzhiyun 	 * though.  Presumably the entropy-generating circuit needs
378*4882a593Smuzhiyun 	 * time to ramp up.  So, we wait longer on the first read.
379*4882a593Smuzhiyun 	 */
380*4882a593Smuzhiyun 	started = dev->reads_started;
381*4882a593Smuzhiyun 	dev->reads_started = true;
382*4882a593Smuzhiyun 	result = wait_event_interruptible_timeout(
383*4882a593Smuzhiyun 		dev->wait_q,
384*4882a593Smuzhiyun 		!dev->reading,
385*4882a593Smuzhiyun 		(started ? NAK_TIMEOUT : ALEA_FIRST_TIMEOUT) );
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 	if (result < 0) {
388*4882a593Smuzhiyun 		usb_kill_urb(dev->urb);
389*4882a593Smuzhiyun 		goto out;
390*4882a593Smuzhiyun 	}
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 	if (result == 0) {
393*4882a593Smuzhiyun 		result = -ETIMEDOUT;
394*4882a593Smuzhiyun 		usb_kill_urb(dev->urb);
395*4882a593Smuzhiyun 	} else {
396*4882a593Smuzhiyun 		result = dev->valid;
397*4882a593Smuzhiyun 	}
398*4882a593Smuzhiyun out:
399*4882a593Smuzhiyun 	/* Let the device go back to sleep eventually */
400*4882a593Smuzhiyun 	usb_autopm_put_interface(dev->interface);
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun 	usb_dbg(dev->interface, "read %d bytes", dev->valid);
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun 	return result;
405*4882a593Smuzhiyun }
406*4882a593Smuzhiyun 
chaoskey_read(struct file * file,char __user * buffer,size_t count,loff_t * ppos)407*4882a593Smuzhiyun static ssize_t chaoskey_read(struct file *file,
408*4882a593Smuzhiyun 			     char __user *buffer,
409*4882a593Smuzhiyun 			     size_t count,
410*4882a593Smuzhiyun 			     loff_t *ppos)
411*4882a593Smuzhiyun {
412*4882a593Smuzhiyun 	struct chaoskey *dev;
413*4882a593Smuzhiyun 	ssize_t read_count = 0;
414*4882a593Smuzhiyun 	int this_time;
415*4882a593Smuzhiyun 	int result = 0;
416*4882a593Smuzhiyun 	unsigned long remain;
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 	dev = file->private_data;
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 	if (dev == NULL || !dev->present)
421*4882a593Smuzhiyun 		return -ENODEV;
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 	usb_dbg(dev->interface, "read %zu", count);
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	while (count > 0) {
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 		/* Grab the rng_lock briefly to ensure that the hwrng interface
428*4882a593Smuzhiyun 		 * gets priority over other user access
429*4882a593Smuzhiyun 		 */
430*4882a593Smuzhiyun 		result = mutex_lock_interruptible(&dev->rng_lock);
431*4882a593Smuzhiyun 		if (result)
432*4882a593Smuzhiyun 			goto bail;
433*4882a593Smuzhiyun 		mutex_unlock(&dev->rng_lock);
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun 		result = mutex_lock_interruptible(&dev->lock);
436*4882a593Smuzhiyun 		if (result)
437*4882a593Smuzhiyun 			goto bail;
438*4882a593Smuzhiyun 		if (dev->valid == dev->used) {
439*4882a593Smuzhiyun 			result = _chaoskey_fill(dev);
440*4882a593Smuzhiyun 			if (result < 0) {
441*4882a593Smuzhiyun 				mutex_unlock(&dev->lock);
442*4882a593Smuzhiyun 				goto bail;
443*4882a593Smuzhiyun 			}
444*4882a593Smuzhiyun 		}
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 		this_time = dev->valid - dev->used;
447*4882a593Smuzhiyun 		if (this_time > count)
448*4882a593Smuzhiyun 			this_time = count;
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun 		remain = copy_to_user(buffer, dev->buf + dev->used, this_time);
451*4882a593Smuzhiyun 		if (remain) {
452*4882a593Smuzhiyun 			result = -EFAULT;
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun 			/* Consume the bytes that were copied so we don't leak
455*4882a593Smuzhiyun 			 * data to user space
456*4882a593Smuzhiyun 			 */
457*4882a593Smuzhiyun 			dev->used += this_time - remain;
458*4882a593Smuzhiyun 			mutex_unlock(&dev->lock);
459*4882a593Smuzhiyun 			goto bail;
460*4882a593Smuzhiyun 		}
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 		count -= this_time;
463*4882a593Smuzhiyun 		read_count += this_time;
464*4882a593Smuzhiyun 		buffer += this_time;
465*4882a593Smuzhiyun 		dev->used += this_time;
466*4882a593Smuzhiyun 		mutex_unlock(&dev->lock);
467*4882a593Smuzhiyun 	}
468*4882a593Smuzhiyun bail:
469*4882a593Smuzhiyun 	if (read_count) {
470*4882a593Smuzhiyun 		usb_dbg(dev->interface, "read %zu bytes", read_count);
471*4882a593Smuzhiyun 		return read_count;
472*4882a593Smuzhiyun 	}
473*4882a593Smuzhiyun 	usb_dbg(dev->interface, "empty read, result %d", result);
474*4882a593Smuzhiyun 	if (result == -ETIMEDOUT)
475*4882a593Smuzhiyun 		result = -EAGAIN;
476*4882a593Smuzhiyun 	return result;
477*4882a593Smuzhiyun }
478*4882a593Smuzhiyun 
chaoskey_rng_read(struct hwrng * rng,void * data,size_t max,bool wait)479*4882a593Smuzhiyun static int chaoskey_rng_read(struct hwrng *rng, void *data,
480*4882a593Smuzhiyun 			     size_t max, bool wait)
481*4882a593Smuzhiyun {
482*4882a593Smuzhiyun 	struct chaoskey *dev = container_of(rng, struct chaoskey, hwrng);
483*4882a593Smuzhiyun 	int this_time;
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 	usb_dbg(dev->interface, "rng_read max %zu wait %d", max, wait);
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun 	if (!dev->present) {
488*4882a593Smuzhiyun 		usb_dbg(dev->interface, "device not present");
489*4882a593Smuzhiyun 		return 0;
490*4882a593Smuzhiyun 	}
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	/* Hold the rng_lock until we acquire the device lock so that
493*4882a593Smuzhiyun 	 * this operation gets priority over other user access to the
494*4882a593Smuzhiyun 	 * device
495*4882a593Smuzhiyun 	 */
496*4882a593Smuzhiyun 	mutex_lock(&dev->rng_lock);
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 	mutex_lock(&dev->lock);
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun 	mutex_unlock(&dev->rng_lock);
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun 	/* Try to fill the buffer if empty. It doesn't actually matter
503*4882a593Smuzhiyun 	 * if _chaoskey_fill works; we'll just return zero bytes as
504*4882a593Smuzhiyun 	 * the buffer will still be empty
505*4882a593Smuzhiyun 	 */
506*4882a593Smuzhiyun 	if (dev->valid == dev->used)
507*4882a593Smuzhiyun 		(void) _chaoskey_fill(dev);
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun 	this_time = dev->valid - dev->used;
510*4882a593Smuzhiyun 	if (this_time > max)
511*4882a593Smuzhiyun 		this_time = max;
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun 	memcpy(data, dev->buf + dev->used, this_time);
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	dev->used += this_time;
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	mutex_unlock(&dev->lock);
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun 	usb_dbg(dev->interface, "rng_read this_time %d\n", this_time);
520*4882a593Smuzhiyun 	return this_time;
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun #ifdef CONFIG_PM
chaoskey_suspend(struct usb_interface * interface,pm_message_t message)524*4882a593Smuzhiyun static int chaoskey_suspend(struct usb_interface *interface,
525*4882a593Smuzhiyun 			    pm_message_t message)
526*4882a593Smuzhiyun {
527*4882a593Smuzhiyun 	usb_dbg(interface, "suspend");
528*4882a593Smuzhiyun 	return 0;
529*4882a593Smuzhiyun }
530*4882a593Smuzhiyun 
chaoskey_resume(struct usb_interface * interface)531*4882a593Smuzhiyun static int chaoskey_resume(struct usb_interface *interface)
532*4882a593Smuzhiyun {
533*4882a593Smuzhiyun 	struct chaoskey *dev;
534*4882a593Smuzhiyun 	struct usb_device *udev = interface_to_usbdev(interface);
535*4882a593Smuzhiyun 
536*4882a593Smuzhiyun 	usb_dbg(interface, "resume");
537*4882a593Smuzhiyun 	dev = usb_get_intfdata(interface);
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 	/*
540*4882a593Smuzhiyun 	 * We may have lost power.
541*4882a593Smuzhiyun 	 * In that case the device that needs a long time
542*4882a593Smuzhiyun 	 * for the first requests needs an extended timeout
543*4882a593Smuzhiyun 	 * again
544*4882a593Smuzhiyun 	 */
545*4882a593Smuzhiyun 	if (le16_to_cpu(udev->descriptor.idVendor) == ALEA_VENDOR_ID)
546*4882a593Smuzhiyun 		dev->reads_started = false;
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun 	return 0;
549*4882a593Smuzhiyun }
550*4882a593Smuzhiyun #else
551*4882a593Smuzhiyun #define chaoskey_suspend NULL
552*4882a593Smuzhiyun #define chaoskey_resume NULL
553*4882a593Smuzhiyun #endif
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun /* file operation pointers */
556*4882a593Smuzhiyun static const struct file_operations chaoskey_fops = {
557*4882a593Smuzhiyun 	.owner = THIS_MODULE,
558*4882a593Smuzhiyun 	.read = chaoskey_read,
559*4882a593Smuzhiyun 	.open = chaoskey_open,
560*4882a593Smuzhiyun 	.release = chaoskey_release,
561*4882a593Smuzhiyun 	.llseek = default_llseek,
562*4882a593Smuzhiyun };
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun /* class driver information */
565*4882a593Smuzhiyun static struct usb_class_driver chaoskey_class = {
566*4882a593Smuzhiyun 	.name = "chaoskey%d",
567*4882a593Smuzhiyun 	.fops = &chaoskey_fops,
568*4882a593Smuzhiyun 	.minor_base = USB_CHAOSKEY_MINOR_BASE,
569*4882a593Smuzhiyun };
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun /* usb specific object needed to register this driver with the usb subsystem */
572*4882a593Smuzhiyun static struct usb_driver chaoskey_driver = {
573*4882a593Smuzhiyun 	.name = DRIVER_SHORT,
574*4882a593Smuzhiyun 	.probe = chaoskey_probe,
575*4882a593Smuzhiyun 	.disconnect = chaoskey_disconnect,
576*4882a593Smuzhiyun 	.suspend = chaoskey_suspend,
577*4882a593Smuzhiyun 	.resume = chaoskey_resume,
578*4882a593Smuzhiyun 	.reset_resume = chaoskey_resume,
579*4882a593Smuzhiyun 	.id_table = chaoskey_table,
580*4882a593Smuzhiyun 	.supports_autosuspend = 1,
581*4882a593Smuzhiyun };
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun module_usb_driver(chaoskey_driver);
584*4882a593Smuzhiyun 
585