mwifiex: device specific sleep cookie handling for PCIe
authorAvinash Patil <patila@marvell.com>
Tue, 12 Feb 2013 22:38:32 +0000 (14:38 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 14 Feb 2013 19:24:07 +0000 (14:24 -0500)
This patch adds support for handling of PCIe sleep cookie depending
upon device properties. Some PCIe devices need sleep cookie probing
before accessing HW while some others don't. A new sleep_cookie
variable is defined as part of mwifiex_pcie_card_reg strcture and
set/reset as per device capability.

Sleep cookie is allocated/accessed/freed only when flag sleep_cookie
for this particular device is enabled.

Signed-off-by: Avinash Patil <patila@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/mwifiex/pcie.c
drivers/net/wireless/mwifiex/pcie.h

index 3b9be7c185cb593b5d736ecec0c6265f214e2a0a..492655c048d1c44ee069e27508bb5e1fd9db6efb 100644 (file)
@@ -62,6 +62,10 @@ static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
 {
        u32 *cookie_addr;
        struct pcie_service_card *card = adapter->card;
+       const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
+
+       if (!reg->sleep_cookie)
+               return true;
 
        if (card->sleep_cookie_vbase) {
                cookie_addr = (u32 *)card->sleep_cookie_vbase;
@@ -299,8 +303,10 @@ static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
 static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
 {
        int i = 0;
+       struct pcie_service_card *card = adapter->card;
+       const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
 
-       while (mwifiex_pcie_ok_to_access_hw(adapter)) {
+       while (reg->sleep_cookie && mwifiex_pcie_ok_to_access_hw(adapter)) {
                i++;
                usleep_range(10, 20);
                /* 50ms max wait */
@@ -1513,8 +1519,8 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
                if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
                        mwifiex_process_sleep_confirm_resp(adapter, skb->data,
                                                           skb->len);
-                       while (mwifiex_pcie_ok_to_access_hw(adapter) &&
-                                                       (count++ < 10))
+                       while (reg->sleep_cookie && (count++ < 10) &&
+                              mwifiex_pcie_ok_to_access_hw(adapter))
                                usleep_range(50, 60);
                } else {
                        dev_err(adapter->dev,
@@ -2172,6 +2178,7 @@ static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
        struct pcie_service_card *card = adapter->card;
        int ret;
        struct pci_dev *pdev = card->dev;
+       const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
 
        pci_set_drvdata(pdev, card);
 
@@ -2234,10 +2241,13 @@ static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
        ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
        if (ret)
                goto err_alloc_cmdbuf;
-       ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
-       if (ret)
-               goto err_alloc_cookie;
-
+       if (reg->sleep_cookie) {
+               ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
+               if (ret)
+                       goto err_alloc_cookie;
+       } else {
+               card->sleep_cookie_vbase = NULL;
+       }
        return ret;
 
 err_alloc_cookie:
@@ -2334,12 +2344,16 @@ static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
 static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
 {
        struct pcie_service_card *card = adapter->card;
+       const struct mwifiex_pcie_card_reg *reg;
 
        if (card) {
                dev_dbg(adapter->dev, "%s(): calling free_irq()\n", __func__);
                free_irq(card->dev->irq, card->dev);
 
-               mwifiex_pcie_delete_sleep_cookie_buf(adapter);
+               reg = card->pcie.reg;
+               if (reg->sleep_cookie)
+                       mwifiex_pcie_delete_sleep_cookie_buf(adapter);
+
                mwifiex_pcie_delete_cmdrsp_buf(adapter);
                mwifiex_pcie_delete_evtbd_ring(adapter);
                mwifiex_pcie_delete_rxbd_ring(adapter);
index 608061578b3791d0a6b1d256bc3fcabbf12cd026..d322ab8604ea806e8216ab122d1ae30df6cc618d 100644 (file)
@@ -126,6 +126,7 @@ struct mwifiex_pcie_card_reg {
        u8 ring_flag_xs_eop;
        u32 ring_tx_start_ptr;
        u8 pfu_enabled;
+       u8 sleep_cookie;
 };
 
 static const struct mwifiex_pcie_card_reg mwifiex_reg_8766 = {
@@ -156,6 +157,7 @@ static const struct mwifiex_pcie_card_reg mwifiex_reg_8766 = {
        .ring_flag_xs_eop = 0,
        .ring_tx_start_ptr = 0,
        .pfu_enabled = 0,
+       .sleep_cookie = 1,
 };
 
 static const struct mwifiex_pcie_card_reg mwifiex_reg_8897 = {
@@ -186,6 +188,7 @@ static const struct mwifiex_pcie_card_reg mwifiex_reg_8897 = {
        .ring_flag_xs_eop = MWIFIEX_BD_FLAG_XS_EOP,
        .ring_tx_start_ptr = MWIFIEX_BD_FLAG_TX_START_PTR,
        .pfu_enabled = 1,
+       .sleep_cookie = 0,
 };
 
 struct mwifiex_pcie_device {