mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-17 22:49:02 +00:00
virtio: pci: Tear down VQs in virtio_pci_reset()
The pages backing the virtqueues for virtio PCI devices are not freed
on reset, despite the virtqueue structure being freed as part of the
driver '->priv_auto' destruction at ->remove() time.
Call virtio_pci_del_vqs() from virtio_pci_reset() to free the virtqueue
pages before freeing the virtqueue structure itself.
Signed-off-by: Will Deacon <willdeacon@google.com>
[ Paul: pick from the Android tree. Rebase to the upstream ]
Signed-off-by: Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>
Cc: Bin Meng <bmeng.cn@gmail.com>
Link: 5ed54ccd83
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
7804306c80
commit
da4e8bb09d
1 changed files with 19 additions and 19 deletions
|
@ -218,25 +218,6 @@ static int virtio_pci_set_status(struct udevice *udev, u8 status)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int virtio_pci_reset(struct udevice *udev)
|
|
||||||
{
|
|
||||||
struct virtio_pci_priv *priv = dev_get_priv(udev);
|
|
||||||
|
|
||||||
/* 0 status means a reset */
|
|
||||||
iowrite8(0, &priv->common->device_status);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* After writing 0 to device_status, the driver MUST wait for a read
|
|
||||||
* of device_status to return 0 before reinitializing the device.
|
|
||||||
* This will flush out the status write, and flush in device writes,
|
|
||||||
* including MSI-X interrupts, if any.
|
|
||||||
*/
|
|
||||||
while (ioread8(&priv->common->device_status))
|
|
||||||
udelay(1000);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int virtio_pci_get_features(struct udevice *udev, u64 *features)
|
static int virtio_pci_get_features(struct udevice *udev, u64 *features)
|
||||||
{
|
{
|
||||||
struct virtio_pci_priv *priv = dev_get_priv(udev);
|
struct virtio_pci_priv *priv = dev_get_priv(udev);
|
||||||
|
@ -363,6 +344,25 @@ static int virtio_pci_find_vqs(struct udevice *udev, unsigned int nvqs,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int virtio_pci_reset(struct udevice *udev)
|
||||||
|
{
|
||||||
|
struct virtio_pci_priv *priv = dev_get_priv(udev);
|
||||||
|
|
||||||
|
/* 0 status means a reset */
|
||||||
|
iowrite8(0, &priv->common->device_status);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* After writing 0 to device_status, the driver MUST wait for a read
|
||||||
|
* of device_status to return 0 before reinitializing the device.
|
||||||
|
* This will flush out the status write, and flush in device writes,
|
||||||
|
* including MSI-X interrupts, if any.
|
||||||
|
*/
|
||||||
|
while (ioread8(&priv->common->device_status))
|
||||||
|
udelay(1000);
|
||||||
|
|
||||||
|
return virtio_pci_del_vqs(udev);
|
||||||
|
}
|
||||||
|
|
||||||
static int virtio_pci_notify(struct udevice *udev, struct virtqueue *vq)
|
static int virtio_pci_notify(struct udevice *udev, struct virtqueue *vq)
|
||||||
{
|
{
|
||||||
struct virtio_pci_priv *priv = dev_get_priv(udev);
|
struct virtio_pci_priv *priv = dev_get_priv(udev);
|
||||||
|
|
Loading…
Add table
Reference in a new issue