suspend-0.80-vbetool-retry-on-errors.diff 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. Index: s2ram-x86.c
  2. ===================================================================
  3. --- s2ram-x86.c.orig
  4. +++ s2ram-x86.c
  5. @@ -321,6 +321,7 @@ int s2ram_do(void)
  6. void s2ram_resume(void)
  7. {
  8. + int i = 0;
  9. if (flags & PCI_SAVE) {
  10. printf("restoring PCI config of device %02x:%02x.%d\n",
  11. vga_dev.bus, vga_dev.dev, vga_dev.func);
  12. @@ -330,19 +331,36 @@ void s2ram_resume(void)
  13. }
  14. // FIXME: can we call vbetool_init() multiple times without cleaning up?
  15. if (flags & VBE_POST) {
  16. - vbetool_init();
  17. - printf("Calling do_post\n");
  18. - do_post();
  19. + while (i++ < 5) {
  20. + vbetool_init();
  21. + printf("Calling do_post\n");
  22. + if (!do_post())
  23. + break;
  24. + printf("do_post failed, sleeping 100ms and retrying...\n");
  25. + usleep(100000);
  26. + }
  27. + i = 0;
  28. }
  29. if (vbe_buffer) {
  30. - vbetool_init();
  31. - printf("Calling restore_state_from\n");
  32. - restore_state_from(vbe_buffer);
  33. + while (i++ < 5) {
  34. + vbetool_init();
  35. + printf("Calling restore_state_from\n");
  36. + if (!restore_state_from(vbe_buffer))
  37. + break;
  38. + printf("restore_state_from failed, sleeping 100ms and retrying...\n");
  39. + usleep(100000);
  40. + }
  41. + i = 0;
  42. }
  43. if (vbe_mode >= 0) {
  44. - vbetool_init();
  45. - printf("Calling set_vbe_mode\n");
  46. - do_set_mode(vbe_mode, 0);
  47. + while (i++ < 5) {
  48. + vbetool_init();
  49. + printf("Calling set_vbe_mode\n");
  50. + if (!do_set_mode(vbe_mode, 0))
  51. + break;
  52. + printf("set_vbe_mode failed, sleeping 100ms and retrying...\n");
  53. + usleep(100000);
  54. + }
  55. }
  56. if (!fb_nosuspend)
  57. resume_fbcon();
  58. Index: vbetool/vbetool.c
  59. ===================================================================
  60. --- vbetool/vbetool.c.orig
  61. +++ vbetool/vbetool.c
  62. @@ -231,9 +231,10 @@ int do_post(void)
  63. return 0;
  64. }
  65. -void restore_state_from(char *data)
  66. +int restore_state_from(char *data)
  67. {
  68. struct LRMI_regs r;
  69. + int ret = 1;
  70. /* VGA BIOS mode 3 is text mode */
  71. do_set_mode(3,1);
  72. @@ -252,12 +253,16 @@ void restore_state_from(char *data)
  73. "Can't restore video state (vm86 failure)\n");
  74. } else if ((r.eax & 0xffff) != 0x4f) {
  75. fprintf(stderr, "Restore video state failed\n");
  76. + } else {
  77. + /* everything ok */
  78. + ret = 0;
  79. }
  80. LRMI_free_real(data);
  81. ioctl(0, KDSETMODE, KD_TEXT);
  82. + return ret;
  83. }
  84. #ifndef S2RAM
  85. Index: vbetool/vbetool.h
  86. ===================================================================
  87. --- vbetool/vbetool.h.orig
  88. +++ vbetool/vbetool.h
  89. @@ -18,5 +18,5 @@ int disable_vga(void);
  90. int do_get_panel_id();
  91. void vbetool_init(void);
  92. char *__save_state(int *);
  93. -void restore_state_from(char *);
  94. +int restore_state_from(char *);
  95. int __get_mode(void);