mirror of https://gitee.com/openkylin/linux.git
[SCSI] ibmvfc: Add suspend/resume support
Adds support for resuming from suspend for IBM VFC devices. We may have lost an interrupt over the suspend, so we just kick the interrupt handler to process anything that is outstanding. We expect to find a transport event indicating we need to reestablish our CRQ. Signed-off-by: Brian King <brking@linux.vnet.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
64355b929d
commit
b0f4d4cf12
|
@ -29,6 +29,7 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
#include <linux/pm.h>
|
||||||
#include <linux/stringify.h>
|
#include <linux/stringify.h>
|
||||||
#include <asm/firmware.h>
|
#include <asm/firmware.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -4735,6 +4736,27 @@ static int ibmvfc_remove(struct vio_dev *vdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ibmvfc_resume - Resume from suspend
|
||||||
|
* @dev: device struct
|
||||||
|
*
|
||||||
|
* We may have lost an interrupt across suspend/resume, so kick the
|
||||||
|
* interrupt handler
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static int ibmvfc_resume(struct device *dev)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
struct ibmvfc_host *vhost = dev_get_drvdata(dev);
|
||||||
|
struct vio_dev *vdev = to_vio_dev(dev);
|
||||||
|
|
||||||
|
spin_lock_irqsave(vhost->host->host_lock, flags);
|
||||||
|
vio_disable_interrupts(vdev);
|
||||||
|
tasklet_schedule(&vhost->tasklet);
|
||||||
|
spin_unlock_irqrestore(vhost->host->host_lock, flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ibmvfc_get_desired_dma - Calculate DMA resources needed by the driver
|
* ibmvfc_get_desired_dma - Calculate DMA resources needed by the driver
|
||||||
* @vdev: vio device struct
|
* @vdev: vio device struct
|
||||||
|
@ -4755,6 +4777,10 @@ static struct vio_device_id ibmvfc_device_table[] __devinitdata = {
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(vio, ibmvfc_device_table);
|
MODULE_DEVICE_TABLE(vio, ibmvfc_device_table);
|
||||||
|
|
||||||
|
static struct dev_pm_ops ibmvfc_pm_ops = {
|
||||||
|
.resume = ibmvfc_resume
|
||||||
|
};
|
||||||
|
|
||||||
static struct vio_driver ibmvfc_driver = {
|
static struct vio_driver ibmvfc_driver = {
|
||||||
.id_table = ibmvfc_device_table,
|
.id_table = ibmvfc_device_table,
|
||||||
.probe = ibmvfc_probe,
|
.probe = ibmvfc_probe,
|
||||||
|
@ -4763,6 +4789,7 @@ static struct vio_driver ibmvfc_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = IBMVFC_NAME,
|
.name = IBMVFC_NAME,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
|
.pm = &ibmvfc_pm_ops,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue