mwifiex: add init_fw_port handler for PCIe interface
authorAvinash Patil <patila@marvell.com>
Fri, 4 Jan 2013 05:21:29 +0000 (21:21 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 7 Jan 2013 20:18:29 +0000 (15:18 -0500)
This patch adds support for init_fw_port handler for PCIe
interface, which resets RXBD read pointer for PCIe.
This fixes issue where RX doesn't work until some TX from
driver happens.

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/init.c
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/pcie.c

index 39f03ce5a5b1cf50bfde4ec291438bc828a2dc22..e00b8060aff7512228ef4de873a70f41a3e8219a 100644 (file)
@@ -591,6 +591,12 @@ int mwifiex_init_fw(struct mwifiex_adapter *adapter)
                                return -1;
                }
        }
+
+       if (adapter->if_ops.init_fw_port) {
+               if (adapter->if_ops.init_fw_port(adapter))
+                       return -1;
+       }
+
        for (i = 0; i < adapter->priv_num; i++) {
                if (adapter->priv[i]) {
                        ret = mwifiex_sta_init_cmd(adapter->priv[i], first_sta);
index d717c9859fb9b2a529ef32d824e4f780942c32b0..ef02a5bf57b1ad984ee7c2cfcbe758277aeb98b8 100644 (file)
@@ -599,6 +599,7 @@ struct mwifiex_if_ops {
        int (*cmdrsp_complete) (struct mwifiex_adapter *, struct sk_buff *);
        int (*event_complete) (struct mwifiex_adapter *, struct sk_buff *);
        int (*data_complete) (struct mwifiex_adapter *, struct sk_buff *);
+       int (*init_fw_port) (struct mwifiex_adapter *);
        int (*dnld_fw) (struct mwifiex_adapter *, struct mwifiex_fw_image *);
        void (*card_reset) (struct mwifiex_adapter *);
 };
index e4c2cfdd049c72049f168de2ad1fd63119857019..191c6825a6b6b2be559f03b0e5ad34357db70a28 100644 (file)
@@ -966,8 +966,23 @@ mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
        return 0;
 }
 
-/*
- * This function downloads commands to the device
+/* This function init rx port in firmware which in turn enables to receive data
+ * from device before transmitting any packet.
+ */
+static int mwifiex_pcie_init_fw_port(struct mwifiex_adapter *adapter)
+{
+       struct pcie_service_card *card = adapter->card;
+
+       /* Write the RX ring read pointer in to REG_RXBD_RDPTR */
+       if (mwifiex_write_reg(adapter, REG_RXBD_RDPTR, card->rxbd_rdptr | 0)) {
+               dev_err(adapter->dev,
+                       "RECV DATA: failed to write REG_RXBD_RDPTR\n");
+               return -1;
+       }
+       return 0;
+}
+
+/* This function downloads commands to the device
  */
 static int
 mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
@@ -1899,6 +1914,7 @@ static struct mwifiex_if_ops pcie_ops = {
        .event_complete =               mwifiex_pcie_event_complete,
        .update_mp_end_port =           NULL,
        .cleanup_mpa_buf =              NULL,
+       .init_fw_port =                 mwifiex_pcie_init_fw_port,
 };
 
 /*