2009-09-30 18:18:30

by Bing Zhao

[permalink] [raw]
Subject: [PATCH v2] Bluetooth: Enable auto sleep mode for btmrvl driver

From: Amitkumar Karwar <[email protected]>

The auto sleep mode for btmrvl driver is not enabled by default.
This patch enables auto sleep mode when card is probed.

Signed-off-by: Amitkumar Karwar <[email protected]>
Signed-off-by: Bing Zhao <[email protected]>
---
drivers/bluetooth/btmrvl_drv.h | 1 +
drivers/bluetooth/btmrvl_main.c | 55 +++++++++++++++++++++++---------------
drivers/bluetooth/btmrvl_sdio.c | 2 +
3 files changed, 36 insertions(+), 22 deletions(-)

diff --git a/drivers/bluetooth/btmrvl_drv.h b/drivers/bluetooth/btmrvl_drv.h
index 411c7a7..523d197 100644
--- a/drivers/bluetooth/btmrvl_drv.h
+++ b/drivers/bluetooth/btmrvl_drv.h
@@ -131,6 +131,7 @@ void btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb);
int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb);

int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd);
+int btmrvl_enable_ps(struct btmrvl_private *priv);
int btmrvl_prepare_command(struct btmrvl_private *priv);

#ifdef CONFIG_DEBUG_FS
diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c
index e605563..f97771c 100644
--- a/drivers/bluetooth/btmrvl_main.c
+++ b/drivers/bluetooth/btmrvl_main.c
@@ -189,6 +189,38 @@ int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd)
}
EXPORT_SYMBOL_GPL(btmrvl_send_module_cfg_cmd);

