Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e668498 authored by Amitkumar Karwar's avatar Amitkumar Karwar Committed by Kalle Valo
Browse files

mwifiex: mwifiex_unmap_pci_memory() handling for sleep confirm



Sleep confirm is a special command for which "adapter->cur_cmd" pointer
is not set. When it's response is received, host writes SLEEP confirm done
to a register. Firmware will perform DMA for writing sleep cookie signature
on same buffer after this.

Let's not immediately call mwifiex_unmap_pci_memory() for this special
command. Unmapping will be done when firmware completes writing sleep
cookie signature.

Signed-off-by: default avatarAmitkumar Karwar <akarwar@marvell.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 98e71f44
Loading
Loading
Loading
Loading
+16 −3
Original line number Original line Diff line number Diff line
@@ -441,7 +441,7 @@ static void mwifiex_delay_for_sleep_cookie(struct mwifiex_adapter *adapter,
	u32 sleep_cookie, count;
	u32 sleep_cookie, count;


	for (count = 0; count < max_delay_loop_cnt; count++) {
	for (count = 0; count < max_delay_loop_cnt; count++) {
		buffer = card->cmdrsp_buf->data - INTF_HEADER_LEN;
		buffer = card->cmdrsp_buf->data;
		sleep_cookie = READ_ONCE(*(u32 *)buffer);
		sleep_cookie = READ_ONCE(*(u32 *)buffer);


		if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
		if (sleep_cookie == MWIFIEX_DEF_SLEEP_COOKIE) {
@@ -1690,7 +1690,13 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
	mwifiex_dbg(adapter, CMD,
	mwifiex_dbg(adapter, CMD,
		    "info: Rx CMD Response\n");
		    "info: Rx CMD Response\n");


	if (adapter->curr_cmd)
		mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
		mwifiex_unmap_pci_memory(adapter, skb, PCI_DMA_FROMDEVICE);
	else
		pci_dma_sync_single_for_cpu(card->dev,
					    MWIFIEX_SKB_DMA_ADDR(skb),
					    MWIFIEX_UPLD_SIZE,
					    PCI_DMA_FROMDEVICE);


	/* Unmap the command as a response has been received. */
	/* Unmap the command as a response has been received. */
	if (card->cmd_buf) {
	if (card->cmd_buf) {
@@ -1703,10 +1709,13 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
	rx_len = le16_to_cpu(pkt_len);
	rx_len = le16_to_cpu(pkt_len);
	skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
	skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
	skb_trim(skb, rx_len);
	skb_trim(skb, rx_len);
	skb_pull(skb, INTF_HEADER_LEN);


	if (!adapter->curr_cmd) {
	if (!adapter->curr_cmd) {
		if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
		if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
			pci_dma_sync_single_for_device(card->dev,
						MWIFIEX_SKB_DMA_ADDR(skb),
						MWIFIEX_SLEEP_COOKIE_SIZE,
						PCI_DMA_FROMDEVICE);
			if (mwifiex_write_reg(adapter,
			if (mwifiex_write_reg(adapter,
					      PCIE_CPU_INT_EVENT,
					      PCIE_CPU_INT_EVENT,
					      CPU_INTR_SLEEP_CFM_DONE)) {
					      CPU_INTR_SLEEP_CFM_DONE)) {
@@ -1716,6 +1725,9 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
			}
			}
			mwifiex_delay_for_sleep_cookie(adapter,
			mwifiex_delay_for_sleep_cookie(adapter,
						       MWIFIEX_MAX_DELAY_COUNT);
						       MWIFIEX_MAX_DELAY_COUNT);
			mwifiex_unmap_pci_memory(adapter, skb,
						 PCI_DMA_FROMDEVICE);
			skb_pull(skb, INTF_HEADER_LEN);
			while (reg->sleep_cookie && (count++ < 10) &&
			while (reg->sleep_cookie && (count++ < 10) &&
			       mwifiex_pcie_ok_to_access_hw(adapter))
			       mwifiex_pcie_ok_to_access_hw(adapter))
				usleep_range(50, 60);
				usleep_range(50, 60);
@@ -1733,6 +1745,7 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
					   PCI_DMA_FROMDEVICE))
					   PCI_DMA_FROMDEVICE))
			return -1;
			return -1;
	} else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
	} else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
		skb_pull(skb, INTF_HEADER_LEN);
		adapter->curr_cmd->resp_skb = skb;
		adapter->curr_cmd->resp_skb = skb;
		adapter->cmd_resp_received = true;
		adapter->cmd_resp_received = true;
		/* Take the pointer and set it to CMD node and will
		/* Take the pointer and set it to CMD node and will
+1 −0
Original line number Original line Diff line number Diff line
@@ -116,6 +116,7 @@
/* FW awake cookie after FW ready */
/* FW awake cookie after FW ready */
#define FW_AWAKE_COOKIE						(0xAA55AA55)
#define FW_AWAKE_COOKIE						(0xAA55AA55)
#define MWIFIEX_DEF_SLEEP_COOKIE			0xBEEFBEEF
#define MWIFIEX_DEF_SLEEP_COOKIE			0xBEEFBEEF
#define MWIFIEX_SLEEP_COOKIE_SIZE			4
#define MWIFIEX_MAX_DELAY_COUNT				100
#define MWIFIEX_MAX_DELAY_COUNT				100


struct mwifiex_pcie_card_reg {
struct mwifiex_pcie_card_reg {