On 20/01/12 08:46, Jonathan Nieder wrote:
It's one I've been working on to fix Sony Vaio keyboard problems. I'll try an "official" kernel today.Thanks. Do you know the commit id of this 3.2-rc2+ kernel? There have been some tpm fixes upstream recently, so results from testing v3.3-rc1 or later would be interesting. Ok, will try. I've tried the workaround and it works perfectly. root@carbon:~# cat /sys/devices/pnp0/00:07/caps Manufacturer: 0x49465800 TCG version: 1.2 Firmware version: 1.0 did a suspend there - worked root@carbon:~# cat /sys/devices/pnp0/00:07/caps tried a suspend - didnt work root@carbon:~# dmesg | grep -i failed [ 0.076215] pci0000:00: ACPI _OSC request failed (AE_NOT_FOUND), returned control mask: 0x1d [ 1176.136093] PM: Device 00:07 failed to suspend: error 38 [ 1176.136109] PM: Some devices failed to suspend root@carbon:~# ~john/tpm_startup Success! root@carbon:~# cat /sys/devices/pnp0/00:07/caps Manufacturer: 0x49465800 TCG version: 1.2 Firmware version: 1.0 did a suspend there - worked root@carbon:~# cat /sys/devices/pnp0/00:07/caps root@carbon:~# ~john/tpm_startup Success! root@carbon:~# cat /sys/devices/pnp0/00:07/caps Manufacturer: 0x49465800 TCG version: 1.2 Firmware version: 1.0 Did a suspend there - worked root@carbon:~# cat /sys/devices/pnp0/00:07/caps root@carbon:~# ~john/tpm_startup Success! root@carbon:~# cat /sys/devices/pnp0/00:07/caps Manufacturer: 0x49465800 TCG version: 1.2 Firmware version: 1.0 Try running tpm_startup twice: root@carbon:~# ~john/tpm_startup Got an error code in response: 38 root@carbon:~# cat /sys/devices/pnp0/00:07/caps Manufacturer: 0x49465800 TCG version: 1.2 Firmware version: 1.0 Suspend still works |
#include <stdio.h> #include <stdint.h> #include <fcntl.h> #include <unistd.h> int main(void) { const uint8_t startup_st_state[] = { 0x00, 0xc1, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x99, 0x00, 0x02 }; uint8_t buf[10]; int fd = open("/dev/tpm0", O_RDWR); int len; uint32_t err; if (fd < 0) { printf("Could not open /dev/tpm0\n"); return 1; } len = write(fd, startup_st_state, sizeof(startup_st_state)); if (len != sizeof(startup_st_state)) { printf("Write failed.\n"); goto err_exit; } len = read(fd, buf, sizeof(buf)); if (len != sizeof(buf)) { printf("Expected %d bytes bot got %d\n", (int)sizeof(buf), len); goto err_exit; } if (buf[1] != 0xc4) { printf("Response tag is bad.\n"); goto err_exit; } if (buf[5] != sizeof(buf)) { printf("Response length is bad: %d\n", buf[5]); goto err_exit; } err = buf[6] << 24 | buf[7] << 16 | buf[8] << 8 | buf[9]; if (err) { printf("Got an error code in response: %u\n", err); } else { printf("Success!\n"); } err_exit: close(fd); return 0; }