From: Mauro Carvalho Chehab - Some error treatment implemented at resume functions. Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Andrew Morton --- drivers/media/video/bttv-driver.c | 18 ++++++++++++++++-- drivers/media/video/cx88/cx88-mpeg.c | 20 +++++++++++++++++--- drivers/media/video/cx88/cx88-video.c | 20 ++++++++++++++++++-- 3 files changed, 51 insertions(+), 7 deletions(-) diff -puN drivers/media/video/bttv-driver.c~v4l-some-error-treatment-implemented-at-resume drivers/media/video/bttv-driver.c --- devel/drivers/media/video/bttv-driver.c~v4l-some-error-treatment-implemented-at-resume 2005-09-06 21:14:28.000000000 -0700 +++ devel-akpm/drivers/media/video/bttv-driver.c 2005-09-06 21:14:28.000000000 -0700 @@ -4111,15 +4111,29 @@ static int bttv_resume(struct pci_dev *p { struct bttv *btv = pci_get_drvdata(pci_dev); unsigned long flags; + int err; dprintk("bttv%d: resume\n", btv->c.nr); /* restore pci state */ if (btv->state.disabled) { - pci_enable_device(pci_dev); + err=pci_enable_device(pci_dev); + if (err) { + printk(KERN_WARNING "bttv%d: Can't enable device.\n", + btv->c.nr); + return err; + } btv->state.disabled = 0; } - pci_set_power_state(pci_dev, PCI_D0); + err=pci_set_power_state(pci_dev, PCI_D0); + if (err) { + pci_disable_device(pci_dev); + printk(KERN_WARNING "bttv%d: Can't enable device.\n", + btv->c.nr); + btv->state.disabled = 1; + return err; + } + pci_restore_state(pci_dev); /* restore bt878 state */ diff -puN drivers/media/video/cx88/cx88-mpeg.c~v4l-some-error-treatment-implemented-at-resume drivers/media/video/cx88/cx88-mpeg.c --- devel/drivers/media/video/cx88/cx88-mpeg.c~v4l-some-error-treatment-implemented-at-resume 2005-09-06 21:14:28.000000000 -0700 +++ devel-akpm/drivers/media/video/cx88/cx88-mpeg.c 2005-09-06 21:14:28.000000000 -0700 @@ -455,14 +455,28 @@ int cx8802_suspend_common(struct pci_dev int cx8802_resume_common(struct pci_dev *pci_dev) { - struct cx8802_dev *dev = pci_get_drvdata(pci_dev); + struct cx8802_dev *dev = pci_get_drvdata(pci_dev); struct cx88_core *core = dev->core; + int err; if (dev->state.disabled) { - pci_enable_device(pci_dev); + err=pci_enable_device(pci_dev); + if (err) { + printk(KERN_ERR "%s: can't enable device\n", + dev->core->name); + return err; + } dev->state.disabled = 0; } - pci_set_power_state(pci_dev, PCI_D0); + err=pci_set_power_state(pci_dev, PCI_D0); + if (err) { + printk(KERN_ERR "%s: can't enable device\n", + dev->core->name); + pci_disable_device(pci_dev); + dev->state.disabled = 1; + + return err; + } pci_restore_state(pci_dev); /* FIXME: re-initialize hardware */ diff -puN drivers/media/video/cx88/cx88-video.c~v4l-some-error-treatment-implemented-at-resume drivers/media/video/cx88/cx88-video.c --- devel/drivers/media/video/cx88/cx88-video.c~v4l-some-error-treatment-implemented-at-resume 2005-09-06 21:14:28.000000000 -0700 +++ devel-akpm/drivers/media/video/cx88/cx88-video.c 2005-09-06 21:14:28.000000000 -0700 @@ -2005,12 +2005,28 @@ static int cx8800_resume(struct pci_dev { struct cx8800_dev *dev = pci_get_drvdata(pci_dev); struct cx88_core *core = dev->core; + int err; if (dev->state.disabled) { - pci_enable_device(pci_dev); + err=pci_enable_device(pci_dev); + if (err) { + printk(KERN_ERR "%s: can't enable device\n", + core->name); + return err; + } + dev->state.disabled = 0; } - pci_set_power_state(pci_dev, PCI_D0); + err= pci_set_power_state(pci_dev, PCI_D0); + if (err) { + printk(KERN_ERR "%s: can't enable device\n", + core->name); + + pci_disable_device(pci_dev); + dev->state.disabled = 1; + + return err; + } pci_restore_state(pci_dev); /* FIXME: re-initialize hardware */ _