Re: [PATCH v2 2/3] Bluetooth: hci_vhci: Add force_suspend entry

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Marcel,

On Wed, Sep 29, 2021 at 6:51 AM Marcel Holtmann <marcel@xxxxxxxxxxxx> wrote:
>
> Hi Luiz,
>
> > This adds force_suspend which can be used to force the controller into
> > suspend/resume state.
> >
> > Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
> > ---
> > drivers/bluetooth/hci_vhci.c | 49 ++++++++++++++++++++++++++++++++++++
> > 1 file changed, 49 insertions(+)
> >
> > diff --git a/drivers/bluetooth/hci_vhci.c b/drivers/bluetooth/hci_vhci.c
> > index cc3679f3491d..52f9106faeae 100644
> > --- a/drivers/bluetooth/hci_vhci.c
> > +++ b/drivers/bluetooth/hci_vhci.c
> > @@ -21,6 +21,7 @@
> >
> > #include <linux/skbuff.h>
> > #include <linux/miscdevice.h>
> > +#include <linux/debugfs.h>
> >
> > #include <net/bluetooth/bluetooth.h>
> > #include <net/bluetooth/hci_core.h>
> > @@ -91,6 +92,51 @@ static int vhci_get_codec_config_data(struct hci_dev *hdev, __u8 type,
> >       return 0;
> > }
> >
> > +static ssize_t force_suspend_read(struct file *file, char __user *user_buf,
> > +                               size_t count, loff_t *ppos)
> > +{
> > +     struct hci_dev *hdev = file->private_data;
> > +     char buf[3];
> > +
> > +     buf[0] = hdev->suspended ? 'Y' : 'N';
> > +     buf[1] = '\n';
> > +     buf[2] = '\0';
> > +     return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
> > +}
> > +
> > +static ssize_t force_suspend_write(struct file *file,
> > +                                const char __user *user_buf,
> > +                                size_t count, loff_t *ppos)
> > +{
> > +     struct hci_dev *hdev = file->private_data;
> > +     bool enable;
> > +     int err;
> > +
> > +     err = kstrtobool_from_user(user_buf, count, &enable);
> > +     if (err)
> > +             return err;
> > +
> > +     if (hdev->suspended == enable)
> > +             return -EALREADY;
>
> I think that we have to have bool suspended in vhci_data struct here. It needs to be local to the driver.

Ok, but I guess hdev->suspended should be kept as is, right?

>
> > +
> > +     if (enable)
> > +             err = hci_suspend_dev(hdev);
> > +     else
> > +             err = hci_resume_dev(hdev);
> > +
> > +     if (err)
> > +             return err;
> > +
> > +     return count;
> > +}
> > +
> > +static const struct file_operations force_suspend_fops = {
> > +     .open           = simple_open,
> > +     .read           = force_suspend_read,
> > +     .write          = force_suspend_write,
> > +     .llseek         = default_llseek,
> > +};
> > +
> > static int __vhci_create_device(struct vhci_data *data, __u8 opcode)
> > {
> >       struct hci_dev *hdev;
> > @@ -149,6 +195,9 @@ static int __vhci_create_device(struct vhci_data *data, __u8 opcode)
> >               return -EBUSY;
> >       }
> >
> > +     debugfs_create_file("force_suspend", 0644, hdev->debugfs, hdev,
> > +                         &force_suspend_fops);
> > +
> >       hci_skb_pkt_type(skb) = HCI_VENDOR_PKT;
>
> Regards
>
> Marcel
>


-- 
Luiz Augusto von Dentz



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux