diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/applicom.c | 1 | ||||
-rw-r--r-- | drivers/char/hw_random/Kconfig | 101 | ||||
-rw-r--r-- | drivers/char/hw_random/Makefile | 1 | ||||
-rw-r--r-- | drivers/char/hw_random/core.c | 47 | ||||
-rw-r--r-- | drivers/char/hw_random/n2-drv.c | 24 | ||||
-rw-r--r-- | drivers/char/hw_random/omap-rng.c | 4 | ||||
-rw-r--r-- | drivers/char/hw_random/picoxcell-rng.c | 181 | ||||
-rw-r--r-- | drivers/char/hw_random/timeriomem-rng.c | 4 | ||||
-rw-r--r-- | drivers/char/hw_random/virtio-rng.c | 115 | ||||
-rw-r--r-- | drivers/char/i8k.c | 4 | ||||
-rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 2 | ||||
-rw-r--r-- | drivers/char/random.c | 36 | ||||
-rw-r--r-- | drivers/char/raw.c | 8 | ||||
-rw-r--r-- | drivers/char/tpm/tpm_acpi.c | 4 | ||||
-rw-r--r-- | drivers/char/tpm/tpm_ppi.c | 8 |
15 files changed, 213 insertions, 327 deletions
diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c index 974321a2508d..14790304b84b 100644 --- a/drivers/char/applicom.c +++ b/drivers/char/applicom.c | |||
@@ -345,7 +345,6 @@ out: | |||
345 | free_irq(apbs[i].irq, &dummy); | 345 | free_irq(apbs[i].irq, &dummy); |
346 | iounmap(apbs[i].RamIO); | 346 | iounmap(apbs[i].RamIO); |
347 | } | 347 | } |
348 | pci_disable_device(dev); | ||
349 | return ret; | 348 | return ret; |
350 | } | 349 | } |
351 | 350 | ||
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig index 244759bbd7b7..836b061ced35 100644 --- a/drivers/char/hw_random/Kconfig +++ b/drivers/char/hw_random/Kconfig | |||
@@ -2,7 +2,7 @@ | |||
2 | # Hardware Random Number Generator (RNG) configuration | 2 | # Hardware Random Number Generator (RNG) configuration |
3 | # | 3 | # |
4 | 4 | ||
5 | config HW_RANDOM | 5 | menuconfig HW_RANDOM |
6 | tristate "Hardware Random Number Generator Core support" | 6 | tristate "Hardware Random Number Generator Core support" |
7 | default m | 7 | default m |
8 | ---help--- | 8 | ---help--- |
@@ -20,9 +20,11 @@ config HW_RANDOM | |||
20 | 20 | ||
21 | If unsure, say Y. | 21 | If unsure, say Y. |
22 | 22 | ||
23 | if HW_RANDOM | ||
24 | |||
23 | config HW_RANDOM_TIMERIOMEM | 25 | config HW_RANDOM_TIMERIOMEM |
24 | tristate "Timer IOMEM HW Random Number Generator support" | 26 | tristate "Timer IOMEM HW Random Number Generator support" |
25 | depends on HW_RANDOM && HAS_IOMEM | 27 | depends on HAS_IOMEM |
26 | ---help--- | 28 | ---help--- |
27 | This driver provides kernel-side support for a generic Random | 29 | This driver provides kernel-side support for a generic Random |
28 | Number Generator used by reading a 'dumb' iomem address that | 30 | Number Generator used by reading a 'dumb' iomem address that |
@@ -36,7 +38,7 @@ config HW_RANDOM_TIMERIOMEM | |||
36 | 38 | ||
37 | config HW_RANDOM_INTEL | 39 | config HW_RANDOM_INTEL |
38 | tristate "Intel HW Random Number Generator support" | 40 | tristate "Intel HW Random Number Generator support" |
39 | depends on HW_RANDOM && (X86 || IA64) && PCI | 41 | depends on (X86 || IA64) && PCI |
40 | default HW_RANDOM | 42 | default HW_RANDOM |
41 | ---help--- | 43 | ---help--- |
42 | This driver provides kernel-side support for the Random Number | 44 | This driver provides kernel-side support for the Random Number |
@@ -49,7 +51,7 @@ config HW_RANDOM_INTEL | |||
49 | 51 | ||
50 | config HW_RANDOM_AMD | 52 | config HW_RANDOM_AMD |
51 | tristate "AMD HW Random Number Generator support" | 53 | tristate "AMD HW Random Number Generator support" |
52 | depends on HW_RANDOM && (X86 || PPC_MAPLE) && PCI | 54 | depends on (X86 || PPC_MAPLE) && PCI |
53 | default HW_RANDOM | 55 | default HW_RANDOM |
54 | ---help--- | 56 | ---help--- |
55 | This driver provides kernel-side support for the Random Number | 57 | This driver provides kernel-side support for the Random Number |
@@ -62,8 +64,8 @@ config HW_RANDOM_AMD | |||
62 | 64 | ||
63 | config HW_RANDOM_ATMEL | 65 | config HW_RANDOM_ATMEL |
64 | tristate "Atmel Random Number Generator support" | 66 | tristate "Atmel Random Number Generator support" |
65 | depends on HW_RANDOM && HAVE_CLK | 67 | depends on ARCH_AT91 && HAVE_CLK |
66 | default (HW_RANDOM && ARCH_AT91) | 68 | default HW_RANDOM |
67 | ---help--- | 69 | ---help--- |
68 | This driver provides kernel-side support for the Random Number | 70 | This driver provides kernel-side support for the Random Number |
69 | Generator hardware found on Atmel AT91 devices. | 71 | Generator hardware found on Atmel AT91 devices. |
@@ -75,7 +77,7 @@ config HW_RANDOM_ATMEL | |||
75 | 77 | ||
76 | config HW_RANDOM_BCM63XX | 78 | config HW_RANDOM_BCM63XX |
77 | tristate "Broadcom BCM63xx Random Number Generator support" | 79 | tristate "Broadcom BCM63xx Random Number Generator support" |
78 | depends on HW_RANDOM && BCM63XX | 80 | depends on BCM63XX |
79 | default HW_RANDOM | 81 | default HW_RANDOM |
80 | ---help--- | 82 | ---help--- |
81 | This driver provides kernel-side support for the Random Number | 83 | This driver provides kernel-side support for the Random Number |
@@ -88,7 +90,7 @@ config HW_RANDOM_BCM63XX | |||
88 | 90 | ||
89 | config HW_RANDOM_BCM2835 | 91 | config HW_RANDOM_BCM2835 |
90 | tristate "Broadcom BCM2835 Random Number Generator support" | 92 | tristate "Broadcom BCM2835 Random Number Generator support" |
91 | depends on HW_RANDOM && ARCH_BCM2835 | 93 | depends on ARCH_BCM2835 |
92 | default HW_RANDOM | 94 | default HW_RANDOM |
93 | ---help--- | 95 | ---help--- |
94 | This driver provides kernel-side support for the Random Number | 96 | This driver provides kernel-side support for the Random Number |
@@ -101,7 +103,7 @@ config HW_RANDOM_BCM2835 | |||
101 | 103 | ||
102 | config HW_RANDOM_GEODE | 104 | config HW_RANDOM_GEODE |
103 | tristate "AMD Geode HW Random Number Generator support" | 105 | tristate "AMD Geode HW Random Number Generator support" |
104 | depends on HW_RANDOM && X86_32 && PCI | 106 | depends on X86_32 && PCI |
105 | default HW_RANDOM | 107 | default HW_RANDOM |
106 | ---help--- | 108 | ---help--- |
107 | This driver provides kernel-side support for the Random Number | 109 | This driver provides kernel-side support for the Random Number |
@@ -114,7 +116,7 @@ config HW_RANDOM_GEODE | |||
114 | 116 | ||
115 | config HW_RANDOM_N2RNG | 117 | config HW_RANDOM_N2RNG |
116 | tristate "Niagara2 Random Number Generator support" | 118 | tristate "Niagara2 Random Number Generator support" |
117 | depends on HW_RANDOM && SPARC64 | 119 | depends on SPARC64 |
118 | default HW_RANDOM | 120 | default HW_RANDOM |
119 | ---help--- | 121 | ---help--- |
120 | This driver provides kernel-side support for the Random Number | 122 | This driver provides kernel-side support for the Random Number |
@@ -127,7 +129,7 @@ config HW_RANDOM_N2RNG | |||
127 | 129 | ||
128 | config HW_RANDOM_VIA | 130 | config HW_RANDOM_VIA |
129 | tristate "VIA HW Random Number Generator support" | 131 | tristate "VIA HW Random Number Generator support" |
130 | depends on HW_RANDOM && X86 | 132 | depends on X86 |
131 | default HW_RANDOM | 133 | default HW_RANDOM |
132 | ---help--- | 134 | ---help--- |
133 | This driver provides kernel-side support for the Random Number | 135 | This driver provides kernel-side support for the Random Number |
@@ -140,7 +142,7 @@ config HW_RANDOM_VIA | |||
140 | 142 | ||
141 | config HW_RANDOM_IXP4XX | 143 | config HW_RANDOM_IXP4XX |
142 | tristate "Intel IXP4xx NPU HW Pseudo-Random Number Generator support" | 144 | tristate "Intel IXP4xx NPU HW Pseudo-Random Number Generator support" |
143 | depends on HW_RANDOM && ARCH_IXP4XX | 145 | depends on ARCH_IXP4XX |
144 | default HW_RANDOM | 146 | default HW_RANDOM |
145 | ---help--- | 147 | ---help--- |
146 | This driver provides kernel-side support for the Pseudo-Random | 148 | This driver provides kernel-side support for the Pseudo-Random |
@@ -153,7 +155,7 @@ config HW_RANDOM_IXP4XX | |||
153 | 155 | ||
154 | config HW_RANDOM_OMAP | 156 | config HW_RANDOM_OMAP |
155 | tristate "OMAP Random Number Generator support" | 157 | tristate "OMAP Random Number Generator support" |
156 | depends on HW_RANDOM && (ARCH_OMAP16XX || ARCH_OMAP2PLUS) | 158 | depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS |
157 | default HW_RANDOM | 159 | default HW_RANDOM |
158 | ---help--- | 160 | ---help--- |
159 | This driver provides kernel-side support for the Random Number | 161 | This driver provides kernel-side support for the Random Number |
@@ -167,7 +169,7 @@ config HW_RANDOM_OMAP | |||
167 | 169 | ||
168 | config HW_RANDOM_OMAP3_ROM | 170 | config HW_RANDOM_OMAP3_ROM |
169 | tristate "OMAP3 ROM Random Number Generator support" | 171 | tristate "OMAP3 ROM Random Number Generator support" |
170 | depends on HW_RANDOM && ARCH_OMAP3 | 172 | depends on ARCH_OMAP3 |
171 | default HW_RANDOM | 173 | default HW_RANDOM |
172 | ---help--- | 174 | ---help--- |
173 | This driver provides kernel-side support for the Random Number | 175 | This driver provides kernel-side support for the Random Number |
@@ -180,7 +182,7 @@ config HW_RANDOM_OMAP3_ROM | |||
180 | 182 | ||
181 | config HW_RANDOM_OCTEON | 183 | config HW_RANDOM_OCTEON |
182 | tristate "Octeon Random Number Generator support" | 184 | tristate "Octeon Random Number Generator support" |
183 | depends on HW_RANDOM && CAVIUM_OCTEON_SOC | 185 | depends on CAVIUM_OCTEON_SOC |
184 | default HW_RANDOM | 186 | default HW_RANDOM |
185 | ---help--- | 187 | ---help--- |
186 | This driver provides kernel-side support for the Random Number | 188 | This driver provides kernel-side support for the Random Number |
@@ -193,7 +195,7 @@ config HW_RANDOM_OCTEON | |||
193 | 195 | ||
194 | config HW_RANDOM_PASEMI | 196 | config HW_RANDOM_PASEMI |
195 | tristate "PA Semi HW Random Number Generator support" | 197 | tristate "PA Semi HW Random Number Generator support" |
196 | depends on HW_RANDOM && PPC_PASEMI | 198 | depends on PPC_PASEMI |
197 | default HW_RANDOM | 199 | default HW_RANDOM |
198 | ---help--- | 200 | ---help--- |
199 | This driver provides kernel-side support for the Random Number | 201 | This driver provides kernel-side support for the Random Number |
@@ -206,7 +208,7 @@ config HW_RANDOM_PASEMI | |||
206 | 208 | ||
207 | config HW_RANDOM_VIRTIO | 209 | config HW_RANDOM_VIRTIO |
208 | tristate "VirtIO Random Number Generator support" | 210 | tristate "VirtIO Random Number Generator support" |
209 | depends on HW_RANDOM && VIRTIO | 211 | depends on VIRTIO |
210 | ---help--- | 212 | ---help--- |
211 | This driver provides kernel-side support for the virtual Random Number | 213 | This driver provides kernel-side support for the virtual Random Number |
212 | Generator hardware. | 214 | Generator hardware. |
@@ -216,7 +218,7 @@ config HW_RANDOM_VIRTIO | |||
216 | 218 | ||
217 | config HW_RANDOM_TX4939 | 219 | config HW_RANDOM_TX4939 |
218 | tristate "TX4939 Random Number Generator support" | 220 | tristate "TX4939 Random Number Generator support" |
219 | depends on HW_RANDOM && SOC_TX4939 | 221 | depends on SOC_TX4939 |
220 | default HW_RANDOM | 222 | default HW_RANDOM |
221 | ---help--- | 223 | ---help--- |
222 | This driver provides kernel-side support for the Random Number | 224 | This driver provides kernel-side support for the Random Number |
@@ -229,7 +231,8 @@ config HW_RANDOM_TX4939 | |||
229 | 231 | ||
230 | config HW_RANDOM_MXC_RNGA | 232 | config HW_RANDOM_MXC_RNGA |
231 | tristate "Freescale i.MX RNGA Random Number Generator" | 233 | tristate "Freescale i.MX RNGA Random Number Generator" |
232 | depends on HW_RANDOM && ARCH_HAS_RNGA | 234 | depends on ARCH_HAS_RNGA |
235 | default HW_RANDOM | ||
233 | ---help--- | 236 | ---help--- |
234 | This driver provides kernel-side support for the Random Number | 237 | This driver provides kernel-side support for the Random Number |
235 | Generator hardware found on Freescale i.MX processors. | 238 | Generator hardware found on Freescale i.MX processors. |
@@ -241,7 +244,8 @@ config HW_RANDOM_MXC_RNGA | |||
241 | 244 | ||
242 | config HW_RANDOM_NOMADIK | 245 | config HW_RANDOM_NOMADIK |
243 | tristate "ST-Ericsson Nomadik Random Number Generator support" | 246 | tristate "ST-Ericsson Nomadik Random Number Generator support" |
244 | depends on HW_RANDOM && ARCH_NOMADIK | 247 | depends on ARCH_NOMADIK |
248 | default HW_RANDOM | ||
245 | ---help--- | 249 | ---help--- |
246 | This driver provides kernel-side support for the Random Number | 250 | This driver provides kernel-side support for the Random Number |
247 | Generator hardware found on ST-Ericsson SoCs (8815 and 8500). | 251 | Generator hardware found on ST-Ericsson SoCs (8815 and 8500). |
@@ -251,21 +255,10 @@ config HW_RANDOM_NOMADIK | |||
251 | 255 | ||
252 | If unsure, say Y. | 256 | If unsure, say Y. |
253 | 257 | ||
254 | config HW_RANDOM_PICOXCELL | ||
255 | tristate "Picochip picoXcell true random number generator support" | ||
256 | depends on HW_RANDOM && ARCH_PICOXCELL && PICOXCELL_PC3X3 | ||
257 | ---help--- | ||
258 | This driver provides kernel-side support for the Random Number | ||
259 | Generator hardware found on Picochip PC3x3 and later devices. | ||
260 | |||
261 | To compile this driver as a module, choose M here: the | ||
262 | module will be called picoxcell-rng. | ||
263 | |||
264 | If unsure, say Y. | ||
265 | |||
266 | config HW_RANDOM_PPC4XX | 258 | config HW_RANDOM_PPC4XX |
267 | tristate "PowerPC 4xx generic true random number generator support" | 259 | tristate "PowerPC 4xx generic true random number generator support" |
268 | depends on HW_RANDOM && PPC && 4xx | 260 | depends on PPC && 4xx |
261 | default HW_RANDOM | ||
269 | ---help--- | 262 | ---help--- |
270 | This driver provides the kernel-side support for the TRNG hardware | 263 | This driver provides the kernel-side support for the TRNG hardware |
271 | found in the security function of some PowerPC 4xx SoCs. | 264 | found in the security function of some PowerPC 4xx SoCs. |
@@ -275,24 +268,9 @@ config HW_RANDOM_PPC4XX | |||
275 | 268 | ||
276 | If unsure, say N. | 269 | If unsure, say N. |
277 | 270 | ||
278 | config UML_RANDOM | ||
279 | depends on UML | ||
280 | tristate "Hardware random number generator" | ||
281 | help | ||
282 | This option enables UML's "hardware" random number generator. It | ||
283 | attaches itself to the host's /dev/random, supplying as much entropy | ||
284 | as the host has, rather than the small amount the UML gets from its | ||
285 | own drivers. It registers itself as a standard hardware random number | ||
286 | generator, major 10, minor 183, and the canonical device name is | ||
287 | /dev/hwrng. | ||
288 | The way to make use of this is to install the rng-tools package | ||
289 | (check your distro, or download from | ||
290 | http://sourceforge.net/projects/gkernel/). rngd periodically reads | ||
291 | /dev/hwrng and injects the entropy into /dev/random. | ||
292 | |||
293 | config HW_RANDOM_PSERIES | 271 | config HW_RANDOM_PSERIES |
294 | tristate "pSeries HW Random Number Generator support" | 272 | tristate "pSeries HW Random Number Generator support" |
295 | depends on HW_RANDOM && PPC64 && IBMVIO | 273 | depends on PPC64 && IBMVIO |
296 | default HW_RANDOM | 274 | default HW_RANDOM |
297 | ---help--- | 275 | ---help--- |
298 | This driver provides kernel-side support for the Random Number | 276 | This driver provides kernel-side support for the Random Number |
@@ -305,7 +283,7 @@ config HW_RANDOM_PSERIES | |||
305 | 283 | ||
306 | config HW_RANDOM_POWERNV | 284 | config HW_RANDOM_POWERNV |
307 | tristate "PowerNV Random Number Generator support" | 285 | tristate "PowerNV Random Number Generator support" |
308 | depends on HW_RANDOM && PPC_POWERNV | 286 | depends on PPC_POWERNV |
309 | default HW_RANDOM | 287 | default HW_RANDOM |
310 | ---help--- | 288 | ---help--- |
311 | This is the driver for Random Number Generator hardware found | 289 | This is the driver for Random Number Generator hardware found |
@@ -318,7 +296,8 @@ config HW_RANDOM_POWERNV | |||
318 | 296 | ||
319 | config HW_RANDOM_EXYNOS | 297 | config HW_RANDOM_EXYNOS |
320 | tristate "EXYNOS HW random number generator support" | 298 | tristate "EXYNOS HW random number generator support" |
321 | depends on HW_RANDOM && HAS_IOMEM && HAVE_CLK | 299 | depends on ARCH_EXYNOS |
300 | default HW_RANDOM | ||
322 | ---help--- | 301 | ---help--- |
323 | This driver provides kernel-side support for the Random Number | 302 | This driver provides kernel-side support for the Random Number |
324 | Generator hardware found on EXYNOS SOCs. | 303 | Generator hardware found on EXYNOS SOCs. |
@@ -330,7 +309,7 @@ config HW_RANDOM_EXYNOS | |||
330 | 309 | ||
331 | config HW_RANDOM_TPM | 310 | config HW_RANDOM_TPM |
332 | tristate "TPM HW Random Number Generator support" | 311 | tristate "TPM HW Random Number Generator support" |
333 | depends on HW_RANDOM && TCG_TPM | 312 | depends on TCG_TPM |
334 | default HW_RANDOM | 313 | default HW_RANDOM |
335 | ---help--- | 314 | ---help--- |
336 | This driver provides kernel-side support for the Random Number | 315 | This driver provides kernel-side support for the Random Number |
@@ -344,6 +323,7 @@ config HW_RANDOM_TPM | |||
344 | config HW_RANDOM_MSM | 323 | config HW_RANDOM_MSM |
345 | tristate "Qualcomm SoCs Random Number Generator support" | 324 | tristate "Qualcomm SoCs Random Number Generator support" |
346 | depends on HW_RANDOM && ARCH_QCOM | 325 | depends on HW_RANDOM && ARCH_QCOM |
326 | default HW_RANDOM | ||
347 | ---help--- | 327 | ---help--- |
348 | This driver provides kernel-side support for the Random Number | 328 | This driver provides kernel-side support for the Random Number |
349 | Generator hardware found on Qualcomm SoCs. | 329 | Generator hardware found on Qualcomm SoCs. |
@@ -352,3 +332,20 @@ config HW_RANDOM_MSM | |||
352 | module will be called msm-rng. | 332 | module will be called msm-rng. |
353 | 333 | ||
354 | If unsure, say Y. | 334 | If unsure, say Y. |
335 | |||
336 | endif # HW_RANDOM | ||
337 | |||
338 | config UML_RANDOM | ||
339 | depends on UML | ||
340 | tristate "Hardware random number generator" | ||
341 | help | ||
342 | This option enables UML's "hardware" random number generator. It | ||
343 | attaches itself to the host's /dev/random, supplying as much entropy | ||
344 | as the host has, rather than the small amount the UML gets from its | ||
345 | own drivers. It registers itself as a standard hardware random number | ||
346 | generator, major 10, minor 183, and the canonical device name is | ||
347 | /dev/hwrng. | ||
348 | The way to make use of this is to install the rng-tools package | ||
349 | (check your distro, or download from | ||
350 | http://sourceforge.net/projects/gkernel/). rngd periodically reads | ||
351 | /dev/hwrng and injects the entropy into /dev/random. | ||
diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile index 3ae7755a52e7..199ed283e149 100644 --- a/drivers/char/hw_random/Makefile +++ b/drivers/char/hw_random/Makefile | |||
@@ -22,7 +22,6 @@ obj-$(CONFIG_HW_RANDOM_TX4939) += tx4939-rng.o | |||
22 | obj-$(CONFIG_HW_RANDOM_MXC_RNGA) += mxc-rnga.o | 22 | obj-$(CONFIG_HW_RANDOM_MXC_RNGA) += mxc-rnga.o |
23 | obj-$(CONFIG_HW_RANDOM_OCTEON) += octeon-rng.o | 23 | obj-$(CONFIG_HW_RANDOM_OCTEON) += octeon-rng.o |
24 | obj-$(CONFIG_HW_RANDOM_NOMADIK) += nomadik-rng.o | 24 | obj-$(CONFIG_HW_RANDOM_NOMADIK) += nomadik-rng.o |
25 | obj-$(CONFIG_HW_RANDOM_PICOXCELL) += picoxcell-rng.o | ||
26 | obj-$(CONFIG_HW_RANDOM_PPC4XX) += ppc4xx-rng.o | 25 | obj-$(CONFIG_HW_RANDOM_PPC4XX) += ppc4xx-rng.o |
27 | obj-$(CONFIG_HW_RANDOM_PSERIES) += pseries-rng.o | 26 | obj-$(CONFIG_HW_RANDOM_PSERIES) += pseries-rng.o |
28 | obj-$(CONFIG_HW_RANDOM_POWERNV) += powernv-rng.o | 27 | obj-$(CONFIG_HW_RANDOM_POWERNV) += powernv-rng.o |
diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c index 334601cc81cf..c4419ea1ab07 100644 --- a/drivers/char/hw_random/core.c +++ b/drivers/char/hw_random/core.c | |||
@@ -55,16 +55,41 @@ static DEFINE_MUTEX(rng_mutex); | |||
55 | static int data_avail; | 55 | static int data_avail; |
56 | static u8 *rng_buffer; | 56 | static u8 *rng_buffer; |
57 | 57 | ||
58 | static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size, | ||
59 | int wait); | ||
60 | |||
58 | static size_t rng_buffer_size(void) | 61 | static size_t rng_buffer_size(void) |
59 | { | 62 | { |
60 | return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES; | 63 | return SMP_CACHE_BYTES < 32 ? 32 : SMP_CACHE_BYTES; |
61 | } | 64 | } |
62 | 65 | ||
66 | static void add_early_randomness(struct hwrng *rng) | ||
67 | { | ||
68 | unsigned char bytes[16]; | ||
69 | int bytes_read; | ||
70 | |||
71 | /* | ||
72 | * Currently only virtio-rng cannot return data during device | ||
73 | * probe, and that's handled in virtio-rng.c itself. If there | ||
74 | * are more such devices, this call to rng_get_data can be | ||
75 | * made conditional here instead of doing it per-device. | ||
76 | */ | ||
77 | bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1); | ||
78 | if (bytes_read > 0) | ||
79 | add_device_randomness(bytes, bytes_read); | ||
80 | } | ||
81 | |||
63 | static inline int hwrng_init(struct hwrng *rng) | 82 | static inline int hwrng_init(struct hwrng *rng) |
64 | { | 83 | { |
65 | if (!rng->init) | 84 | if (rng->init) { |
66 | return 0; | 85 | int ret; |
67 | return rng->init(rng); | 86 | |
87 | ret = rng->init(rng); | ||
88 | if (ret) | ||
89 | return ret; | ||
90 | } | ||
91 | add_early_randomness(rng); | ||
92 | return 0; | ||
68 | } | 93 | } |
69 | 94 | ||
70 | static inline void hwrng_cleanup(struct hwrng *rng) | 95 | static inline void hwrng_cleanup(struct hwrng *rng) |
@@ -304,8 +329,6 @@ int hwrng_register(struct hwrng *rng) | |||
304 | { | 329 | { |
305 | int err = -EINVAL; | 330 | int err = -EINVAL; |
306 | struct hwrng *old_rng, *tmp; | 331 | struct hwrng *old_rng, *tmp; |
307 | unsigned char bytes[16]; | ||
308 | int bytes_read; | ||
309 | 332 | ||
310 | if (rng->name == NULL || | 333 | if (rng->name == NULL || |
311 | (rng->data_read == NULL && rng->read == NULL)) | 334 | (rng->data_read == NULL && rng->read == NULL)) |
@@ -347,9 +370,17 @@ int hwrng_register(struct hwrng *rng) | |||
347 | INIT_LIST_HEAD(&rng->list); | 370 | INIT_LIST_HEAD(&rng->list); |
348 | list_add_tail(&rng->list, &rng_list); | 371 | list_add_tail(&rng->list, &rng_list); |
349 | 372 | ||
350 | bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1); | 373 | if (old_rng && !rng->init) { |
351 | if (bytes_read > 0) | 374 | /* |
352 | add_device_randomness(bytes, bytes_read); | 375 | * Use a new device's input to add some randomness to |
376 | * the system. If this rng device isn't going to be | ||
377 | * used right away, its init function hasn't been | ||
378 | * called yet; so only use the randomness from devices | ||
379 | * that don't need an init callback. | ||
380 | */ | ||
381 | add_early_randomness(rng); | ||
382 | } | ||
383 | |||
353 | out_unlock: | 384 | out_unlock: |
354 | mutex_unlock(&rng_mutex); | 385 | mutex_unlock(&rng_mutex); |
355 | out: | 386 | out: |
diff --git a/drivers/char/hw_random/n2-drv.c b/drivers/char/hw_random/n2-drv.c index 432232eefe05..292a5889f675 100644 --- a/drivers/char/hw_random/n2-drv.c +++ b/drivers/char/hw_random/n2-drv.c | |||
@@ -632,7 +632,7 @@ static int n2rng_probe(struct platform_device *op) | |||
632 | multi_capable = (match->data != NULL); | 632 | multi_capable = (match->data != NULL); |
633 | 633 | ||
634 | n2rng_driver_version(); | 634 | n2rng_driver_version(); |
635 | np = kzalloc(sizeof(*np), GFP_KERNEL); | 635 | np = devm_kzalloc(&op->dev, sizeof(*np), GFP_KERNEL); |
636 | if (!np) | 636 | if (!np) |
637 | goto out; | 637 | goto out; |
638 | np->op = op; | 638 | np->op = op; |
@@ -653,7 +653,7 @@ static int n2rng_probe(struct platform_device *op) | |||
653 | &np->hvapi_minor)) { | 653 | &np->hvapi_minor)) { |
654 | dev_err(&op->dev, "Cannot register suitable " | 654 | dev_err(&op->dev, "Cannot register suitable " |
655 | "HVAPI version.\n"); | 655 | "HVAPI version.\n"); |
656 | goto out_free; | 656 | goto out; |
657 | } | 657 | } |
658 | } | 658 | } |
659 | 659 | ||
@@ -676,15 +676,16 @@ static int n2rng_probe(struct platform_device *op) | |||
676 | dev_info(&op->dev, "Registered RNG HVAPI major %lu minor %lu\n", | 676 | dev_info(&op->dev, "Registered RNG HVAPI major %lu minor %lu\n", |
677 | np->hvapi_major, np->hvapi_minor); | 677 | np->hvapi_major, np->hvapi_minor); |
678 | 678 | ||
679 | np->units = kzalloc(sizeof(struct n2rng_unit) * np->num_units, | 679 | np->units = devm_kzalloc(&op->dev, |
680 | GFP_KERNEL); | 680 | sizeof(struct n2rng_unit) * np->num_units, |
681 | GFP_KERNEL); | ||
681 | err = -ENOMEM; | 682 | err = -ENOMEM; |
682 | if (!np->units) | 683 | if (!np->units) |
683 | goto out_hvapi_unregister; | 684 | goto out_hvapi_unregister; |
684 | 685 | ||
685 | err = n2rng_init_control(np); | 686 | err = n2rng_init_control(np); |
686 | if (err) | 687 | if (err) |
687 | goto out_free_units; | 688 | goto out_hvapi_unregister; |
688 | 689 | ||
689 | dev_info(&op->dev, "Found %s RNG, units: %d\n", | 690 | dev_info(&op->dev, "Found %s RNG, units: %d\n", |
690 | ((np->flags & N2RNG_FLAG_MULTI) ? | 691 | ((np->flags & N2RNG_FLAG_MULTI) ? |
@@ -697,7 +698,7 @@ static int n2rng_probe(struct platform_device *op) | |||
697 | 698 | ||
698 | err = hwrng_register(&np->hwrng); | 699 | err = hwrng_register(&np->hwrng); |
699 | if (err) | 700 | if (err) |
700 | goto out_free_units; | 701 | goto out_hvapi_unregister; |
701 | 702 | ||
702 | platform_set_drvdata(op, np); | 703 | platform_set_drvdata(op, np); |
703 | 704 | ||
@@ -705,15 +706,9 @@ static int n2rng_probe(struct platform_device *op) | |||
705 | 706 | ||
706 | return 0; | 707 | return 0; |
707 | 708 | ||
708 | out_free_units: | ||
709 | kfree(np->units); | ||
710 | np->units = NULL; | ||
711 | |||
712 | out_hvapi_unregister: | 709 | out_hvapi_unregister: |
713 | sun4v_hvapi_unregister(HV_GRP_RNG); | 710 | sun4v_hvapi_unregister(HV_GRP_RNG); |
714 | 711 | ||
715 | out_free: | ||
716 | kfree(np); | ||
717 | out: | 712 | out: |
718 | return err; | 713 | return err; |
719 | } | 714 | } |
@@ -730,11 +725,6 @@ static int n2rng_remove(struct platform_device *op) | |||
730 | 725 | ||
731 | sun4v_hvapi_unregister(HV_GRP_RNG); | 726 | sun4v_hvapi_unregister(HV_GRP_RNG); |
732 | 727 | ||
733 | kfree(np->units); | ||
734 | np->units = NULL; | ||
735 | |||
736 | kfree(np); | ||
737 | |||
738 | return 0; | 728 | return 0; |
739 | } | 729 | } |
740 | 730 | ||
diff --git a/drivers/char/hw_random/omap-rng.c b/drivers/char/hw_random/omap-rng.c index 9b89ff4881de..f66ea258382f 100644 --- a/drivers/char/hw_random/omap-rng.c +++ b/drivers/char/hw_random/omap-rng.c | |||
@@ -369,10 +369,8 @@ static int omap_rng_probe(struct platform_device *pdev) | |||
369 | int ret; | 369 | int ret; |
370 | 370 | ||
371 | priv = devm_kzalloc(dev, sizeof(struct omap_rng_dev), GFP_KERNEL); | 371 | priv = devm_kzalloc(dev, sizeof(struct omap_rng_dev), GFP_KERNEL); |
372 | if (!priv) { | 372 | if (!priv) |
373 | dev_err(&pdev->dev, "could not allocate memory\n"); | ||
374 | return -ENOMEM; | 373 | return -ENOMEM; |
375 | }; | ||
376 | 374 | ||
377 | omap_rng_ops.priv = (unsigned long)priv; | 375 | omap_rng_ops.priv = (unsigned long)priv; |
378 | platform_set_drvdata(pdev, priv); | 376 | platform_set_drvdata(pdev, priv); |
diff --git a/drivers/char/hw_random/picoxcell-rng.c b/drivers/char/hw_random/picoxcell-rng.c deleted file mode 100644 index eab5448ad56f..000000000000 --- a/drivers/char/hw_random/picoxcell-rng.c +++ /dev/null | |||
@@ -1,181 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2010-2011 Picochip Ltd., Jamie Iles | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * All enquiries to support@picochip.com | ||
9 | */ | ||
10 | #include <linux/clk.h> | ||
11 | #include <linux/delay.h> | ||
12 | #include <linux/err.h> | ||
13 | #include <linux/hw_random.h> | ||
14 | #include <linux/io.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | |||
19 | #define DATA_REG_OFFSET 0x0200 | ||
20 | #define CSR_REG_OFFSET 0x0278 | ||
21 | #define CSR_OUT_EMPTY_MASK (1 << 24) | ||
22 | #define CSR_FAULT_MASK (1 << 1) | ||
23 | #define TRNG_BLOCK_RESET_MASK (1 << 0) | ||
24 | #define TAI_REG_OFFSET 0x0380 | ||
25 | |||
26 | /* | ||
27 | * The maximum amount of time in microseconds to spend waiting for data if the | ||
28 | * core wants us to wait. The TRNG should generate 32 bits every 320ns so a | ||
29 | * timeout of 20us seems reasonable. The TRNG does builtin tests of the data | ||
30 | * for randomness so we can't always assume there is data present. | ||
31 | */ | ||
32 | #define PICO_TRNG_TIMEOUT 20 | ||
33 | |||
34 | static void __iomem *rng_base; | ||
35 | static struct clk *rng_clk; | ||
36 | static struct device *rng_dev; | ||
37 | |||
38 | static inline u32 picoxcell_trng_read_csr(void) | ||
39 | { | ||
40 | return __raw_readl(rng_base + CSR_REG_OFFSET); | ||
41 | } | ||
42 | |||
43 | static inline bool picoxcell_trng_is_empty(void) | ||
44 | { | ||
45 | return picoxcell_trng_read_csr() & CSR_OUT_EMPTY_MASK; | ||
46 | } | ||
47 | |||
48 | /* | ||
49 | * Take the random number generator out of reset and make sure the interrupts | ||
50 | * are masked. We shouldn't need to get large amounts of random bytes so just | ||
51 | * poll the status register. The hardware generates 32 bits every 320ns so we | ||
52 | * shouldn't have to wait long enough to warrant waiting for an IRQ. | ||
53 | */ | ||
54 | static void picoxcell_trng_start(void) | ||
55 | { | ||
56 | __raw_writel(0, rng_base + TAI_REG_OFFSET); | ||
57 | __raw_writel(0, rng_base + CSR_REG_OFFSET); | ||
58 | } | ||
59 | |||
60 | static void picoxcell_trng_reset(void) | ||
61 | { | ||
62 | __raw_writel(TRNG_BLOCK_RESET_MASK, rng_base + CSR_REG_OFFSET); | ||
63 | __raw_writel(TRNG_BLOCK_RESET_MASK, rng_base + TAI_REG_OFFSET); | ||
64 | picoxcell_trng_start(); | ||
65 | } | ||
66 | |||
67 | /* | ||
68 | * Get some random data from the random number generator. The hw_random core | ||
69 | * layer provides us with locking. | ||
70 | */ | ||
71 | static int picoxcell_trng_read(struct hwrng *rng, void *buf, size_t max, | ||
72 | bool wait) | ||
73 | { | ||
74 | int i; | ||
75 | |||
76 | /* Wait for some data to become available. */ | ||
77 | for (i = 0; i < PICO_TRNG_TIMEOUT && picoxcell_trng_is_empty(); ++i) { | ||
78 | if (!wait) | ||
79 | return 0; | ||
80 | |||
81 | udelay(1); | ||
82 | } | ||
83 | |||
84 | if (picoxcell_trng_read_csr() & CSR_FAULT_MASK) { | ||
85 | dev_err(rng_dev, "fault detected, resetting TRNG\n"); | ||
86 | picoxcell_trng_reset(); | ||
87 | return -EIO; | ||
88 | } | ||
89 | |||
90 | if (i == PICO_TRNG_TIMEOUT) | ||
91 | return 0; | ||
92 | |||
93 | *(u32 *)buf = __raw_readl(rng_base + DATA_REG_OFFSET); | ||
94 | return sizeof(u32); | ||
95 | } | ||
96 | |||
97 | static struct hwrng picoxcell_trng = { | ||
98 | .name = "picoxcell", | ||
99 | .read = picoxcell_trng_read, | ||
100 | }; | ||
101 | |||
102 | static int picoxcell_trng_probe(struct platform_device *pdev) | ||
103 | { | ||
104 | int ret; | ||
105 | struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
106 | |||
107 | rng_base = devm_ioremap_resource(&pdev->dev, mem); | ||
108 | if (IS_ERR(rng_base)) | ||
109 | return PTR_ERR(rng_base); | ||
110 | |||
111 | rng_clk = devm_clk_get(&pdev->dev, NULL); | ||
112 | if (IS_ERR(rng_clk)) { | ||
113 | dev_warn(&pdev->dev, "no clk\n"); | ||
114 | return PTR_ERR(rng_clk); | ||
115 | } | ||
116 | |||
117 | ret = clk_enable(rng_clk); | ||
118 | if (ret) { | ||
119 | dev_warn(&pdev->dev, "unable to enable clk\n"); | ||
120 | return ret; | ||
121 | } | ||
122 | |||
123 | picoxcell_trng_start(); | ||
124 | ret = hwrng_register(&picoxcell_trng); | ||
125 | if (ret) | ||
126 | goto err_register; | ||
127 | |||
128 | rng_dev = &pdev->dev; | ||
129 | dev_info(&pdev->dev, "pixoxcell random number generator active\n"); | ||
130 | |||
131 | return 0; | ||
132 | |||
133 | err_register: | ||
134 | clk_disable(rng_clk); | ||
135 | return ret; | ||
136 | } | ||
137 | |||
138 | static int picoxcell_trng_remove(struct platform_device *pdev) | ||
139 | { | ||
140 | hwrng_unregister(&picoxcell_trng); | ||
141 | clk_disable(rng_clk); | ||
142 | |||
143 | return 0; | ||
144 | } | ||
145 | |||
146 | #ifdef CONFIG_PM | ||
147 | static int picoxcell_trng_suspend(struct device *dev) | ||
148 | { | ||
149 | clk_disable(rng_clk); | ||
150 | |||
151 | return 0; | ||
152 | } | ||
153 | |||
154 | static int picoxcell_trng_resume(struct device *dev) | ||
155 | { | ||
156 | return clk_enable(rng_clk); | ||
157 | } | ||
158 | |||
159 | static const struct dev_pm_ops picoxcell_trng_pm_ops = { | ||
160 | .suspend = picoxcell_trng_suspend, | ||
161 | .resume = picoxcell_trng_resume, | ||
162 | }; | ||
163 | #endif /* CONFIG_PM */ | ||
164 | |||
165 | static struct platform_driver picoxcell_trng_driver = { | ||
166 | .probe = picoxcell_trng_probe, | ||
167 | .remove = picoxcell_trng_remove, | ||
168 | .driver = { | ||
169 | .name = "picoxcell-trng", | ||
170 | .owner = THIS_MODULE, | ||
171 | #ifdef CONFIG_PM | ||
172 | .pm = &picoxcell_trng_pm_ops, | ||
173 | #endif /* CONFIG_PM */ | ||
174 | }, | ||
175 | }; | ||
176 | |||
177 | module_platform_driver(picoxcell_trng_driver); | ||
178 | |||
179 | MODULE_LICENSE("GPL"); | ||
180 | MODULE_AUTHOR("Jamie Iles"); | ||
181 | MODULE_DESCRIPTION("Picochip picoXcell TRNG driver"); | ||
diff --git a/drivers/char/hw_random/timeriomem-rng.c b/drivers/char/hw_random/timeriomem-rng.c index 439ff8b28c43..b6ab9ac3f34d 100644 --- a/drivers/char/hw_random/timeriomem-rng.c +++ b/drivers/char/hw_random/timeriomem-rng.c | |||
@@ -120,10 +120,8 @@ static int timeriomem_rng_probe(struct platform_device *pdev) | |||
120 | /* Allocate memory for the device structure (and zero it) */ | 120 | /* Allocate memory for the device structure (and zero it) */ |
121 | priv = devm_kzalloc(&pdev->dev, | 121 | priv = devm_kzalloc(&pdev->dev, |
122 | sizeof(struct timeriomem_rng_private_data), GFP_KERNEL); | 122 | sizeof(struct timeriomem_rng_private_data), GFP_KERNEL); |
123 | if (!priv) { | 123 | if (!priv) |
124 | dev_err(&pdev->dev, "failed to allocate device structure.\n"); | ||
125 | return -ENOMEM; | 124 | return -ENOMEM; |
126 | } | ||
127 | 125 | ||
128 | platform_set_drvdata(pdev, priv); | 126 | platform_set_drvdata(pdev, priv); |
129 | 127 | ||
diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c index 2ce0e225e58c..e9b15bc18b4d 100644 --- a/drivers/char/hw_random/virtio-rng.c +++ b/drivers/char/hw_random/virtio-rng.c | |||
@@ -25,101 +25,140 @@ | |||
25 | #include <linux/virtio_rng.h> | 25 | #include <linux/virtio_rng.h> |
26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
27 | 27 | ||
28 | static struct virtqueue *vq; | 28 | static DEFINE_IDA(rng_index_ida); |
29 | static unsigned int data_avail; | 29 | |
30 | static DECLARE_COMPLETION(have_data); | 30 | struct virtrng_info { |
31 | static bool busy; | 31 | struct virtio_device *vdev; |
32 | struct hwrng hwrng; | ||
33 | struct virtqueue *vq; | ||
34 | unsigned int data_avail; | ||
35 | struct completion have_data; | ||
36 | bool busy; | ||
37 | char name[25]; | ||
38 | int index; | ||
39 | }; | ||
40 | |||
41 | static bool probe_done; | ||
32 | 42 | ||
33 | static void random_recv_done(struct virtqueue *vq) | 43 | static void random_recv_done(struct virtqueue *vq) |
34 | { | 44 | { |
45 | struct virtrng_info *vi = vq->vdev->priv; | ||
46 | |||
35 | /* We can get spurious callbacks, e.g. shared IRQs + virtio_pci. */ | 47 | /* We can get spurious callbacks, e.g. shared IRQs + virtio_pci. */ |
36 | if (!virtqueue_get_buf(vq, &data_avail)) | 48 | if (!virtqueue_get_buf(vi->vq, &vi->data_avail)) |
37 | return; | 49 | return; |
38 | 50 | ||
39 | complete(&have_data); | 51 | complete(&vi->have_data); |
40 | } | 52 | } |
41 | 53 | ||
42 | /* The host will fill any buffer we give it with sweet, sweet randomness. */ | 54 | /* The host will fill any buffer we give it with sweet, sweet randomness. */ |
43 | static void register_buffer(u8 *buf, size_t size) | 55 | static void register_buffer(struct virtrng_info *vi, u8 *buf, size_t size) |
44 | { | 56 | { |
45 | struct scatterlist sg; | 57 | struct scatterlist sg; |
46 | 58 | ||
47 | sg_init_one(&sg, buf, size); | 59 | sg_init_one(&sg, buf, size); |
48 | 60 | ||
49 | /* There should always be room for one buffer. */ | 61 | /* There should always be room for one buffer. */ |
50 | virtqueue_add_inbuf(vq, &sg, 1, buf, GFP_KERNEL); | 62 | virtqueue_add_inbuf(vi->vq, &sg, 1, buf, GFP_KERNEL); |
51 | 63 | ||
52 | virtqueue_kick(vq); | 64 | virtqueue_kick(vi->vq); |
53 | } | 65 | } |
54 | 66 | ||
55 | static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) | 67 | static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) |
56 | { | 68 | { |
57 | int ret; | 69 | int ret; |
70 | struct virtrng_info *vi = (struct virtrng_info *)rng->priv; | ||
58 | 71 | ||
59 | if (!busy) { | 72 | /* |
60 | busy = true; | 73 | * Don't ask host for data till we're setup. This call can |
61 | init_completion(&have_data); | 74 | * happen during hwrng_register(), after commit d9e7972619. |
62 | register_buffer(buf, size); | 75 | */ |
76 | if (unlikely(!probe_done)) | ||
77 | return 0; | ||
78 | |||
79 | if (!vi->busy) { | ||
80 | vi->busy = true; | ||
81 | init_completion(&vi->have_data); | ||
82 | register_buffer(vi, buf, size); | ||
63 | } | 83 | } |
64 | 84 | ||
65 | if (!wait) | 85 | if (!wait) |
66 | return 0; | 86 | return 0; |
67 | 87 | ||
68 | ret = wait_for_completion_killable(&have_data); | 88 | ret = wait_for_completion_killable(&vi->have_data); |
69 | if (ret < 0) | 89 | if (ret < 0) |
70 | return ret; | 90 | return ret; |
71 | 91 | ||
72 | busy = false; | 92 | vi->busy = false; |
73 | 93 | ||
74 | return data_avail; | 94 | return vi->data_avail; |
75 | } | 95 | } |
76 | 96 | ||
77 | static void virtio_cleanup(struct hwrng *rng) | 97 | static void virtio_cleanup(struct hwrng *rng) |
78 | { | 98 | { |
79 | if (busy) | 99 | struct virtrng_info *vi = (struct virtrng_info *)rng->priv; |
80 | wait_for_completion(&have_data); | ||
81 | } | ||
82 | 100 | ||
83 | 101 | if (vi->busy) | |
84 | static struct hwrng virtio_hwrng = { | 102 | wait_for_completion(&vi->have_data); |
85 | .name = "virtio", | 103 | } |
86 | .cleanup = virtio_cleanup, | ||
87 | .read = virtio_read, | ||
88 | }; | ||
89 | 104 | ||
90 | static int probe_common(struct virtio_device *vdev) | 105 | static int probe_common(struct virtio_device *vdev) |
91 | { | 106 | { |
92 | int err; | 107 | int err, index; |
108 | struct virtrng_info *vi = NULL; | ||
93 | 109 | ||
94 | if (vq) { | 110 | vi = kzalloc(sizeof(struct virtrng_info), GFP_KERNEL); |
95 | /* We only support one device for now */ | 111 | if (!vi) |
96 | return -EBUSY; | 112 | return -ENOMEM; |
113 | |||
114 | vi->index = index = ida_simple_get(&rng_index_ida, 0, 0, GFP_KERNEL); | ||
115 | if (index < 0) { | ||
116 | kfree(vi); | ||
117 | return index; | ||
97 | } | 118 | } |
119 | sprintf(vi->name, "virtio_rng.%d", index); | ||
120 | init_completion(&vi->have_data); | ||
121 | |||
122 | vi->hwrng = (struct hwrng) { | ||
123 | .read = virtio_read, | ||
124 | .cleanup = virtio_cleanup, | ||
125 | .priv = (unsigned long)vi, | ||
126 | .name = vi->name, | ||
127 | }; | ||
128 | vdev->priv = vi; | ||
129 | |||
98 | /* We expect a single virtqueue. */ | 130 | /* We expect a single virtqueue. */ |
99 | vq = virtio_find_single_vq(vdev, random_recv_done, "input"); | 131 | vi->vq = virtio_find_single_vq(vdev, random_recv_done, "input"); |
100 | if (IS_ERR(vq)) { | 132 | if (IS_ERR(vi->vq)) { |
101 | err = PTR_ERR(vq); | 133 | err = PTR_ERR(vi->vq); |
102 | vq = NULL; | 134 | vi->vq = NULL; |
135 | kfree(vi); | ||
136 | ida_simple_remove(&rng_index_ida, index); | ||
103 | return err; | 137 | return err; |
104 | } | 138 | } |
105 | 139 | ||
106 | err = hwrng_register(&virtio_hwrng); | 140 | err = hwrng_register(&vi->hwrng); |
107 | if (err) { | 141 | if (err) { |
108 | vdev->config->del_vqs(vdev); | 142 | vdev->config->del_vqs(vdev); |
109 | vq = NULL; | 143 | vi->vq = NULL; |
144 | kfree(vi); | ||
145 | ida_simple_remove(&rng_index_ida, index); | ||
110 | return err; | 146 | return err; |
111 | } | 147 | } |
112 | 148 | ||
149 | probe_done = true; | ||
113 | return 0; | 150 | return 0; |
114 | } | 151 | } |
115 | 152 | ||
116 | static void remove_common(struct virtio_device *vdev) | 153 | static void remove_common(struct virtio_device *vdev) |
117 | { | 154 | { |
155 | struct virtrng_info *vi = vdev->priv; | ||
118 | vdev->config->reset(vdev); | 156 | vdev->config->reset(vdev); |
119 | busy = false; | 157 | vi->busy = false; |
120 | hwrng_unregister(&virtio_hwrng); | 158 | hwrng_unregister(&vi->hwrng); |
121 | vdev->config->del_vqs(vdev); | 159 | vdev->config->del_vqs(vdev); |
122 | vq = NULL; | 160 | ida_simple_remove(&rng_index_ida, vi->index); |
161 | kfree(vi); | ||
123 | } | 162 | } |
124 | 163 | ||
125 | static int virtrng_probe(struct virtio_device *vdev) | 164 | static int virtrng_probe(struct virtio_device *vdev) |
diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c index d915707d2ba1..93dcad0c1cbe 100644 --- a/drivers/char/i8k.c +++ b/drivers/char/i8k.c | |||
@@ -138,7 +138,9 @@ static int i8k_smm(struct smm_regs *regs) | |||
138 | if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) | 138 | if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) |
139 | return -ENOMEM; | 139 | return -ENOMEM; |
140 | cpumask_copy(old_mask, ¤t->cpus_allowed); | 140 | cpumask_copy(old_mask, ¤t->cpus_allowed); |
141 | set_cpus_allowed_ptr(current, cpumask_of(0)); | 141 | rc = set_cpus_allowed_ptr(current, cpumask_of(0)); |
142 | if (rc) | ||
143 | goto out; | ||
142 | if (smp_processor_id() != 0) { | 144 | if (smp_processor_id() != 0) { |
143 | rc = -EBUSY; | 145 | rc = -EBUSY; |
144 | goto out; | 146 | goto out; |
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 1c4bb4f6ce93..5d665680ae33 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -1007,7 +1007,7 @@ static int ipmi_thread(void *data) | |||
1007 | struct timespec busy_until; | 1007 | struct timespec busy_until; |
1008 | 1008 | ||
1009 | ipmi_si_set_not_busy(&busy_until); | 1009 | ipmi_si_set_not_busy(&busy_until); |
1010 | set_user_nice(current, 19); | 1010 | set_user_nice(current, MAX_NICE); |
1011 | while (!kthread_should_stop()) { | 1011 | while (!kthread_should_stop()) { |
1012 | int busy_wait; | 1012 | int busy_wait; |
1013 | 1013 | ||
diff --git a/drivers/char/random.c b/drivers/char/random.c index 6b75713d953a..71529e196b84 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -641,7 +641,7 @@ retry: | |||
641 | } while (unlikely(entropy_count < pool_size-2 && pnfrac)); | 641 | } while (unlikely(entropy_count < pool_size-2 && pnfrac)); |
642 | } | 642 | } |
643 | 643 | ||
644 | if (entropy_count < 0) { | 644 | if (unlikely(entropy_count < 0)) { |
645 | pr_warn("random: negative entropy/overflow: pool %s count %d\n", | 645 | pr_warn("random: negative entropy/overflow: pool %s count %d\n", |
646 | r->name, entropy_count); | 646 | r->name, entropy_count); |
647 | WARN_ON(1); | 647 | WARN_ON(1); |
@@ -902,6 +902,7 @@ void add_disk_randomness(struct gendisk *disk) | |||
902 | add_timer_randomness(disk->random, 0x100 + disk_devt(disk)); | 902 | add_timer_randomness(disk->random, 0x100 + disk_devt(disk)); |
903 | trace_add_disk_randomness(disk_devt(disk), ENTROPY_BITS(&input_pool)); | 903 | trace_add_disk_randomness(disk_devt(disk), ENTROPY_BITS(&input_pool)); |
904 | } | 904 | } |
905 | EXPORT_SYMBOL_GPL(add_disk_randomness); | ||
905 | #endif | 906 | #endif |
906 | 907 | ||
907 | /********************************************************************* | 908 | /********************************************************************* |
@@ -979,24 +980,38 @@ static void push_to_pool(struct work_struct *work) | |||
979 | static size_t account(struct entropy_store *r, size_t nbytes, int min, | 980 | static size_t account(struct entropy_store *r, size_t nbytes, int min, |
980 | int reserved) | 981 | int reserved) |
981 | { | 982 | { |
982 | int have_bytes; | ||
983 | int entropy_count, orig; | 983 | int entropy_count, orig; |
984 | size_t ibytes; | 984 | size_t ibytes, nfrac; |
985 | 985 | ||
986 | BUG_ON(r->entropy_count > r->poolinfo->poolfracbits); | 986 | BUG_ON(r->entropy_count > r->poolinfo->poolfracbits); |
987 | 987 | ||
988 | /* Can we pull enough? */ | 988 | /* Can we pull enough? */ |
989 | retry: | 989 | retry: |
990 | entropy_count = orig = ACCESS_ONCE(r->entropy_count); | 990 | entropy_count = orig = ACCESS_ONCE(r->entropy_count); |
991 | have_bytes = entropy_count >> (ENTROPY_SHIFT + 3); | ||
992 | ibytes = nbytes; | 991 | ibytes = nbytes; |
993 | /* If limited, never pull more than available */ | 992 | /* If limited, never pull more than available */ |
994 | if (r->limit) | 993 | if (r->limit) { |
995 | ibytes = min_t(size_t, ibytes, have_bytes - reserved); | 994 | int have_bytes = entropy_count >> (ENTROPY_SHIFT + 3); |
995 | |||
996 | if ((have_bytes -= reserved) < 0) | ||
997 | have_bytes = 0; | ||
998 | ibytes = min_t(size_t, ibytes, have_bytes); | ||
999 | } | ||
996 | if (ibytes < min) | 1000 | if (ibytes < min) |
997 | ibytes = 0; | 1001 | ibytes = 0; |
998 | entropy_count = max_t(int, 0, | 1002 | |
999 | entropy_count - (ibytes << (ENTROPY_SHIFT + 3))); | 1003 | if (unlikely(entropy_count < 0)) { |
1004 | pr_warn("random: negative entropy count: pool %s count %d\n", | ||
1005 | r->name, entropy_count); | ||
1006 | WARN_ON(1); | ||
1007 | entropy_count = 0; | ||
1008 | } | ||
1009 | nfrac = ibytes << (ENTROPY_SHIFT + 3); | ||
1010 | if ((size_t) entropy_count > nfrac) | ||
1011 | entropy_count -= nfrac; | ||
1012 | else | ||
1013 | entropy_count = 0; | ||
1014 | |||
1000 | if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig) | 1015 | if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig) |
1001 | goto retry; | 1016 | goto retry; |
1002 | 1017 | ||
@@ -1371,6 +1386,7 @@ urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) | |||
1371 | "with %d bits of entropy available\n", | 1386 | "with %d bits of entropy available\n", |
1372 | current->comm, nonblocking_pool.entropy_total); | 1387 | current->comm, nonblocking_pool.entropy_total); |
1373 | 1388 | ||
1389 | nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3)); | ||
1374 | ret = extract_entropy_user(&nonblocking_pool, buf, nbytes); | 1390 | ret = extract_entropy_user(&nonblocking_pool, buf, nbytes); |
1375 | 1391 | ||
1376 | trace_urandom_read(8 * nbytes, ENTROPY_BITS(&nonblocking_pool), | 1392 | trace_urandom_read(8 * nbytes, ENTROPY_BITS(&nonblocking_pool), |
@@ -1578,10 +1594,10 @@ static int proc_do_uuid(struct ctl_table *table, int write, | |||
1578 | /* | 1594 | /* |
1579 | * Return entropy available scaled to integral bits | 1595 | * Return entropy available scaled to integral bits |
1580 | */ | 1596 | */ |
1581 | static int proc_do_entropy(ctl_table *table, int write, | 1597 | static int proc_do_entropy(struct ctl_table *table, int write, |
1582 | void __user *buffer, size_t *lenp, loff_t *ppos) | 1598 | void __user *buffer, size_t *lenp, loff_t *ppos) |
1583 | { | 1599 | { |
1584 | ctl_table fake_table; | 1600 | struct ctl_table fake_table; |
1585 | int entropy_count; | 1601 | int entropy_count; |
1586 | 1602 | ||
1587 | entropy_count = *(int *)table->data >> ENTROPY_SHIFT; | 1603 | entropy_count = *(int *)table->data >> ENTROPY_SHIFT; |
diff --git a/drivers/char/raw.c b/drivers/char/raw.c index 6e8d65e9b1d3..0102dc788608 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c | |||
@@ -284,10 +284,10 @@ static long raw_ctl_compat_ioctl(struct file *file, unsigned int cmd, | |||
284 | #endif | 284 | #endif |
285 | 285 | ||
286 | static const struct file_operations raw_fops = { | 286 | static const struct file_operations raw_fops = { |
287 | .read = do_sync_read, | 287 | .read = new_sync_read, |
288 | .aio_read = generic_file_aio_read, | 288 | .read_iter = generic_file_read_iter, |
289 | .write = do_sync_write, | 289 | .write = new_sync_write, |
290 | .aio_write = blkdev_aio_write, | 290 | .write_iter = blkdev_write_iter, |
291 | .fsync = blkdev_fsync, | 291 | .fsync = blkdev_fsync, |
292 | .open = raw_open, | 292 | .open = raw_open, |
293 | .release = raw_release, | 293 | .release = raw_release, |
diff --git a/drivers/char/tpm/tpm_acpi.c b/drivers/char/tpm/tpm_acpi.c index b9a57fa4b710..565a9478cb94 100644 --- a/drivers/char/tpm/tpm_acpi.c +++ b/drivers/char/tpm/tpm_acpi.c | |||
@@ -95,7 +95,7 @@ int read_log(struct tpm_bios_log *log) | |||
95 | 95 | ||
96 | log->bios_event_log_end = log->bios_event_log + len; | 96 | log->bios_event_log_end = log->bios_event_log + len; |
97 | 97 | ||
98 | virt = acpi_os_map_memory(start, len); | 98 | virt = acpi_os_map_iomem(start, len); |
99 | if (!virt) { | 99 | if (!virt) { |
100 | kfree(log->bios_event_log); | 100 | kfree(log->bios_event_log); |
101 | printk("%s: ERROR - Unable to map memory\n", __func__); | 101 | printk("%s: ERROR - Unable to map memory\n", __func__); |
@@ -104,6 +104,6 @@ int read_log(struct tpm_bios_log *log) | |||
104 | 104 | ||
105 | memcpy_fromio(log->bios_event_log, virt, len); | 105 | memcpy_fromio(log->bios_event_log, virt, len); |
106 | 106 | ||
107 | acpi_os_unmap_memory(virt, len); | 107 | acpi_os_unmap_iomem(virt, len); |
108 | return 0; | 108 | return 0; |
109 | } | 109 | } |
diff --git a/drivers/char/tpm/tpm_ppi.c b/drivers/char/tpm/tpm_ppi.c index b3ea223585bd..61dcc8011ec7 100644 --- a/drivers/char/tpm/tpm_ppi.c +++ b/drivers/char/tpm/tpm_ppi.c | |||
@@ -328,13 +328,11 @@ int tpm_add_ppi(struct kobject *parent) | |||
328 | /* Cache TPM ACPI handle and version string */ | 328 | /* Cache TPM ACPI handle and version string */ |
329 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, | 329 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, |
330 | ppi_callback, NULL, NULL, &tpm_ppi_handle); | 330 | ppi_callback, NULL, NULL, &tpm_ppi_handle); |
331 | if (tpm_ppi_handle == NULL) | 331 | return tpm_ppi_handle ? sysfs_create_group(parent, &ppi_attr_grp) : 0; |
332 | return -ENODEV; | ||
333 | |||
334 | return sysfs_create_group(parent, &ppi_attr_grp); | ||
335 | } | 332 | } |
336 | 333 | ||
337 | void tpm_remove_ppi(struct kobject *parent) | 334 | void tpm_remove_ppi(struct kobject *parent) |
338 | { | 335 | { |
339 | sysfs_remove_group(parent, &ppi_attr_grp); | 336 | if (tpm_ppi_handle) |
337 | sysfs_remove_group(parent, &ppi_attr_grp); | ||
340 | } | 338 | } |