Bluetooth: btmrvl: configure default host sleep parameters
authorAmitkumar Karwar <akarwar@marvell.com>
Tue, 24 Apr 2012 23:31:40 +0000 (16:31 -0700)
committerGustavo Padovan <gustavo@padovan.org>
Wed, 9 May 2012 04:40:46 +0000 (01:40 -0300)
Currently debugfs commands "hscfgcmd" and "gpiogap" are provided
for host sleep configuration. But if user doesn't configure host
sleep parameters using these commands, host sleep activation is
failed during suspend (support for suspend and resume handlers is
added in next patch).

Default host sleep configuration is done during driver initialisation
in this patch.

Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Gustavo Padovan <gustavo@padovan.org>
drivers/bluetooth/btmrvl_drv.h
drivers/bluetooth/btmrvl_main.c
drivers/bluetooth/btmrvl_sdio.c

index 90bda50dc4465757d2f8431f7bdc64295ba8bf88..2c79e76b1ba6b407bd563e122e22ff843e860890 100644 (file)
@@ -139,6 +139,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_send_hscfg_cmd(struct btmrvl_private *priv);
 int btmrvl_enable_ps(struct btmrvl_private *priv);
 int btmrvl_prepare_command(struct btmrvl_private *priv);
 
index d1209adc882dd00ad39811f44a4fa2c076274ee9..a880537ff8c5a8629722489a0cf531779507378e 100644 (file)
@@ -200,6 +200,36 @@ int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd)
 }
 EXPORT_SYMBOL_GPL(btmrvl_send_module_cfg_cmd);
 
+int btmrvl_send_hscfg_cmd(struct btmrvl_private *priv)
+{
+       struct sk_buff *skb;
+       struct btmrvl_cmd *cmd;
+
+       skb = bt_skb_alloc(sizeof(*cmd), GFP_ATOMIC);
+       if (!skb) {
+               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_HOST_SLEEP_CONFIG));
+       cmd->length = 2;
+       cmd->data[0] = (priv->btmrvl_dev.gpio_gap & 0xff00) >> 8;
+       cmd->data[1] = (u8) (priv->btmrvl_dev.gpio_gap & 0x00ff);
+
+       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 HSCFG Command, gpio=0x%x, gap=0x%x", cmd->data[0],
+              cmd->data[1]);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(btmrvl_send_hscfg_cmd);
+
 int btmrvl_enable_ps(struct btmrvl_private *priv)
 {
        struct sk_buff *skb;
@@ -271,32 +301,11 @@ static int btmrvl_enable_hs(struct btmrvl_private *priv)
 
 int btmrvl_prepare_command(struct btmrvl_private *priv)
 {
-       struct sk_buff *skb = NULL;
-       struct btmrvl_cmd *cmd;
        int ret = 0;
 
        if (priv->btmrvl_dev.hscfgcmd) {
                priv->btmrvl_dev.hscfgcmd = 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_HOST_SLEEP_CONFIG));
-               cmd->length = 2;
-               cmd->data[0] = (priv->btmrvl_dev.gpio_gap & 0xff00) >> 8;
-               cmd->data[1] = (u8) (priv->btmrvl_dev.gpio_gap & 0x00ff);
-
-               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 HSCFG Command, gpio=0x%x, gap=0x%x",
-                                               cmd->data[0], cmd->data[1]);
+               btmrvl_send_hscfg_cmd(priv);
        }
 
        if (priv->btmrvl_dev.pscmd) {
index ed62c7f6a553a3eac686d66ed24194bf581c6244..d7d8f83d1c027e1496462a4f76c4bb957e200b53 100644 (file)
@@ -1008,6 +1008,9 @@ static int btmrvl_sdio_probe(struct sdio_func *func,
        priv->btmrvl_dev.psmode = 1;
        btmrvl_enable_ps(priv);
 
+       priv->btmrvl_dev.gpio_gap = 0xffff;
+       btmrvl_send_hscfg_cmd(priv);
+
        return 0;
 
 disable_host_int: