Commit 17a60b48 authored by Avinash Patil's avatar Avinash Patil Committed by John W. Linville
Browse files

mwifiex: proper cleanup when RX multiport aggregation fails



Free SKBs allocated during multiport aggrgation setup when RX
multiport aggregation fails in the middle. With this handling
freeing SKB in mwifiex_process_int_status() for failure case
is removed.

Also handles single RX transaction failure.

Signed-off-by: default avatarAvinash Patil <patila@marvell.com>
Signed-off-by: default avatarBing Zhao <bzhao@marvell.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 8c53e42d
Loading
Loading
Loading
Loading
+19 −3
Original line number Original line Diff line number Diff line
@@ -1087,7 +1087,7 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
					   (adapter->ioport | 0x1000 |
					   (adapter->ioport | 0x1000 |
					    (card->mpa_rx.ports << 4)) +
					    (card->mpa_rx.ports << 4)) +
					   card->mpa_rx.start_port, 1))
					   card->mpa_rx.start_port, 1))
			return -1;
			goto error;


		curr_ptr = card->mpa_rx.buf;
		curr_ptr = card->mpa_rx.buf;


@@ -1130,12 +1130,29 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
		if (mwifiex_sdio_card_to_host(adapter, &pkt_type,
		if (mwifiex_sdio_card_to_host(adapter, &pkt_type,
					      skb->data, skb->len,
					      skb->data, skb->len,
					      adapter->ioport + port))
					      adapter->ioport + port))
			return -1;
			goto error;


		mwifiex_decode_rx_packet(adapter, skb, pkt_type);
		mwifiex_decode_rx_packet(adapter, skb, pkt_type);
	}
	}


	return 0;
	return 0;

error:
	if (MP_RX_AGGR_IN_PROGRESS(card)) {
		/* Multiport-aggregation transfer failed - cleanup */
		for (pind = 0; pind < card->mpa_rx.pkt_cnt; pind++) {
			/* copy pkt to deaggr buf */
			skb_deaggr = card->mpa_rx.skb_arr[pind];
			dev_kfree_skb_any(skb_deaggr);
		}
		MP_RX_AGGR_BUF_RESET(card);
	}

	if (f_do_rx_cur)
		/* Single transfer pending. Free curr buff also */
		dev_kfree_skb_any(skb);

	return -1;
}
}


/*
/*
@@ -1271,7 +1288,6 @@ static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)


				dev_dbg(adapter->dev,
				dev_dbg(adapter->dev,
						"info: CFG reg val =%x\n", cr);
						"info: CFG reg val =%x\n", cr);
				dev_kfree_skb_any(skb);
				return -1;
				return -1;
			}
			}
		}
		}