aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-02-10 10:52:55 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-02-10 11:14:49 -0500
commit9edd576d89a5b6d3e136d7dcab654d887c0d25b7 (patch)
treed19670de2256f8187321de3a41fa4a10d3c8e402 /drivers/char
parente21af88d39796c907c38648c824be3d646ffbe35 (diff)
parent28a4d5675857f6386930a324317281cb8ed1e5d0 (diff)
Merge remote-tracking branch 'airlied/drm-fixes' into drm-intel-next-queued
Back-merge from drm-fixes into drm-intel-next to sort out two things: - interlaced support: -fixes contains a bugfix to correctly clear interlaced configuration bits in case the bios sets up an interlaced mode and we want to set up the progressive mode (current kernels don't support interlaced). The actual feature work to support interlaced depends upon (and conflicts with) this bugfix. - forcewake voodoo to workaround missed IRQ issues: -fixes only enabled this for ivybridge, but some recent bug reports indicate that we need this on Sandybridge, too. But in a slightly different flavour and with other fixes and reworks on top. Additionally there are some forcewake cleanup patches heading to -next that would conflict with currrent -fixes. Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/agp/amd64-agp.c2
-rw-r--r--drivers/char/agp/backend.c12
-rw-r--r--drivers/char/agp/sis-agp.c2
-rw-r--r--drivers/char/hw_random/atmel-rng.c12
-rw-r--r--drivers/char/hw_random/n2-drv.c13
-rw-r--r--drivers/char/hw_random/nomadik-rng.c2
-rw-r--r--drivers/char/hw_random/octeon-rng.c13
-rw-r--r--drivers/char/hw_random/pasemi-rng.c12
-rw-r--r--drivers/char/hw_random/picoxcell-rng.c12
-rw-r--r--drivers/char/hw_random/ppc4xx-rng.c12
-rw-r--r--drivers/char/hw_random/timeriomem-rng.c13
-rw-r--r--drivers/char/hw_random/virtio-rng.c2
-rw-r--r--drivers/char/i8k.c8
-rw-r--r--drivers/char/ipmi/ipmi_bt_sm.c2
-rw-r--r--drivers/char/ipmi/ipmi_si_intf.c2
-rw-r--r--drivers/char/ipmi/ipmi_watchdog.c41
-rw-r--r--drivers/char/lp.c2
-rw-r--r--drivers/char/mem.c4
-rw-r--r--drivers/char/misc.c2
-rw-r--r--drivers/char/nwflash.c2
-rw-r--r--drivers/char/pcmcia/synclink_cs.c2
-rw-r--r--drivers/char/ramoops.c24
-rw-r--r--drivers/char/random.c16
-rw-r--r--drivers/char/raw.c2
-rw-r--r--drivers/char/tile-srom.c2
-rw-r--r--drivers/char/tpm/Kconfig2
-rw-r--r--drivers/char/tpm/tpm.c146
-rw-r--r--drivers/char/tpm/tpm.h12
-rw-r--r--drivers/char/tpm/tpm_tis.c90
-rw-r--r--drivers/char/virtio_console.c140
30 files changed, 371 insertions, 235 deletions
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c
index 780498d76581..444f8b6ab411 100644
--- a/drivers/char/agp/amd64-agp.c
+++ b/drivers/char/agp/amd64-agp.c
@@ -33,7 +33,7 @@
33#define ULI_X86_64_ENU_SCR_REG 0x54 33#define ULI_X86_64_ENU_SCR_REG 0x54
34 34
35static struct resource *aperture_resource; 35static struct resource *aperture_resource;
36static int __initdata agp_try_unsupported = 1; 36static bool __initdata agp_try_unsupported = 1;
37static int agp_bridges_found; 37static int agp_bridges_found;
38 38
39static void amd64_tlbflush(struct agp_memory *temp) 39static void amd64_tlbflush(struct agp_memory *temp)
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c
index 4b71647782d0..317c28ce8328 100644
--- a/drivers/char/agp/backend.c
+++ b/drivers/char/agp/backend.c
@@ -194,10 +194,10 @@ static int agp_backend_initialize(struct agp_bridge_data *bridge)
194 194
195err_out: 195err_out:
196 if (bridge->driver->needs_scratch_page) { 196 if (bridge->driver->needs_scratch_page) {
197 void *va = page_address(bridge->scratch_page_page); 197 struct page *page = bridge->scratch_page_page;
198 198
199 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP); 199 bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_UNMAP);
200 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE); 200 bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_FREE);
201 } 201 }
202 if (got_gatt) 202 if (got_gatt)
203 bridge->driver->free_gatt_table(bridge); 203 bridge->driver->free_gatt_table(bridge);
@@ -221,10 +221,10 @@ static void agp_backend_cleanup(struct agp_bridge_data *bridge)
221 221
222 if (bridge->driver->agp_destroy_page && 222 if (bridge->driver->agp_destroy_page &&
223 bridge->driver->needs_scratch_page) { 223 bridge->driver->needs_scratch_page) {
224 void *va = page_address(bridge->scratch_page_page); 224 struct page *page = bridge->scratch_page_page;
225 225
226 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_UNMAP); 226 bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_UNMAP);
227 bridge->driver->agp_destroy_page(va, AGP_PAGE_DESTROY_FREE); 227 bridge->driver->agp_destroy_page(page, AGP_PAGE_DESTROY_FREE);
228 } 228 }
229} 229}
230 230
diff --git a/drivers/char/agp/sis-agp.c b/drivers/char/agp/sis-agp.c
index 29aacd81de78..08704ae53956 100644
--- a/drivers/char/agp/sis-agp.c
+++ b/drivers/char/agp/sis-agp.c
@@ -17,7 +17,7 @@
17#define PCI_DEVICE_ID_SI_662 0x0662 17#define PCI_DEVICE_ID_SI_662 0x0662
18#define PCI_DEVICE_ID_SI_671 0x0671 18#define PCI_DEVICE_ID_SI_671 0x0671
19 19
20static int __devinitdata agp_sis_force_delay = 0; 20static bool __devinitdata agp_sis_force_delay = 0;
21static int __devinitdata agp_sis_agp_spec = -1; 21static int __devinitdata agp_sis_agp_spec = -1;
22 22
23static int sis_fetch_size(void) 23static int sis_fetch_size(void)
diff --git a/drivers/char/hw_random/atmel-rng.c b/drivers/char/hw_random/atmel-rng.c
index 241df2e76aba..f518b99f53f5 100644
--- a/drivers/char/hw_random/atmel-rng.c
+++ b/drivers/char/hw_random/atmel-rng.c
@@ -141,17 +141,7 @@ static struct platform_driver atmel_trng_driver = {
141 }, 141 },
142}; 142};
143 143
144static int __init atmel_trng_init(void) 144module_platform_driver(atmel_trng_driver);
145{
146 return platform_driver_register(&atmel_trng_driver);
147}
148module_init(atmel_trng_init);
149
150static void __exit atmel_trng_exit(void)
151{
152 platform_driver_unregister(&atmel_trng_driver);
153}
154module_exit(atmel_trng_exit);
155 145
156MODULE_LICENSE("GPL"); 146MODULE_LICENSE("GPL");
157MODULE_AUTHOR("Peter Korsgaard <jacmet@sunsite.dk>"); 147MODULE_AUTHOR("Peter Korsgaard <jacmet@sunsite.dk>");
diff --git a/drivers/char/hw_random/n2-drv.c b/drivers/char/hw_random/n2-drv.c
index c3de70de00d4..ebd48f0135da 100644
--- a/drivers/char/hw_random/n2-drv.c
+++ b/drivers/char/hw_random/n2-drv.c
@@ -770,15 +770,4 @@ static struct platform_driver n2rng_driver = {
770 .remove = __devexit_p(n2rng_remove), 770 .remove = __devexit_p(n2rng_remove),
771}; 771};
772 772
773static int __init n2rng_init(void) 773module_platform_driver(n2rng_driver);
774{
775 return platform_driver_register(&n2rng_driver);
776}
777
778static void __exit n2rng_exit(void)
779{
780 platform_driver_unregister(&n2rng_driver);
781}
782
783module_init(n2rng_init);
784module_exit(n2rng_exit);
diff --git a/drivers/char/hw_random/nomadik-rng.c b/drivers/char/hw_random/nomadik-rng.c
index 52e08ca3ccd7..3d3c1e6703b4 100644
--- a/drivers/char/hw_random/nomadik-rng.c
+++ b/drivers/char/hw_random/nomadik-rng.c
@@ -95,6 +95,8 @@ static struct amba_id nmk_rng_ids[] = {
95 {0, 0}, 95 {0, 0},
96}; 96};
97 97
98MODULE_DEVICE_TABLE(amba, nmk_rng_ids);
99
98static struct amba_driver nmk_rng_driver = { 100static struct amba_driver nmk_rng_driver = {
99 .drv = { 101 .drv = {
100 .owner = THIS_MODULE, 102 .owner = THIS_MODULE,
diff --git a/drivers/char/hw_random/octeon-rng.c b/drivers/char/hw_random/octeon-rng.c
index 9cd0feca318c..0943edc782a1 100644
--- a/drivers/char/hw_random/octeon-rng.c
+++ b/drivers/char/hw_random/octeon-rng.c
@@ -131,18 +131,7 @@ static struct platform_driver octeon_rng_driver = {
131 .remove = __exit_p(octeon_rng_remove), 131 .remove = __exit_p(octeon_rng_remove),
132}; 132};
133 133
134static int __init octeon_rng_mod_init(void) 134module_platform_driver(octeon_rng_driver);
135{
136 return platform_driver_register(&octeon_rng_driver);
137}
138
139static void __exit octeon_rng_mod_exit(void)
140{
141 platform_driver_unregister(&octeon_rng_driver);
142}
143
144module_init(octeon_rng_mod_init);
145module_exit(octeon_rng_mod_exit);
146 135
147MODULE_AUTHOR("David Daney"); 136MODULE_AUTHOR("David Daney");
148MODULE_LICENSE("GPL"); 137MODULE_LICENSE("GPL");
diff --git a/drivers/char/hw_random/pasemi-rng.c b/drivers/char/hw_random/pasemi-rng.c
index 1d504815e6db..3a632673aed5 100644
--- a/drivers/char/hw_random/pasemi-rng.c
+++ b/drivers/char/hw_random/pasemi-rng.c
@@ -148,17 +148,7 @@ static struct platform_driver rng_driver = {
148 .remove = rng_remove, 148 .remove = rng_remove,
149}; 149};
150 150
151static int __init rng_init(void) 151module_platform_driver(rng_driver);
152{
153 return platform_driver_register(&rng_driver);
154}
155module_init(rng_init);
156
157static void __exit rng_exit(void)
158{
159 platform_driver_unregister(&rng_driver);
160}
161module_exit(rng_exit);
162 152
163MODULE_LICENSE("GPL"); 153MODULE_LICENSE("GPL");
164MODULE_AUTHOR("Egor Martovetsky <egor@pasemi.com>"); 154MODULE_AUTHOR("Egor Martovetsky <egor@pasemi.com>");
diff --git a/drivers/char/hw_random/picoxcell-rng.c b/drivers/char/hw_random/picoxcell-rng.c
index 990d55a5e3e8..97bd891422c7 100644
--- a/drivers/char/hw_random/picoxcell-rng.c
+++ b/drivers/char/hw_random/picoxcell-rng.c
@@ -191,17 +191,7 @@ static struct platform_driver picoxcell_trng_driver = {
191 }, 191 },
192}; 192};
193 193
194static int __init picoxcell_trng_init(void) 194module_platform_driver(picoxcell_trng_driver);
195{
196 return platform_driver_register(&picoxcell_trng_driver);
197}
198module_init(picoxcell_trng_init);
199
200static void __exit picoxcell_trng_exit(void)
201{
202 platform_driver_unregister(&picoxcell_trng_driver);
203}
204module_exit(picoxcell_trng_exit);
205 195
206MODULE_LICENSE("GPL"); 196MODULE_LICENSE("GPL");
207MODULE_AUTHOR("Jamie Iles"); 197MODULE_AUTHOR("Jamie Iles");
diff --git a/drivers/char/hw_random/ppc4xx-rng.c b/drivers/char/hw_random/ppc4xx-rng.c
index b8afa6a4ff67..c51762c13031 100644
--- a/drivers/char/hw_random/ppc4xx-rng.c
+++ b/drivers/char/hw_random/ppc4xx-rng.c
@@ -139,17 +139,7 @@ static struct platform_driver ppc4xx_rng_driver = {
139 .remove = ppc4xx_rng_remove, 139 .remove = ppc4xx_rng_remove,
140}; 140};
141 141
142static int __init ppc4xx_rng_init(void) 142module_platform_driver(ppc4xx_rng_driver);
143{
144 return platform_driver_register(&ppc4xx_rng_driver);
145}
146module_init(ppc4xx_rng_init);
147
148static void __exit ppc4xx_rng_exit(void)
149{
150 platform_driver_unregister(&ppc4xx_rng_driver);
151}
152module_exit(ppc4xx_rng_exit);
153 143
154MODULE_LICENSE("GPL"); 144MODULE_LICENSE("GPL");
155MODULE_AUTHOR("Josh Boyer <jwboyer@linux.vnet.ibm.com>"); 145MODULE_AUTHOR("Josh Boyer <jwboyer@linux.vnet.ibm.com>");
diff --git a/drivers/char/hw_random/timeriomem-rng.c b/drivers/char/hw_random/timeriomem-rng.c
index a8428e6f64a9..f1a1618db1fb 100644
--- a/drivers/char/hw_random/timeriomem-rng.c
+++ b/drivers/char/hw_random/timeriomem-rng.c
@@ -149,18 +149,7 @@ static struct platform_driver timeriomem_rng_driver = {
149 .remove = __devexit_p(timeriomem_rng_remove), 149 .remove = __devexit_p(timeriomem_rng_remove),
150}; 150};
151 151
152static int __init timeriomem_rng_init(void) 152module_platform_driver(timeriomem_rng_driver);
153{
154 return platform_driver_register(&timeriomem_rng_driver);
155}
156
157static void __exit timeriomem_rng_exit(void)
158{
159 platform_driver_unregister(&timeriomem_rng_driver);
160}
161
162module_init(timeriomem_rng_init);
163module_exit(timeriomem_rng_exit);
164 153
165MODULE_LICENSE("GPL"); 154MODULE_LICENSE("GPL");
166MODULE_AUTHOR("Alexander Clouter <alex@digriz.org.uk>"); 155MODULE_AUTHOR("Alexander Clouter <alex@digriz.org.uk>");
diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c
index fd699ccecf5b..723725bbb96b 100644
--- a/drivers/char/hw_random/virtio-rng.c
+++ b/drivers/char/hw_random/virtio-rng.c
@@ -47,7 +47,7 @@ static void register_buffer(u8 *buf, size_t size)
47 sg_init_one(&sg, buf, size); 47 sg_init_one(&sg, buf, size);
48 48
49 /* There should always be room for one buffer. */ 49 /* There should always be room for one buffer. */
50 if (virtqueue_add_buf(vq, &sg, 0, 1, buf) < 0) 50 if (virtqueue_add_buf(vq, &sg, 0, 1, buf, GFP_KERNEL) < 0)
51 BUG(); 51 BUG();
52 52
53 virtqueue_kick(vq); 53 virtqueue_kick(vq);
diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c
index 6e40072fbf67..40cc0cf2ded6 100644
--- a/drivers/char/i8k.c
+++ b/drivers/char/i8k.c
@@ -69,19 +69,19 @@ MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)");
69MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); 69MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops");
70MODULE_LICENSE("GPL"); 70MODULE_LICENSE("GPL");
71 71
72static int force; 72static bool force;
73module_param(force, bool, 0); 73module_param(force, bool, 0);
74MODULE_PARM_DESC(force, "Force loading without checking for supported models"); 74MODULE_PARM_DESC(force, "Force loading without checking for supported models");
75 75
76static int ignore_dmi; 76static bool ignore_dmi;
77module_param(ignore_dmi, bool, 0); 77module_param(ignore_dmi, bool, 0);
78MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); 78MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match");
79 79
80static int restricted; 80static bool restricted;
81module_param(restricted, bool, 0); 81module_param(restricted, bool, 0);
82MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); 82MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set");
83 83
84static int power_status; 84static bool power_status;
85module_param(power_status, bool, 0600); 85module_param(power_status, bool, 0600);
86MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); 86MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k");
87 87
diff --git a/drivers/char/ipmi/ipmi_bt_sm.c b/drivers/char/ipmi/ipmi_bt_sm.c
index 3ed20e8abc0d..cdd4c09fda96 100644
--- a/drivers/char/ipmi/ipmi_bt_sm.c
+++ b/drivers/char/ipmi/ipmi_bt_sm.c
@@ -560,7 +560,7 @@ static enum si_sm_result bt_event(struct si_sm_data *bt, long time)
560 BT_CONTROL(BT_H_BUSY); /* set */ 560 BT_CONTROL(BT_H_BUSY); /* set */
561 561
562 /* 562 /*
563 * Uncached, ordered writes should just proceeed serially but 563 * Uncached, ordered writes should just proceed serially but
564 * some BMCs don't clear B2H_ATN with one hit. Fast-path a 564 * some BMCs don't clear B2H_ATN with one hit. Fast-path a
565 * workaround without too much penalty to the general case. 565 * workaround without too much penalty to the general case.
566 */ 566 */
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c
index 9397ab49b72e..50fcf9c04569 100644
--- a/drivers/char/ipmi/ipmi_si_intf.c
+++ b/drivers/char/ipmi/ipmi_si_intf.c
@@ -1227,7 +1227,7 @@ static int smi_num; /* Used to sequence the SMIs */
1227#define DEFAULT_REGSPACING 1 1227#define DEFAULT_REGSPACING 1
1228#define DEFAULT_REGSIZE 1 1228#define DEFAULT_REGSIZE 1
1229 1229
1230static int si_trydefaults = 1; 1230static bool si_trydefaults = 1;
1231static char *si_type[SI_MAX_PARMS]; 1231static char *si_type[SI_MAX_PARMS];
1232#define MAX_SI_TYPE_STR 30 1232#define MAX_SI_TYPE_STR 30
1233static char si_type_str[MAX_SI_TYPE_STR]; 1233static char si_type_str[MAX_SI_TYPE_STR];
diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c
index c2917ffad2c2..34767a6d7f42 100644
--- a/drivers/char/ipmi/ipmi_watchdog.c
+++ b/drivers/char/ipmi/ipmi_watchdog.c
@@ -139,6 +139,8 @@
139#define IPMI_WDOG_SET_TIMER 0x24 139#define IPMI_WDOG_SET_TIMER 0x24
140#define IPMI_WDOG_GET_TIMER 0x25 140#define IPMI_WDOG_GET_TIMER 0x25
141 141
142#define IPMI_WDOG_TIMER_NOT_INIT_RESP 0x80
143
142/* These are here until the real ones get into the watchdog.h interface. */ 144/* These are here until the real ones get into the watchdog.h interface. */
143#ifndef WDIOC_GETTIMEOUT 145#ifndef WDIOC_GETTIMEOUT
144#define WDIOC_GETTIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 20, int) 146#define WDIOC_GETTIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 20, int)
@@ -596,6 +598,7 @@ static int ipmi_heartbeat(void)
596 struct kernel_ipmi_msg msg; 598 struct kernel_ipmi_msg msg;
597 int rv; 599 int rv;
598 struct ipmi_system_interface_addr addr; 600 struct ipmi_system_interface_addr addr;
601 int timeout_retries = 0;
599 602
600 if (ipmi_ignore_heartbeat) 603 if (ipmi_ignore_heartbeat)
601 return 0; 604 return 0;
@@ -616,6 +619,7 @@ static int ipmi_heartbeat(void)
616 619
617 mutex_lock(&heartbeat_lock); 620 mutex_lock(&heartbeat_lock);
618 621
622restart:
619 atomic_set(&heartbeat_tofree, 2); 623 atomic_set(&heartbeat_tofree, 2);
620 624
621 /* 625 /*
@@ -653,7 +657,33 @@ static int ipmi_heartbeat(void)
653 /* Wait for the heartbeat to be sent. */ 657 /* Wait for the heartbeat to be sent. */
654 wait_for_completion(&heartbeat_wait); 658 wait_for_completion(&heartbeat_wait);
655 659
656 if (heartbeat_recv_msg.msg.data[0] != 0) { 660 if (heartbeat_recv_msg.msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP) {
661 timeout_retries++;
662 if (timeout_retries > 3) {
663 printk(KERN_ERR PFX ": Unable to restore the IPMI"
664 " watchdog's settings, giving up.\n");
665 rv = -EIO;
666 goto out_unlock;
667 }
668
669 /*
670 * The timer was not initialized, that means the BMC was
671 * probably reset and lost the watchdog information. Attempt
672 * to restore the timer's info. Note that we still hold
673 * the heartbeat lock, to keep a heartbeat from happening
674 * in this process, so must say no heartbeat to avoid a
675 * deadlock on this mutex.
676 */
677 rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
678 if (rv) {
679 printk(KERN_ERR PFX ": Unable to send the command to"
680 " set the watchdog's settings, giving up.\n");
681 goto out_unlock;
682 }
683
684 /* We might need a new heartbeat, so do it now */
685 goto restart;
686 } else if (heartbeat_recv_msg.msg.data[0] != 0) {
657 /* 687 /*
658 * Got an error in the heartbeat response. It was already 688 * Got an error in the heartbeat response. It was already
659 * reported in ipmi_wdog_msg_handler, but we should return 689 * reported in ipmi_wdog_msg_handler, but we should return
@@ -662,6 +692,7 @@ static int ipmi_heartbeat(void)
662 rv = -EINVAL; 692 rv = -EINVAL;
663 } 693 }
664 694
695out_unlock:
665 mutex_unlock(&heartbeat_lock); 696 mutex_unlock(&heartbeat_lock);
666 697
667 return rv; 698 return rv;
@@ -922,11 +953,15 @@ static struct miscdevice ipmi_wdog_miscdev = {
922static void ipmi_wdog_msg_handler(struct ipmi_recv_msg *msg, 953static void ipmi_wdog_msg_handler(struct ipmi_recv_msg *msg,
923 void *handler_data) 954 void *handler_data)
924{ 955{
925 if (msg->msg.data[0] != 0) { 956 if (msg->msg.cmd == IPMI_WDOG_RESET_TIMER &&
957 msg->msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP)
958 printk(KERN_INFO PFX "response: The IPMI controller appears"
959 " to have been reset, will attempt to reinitialize"
960 " the watchdog timer\n");
961 else if (msg->msg.data[0] != 0)
926 printk(KERN_ERR PFX "response: Error %x on cmd %x\n", 962 printk(KERN_ERR PFX "response: Error %x on cmd %x\n",
927 msg->msg.data[0], 963 msg->msg.data[0],
928 msg->msg.cmd); 964 msg->msg.cmd);
929 }
930 965
931 ipmi_free_recv_msg(msg); 966 ipmi_free_recv_msg(msg);
932} 967}
diff --git a/drivers/char/lp.c b/drivers/char/lp.c
index 97c3edb95ae7..f43485607063 100644
--- a/drivers/char/lp.c
+++ b/drivers/char/lp.c
@@ -829,7 +829,7 @@ static struct console lpcons = {
829 829
830static int parport_nr[LP_NO] = { [0 ... LP_NO-1] = LP_PARPORT_UNSPEC }; 830static int parport_nr[LP_NO] = { [0 ... LP_NO-1] = LP_PARPORT_UNSPEC };
831static char *parport[LP_NO]; 831static char *parport[LP_NO];
832static int reset; 832static bool reset;
833 833
834module_param_array(parport, charp, NULL, 0); 834module_param_array(parport, charp, NULL, 0);
835module_param(reset, bool, 0); 835module_param(reset, bool, 0);
diff --git a/drivers/char/mem.c b/drivers/char/mem.c
index 145179033716..d6e9d081c8b1 100644
--- a/drivers/char/mem.c
+++ b/drivers/char/mem.c
@@ -847,7 +847,7 @@ static const struct file_operations kmsg_fops = {
847 847
848static const struct memdev { 848static const struct memdev {
849 const char *name; 849 const char *name;
850 mode_t mode; 850 umode_t mode;
851 const struct file_operations *fops; 851 const struct file_operations *fops;
852 struct backing_dev_info *dev_info; 852 struct backing_dev_info *dev_info;
853} devlist[] = { 853} devlist[] = {
@@ -901,7 +901,7 @@ static const struct file_operations memory_fops = {
901 .llseek = noop_llseek, 901 .llseek = noop_llseek,
902}; 902};
903 903
904static char *mem_devnode(struct device *dev, mode_t *mode) 904static char *mem_devnode(struct device *dev, umode_t *mode)
905{ 905{
906 if (mode && devlist[MINOR(dev->devt)].mode) 906 if (mode && devlist[MINOR(dev->devt)].mode)
907 *mode = devlist[MINOR(dev->devt)].mode; 907 *mode = devlist[MINOR(dev->devt)].mode;
diff --git a/drivers/char/misc.c b/drivers/char/misc.c
index 778273c93242..522136d40843 100644
--- a/drivers/char/misc.c
+++ b/drivers/char/misc.c
@@ -258,7 +258,7 @@ int misc_deregister(struct miscdevice *misc)
258EXPORT_SYMBOL(misc_register); 258EXPORT_SYMBOL(misc_register);
259EXPORT_SYMBOL(misc_deregister); 259EXPORT_SYMBOL(misc_deregister);
260 260
261static char *misc_devnode(struct device *dev, mode_t *mode) 261static char *misc_devnode(struct device *dev, umode_t *mode)
262{ 262{
263 struct miscdevice *c = dev_get_drvdata(dev); 263 struct miscdevice *c = dev_get_drvdata(dev);
264 264
diff --git a/drivers/char/nwflash.c b/drivers/char/nwflash.c
index a12f52400dbc..bf586ae1ee83 100644
--- a/drivers/char/nwflash.c
+++ b/drivers/char/nwflash.c
@@ -51,7 +51,7 @@ static int write_block(unsigned long p, const char __user *buf, int count);
51#define KFLASH_ID 0x89A6 //Intel flash 51#define KFLASH_ID 0x89A6 //Intel flash
52#define KFLASH_ID4 0xB0D4 //Intel flash 4Meg 52#define KFLASH_ID4 0xB0D4 //Intel flash 4Meg
53 53
54static int flashdebug; //if set - we will display progress msgs 54static bool flashdebug; //if set - we will display progress msgs
55 55
56static int gbWriteEnable; 56static int gbWriteEnable;
57static int gbWriteBase64Enable; 57static int gbWriteBase64Enable;
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c
index 15781396af25..07f6a5abe372 100644
--- a/drivers/char/pcmcia/synclink_cs.c
+++ b/drivers/char/pcmcia/synclink_cs.c
@@ -439,7 +439,7 @@ static int mgslpc_device_count = 0;
439 * .text section address and breakpoint on module load. 439 * .text section address and breakpoint on module load.
440 * This is useful for use with gdb and add-symbol-file command. 440 * This is useful for use with gdb and add-symbol-file command.
441 */ 441 */
442static int break_on_load=0; 442static bool break_on_load=0;
443 443
444/* 444/*
445 * Driver major number, defaults to zero to get auto 445 * Driver major number, defaults to zero to get auto
diff --git a/drivers/char/ramoops.c b/drivers/char/ramoops.c
index 7c7f42a1f880..9fec3232b736 100644
--- a/drivers/char/ramoops.c
+++ b/drivers/char/ramoops.c
@@ -83,8 +83,7 @@ static void ramoops_do_dump(struct kmsg_dumper *dumper,
83 struct timeval timestamp; 83 struct timeval timestamp;
84 84
85 if (reason != KMSG_DUMP_OOPS && 85 if (reason != KMSG_DUMP_OOPS &&
86 reason != KMSG_DUMP_PANIC && 86 reason != KMSG_DUMP_PANIC)
87 reason != KMSG_DUMP_KEXEC)
88 return; 87 return;
89 88
90 /* Only dump oopses if dump_oops is set */ 89 /* Only dump oopses if dump_oops is set */
@@ -126,8 +125,8 @@ static int __init ramoops_probe(struct platform_device *pdev)
126 goto fail3; 125 goto fail3;
127 } 126 }
128 127
129 rounddown_pow_of_two(pdata->mem_size); 128 pdata->mem_size = rounddown_pow_of_two(pdata->mem_size);
130 rounddown_pow_of_two(pdata->record_size); 129 pdata->record_size = rounddown_pow_of_two(pdata->record_size);
131 130
132 /* Check for the minimum memory size */ 131 /* Check for the minimum memory size */
133 if (pdata->mem_size < MIN_MEM_SIZE && 132 if (pdata->mem_size < MIN_MEM_SIZE &&
@@ -148,14 +147,6 @@ static int __init ramoops_probe(struct platform_device *pdev)
148 cxt->phys_addr = pdata->mem_address; 147 cxt->phys_addr = pdata->mem_address;
149 cxt->record_size = pdata->record_size; 148 cxt->record_size = pdata->record_size;
150 cxt->dump_oops = pdata->dump_oops; 149 cxt->dump_oops = pdata->dump_oops;
151 /*
152 * Update the module parameter variables as well so they are visible
153 * through /sys/module/ramoops/parameters/
154 */
155 mem_size = pdata->mem_size;
156 mem_address = pdata->mem_address;
157 record_size = pdata->record_size;
158 dump_oops = pdata->dump_oops;
159 150
160 if (!request_mem_region(cxt->phys_addr, cxt->size, "ramoops")) { 151 if (!request_mem_region(cxt->phys_addr, cxt->size, "ramoops")) {
161 pr_err("request mem region failed\n"); 152 pr_err("request mem region failed\n");
@@ -176,6 +167,15 @@ static int __init ramoops_probe(struct platform_device *pdev)
176 goto fail1; 167 goto fail1;
177 } 168 }
178 169
170 /*
171 * Update the module parameter variables as well so they are visible
172 * through /sys/module/ramoops/parameters/
173 */
174 mem_size = pdata->mem_size;
175 mem_address = pdata->mem_address;
176 record_size = pdata->record_size;
177 dump_oops = pdata->dump_oops;
178
179 return 0; 179 return 0;
180 180
181fail1: 181fail1:
diff --git a/drivers/char/random.c b/drivers/char/random.c
index 6035ab8d5ef7..54ca8b23cde3 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -387,7 +387,7 @@ static DECLARE_WAIT_QUEUE_HEAD(random_write_wait);
387static struct fasync_struct *fasync; 387static struct fasync_struct *fasync;
388 388
389#if 0 389#if 0
390static int debug; 390static bool debug;
391module_param(debug, bool, 0644); 391module_param(debug, bool, 0644);
392#define DEBUG_ENT(fmt, arg...) do { \ 392#define DEBUG_ENT(fmt, arg...) do { \
393 if (debug) \ 393 if (debug) \
@@ -624,8 +624,8 @@ static struct timer_rand_state input_timer_state;
624static void add_timer_randomness(struct timer_rand_state *state, unsigned num) 624static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
625{ 625{
626 struct { 626 struct {
627 cycles_t cycles;
628 long jiffies; 627 long jiffies;
628 unsigned cycles;
629 unsigned num; 629 unsigned num;
630 } sample; 630 } sample;
631 long delta, delta2, delta3; 631 long delta, delta2, delta3;
@@ -637,7 +637,11 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
637 goto out; 637 goto out;
638 638
639 sample.jiffies = jiffies; 639 sample.jiffies = jiffies;
640 sample.cycles = get_cycles(); 640
641 /* Use arch random value, fall back to cycles */
642 if (!arch_get_random_int(&sample.cycles))
643 sample.cycles = get_cycles();
644
641 sample.num = num; 645 sample.num = num;
642 mix_pool_bytes(&input_pool, &sample, sizeof(sample)); 646 mix_pool_bytes(&input_pool, &sample, sizeof(sample));
643 647
@@ -961,6 +965,7 @@ EXPORT_SYMBOL(get_random_bytes);
961 */ 965 */
962static void init_std_data(struct entropy_store *r) 966static void init_std_data(struct entropy_store *r)
963{ 967{
968 int i;
964 ktime_t now; 969 ktime_t now;
965 unsigned long flags; 970 unsigned long flags;
966 971
@@ -970,6 +975,11 @@ static void init_std_data(struct entropy_store *r)
970 975
971 now = ktime_get_real(); 976 now = ktime_get_real();
972 mix_pool_bytes(r, &now, sizeof(now)); 977 mix_pool_bytes(r, &now, sizeof(now));
978 for (i = r->poolinfo->POOLBYTES; i > 0; i -= sizeof flags) {
979 if (!arch_get_random_long(&flags))
980 break;
981 mix_pool_bytes(r, &flags, sizeof(flags));
982 }
973 mix_pool_bytes(r, utsname(), sizeof(*(utsname()))); 983 mix_pool_bytes(r, utsname(), sizeof(*(utsname())));
974} 984}
975 985
diff --git a/drivers/char/raw.c b/drivers/char/raw.c
index b6de2c047145..54a3a6d09819 100644
--- a/drivers/char/raw.c
+++ b/drivers/char/raw.c
@@ -308,7 +308,7 @@ static const struct file_operations raw_ctl_fops = {
308 308
309static struct cdev raw_cdev; 309static struct cdev raw_cdev;
310 310
311static char *raw_devnode(struct device *dev, mode_t *mode) 311static char *raw_devnode(struct device *dev, umode_t *mode)
312{ 312{
313 return kasprintf(GFP_KERNEL, "raw/%s", dev_name(dev)); 313 return kasprintf(GFP_KERNEL, "raw/%s", dev_name(dev));
314} 314}
diff --git a/drivers/char/tile-srom.c b/drivers/char/tile-srom.c
index cf3ee008dca2..4dc019408fac 100644
--- a/drivers/char/tile-srom.c
+++ b/drivers/char/tile-srom.c
@@ -329,7 +329,7 @@ static struct device_attribute srom_dev_attrs[] = {
329 __ATTR_NULL 329 __ATTR_NULL
330}; 330};
331 331
332static char *srom_devnode(struct device *dev, mode_t *mode) 332static char *srom_devnode(struct device *dev, umode_t *mode)
333{ 333{
334 *mode = S_IRUGO | S_IWUSR; 334 *mode = S_IRUGO | S_IWUSR;
335 return kasprintf(GFP_KERNEL, "srom/%s", dev_name(dev)); 335 return kasprintf(GFP_KERNEL, "srom/%s", dev_name(dev));
diff --git a/drivers/char/tpm/Kconfig b/drivers/char/tpm/Kconfig
index fa567f1158c2..7fc75e47e6d0 100644
--- a/drivers/char/tpm/Kconfig
+++ b/drivers/char/tpm/Kconfig
@@ -27,6 +27,7 @@ if TCG_TPM
27 27
28config TCG_TIS 28config TCG_TIS
29 tristate "TPM Interface Specification 1.2 Interface" 29 tristate "TPM Interface Specification 1.2 Interface"
30 depends on X86
30 ---help--- 31 ---help---
31 If you have a TPM security chip that is compliant with the 32 If you have a TPM security chip that is compliant with the
32 TCG TIS 1.2 TPM specification say Yes and it will be accessible 33 TCG TIS 1.2 TPM specification say Yes and it will be accessible
@@ -35,6 +36,7 @@ config TCG_TIS
35 36
36config TCG_NSC 37config TCG_NSC
37 tristate "National Semiconductor TPM Interface" 38 tristate "National Semiconductor TPM Interface"
39 depends on X86
38 ---help--- 40 ---help---
39 If you have a TPM security chip from National Semiconductor 41 If you have a TPM security chip from National Semiconductor
40 say Yes and it will be accessible from within Linux. To 42 say Yes and it will be accessible from within Linux. To
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
index 361a1dff8f77..32362cf35b8d 100644
--- a/drivers/char/tpm/tpm.c
+++ b/drivers/char/tpm/tpm.c
@@ -27,6 +27,7 @@
27#include <linux/slab.h> 27#include <linux/slab.h>
28#include <linux/mutex.h> 28#include <linux/mutex.h>
29#include <linux/spinlock.h> 29#include <linux/spinlock.h>
30#include <linux/freezer.h>
30 31
31#include "tpm.h" 32#include "tpm.h"
32 33
@@ -440,7 +441,6 @@ out:
440} 441}
441 442
442#define TPM_DIGEST_SIZE 20 443#define TPM_DIGEST_SIZE 20
443#define TPM_ERROR_SIZE 10
444#define TPM_RET_CODE_IDX 6 444#define TPM_RET_CODE_IDX 6
445 445
446enum tpm_capabilities { 446enum tpm_capabilities {
@@ -469,12 +469,14 @@ static ssize_t transmit_cmd(struct tpm_chip *chip, struct tpm_cmd_t *cmd,
469 len = tpm_transmit(chip,(u8 *) cmd, len); 469 len = tpm_transmit(chip,(u8 *) cmd, len);
470 if (len < 0) 470 if (len < 0)
471 return len; 471 return len;
472 if (len == TPM_ERROR_SIZE) { 472 else if (len < TPM_HEADER_SIZE)
473 err = be32_to_cpu(cmd->header.out.return_code); 473 return -EFAULT;
474 dev_dbg(chip->dev, "A TPM error (%d) occurred %s\n", err, desc); 474
475 return err; 475 err = be32_to_cpu(cmd->header.out.return_code);
476 } 476 if (err != 0)
477 return 0; 477 dev_err(chip->dev, "A TPM error (%d) occurred %s\n", err, desc);
478
479 return err;
478} 480}
479 481
480#define TPM_INTERNAL_RESULT_SIZE 200 482#define TPM_INTERNAL_RESULT_SIZE 200
@@ -530,7 +532,7 @@ void tpm_gen_interrupt(struct tpm_chip *chip)
530} 532}
531EXPORT_SYMBOL_GPL(tpm_gen_interrupt); 533EXPORT_SYMBOL_GPL(tpm_gen_interrupt);
532 534
533void tpm_get_timeouts(struct tpm_chip *chip) 535int tpm_get_timeouts(struct tpm_chip *chip)
534{ 536{
535 struct tpm_cmd_t tpm_cmd; 537 struct tpm_cmd_t tpm_cmd;
536 struct timeout_t *timeout_cap; 538 struct timeout_t *timeout_cap;
@@ -552,7 +554,7 @@ void tpm_get_timeouts(struct tpm_chip *chip)
552 if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 || 554 if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 ||
553 be32_to_cpu(tpm_cmd.header.out.length) 555 be32_to_cpu(tpm_cmd.header.out.length)
554 != sizeof(tpm_cmd.header.out) + sizeof(u32) + 4 * sizeof(u32)) 556 != sizeof(tpm_cmd.header.out) + sizeof(u32) + 4 * sizeof(u32))
555 return; 557 return -EINVAL;
556 558
557 timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout; 559 timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout;
558 /* Don't overwrite default if value is 0 */ 560 /* Don't overwrite default if value is 0 */
@@ -583,12 +585,12 @@ duration:
583 rc = transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, 585 rc = transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE,
584 "attempting to determine the durations"); 586 "attempting to determine the durations");
585 if (rc) 587 if (rc)
586 return; 588 return rc;
587 589
588 if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 || 590 if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 ||
589 be32_to_cpu(tpm_cmd.header.out.length) 591 be32_to_cpu(tpm_cmd.header.out.length)
590 != sizeof(tpm_cmd.header.out) + sizeof(u32) + 3 * sizeof(u32)) 592 != sizeof(tpm_cmd.header.out) + sizeof(u32) + 3 * sizeof(u32))
591 return; 593 return -EINVAL;
592 594
593 duration_cap = &tpm_cmd.params.getcap_out.cap.duration; 595 duration_cap = &tpm_cmd.params.getcap_out.cap.duration;
594 chip->vendor.duration[TPM_SHORT] = 596 chip->vendor.duration[TPM_SHORT] =
@@ -610,20 +612,36 @@ duration:
610 chip->vendor.duration_adjusted = true; 612 chip->vendor.duration_adjusted = true;
611 dev_info(chip->dev, "Adjusting TPM timeout parameters."); 613 dev_info(chip->dev, "Adjusting TPM timeout parameters.");
612 } 614 }
615 return 0;
613} 616}
614EXPORT_SYMBOL_GPL(tpm_get_timeouts); 617EXPORT_SYMBOL_GPL(tpm_get_timeouts);
615 618
616void tpm_continue_selftest(struct tpm_chip *chip) 619#define TPM_ORD_CONTINUE_SELFTEST 83
620#define CONTINUE_SELFTEST_RESULT_SIZE 10
621
622static struct tpm_input_header continue_selftest_header = {
623 .tag = TPM_TAG_RQU_COMMAND,
624 .length = cpu_to_be32(10),
625 .ordinal = cpu_to_be32(TPM_ORD_CONTINUE_SELFTEST),
626};
627
628/**
629 * tpm_continue_selftest -- run TPM's selftest
630 * @chip: TPM chip to use
631 *
632 * Returns 0 on success, < 0 in case of fatal error or a value > 0 representing
633 * a TPM error code.
634 */
635static int tpm_continue_selftest(struct tpm_chip *chip)
617{ 636{
618 u8 data[] = { 637 int rc;
619 0, 193, /* TPM_TAG_RQU_COMMAND */ 638 struct tpm_cmd_t cmd;
620 0, 0, 0, 10, /* length */
621 0, 0, 0, 83, /* TPM_ORD_ContinueSelfTest */
622 };
623 639
624 tpm_transmit(chip, data, sizeof(data)); 640 cmd.header.in = continue_selftest_header;
641 rc = transmit_cmd(chip, &cmd, CONTINUE_SELFTEST_RESULT_SIZE,
642 "continue selftest");
643 return rc;
625} 644}
626EXPORT_SYMBOL_GPL(tpm_continue_selftest);
627 645
628ssize_t tpm_show_enabled(struct device * dev, struct device_attribute * attr, 646ssize_t tpm_show_enabled(struct device * dev, struct device_attribute * attr,
629 char *buf) 647 char *buf)
@@ -718,7 +736,7 @@ static struct tpm_input_header pcrread_header = {
718 .ordinal = TPM_ORDINAL_PCRREAD 736 .ordinal = TPM_ORDINAL_PCRREAD
719}; 737};
720 738
721int __tpm_pcr_read(struct tpm_chip *chip, int pcr_idx, u8 *res_buf) 739static int __tpm_pcr_read(struct tpm_chip *chip, int pcr_idx, u8 *res_buf)
722{ 740{
723 int rc; 741 int rc;
724 struct tpm_cmd_t cmd; 742 struct tpm_cmd_t cmd;
@@ -798,6 +816,54 @@ int tpm_pcr_extend(u32 chip_num, int pcr_idx, const u8 *hash)
798} 816}
799EXPORT_SYMBOL_GPL(tpm_pcr_extend); 817EXPORT_SYMBOL_GPL(tpm_pcr_extend);
800 818
819/**
820 * tpm_do_selftest - have the TPM continue its selftest and wait until it
821 * can receive further commands
822 * @chip: TPM chip to use
823 *
824 * Returns 0 on success, < 0 in case of fatal error or a value > 0 representing
825 * a TPM error code.
826 */
827int tpm_do_selftest(struct tpm_chip *chip)
828{
829 int rc;
830 u8 digest[TPM_DIGEST_SIZE];
831 unsigned int loops;
832 unsigned int delay_msec = 1000;
833 unsigned long duration;
834
835 duration = tpm_calc_ordinal_duration(chip,
836 TPM_ORD_CONTINUE_SELFTEST);
837
838 loops = jiffies_to_msecs(duration) / delay_msec;
839
840 rc = tpm_continue_selftest(chip);
841 /* This may fail if there was no TPM driver during a suspend/resume
842 * cycle; some may return 10 (BAD_ORDINAL), others 28 (FAILEDSELFTEST)
843 */
844 if (rc)
845 return rc;
846
847 do {
848 rc = __tpm_pcr_read(chip, 0, digest);
849 if (rc == TPM_ERR_DISABLED || rc == TPM_ERR_DEACTIVATED) {
850 dev_info(chip->dev,
851 "TPM is disabled/deactivated (0x%X)\n", rc);
852 /* TPM is disabled and/or deactivated; driver can
853 * proceed and TPM does handle commands for
854 * suspend/resume correctly
855 */
856 return 0;
857 }
858 if (rc != TPM_WARN_DOING_SELFTEST)
859 return rc;
860 msleep(delay_msec);
861 } while (--loops > 0);
862
863 return rc;
864}
865EXPORT_SYMBOL_GPL(tpm_do_selftest);
866
801int tpm_send(u32 chip_num, void *cmd, size_t buflen) 867int tpm_send(u32 chip_num, void *cmd, size_t buflen)
802{ 868{
803 struct tpm_chip *chip; 869 struct tpm_chip *chip;
@@ -1005,6 +1071,46 @@ ssize_t tpm_store_cancel(struct device *dev, struct device_attribute *attr,
1005} 1071}
1006EXPORT_SYMBOL_GPL(tpm_store_cancel); 1072EXPORT_SYMBOL_GPL(tpm_store_cancel);
1007 1073
1074int wait_for_tpm_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
1075 wait_queue_head_t *queue)
1076{
1077 unsigned long stop;
1078 long rc;
1079 u8 status;
1080
1081 /* check current status */
1082 status = chip->vendor.status(chip);
1083 if ((status & mask) == mask)
1084 return 0;
1085
1086 stop = jiffies + timeout;
1087
1088 if (chip->vendor.irq) {
1089again:
1090 timeout = stop - jiffies;
1091 if ((long)timeout <= 0)
1092 return -ETIME;
1093 rc = wait_event_interruptible_timeout(*queue,
1094 ((chip->vendor.status(chip)
1095 & mask) == mask),
1096 timeout);
1097 if (rc > 0)
1098 return 0;
1099 if (rc == -ERESTARTSYS && freezing(current)) {
1100 clear_thread_flag(TIF_SIGPENDING);
1101 goto again;
1102 }
1103 } else {
1104 do {
1105 msleep(TPM_TIMEOUT);
1106 status = chip->vendor.status(chip);
1107 if ((status & mask) == mask)
1108 return 0;
1109 } while (time_before(jiffies, stop));
1110 }
1111 return -ETIME;
1112}
1113EXPORT_SYMBOL_GPL(wait_for_tpm_stat);
1008/* 1114/*
1009 * Device file system interface to the TPM 1115 * Device file system interface to the TPM
1010 * 1116 *
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
index 9c4163cfa3ce..010547138281 100644
--- a/drivers/char/tpm/tpm.h
+++ b/drivers/char/tpm/tpm.h
@@ -38,6 +38,11 @@ enum tpm_addr {
38 TPM_ADDR = 0x4E, 38 TPM_ADDR = 0x4E,
39}; 39};
40 40
41#define TPM_WARN_DOING_SELFTEST 0x802
42#define TPM_ERR_DEACTIVATED 0x6
43#define TPM_ERR_DISABLED 0x7
44
45#define TPM_HEADER_SIZE 10
41extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr, 46extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr,
42 char *); 47 char *);
43extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr, 48extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr,
@@ -279,9 +284,9 @@ struct tpm_cmd_t {
279 284
280ssize_t tpm_getcap(struct device *, __be32, cap_t *, const char *); 285ssize_t tpm_getcap(struct device *, __be32, cap_t *, const char *);
281 286
282extern void tpm_get_timeouts(struct tpm_chip *); 287extern int tpm_get_timeouts(struct tpm_chip *);
283extern void tpm_gen_interrupt(struct tpm_chip *); 288extern void tpm_gen_interrupt(struct tpm_chip *);
284extern void tpm_continue_selftest(struct tpm_chip *); 289extern int tpm_do_selftest(struct tpm_chip *);
285extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32); 290extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32);
286extern struct tpm_chip* tpm_register_hardware(struct device *, 291extern struct tpm_chip* tpm_register_hardware(struct device *,
287 const struct tpm_vendor_specific *); 292 const struct tpm_vendor_specific *);
@@ -294,7 +299,8 @@ extern ssize_t tpm_read(struct file *, char __user *, size_t, loff_t *);
294extern void tpm_remove_hardware(struct device *); 299extern void tpm_remove_hardware(struct device *);
295extern int tpm_pm_suspend(struct device *, pm_message_t); 300extern int tpm_pm_suspend(struct device *, pm_message_t);
296extern int tpm_pm_resume(struct device *); 301extern int tpm_pm_resume(struct device *);
297 302extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long,
303 wait_queue_head_t *);
298#ifdef CONFIG_ACPI 304#ifdef CONFIG_ACPI
299extern struct dentry ** tpm_bios_log_setup(char *); 305extern struct dentry ** tpm_bios_log_setup(char *);
300extern void tpm_bios_log_teardown(struct dentry **); 306extern void tpm_bios_log_teardown(struct dentry **);
diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c
index 3f4051a7c5a7..a1748621111b 100644
--- a/drivers/char/tpm/tpm_tis.c
+++ b/drivers/char/tpm/tpm_tis.c
@@ -29,8 +29,6 @@
29#include <linux/freezer.h> 29#include <linux/freezer.h>
30#include "tpm.h" 30#include "tpm.h"
31 31
32#define TPM_HEADER_SIZE 10
33
34enum tis_access { 32enum tis_access {
35 TPM_ACCESS_VALID = 0x80, 33 TPM_ACCESS_VALID = 0x80,
36 TPM_ACCESS_ACTIVE_LOCALITY = 0x20, 34 TPM_ACCESS_ACTIVE_LOCALITY = 0x20,
@@ -193,54 +191,14 @@ static int get_burstcount(struct tpm_chip *chip)
193 return -EBUSY; 191 return -EBUSY;
194} 192}
195 193
196static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
197 wait_queue_head_t *queue)
198{
199 unsigned long stop;
200 long rc;
201 u8 status;
202
203 /* check current status */
204 status = tpm_tis_status(chip);
205 if ((status & mask) == mask)
206 return 0;
207
208 stop = jiffies + timeout;
209
210 if (chip->vendor.irq) {
211again:
212 timeout = stop - jiffies;
213 if ((long)timeout <= 0)
214 return -ETIME;
215 rc = wait_event_interruptible_timeout(*queue,
216 ((tpm_tis_status
217 (chip) & mask) ==
218 mask), timeout);
219 if (rc > 0)
220 return 0;
221 if (rc == -ERESTARTSYS && freezing(current)) {
222 clear_thread_flag(TIF_SIGPENDING);
223 goto again;
224 }
225 } else {
226 do {
227 msleep(TPM_TIMEOUT);
228 status = tpm_tis_status(chip);
229 if ((status & mask) == mask)
230 return 0;
231 } while (time_before(jiffies, stop));
232 }
233 return -ETIME;
234}
235
236static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count) 194static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count)
237{ 195{
238 int size = 0, burstcnt; 196 int size = 0, burstcnt;
239 while (size < count && 197 while (size < count &&
240 wait_for_stat(chip, 198 wait_for_tpm_stat(chip,
241 TPM_STS_DATA_AVAIL | TPM_STS_VALID, 199 TPM_STS_DATA_AVAIL | TPM_STS_VALID,
242 chip->vendor.timeout_c, 200 chip->vendor.timeout_c,
243 &chip->vendor.read_queue) 201 &chip->vendor.read_queue)
244 == 0) { 202 == 0) {
245 burstcnt = get_burstcount(chip); 203 burstcnt = get_burstcount(chip);
246 for (; burstcnt > 0 && size < count; burstcnt--) 204 for (; burstcnt > 0 && size < count; burstcnt--)
@@ -282,8 +240,8 @@ static int tpm_tis_recv(struct tpm_chip *chip, u8 *buf, size_t count)
282 goto out; 240 goto out;
283 } 241 }
284 242
285 wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, 243 wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
286 &chip->vendor.int_queue); 244 &chip->vendor.int_queue);
287 status = tpm_tis_status(chip); 245 status = tpm_tis_status(chip);
288 if (status & TPM_STS_DATA_AVAIL) { /* retry? */ 246 if (status & TPM_STS_DATA_AVAIL) { /* retry? */
289 dev_err(chip->dev, "Error left over data\n"); 247 dev_err(chip->dev, "Error left over data\n");
@@ -297,7 +255,7 @@ out:
297 return size; 255 return size;
298} 256}
299 257
300static int itpm; 258static bool itpm;
301module_param(itpm, bool, 0444); 259module_param(itpm, bool, 0444);
302MODULE_PARM_DESC(itpm, "Force iTPM workarounds (found on some Lenovo laptops)"); 260MODULE_PARM_DESC(itpm, "Force iTPM workarounds (found on some Lenovo laptops)");
303 261
@@ -317,7 +275,7 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len)
317 status = tpm_tis_status(chip); 275 status = tpm_tis_status(chip);
318 if ((status & TPM_STS_COMMAND_READY) == 0) { 276 if ((status & TPM_STS_COMMAND_READY) == 0) {
319 tpm_tis_ready(chip); 277 tpm_tis_ready(chip);
320 if (wait_for_stat 278 if (wait_for_tpm_stat
321 (chip, TPM_STS_COMMAND_READY, chip->vendor.timeout_b, 279 (chip, TPM_STS_COMMAND_READY, chip->vendor.timeout_b,
322 &chip->vendor.int_queue) < 0) { 280 &chip->vendor.int_queue) < 0) {
323 rc = -ETIME; 281 rc = -ETIME;
@@ -333,8 +291,8 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len)
333 count++; 291 count++;
334 } 292 }
335 293
336 wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, 294 wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
337 &chip->vendor.int_queue); 295 &chip->vendor.int_queue);
338 status = tpm_tis_status(chip); 296 status = tpm_tis_status(chip);
339 if (!itpm && (status & TPM_STS_DATA_EXPECT) == 0) { 297 if (!itpm && (status & TPM_STS_DATA_EXPECT) == 0) {
340 rc = -EIO; 298 rc = -EIO;
@@ -345,8 +303,8 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len)
345 /* write last byte */ 303 /* write last byte */
346 iowrite8(buf[count], 304 iowrite8(buf[count],
347 chip->vendor.iobase + TPM_DATA_FIFO(chip->vendor.locality)); 305 chip->vendor.iobase + TPM_DATA_FIFO(chip->vendor.locality));
348 wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, 306 wait_for_tpm_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
349 &chip->vendor.int_queue); 307 &chip->vendor.int_queue);
350 status = tpm_tis_status(chip); 308 status = tpm_tis_status(chip);
351 if ((status & TPM_STS_DATA_EXPECT) != 0) { 309 if ((status & TPM_STS_DATA_EXPECT) != 0) {
352 rc = -EIO; 310 rc = -EIO;
@@ -381,7 +339,7 @@ static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len)
381 339
382 if (chip->vendor.irq) { 340 if (chip->vendor.irq) {
383 ordinal = be32_to_cpu(*((__be32 *) (buf + 6))); 341 ordinal = be32_to_cpu(*((__be32 *) (buf + 6)));
384 if (wait_for_stat 342 if (wait_for_tpm_stat
385 (chip, TPM_STS_DATA_AVAIL | TPM_STS_VALID, 343 (chip, TPM_STS_DATA_AVAIL | TPM_STS_VALID,
386 tpm_calc_ordinal_duration(chip, ordinal), 344 tpm_calc_ordinal_duration(chip, ordinal),
387 &chip->vendor.read_queue) < 0) { 345 &chip->vendor.read_queue) < 0) {
@@ -432,6 +390,9 @@ static int probe_itpm(struct tpm_chip *chip)
432out: 390out:
433 itpm = rem_itpm; 391 itpm = rem_itpm;
434 tpm_tis_ready(chip); 392 tpm_tis_ready(chip);
393 /* some TPMs need a break here otherwise they will not work
394 * correctly on the immediately subsequent command */
395 msleep(chip->vendor.timeout_b);
435 release_locality(chip, chip->vendor.locality, 0); 396 release_locality(chip, chip->vendor.locality, 0);
436 397
437 return rc; 398 return rc;
@@ -539,7 +500,7 @@ static irqreturn_t tis_int_handler(int dummy, void *dev_id)
539 return IRQ_HANDLED; 500 return IRQ_HANDLED;
540} 501}
541 502
542static int interrupts = 1; 503static bool interrupts = 1;
543module_param(interrupts, bool, 0444); 504module_param(interrupts, bool, 0444);
544MODULE_PARM_DESC(interrupts, "Enable interrupts"); 505MODULE_PARM_DESC(interrupts, "Enable interrupts");
545 506
@@ -614,7 +575,17 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
614 dev_dbg(dev, "\tData Avail Int Support\n"); 575 dev_dbg(dev, "\tData Avail Int Support\n");
615 576
616 /* get the timeouts before testing for irqs */ 577 /* get the timeouts before testing for irqs */
617 tpm_get_timeouts(chip); 578 if (tpm_get_timeouts(chip)) {
579 dev_err(dev, "Could not get TPM timeouts and durations\n");
580 rc = -ENODEV;
581 goto out_err;
582 }
583
584 if (tpm_do_selftest(chip)) {
585 dev_err(dev, "TPM self test failed\n");
586 rc = -ENODEV;
587 goto out_err;
588 }
618 589
619 /* INTERRUPT Setup */ 590 /* INTERRUPT Setup */
620 init_waitqueue_head(&chip->vendor.read_queue); 591 init_waitqueue_head(&chip->vendor.read_queue);
@@ -722,7 +693,6 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
722 list_add(&chip->vendor.list, &tis_chips); 693 list_add(&chip->vendor.list, &tis_chips);
723 spin_unlock(&tis_lock); 694 spin_unlock(&tis_lock);
724 695
725 tpm_continue_selftest(chip);
726 696
727 return 0; 697 return 0;
728out_err: 698out_err:
@@ -790,7 +760,7 @@ static int tpm_tis_pnp_resume(struct pnp_dev *dev)
790 760
791 ret = tpm_pm_resume(&dev->dev); 761 ret = tpm_pm_resume(&dev->dev);
792 if (!ret) 762 if (!ret)
793 tpm_continue_selftest(chip); 763 tpm_do_selftest(chip);
794 764
795 return ret; 765 return ret;
796} 766}
@@ -858,7 +828,7 @@ static struct platform_driver tis_drv = {
858 828
859static struct platform_device *pdev; 829static struct platform_device *pdev;
860 830
861static int force; 831static bool force;
862module_param(force, bool, 0444); 832module_param(force, bool, 0444);
863MODULE_PARM_DESC(force, "Force device probe rather than using ACPI entry"); 833MODULE_PARM_DESC(force, "Force device probe rather than using ACPI entry");
864static int __init init_tis(void) 834static int __init init_tis(void)
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 8e3c46d67cb3..b58b56187065 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -392,7 +392,7 @@ static int add_inbuf(struct virtqueue *vq, struct port_buffer *buf)
392 392
393 sg_init_one(sg, buf->buf, buf->size); 393 sg_init_one(sg, buf->buf, buf->size);
394 394
395 ret = virtqueue_add_buf(vq, sg, 0, 1, buf); 395 ret = virtqueue_add_buf(vq, sg, 0, 1, buf, GFP_ATOMIC);
396 virtqueue_kick(vq); 396 virtqueue_kick(vq);
397 return ret; 397 return ret;
398} 398}
@@ -457,7 +457,7 @@ static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id,
457 vq = portdev->c_ovq; 457 vq = portdev->c_ovq;
458 458
459 sg_init_one(sg, &cpkt, sizeof(cpkt)); 459 sg_init_one(sg, &cpkt, sizeof(cpkt));
460 if (virtqueue_add_buf(vq, sg, 1, 0, &cpkt) >= 0) { 460 if (virtqueue_add_buf(vq, sg, 1, 0, &cpkt, GFP_ATOMIC) >= 0) {
461 virtqueue_kick(vq); 461 virtqueue_kick(vq);
462 while (!virtqueue_get_buf(vq, &len)) 462 while (!virtqueue_get_buf(vq, &len))
463 cpu_relax(); 463 cpu_relax();
@@ -506,7 +506,7 @@ static ssize_t send_buf(struct port *port, void *in_buf, size_t in_count,
506 reclaim_consumed_buffers(port); 506 reclaim_consumed_buffers(port);
507 507
508 sg_init_one(sg, in_buf, in_count); 508 sg_init_one(sg, in_buf, in_count);
509 ret = virtqueue_add_buf(out_vq, sg, 1, 0, in_buf); 509 ret = virtqueue_add_buf(out_vq, sg, 1, 0, in_buf, GFP_ATOMIC);
510 510
511 /* Tell Host to go! */ 511 /* Tell Host to go! */
512 virtqueue_kick(out_vq); 512 virtqueue_kick(out_vq);
@@ -1271,6 +1271,20 @@ static void remove_port(struct kref *kref)
1271 kfree(port); 1271 kfree(port);
1272} 1272}
1273 1273
1274static void remove_port_data(struct port *port)
1275{
1276 struct port_buffer *buf;
1277
1278 /* Remove unused data this port might have received. */
1279 discard_port_data(port);
1280
1281 reclaim_consumed_buffers(port);
1282
1283 /* Remove buffers we queued up for the Host to send us data in. */
1284 while ((buf = virtqueue_detach_unused_buf(port->in_vq)))
1285 free_buf(buf);
1286}
1287
1274/* 1288/*
1275 * Port got unplugged. Remove port from portdev's list and drop the 1289 * Port got unplugged. Remove port from portdev's list and drop the
1276 * kref reference. If no userspace has this port opened, it will 1290 * kref reference. If no userspace has this port opened, it will
@@ -1278,8 +1292,6 @@ static void remove_port(struct kref *kref)
1278 */ 1292 */
1279static void unplug_port(struct port *port) 1293static void unplug_port(struct port *port)
1280{ 1294{
1281 struct port_buffer *buf;
1282
1283 spin_lock_irq(&port->portdev->ports_lock); 1295 spin_lock_irq(&port->portdev->ports_lock);
1284 list_del(&port->list); 1296 list_del(&port->list);
1285 spin_unlock_irq(&port->portdev->ports_lock); 1297 spin_unlock_irq(&port->portdev->ports_lock);
@@ -1300,14 +1312,7 @@ static void unplug_port(struct port *port)
1300 hvc_remove(port->cons.hvc); 1312 hvc_remove(port->cons.hvc);
1301 } 1313 }
1302 1314
1303 /* Remove unused data this port might have received. */ 1315 remove_port_data(port);
1304 discard_port_data(port);
1305
1306 reclaim_consumed_buffers(port);
1307
1308 /* Remove buffers we queued up for the Host to send us data in. */
1309 while ((buf = virtqueue_detach_unused_buf(port->in_vq)))
1310 free_buf(buf);
1311 1316
1312 /* 1317 /*
1313 * We should just assume the device itself has gone off -- 1318 * We should just assume the device itself has gone off --
@@ -1659,6 +1664,28 @@ static const struct file_operations portdev_fops = {
1659 .owner = THIS_MODULE, 1664 .owner = THIS_MODULE,
1660}; 1665};
1661 1666
1667static void remove_vqs(struct ports_device *portdev)
1668{
1669 portdev->vdev->config->del_vqs(portdev->vdev);
1670 kfree(portdev->in_vqs);
1671 kfree(portdev->out_vqs);
1672}
1673
1674static void remove_controlq_data(struct ports_device *portdev)
1675{
1676 struct port_buffer *buf;
1677 unsigned int len;
1678
1679 if (!use_multiport(portdev))
1680 return;
1681
1682 while ((buf = virtqueue_get_buf(portdev->c_ivq, &len)))
1683 free_buf(buf);
1684
1685 while ((buf = virtqueue_detach_unused_buf(portdev->c_ivq)))
1686 free_buf(buf);
1687}
1688
1662/* 1689/*
1663 * Once we're further in boot, we get probed like any other virtio 1690 * Once we're further in boot, we get probed like any other virtio
1664 * device. 1691 * device.
@@ -1764,9 +1791,7 @@ free_vqs:
1764 /* The host might want to notify mgmt sw about device add failure */ 1791 /* The host might want to notify mgmt sw about device add failure */
1765 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID, 1792 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
1766 VIRTIO_CONSOLE_DEVICE_READY, 0); 1793 VIRTIO_CONSOLE_DEVICE_READY, 0);
1767 vdev->config->del_vqs(vdev); 1794 remove_vqs(portdev);
1768 kfree(portdev->in_vqs);
1769 kfree(portdev->out_vqs);
1770free_chrdev: 1795free_chrdev:
1771 unregister_chrdev(portdev->chr_major, "virtio-portsdev"); 1796 unregister_chrdev(portdev->chr_major, "virtio-portsdev");
1772free: 1797free:
@@ -1804,21 +1829,8 @@ static void virtcons_remove(struct virtio_device *vdev)
1804 * have to just stop using the port, as the vqs are going 1829 * have to just stop using the port, as the vqs are going
1805 * away. 1830 * away.
1806 */ 1831 */
1807 if (use_multiport(portdev)) { 1832 remove_controlq_data(portdev);
1808 struct port_buffer *buf; 1833 remove_vqs(portdev);
1809 unsigned int len;
1810
1811 while ((buf = virtqueue_get_buf(portdev->c_ivq, &len)))
1812 free_buf(buf);
1813
1814 while ((buf = virtqueue_detach_unused_buf(portdev->c_ivq)))
1815 free_buf(buf);
1816 }
1817
1818 vdev->config->del_vqs(vdev);
1819 kfree(portdev->in_vqs);
1820 kfree(portdev->out_vqs);
1821
1822 kfree(portdev); 1834 kfree(portdev);
1823} 1835}
1824 1836
@@ -1832,6 +1844,68 @@ static unsigned int features[] = {
1832 VIRTIO_CONSOLE_F_MULTIPORT, 1844 VIRTIO_CONSOLE_F_MULTIPORT,
1833}; 1845};
1834 1846
1847#ifdef CONFIG_PM
1848static int virtcons_freeze(struct virtio_device *vdev)
1849{
1850 struct ports_device *portdev;
1851 struct port *port;
1852
1853 portdev = vdev->priv;
1854
1855 vdev->config->reset(vdev);
1856
1857 virtqueue_disable_cb(portdev->c_ivq);
1858 cancel_work_sync(&portdev->control_work);
1859 /*
1860 * Once more: if control_work_handler() was running, it would
1861 * enable the cb as the last step.
1862 */
1863 virtqueue_disable_cb(portdev->c_ivq);
1864 remove_controlq_data(portdev);
1865
1866 list_for_each_entry(port, &portdev->ports, list) {
1867 virtqueue_disable_cb(port->in_vq);
1868 virtqueue_disable_cb(port->out_vq);
1869 /*
1870 * We'll ask the host later if the new invocation has
1871 * the port opened or closed.
1872 */
1873 port->host_connected = false;
1874 remove_port_data(port);
1875 }
1876 remove_vqs(portdev);
1877
1878 return 0;
1879}
1880
1881static int virtcons_restore(struct virtio_device *vdev)
1882{
1883 struct ports_device *portdev;
1884 struct port *port;
1885 int ret;
1886
1887 portdev = vdev->priv;
1888
1889 ret = init_vqs(portdev);
1890 if (ret)
1891 return ret;
1892
1893 if (use_multiport(portdev))
1894 fill_queue(portdev->c_ivq, &portdev->cvq_lock);
1895
1896 list_for_each_entry(port, &portdev->ports, list) {
1897 port->in_vq = portdev->in_vqs[port->id];
1898 port->out_vq = portdev->out_vqs[port->id];
1899
1900 fill_queue(port->in_vq, &port->inbuf_lock);
1901
1902 /* Get port open/close status on the host */
1903 send_control_msg(port, VIRTIO_CONSOLE_PORT_READY, 1);
1904 }
1905 return 0;
1906}
1907#endif
1908
1835static struct virtio_driver virtio_console = { 1909static struct virtio_driver virtio_console = {
1836 .feature_table = features, 1910 .feature_table = features,
1837 .feature_table_size = ARRAY_SIZE(features), 1911 .feature_table_size = ARRAY_SIZE(features),
@@ -1841,6 +1915,10 @@ static struct virtio_driver virtio_console = {
1841 .probe = virtcons_probe, 1915 .probe = virtcons_probe,
1842 .remove = virtcons_remove, 1916 .remove = virtcons_remove,
1843 .config_changed = config_intr, 1917 .config_changed = config_intr,
1918#ifdef CONFIG_PM
1919 .freeze = virtcons_freeze,
1920 .restore = virtcons_restore,
1921#endif
1844}; 1922};
1845 1923
1846static int __init init(void) 1924static int __init init(void)