Commit 32fd63981ed453bd882f22e3e9b0ccbc11fb47e5

Authored by Amitkumar Karwar
Committed by Marcel Holtmann
1 parent 2ab25cdd7b

Bluetooth: Enable auto sleep mode for btmrvl driver

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 <akarwar@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>

Showing 3 changed files with 36 additions and 22 deletions Side-by-side Diff

drivers/bluetooth/btmrvl_drv.h
... ... @@ -131,6 +131,7 @@
131 131 int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb);
132 132  
133 133 int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd);
  134 +int btmrvl_enable_ps(struct btmrvl_private *priv);
134 135 int btmrvl_prepare_command(struct btmrvl_private *priv);
135 136  
136 137 #ifdef CONFIG_DEBUG_FS
drivers/bluetooth/btmrvl_main.c
... ... @@ -189,6 +189,38 @@
189 189 }
190 190 EXPORT_SYMBOL_GPL(btmrvl_send_module_cfg_cmd);
191 191  
  192 +int btmrvl_enable_ps(struct btmrvl_private *priv)
  193 +{
  194 + struct sk_buff *skb;
  195 + struct btmrvl_cmd *cmd;
  196 +
  197 + skb = bt_skb_alloc(sizeof(*cmd), GFP_ATOMIC);
  198 + if (skb == NULL) {
  199 + BT_ERR("No free skb");
  200 + return -ENOMEM;
  201 + }
  202 +
  203 + cmd = (struct btmrvl_cmd *) skb_put(skb, sizeof(*cmd));
  204 + cmd->ocf_ogf = cpu_to_le16(hci_opcode_pack(OGF,
  205 + BT_CMD_AUTO_SLEEP_MODE));
  206 + cmd->length = 1;
  207 +
  208 + if (priv->btmrvl_dev.psmode)
  209 + cmd->data[0] = BT_PS_ENABLE;
  210 + else
  211 + cmd->data[0] = BT_PS_DISABLE;
  212 +
  213 + bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT;
  214 +
  215 + skb->dev = (void *) priv->btmrvl_dev.hcidev;
  216 + skb_queue_head(&priv->adapter->tx_queue, skb);
  217 +
  218 + BT_DBG("Queue PSMODE Command:%d", cmd->data[0]);
  219 +
  220 + return 0;
  221 +}
  222 +EXPORT_SYMBOL_GPL(btmrvl_enable_ps);
  223 +
192 224 static int btmrvl_enable_hs(struct btmrvl_private *priv)
193 225 {
194 226 struct sk_buff *skb;
... ... @@ -258,28 +290,7 @@
258 290  
259 291 if (priv->btmrvl_dev.pscmd) {
260 292 priv->btmrvl_dev.pscmd = 0;
261   -
262   - skb = bt_skb_alloc(sizeof(*cmd), GFP_ATOMIC);
263   - if (skb == NULL) {
264   - BT_ERR("No free skb");
265   - return -ENOMEM;
266   - }
267   -
268   - cmd = (struct btmrvl_cmd *) skb_put(skb, sizeof(*cmd));
269   - cmd->ocf_ogf = cpu_to_le16(hci_opcode_pack(OGF, BT_CMD_AUTO_SLEEP_MODE));
270   - cmd->length = 1;
271   -
272   - if (priv->btmrvl_dev.psmode)
273   - cmd->data[0] = BT_PS_ENABLE;
274   - else
275   - cmd->data[0] = BT_PS_DISABLE;
276   -
277   - bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT;
278   -
279   - skb->dev = (void *) priv->btmrvl_dev.hcidev;
280   - skb_queue_head(&priv->adapter->tx_queue, skb);
281   -
282   - BT_DBG("Queue PSMODE Command:%d", cmd->data[0]);
  293 + btmrvl_enable_ps(priv);
283 294 }
284 295  
285 296 if (priv->btmrvl_dev.hscmd) {
drivers/bluetooth/btmrvl_sdio.c
... ... @@ -930,6 +930,8 @@
930 930 priv->hw_wakeup_firmware = btmrvl_sdio_wakeup_fw;
931 931  
932 932 btmrvl_send_module_cfg_cmd(priv, MODULE_BRINGUP_REQ);
  933 + priv->btmrvl_dev.psmode = 1;
  934 + btmrvl_enable_ps(priv);
933 935  
934 936 return 0;
935 937