On Wed, Jan 10, 2007 at 12:26:07PM +0100, Pavel Machek wrote:
> Hi!
>
> > > Well, Frank was wrong here for subtle reason, and I did not like it:
> > >
> > > If malloc failed (basically can not happen, but...) he'd suspend,
> > > anyway, failing to restore PCI config at the exit, and bringing video
> > > corruption back to us... Without knowing that pci save state failed.
> > You are absolutly right, this wan't that nice. But it still could happen,
> > that find_vga returns NULL (eventhoug of course this is now very unlikely)
> > and furthermore we now have a second global variable for
> > the same thing (global static pointer to global static struct).
> >
> > So, i did a further cleanup to this patch. This version has only one global
> > struct for the vga_dev and terminates execution if vga_dev
> > couldn't be found.
>
> If you can get me version relative to current cvs,
here it is (some small changes to Frank's patch are: do not initialize *pacc,
static vga_pci_state, a comment on why we fail suspend, whitespace cleanups):
s2ram.c | 42 +++++++++++++++++++++---------------------
1 file changed, 21 insertions(+), 21 deletions(-)
Index: s2ram.c
===================================================================
RCS file: /cvsroot/suspend/suspend/s2ram.c,v
retrieving revision 1.46
diff -u -p -r1.46 s2ram.c
--- s2ram.c 10 Jan 2007 08:04:55 -0000 1.46
+++ s2ram.c 10 Jan 2007 12:03:55 -0000
@@ -20,7 +20,7 @@
static void *vbe_buffer;
static unsigned char vga_pci_state[256];
-static struct pci_dev *vga_dev;
+static struct pci_dev vga_dev;
static struct pci_access *pacc;
/* Flags set from whitelist */
static int flags, vbe_mode = -1;
@@ -150,9 +150,7 @@ int s2ram_check(int id)
return ret;
}
-static struct pci_dev vga_dev_s;
-
-struct pci_dev *find_vga(void)
+int find_vga(void)
{
struct pci_dev *dev;
@@ -165,21 +163,22 @@ struct pci_dev *find_vga(void)
}
if (!dev)
- return NULL;
+ return 0;
+
+ memcpy(&vga_dev, dev, sizeof(*dev));
+ vga_dev.next = NULL;
- memcpy(&vga_dev_s, dev, sizeof(*dev));
- vga_dev_s.next = NULL;
- return &vga_dev_s;
+ return 1;
}
-void save_vga_pci(struct pci_dev *dev)
+void save_vga_pci(void)
{
- pci_read_block(dev, 0, vga_pci_state, 256);
+ pci_read_block(&vga_dev, 0, vga_pci_state, 256);
}
-void restore_vga_pci(struct pci_dev *dev)
+void restore_vga_pci(void)
{
- pci_write_block(dev, 0, vga_pci_state, 256);
+ pci_write_block(&vga_dev, 0, vga_pci_state, 256);
}
/* warning: we have to be on a text console when calling this */
@@ -212,14 +211,15 @@ int s2ram_hacks(void)
}
if (flags & PCI_SAVE) {
pacc = pci_alloc(); /* Get the pci_access structure */
- pci_init(pacc); /* Initialize the PCI library */
+ pci_init(pacc); /* Initialize the PCI library */
- vga_dev = find_vga();
- if (vga_dev) {
+ if (find_vga()) {
printf("saving PCI config of device %02x:%02x.%d\n",
- vga_dev->bus, vga_dev->dev, vga_dev->func);
- save_vga_pci(vga_dev);
- }
+ vga_dev.bus, vga_dev.dev, vga_dev.func);
+ save_vga_pci();
+ } else
+ /* pci_save requested, no VGA device found => abort */
+ return 1;
}
return 0;
@@ -266,10 +266,10 @@ int s2ram_do(void)
void s2ram_resume(void)
{
- if ((flags & PCI_SAVE) && vga_dev) {
+ if ((flags & PCI_SAVE) && vga_dev.device_class == 0x300) {
printf("restoring PCI config of device %02x:%02x.%d\n",
- vga_dev->bus, vga_dev->dev, vga_dev->func);
- restore_vga_pci(vga_dev);
+ vga_dev.bus, vga_dev.dev, vga_dev.func);
+ restore_vga_pci();
pci_cleanup(pacc);
}
--
Stefan Seyfried
QA / R&D Team Mobile Devices | "Any ideas, John?"
SUSE LINUX Products GmbH, Nürnberg | "Well, surrounding them's out."
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Suspend-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/suspend-devel