| From dd65c736d1b5312c80c88a64bf521db4959eded5 Mon Sep 17 00:00:00 2001 |
| From: Stuart Hayes <stuart_hayes@yahoo.com> |
| Date: Wed, 2 Mar 2011 13:42:05 +0100 |
| Subject: dcdbas: force SMI to happen when expected |
| |
| From: Stuart Hayes <stuart_hayes@yahoo.com> |
| |
| commit dd65c736d1b5312c80c88a64bf521db4959eded5 upstream. |
| |
| The dcdbas driver can do an I/O write to cause a SMI to occur. The SMI handler |
| looks at certain registers and memory locations, so the SMI needs to happen |
| immediately. On some systems I/O writes are posted, though, causing the SMI to |
| happen well after the "outb" occurred, which causes random failures. Following |
| the "outb" with an "inb" forces the write to go through even if it is posted. |
| |
| Signed-off-by: Stuart Hayes <stuart_hayes@yahoo.com> |
| Acked-by: Doug Warzecha <douglas_warzecha@dell.com> |
| Cc: Chuck Ebbert <cebbert@redhat.com> |
| Signed-off-by: Jiri Kosina <jkosina@suse.cz> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/firmware/dcdbas.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/firmware/dcdbas.c |
| +++ b/drivers/firmware/dcdbas.c |
| @@ -267,8 +267,10 @@ int dcdbas_smi_request(struct smi_cmd *s |
| } |
| |
| /* generate SMI */ |
| + /* inb to force posted write through and make SMI happen now */ |
| asm volatile ( |
| - "outb %b0,%w1" |
| + "outb %b0,%w1\n" |
| + "inb %w1" |
| : /* no output args */ |
| : "a" (smi_cmd->command_code), |
| "d" (smi_cmd->command_address), |