+int btmrvl_enable_ps(struct btmrvl_private *priv)
+{
+ struct sk_buff *skb;
+ struct btmrvl_cmd *cmd;
+
+ skb = bt_skb_alloc(sizeof(*cmd), GFP_ATOMIC);
+ if (skb == NULL) {
+ BT_ERR("No free skb");
+ return -ENOMEM;
+ }
+
+ cmd = (struct btmrvl_cmd *) skb_put(skb, sizeof(*cmd));
+ cmd->ocf_ogf = cpu_to_le16(hci_opcode_pack(OGF,
+ BT_CMD_AUTO_SLEEP_MODE));
+ cmd->length = 1;
+
+ if (priv->btmrvl_dev.psmode)
+ cmd->data[0] = BT_PS_ENABLE;
+ else
+ cmd->data[0] = BT_PS_DISABLE;
+
+ bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT;
+
+ skb->dev = (void *) priv->btmrvl_dev.hcidev;
+ skb_queue_head(&priv->adapter->tx_queue, skb);
+
+ BT_DBG("Queue PSMODE Command:%d", cmd->data[0]);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(btmrvl_enable_ps);
+
static int btmrvl_enable_hs(struct btmrvl_private *priv)
{
struct sk_buff *skb;
@@ -258,28 +290,7 @@ int btmrvl_prepare_command(struct btmrvl_private *priv)

if (priv->btmrvl_dev.pscmd) {
priv->btmrvl_dev.pscmd = 0;
-
- skb = bt_skb_alloc(sizeof(*cmd), GFP_ATOMIC);
- if (skb == NULL) {
- BT_ERR("No free skb");
- return -ENOMEM;
- }
-
- cmd = (struct btmrvl_cmd *) skb_put(skb, sizeof(*cmd));
- cmd->ocf_ogf = cpu_to_le16(hci_opcode_pack(OGF, BT_CMD_AUTO_SLEEP_MODE));
- cmd->length = 1;
-
- if (priv->btmrvl_dev.psmode)
- cmd->data[0] = BT_PS_ENABLE;
- else
- cmd->data[0] = BT_PS_DISABLE;
-
- bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT;
-
- skb->dev = (void *) priv->btmrvl_dev.hcidev;
- skb_queue_head(&priv->adapter->tx_queue, skb);
-
- BT_DBG("Queue PSMODE Command:%d", cmd->data[0]);
+ btmrvl_enable_ps(priv);
}

if (priv->btmrvl_dev.hscmd) {
diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index 5b33b85..d6aaf51 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -930,6 +930,8 @@ static int btmrvl_sdio_probe(struct sdio_func *func,
priv->hw_wakeup_firmware = btmrvl_sdio_wakeup_fw;

btmrvl_send_module_cfg_cmd(priv, MODULE_BRINGUP_REQ);
+ priv->btmrvl_dev.psmode = 1;
+ btmrvl_enable_ps(priv);

return 0;

--
1.5.4.3



2009-10-12 19:58:16

by Bing Zhao

[permalink] [raw]
Subject: RE: [PATCH v2] Bluetooth: Enable auto sleep mode for btmrvl driver


Hi Marcel,

> -----Original Message-----
> From: Bing Zhao [mailto:[email protected]]
> Sent: Wednesday, September 30, 2009 11:19 AM
> To: [email protected]
> Cc: Bing Zhao; Amitkumar Karwar
> Subject: [PATCH v2] Bluetooth: Enable auto sleep mode for btmrvl driver
>=20
> From: Amitkumar Karwar <[email protected]>
>=20
> The auto sleep mode for btmrvl driver is not enabled by default.
> This patch enables auto sleep mode when card is probed.
>=20
> Signed-off-by: Amitkumar Karwar <[email protected]>
> Signed-off-by: Bing Zhao <[email protected]>

Does this patch look okay to you? Please let me know if any change is neede=
d.

Thanks,

Bing


> ---
> drivers/bluetooth/btmrvl_drv.h | 1 +
> drivers/bluetooth/btmrvl_main.c | 55 +++++++++++++++++++++++----------=
-----
> drivers/bluetooth/btmrvl_sdio.c | 2 +
> 3 files changed, 36 insertions(+), 22 deletions(-)
>=20
> diff --git a/drivers/bluetooth/btmrvl_drv.h b/drivers/bluetooth/btmrvl_dr=
v.h
> index 411c7a7..523d197 100644
> --- a/drivers/bluetooth/btmrvl_drv.h
> +++ b/drivers/bluetooth/btmrvl_drv.h
> @@ -131,6 +131,7 @@ void btmrvl_check_evtpkt(struct btmrvl_private *priv,=
struct sk_buff *skb);
> int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *sk=
b);
>=20
> int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd);
> +int btmrvl_enable_ps(struct btmrvl_private *priv);
> int btmrvl_prepare_command(struct btmrvl_private *priv);
>=20
> #ifdef CONFIG_DEBUG_FS
> diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_m=
ain.c
> index e605563..f97771c 100644
> --- a/drivers/bluetooth/btmrvl_main.c
> +++ b/drivers/bluetooth/btmrvl_main.c
> @@ -189,6 +189,38 @@ int btmrvl_send_module_cfg_cmd(struct btmrvl_private=
*priv, int subcmd)
> }
> EXPORT_SYMBOL_GPL(btmrvl_send_module_cfg_cmd);
>=20
> +int btmrvl_enable_ps(struct btmrvl_private *priv)
> +{
> + struct sk_buff *skb;
> + struct btmrvl_cmd *cmd;
> +
> + skb =3D bt_skb_alloc(sizeof(*cmd), GFP_ATOMIC);
> + if (skb =3D=3D NULL) {
> + BT_ERR("No free skb");
> + return -ENOMEM;
> + }
> +
> + cmd =3D (struct btmrvl_cmd *) skb_put(skb, sizeof(*cmd));
> + cmd->ocf_ogf =3D cpu_to_le16(hci_opcode_pack(OGF,
> + BT_CMD_AUTO_SLEEP_MODE));
> + cmd->length =3D 1;
> +
> + if (priv->btmrvl_dev.psmode)
> + cmd->data[0] =3D BT_PS_ENABLE;
> + else
> + cmd->data[0] =3D BT_PS_DISABLE;
> +
> + bt_cb(skb)->pkt_type =3D MRVL_VENDOR_PKT;
> +
> + skb->dev =3D (void *) priv->btmrvl_dev.hcidev;
> + skb_queue_head(&priv->adapter->tx_queue, skb);
> +
> + BT_DBG("Queue PSMODE Command:%d", cmd->data[0]);
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(btmrvl_enable_ps);
> +
> static int btmrvl_enable_hs(struct btmrvl_private *priv)
> {
> struct sk_buff *skb;
> @@ -258,28 +290,7 @@ int btmrvl_prepare_command(struct btmrvl_private *pr=
iv)
>=20
> if (priv->btmrvl_dev.pscmd) {
> priv->btmrvl_dev.pscmd =3D 0;
> -
> - skb =3D bt_skb_alloc(sizeof(*cmd), GFP_ATOMIC);
> - if (skb =3D=3D NULL) {
> - BT_ERR("No free skb");
> - return -ENOMEM;
> - }
> -
> - cmd =3D (struct btmrvl_cmd *) skb_put(skb, sizeof(*cmd));
> - cmd->ocf_ogf =3D cpu_to_le16(hci_opcode_pack(OGF, BT_CMD_AUTO_SLEEP_MO=
DE));
> - cmd->length =3D 1;
> -
> - if (priv->btmrvl_dev.psmode)
> - cmd->data[0] =3D BT_PS_ENABLE;
> - else
> - cmd->data[0] =3D BT_PS_DISABLE;
> -
> - bt_cb(skb)->pkt_type =3D MRVL_VENDOR_PKT;
> -
> - skb->dev =3D (void *) priv->btmrvl_dev.hcidev;
> - skb_queue_head(&priv->adapter->tx_queue, skb);
> -
> - BT_DBG("Queue PSMODE Command:%d", cmd->data[0]);
> + btmrvl_enable_ps(priv);
> }
>=20
> if (priv->btmrvl_dev.hscmd) {
> diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_s=
dio.c
> index 5b33b85..d6aaf51 100644
> --- a/drivers/bluetooth/btmrvl_sdio.c
> +++ b/drivers/bluetooth/btmrvl_sdio.c
> @@ -930,6 +930,8 @@ static int btmrvl_sdio_probe(struct sdio_func *func,
> priv->hw_wakeup_firmware =3D btmrvl_sdio_wakeup_fw;
>=20
> btmrvl_send_module_cfg_cmd(priv, MODULE_BRINGUP_REQ);
> + priv->btmrvl_dev.psmode =3D 1;
> + btmrvl_enable_ps(priv);
>=20
> return 0;
>=20
> --
> 1.5.4.3