|
@@ -324,6 +324,7 @@ static QDF_STATUS dp_rx_defrag_fraglist_insert(struct dp_peer *peer, unsigned ti
|
|
qdf_nbuf_t *head_addr, qdf_nbuf_t *tail_addr, qdf_nbuf_t frag,
|
|
qdf_nbuf_t *head_addr, qdf_nbuf_t *tail_addr, qdf_nbuf_t frag,
|
|
uint8_t *all_frag_present)
|
|
uint8_t *all_frag_present)
|
|
{
|
|
{
|
|
|
|
+ struct dp_soc *soc = peer->vdev->pdev->soc;
|
|
qdf_nbuf_t next;
|
|
qdf_nbuf_t next;
|
|
qdf_nbuf_t prev = NULL;
|
|
qdf_nbuf_t prev = NULL;
|
|
qdf_nbuf_t cur;
|
|
qdf_nbuf_t cur;
|
|
@@ -332,14 +333,13 @@ static QDF_STATUS dp_rx_defrag_fraglist_insert(struct dp_peer *peer, unsigned ti
|
|
struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];
|
|
struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];
|
|
uint8_t *rx_desc_info;
|
|
uint8_t *rx_desc_info;
|
|
|
|
|
|
-
|
|
|
|
qdf_assert(frag);
|
|
qdf_assert(frag);
|
|
qdf_assert(head_addr);
|
|
qdf_assert(head_addr);
|
|
qdf_assert(tail_addr);
|
|
qdf_assert(tail_addr);
|
|
|
|
|
|
*all_frag_present = 0;
|
|
*all_frag_present = 0;
|
|
rx_desc_info = qdf_nbuf_data(frag);
|
|
rx_desc_info = qdf_nbuf_data(frag);
|
|
- cur_fragno = dp_rx_frag_get_mpdu_frag_number(rx_desc_info);
|
|
|
|
|
|
+ cur_fragno = dp_rx_frag_get_mpdu_frag_number(soc, rx_desc_info);
|
|
|
|
|
|
dp_debug("cur_fragno %d\n", cur_fragno);
|
|
dp_debug("cur_fragno %d\n", cur_fragno);
|
|
/* If this is the first fragment */
|
|
/* If this is the first fragment */
|
|
@@ -361,7 +361,8 @@ static QDF_STATUS dp_rx_defrag_fraglist_insert(struct dp_peer *peer, unsigned ti
|
|
/* Out of sequence fragment */
|
|
/* Out of sequence fragment */
|
|
cur = *head_addr;
|
|
cur = *head_addr;
|
|
rx_desc_info = qdf_nbuf_data(cur);
|
|
rx_desc_info = qdf_nbuf_data(cur);
|
|
- head_fragno = dp_rx_frag_get_mpdu_frag_number(rx_desc_info);
|
|
|
|
|
|
+ head_fragno = dp_rx_frag_get_mpdu_frag_number(soc,
|
|
|
|
+ rx_desc_info);
|
|
|
|
|
|
if (cur_fragno == head_fragno) {
|
|
if (cur_fragno == head_fragno) {
|
|
qdf_nbuf_free(frag);
|
|
qdf_nbuf_free(frag);
|
|
@@ -378,6 +379,7 @@ static QDF_STATUS dp_rx_defrag_fraglist_insert(struct dp_peer *peer, unsigned ti
|
|
rx_desc_info = qdf_nbuf_data(cur);
|
|
rx_desc_info = qdf_nbuf_data(cur);
|
|
head_fragno =
|
|
head_fragno =
|
|
dp_rx_frag_get_mpdu_frag_number(
|
|
dp_rx_frag_get_mpdu_frag_number(
|
|
|
|
+ soc,
|
|
rx_desc_info);
|
|
rx_desc_info);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -395,7 +397,7 @@ static QDF_STATUS dp_rx_defrag_fraglist_insert(struct dp_peer *peer, unsigned ti
|
|
next = qdf_nbuf_next(*head_addr);
|
|
next = qdf_nbuf_next(*head_addr);
|
|
|
|
|
|
rx_desc_info = qdf_nbuf_data(*tail_addr);
|
|
rx_desc_info = qdf_nbuf_data(*tail_addr);
|
|
- last_morefrag = dp_rx_frag_get_more_frag_bit(rx_desc_info);
|
|
|
|
|
|
+ last_morefrag = dp_rx_frag_get_more_frag_bit(soc, rx_desc_info);
|
|
|
|
|
|
/* TODO: optimize the loop */
|
|
/* TODO: optimize the loop */
|
|
if (!last_morefrag) {
|
|
if (!last_morefrag) {
|
|
@@ -403,7 +405,8 @@ static QDF_STATUS dp_rx_defrag_fraglist_insert(struct dp_peer *peer, unsigned ti
|
|
do {
|
|
do {
|
|
rx_desc_info = qdf_nbuf_data(next);
|
|
rx_desc_info = qdf_nbuf_data(next);
|
|
next_fragno =
|
|
next_fragno =
|
|
- dp_rx_frag_get_mpdu_frag_number(rx_desc_info);
|
|
|
|
|
|
+ dp_rx_frag_get_mpdu_frag_number(soc,
|
|
|
|
+ rx_desc_info);
|
|
count++;
|
|
count++;
|
|
|
|
|
|
if (next_fragno != count)
|
|
if (next_fragno != count)
|
|
@@ -437,10 +440,12 @@ insert_fail:
|
|
*
|
|
*
|
|
* Returns: QDF_STATUS
|
|
* Returns: QDF_STATUS
|
|
*/
|
|
*/
|
|
-static QDF_STATUS dp_rx_defrag_tkip_decap(qdf_nbuf_t msdu, uint16_t hdrlen)
|
|
|
|
|
|
+static QDF_STATUS
|
|
|
|
+dp_rx_defrag_tkip_decap(struct dp_soc *soc,
|
|
|
|
+ qdf_nbuf_t msdu, uint16_t hdrlen)
|
|
{
|
|
{
|
|
uint8_t *ivp, *orig_hdr;
|
|
uint8_t *ivp, *orig_hdr;
|
|
- int rx_desc_len = SIZE_OF_DATA_RX_TLV;
|
|
|
|
|
|
+ int rx_desc_len = soc->rx_pkt_tlv_size;
|
|
|
|
|
|
/* start of 802.11 header info */
|
|
/* start of 802.11 header info */
|
|
orig_hdr = (uint8_t *)(qdf_nbuf_data(msdu) + rx_desc_len);
|
|
orig_hdr = (uint8_t *)(qdf_nbuf_data(msdu) + rx_desc_len);
|
|
@@ -467,10 +472,11 @@ static QDF_STATUS dp_rx_defrag_tkip_decap(qdf_nbuf_t msdu, uint16_t hdrlen)
|
|
*
|
|
*
|
|
* Returns: QDF_STATUS
|
|
* Returns: QDF_STATUS
|
|
*/
|
|
*/
|
|
-static QDF_STATUS dp_rx_defrag_ccmp_demic(qdf_nbuf_t nbuf, uint16_t hdrlen)
|
|
|
|
|
|
+static QDF_STATUS
|
|
|
|
+dp_rx_defrag_ccmp_demic(struct dp_soc *soc, qdf_nbuf_t nbuf, uint16_t hdrlen)
|
|
{
|
|
{
|
|
uint8_t *ivp, *orig_hdr;
|
|
uint8_t *ivp, *orig_hdr;
|
|
- int rx_desc_len = SIZE_OF_DATA_RX_TLV;
|
|
|
|
|
|
+ int rx_desc_len = soc->rx_pkt_tlv_size;
|
|
|
|
|
|
/* start of the 802.11 header */
|
|
/* start of the 802.11 header */
|
|
orig_hdr = (uint8_t *)(qdf_nbuf_data(nbuf) + rx_desc_len);
|
|
orig_hdr = (uint8_t *)(qdf_nbuf_data(nbuf) + rx_desc_len);
|
|
@@ -494,10 +500,11 @@ static QDF_STATUS dp_rx_defrag_ccmp_demic(qdf_nbuf_t nbuf, uint16_t hdrlen)
|
|
*
|
|
*
|
|
* Returns: QDF_STATUS
|
|
* Returns: QDF_STATUS
|
|
*/
|
|
*/
|
|
-static QDF_STATUS dp_rx_defrag_ccmp_decap(qdf_nbuf_t nbuf, uint16_t hdrlen)
|
|
|
|
|
|
+static QDF_STATUS
|
|
|
|
+dp_rx_defrag_ccmp_decap(struct dp_soc *soc, qdf_nbuf_t nbuf, uint16_t hdrlen)
|
|
{
|
|
{
|
|
uint8_t *ivp, *origHdr;
|
|
uint8_t *ivp, *origHdr;
|
|
- int rx_desc_len = SIZE_OF_DATA_RX_TLV;
|
|
|
|
|
|
+ int rx_desc_len = soc->rx_pkt_tlv_size;
|
|
|
|
|
|
origHdr = (uint8_t *) (qdf_nbuf_data(nbuf) + rx_desc_len);
|
|
origHdr = (uint8_t *) (qdf_nbuf_data(nbuf) + rx_desc_len);
|
|
ivp = origHdr + hdrlen;
|
|
ivp = origHdr + hdrlen;
|
|
@@ -519,10 +526,11 @@ static QDF_STATUS dp_rx_defrag_ccmp_decap(qdf_nbuf_t nbuf, uint16_t hdrlen)
|
|
*
|
|
*
|
|
* Returns: QDF_STATUS
|
|
* Returns: QDF_STATUS
|
|
*/
|
|
*/
|
|
-static QDF_STATUS dp_rx_defrag_wep_decap(qdf_nbuf_t msdu, uint16_t hdrlen)
|
|
|
|
|
|
+static QDF_STATUS
|
|
|
|
+dp_rx_defrag_wep_decap(struct dp_soc *soc, qdf_nbuf_t msdu, uint16_t hdrlen)
|
|
{
|
|
{
|
|
uint8_t *origHdr;
|
|
uint8_t *origHdr;
|
|
- int rx_desc_len = SIZE_OF_DATA_RX_TLV;
|
|
|
|
|
|
+ int rx_desc_len = soc->rx_pkt_tlv_size;
|
|
|
|
|
|
origHdr = (uint8_t *) (qdf_nbuf_data(msdu) + rx_desc_len);
|
|
origHdr = (uint8_t *) (qdf_nbuf_data(msdu) + rx_desc_len);
|
|
qdf_mem_move(origHdr + dp_f_wep.ic_header, origHdr, hdrlen);
|
|
qdf_mem_move(origHdr + dp_f_wep.ic_header, origHdr, hdrlen);
|
|
@@ -555,7 +563,7 @@ static uint16_t dp_rx_defrag_hdrsize(struct dp_soc *soc, qdf_nbuf_t nbuf)
|
|
frm_ctrl_valid =
|
|
frm_ctrl_valid =
|
|
hal_rx_get_mpdu_frame_control_valid(soc->hal_soc,
|
|
hal_rx_get_mpdu_frame_control_valid(soc->hal_soc,
|
|
rx_tlv_hdr);
|
|
rx_tlv_hdr);
|
|
- frm_ctrl_field = hal_rx_get_frame_ctrl_field(rx_tlv_hdr);
|
|
|
|
|
|
+ frm_ctrl_field = hal_rx_get_frame_ctrl_field(soc->hal_soc, rx_tlv_hdr);
|
|
|
|
|
|
if (to_ds && fr_ds)
|
|
if (to_ds && fr_ds)
|
|
size += QDF_MAC_ADDR_SIZE;
|
|
size += QDF_MAC_ADDR_SIZE;
|
|
@@ -648,14 +656,15 @@ static void dp_rx_defrag_michdr(const struct ieee80211_frame *wh0,
|
|
*
|
|
*
|
|
* Returns: QDF_STATUS
|
|
* Returns: QDF_STATUS
|
|
*/
|
|
*/
|
|
-static QDF_STATUS dp_rx_defrag_mic(const uint8_t *key, qdf_nbuf_t wbuf,
|
|
|
|
- uint16_t off, uint16_t data_len, uint8_t mic[])
|
|
|
|
|
|
+static QDF_STATUS dp_rx_defrag_mic(struct dp_soc *soc, const uint8_t *key,
|
|
|
|
+ qdf_nbuf_t wbuf, uint16_t off,
|
|
|
|
+ uint16_t data_len, uint8_t mic[])
|
|
{
|
|
{
|
|
uint8_t hdr[16] = { 0, };
|
|
uint8_t hdr[16] = { 0, };
|
|
uint32_t l, r;
|
|
uint32_t l, r;
|
|
const uint8_t *data;
|
|
const uint8_t *data;
|
|
uint32_t space;
|
|
uint32_t space;
|
|
- int rx_desc_len = SIZE_OF_DATA_RX_TLV;
|
|
|
|
|
|
+ int rx_desc_len = soc->rx_pkt_tlv_size;
|
|
|
|
|
|
dp_rx_defrag_michdr((struct ieee80211_frame *)(qdf_nbuf_data(wbuf)
|
|
dp_rx_defrag_michdr((struct ieee80211_frame *)(qdf_nbuf_data(wbuf)
|
|
+ rx_desc_len), hdr);
|
|
+ rx_desc_len), hdr);
|
|
@@ -771,8 +780,9 @@ static QDF_STATUS dp_rx_defrag_mic(const uint8_t *key, qdf_nbuf_t wbuf,
|
|
*
|
|
*
|
|
* Returns: QDF_STATUS
|
|
* Returns: QDF_STATUS
|
|
*/
|
|
*/
|
|
-static QDF_STATUS dp_rx_defrag_tkip_demic(const uint8_t *key,
|
|
|
|
- qdf_nbuf_t msdu, uint16_t hdrlen)
|
|
|
|
|
|
+static QDF_STATUS dp_rx_defrag_tkip_demic(struct dp_soc *soc,
|
|
|
|
+ const uint8_t *key,
|
|
|
|
+ qdf_nbuf_t msdu, uint16_t hdrlen)
|
|
{
|
|
{
|
|
QDF_STATUS status;
|
|
QDF_STATUS status;
|
|
uint32_t pktlen = 0, prev_data_len;
|
|
uint32_t pktlen = 0, prev_data_len;
|
|
@@ -824,8 +834,8 @@ static QDF_STATUS dp_rx_defrag_tkip_demic(const uint8_t *key,
|
|
qdf_nbuf_set_next(prev0, NULL);
|
|
qdf_nbuf_set_next(prev0, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
- status = dp_rx_defrag_mic(key, msdu, hdrlen,
|
|
|
|
- pktlen, mic);
|
|
|
|
|
|
+ status = dp_rx_defrag_mic(soc, key, msdu, hdrlen,
|
|
|
|
+ pktlen, mic);
|
|
|
|
|
|
if (QDF_IS_STATUS_ERROR(status))
|
|
if (QDF_IS_STATUS_ERROR(status))
|
|
return status;
|
|
return status;
|
|
@@ -845,19 +855,12 @@ static QDF_STATUS dp_rx_defrag_tkip_demic(const uint8_t *key,
|
|
*
|
|
*
|
|
* Returns: None
|
|
* Returns: None
|
|
*/
|
|
*/
|
|
-static void dp_rx_frag_pull_hdr(qdf_nbuf_t nbuf, uint16_t hdrsize)
|
|
|
|
|
|
+static void dp_rx_frag_pull_hdr(struct dp_soc *soc,
|
|
|
|
+ qdf_nbuf_t nbuf, uint16_t hdrsize)
|
|
{
|
|
{
|
|
- struct rx_pkt_tlvs *rx_pkt_tlv =
|
|
|
|
- (struct rx_pkt_tlvs *)qdf_nbuf_data(nbuf);
|
|
|
|
- struct rx_mpdu_info *rx_mpdu_info_details =
|
|
|
|
- &rx_pkt_tlv->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
|
|
|
|
-
|
|
|
|
- dp_debug("pn_31_0 0x%x pn_63_32 0x%x pn_95_64 0x%x pn_127_96 0x%x\n",
|
|
|
|
- rx_mpdu_info_details->pn_31_0, rx_mpdu_info_details->pn_63_32,
|
|
|
|
- rx_mpdu_info_details->pn_95_64,
|
|
|
|
- rx_mpdu_info_details->pn_127_96);
|
|
|
|
|
|
+ hal_rx_print_pn(soc->hal_soc, qdf_nbuf_data(nbuf));
|
|
|
|
|
|
- qdf_nbuf_pull_head(nbuf, RX_PKT_TLVS_LEN + hdrsize);
|
|
|
|
|
|
+ qdf_nbuf_pull_head(nbuf, soc->rx_pkt_tlv_size + hdrsize);
|
|
|
|
|
|
dp_debug("final pktlen %d .11len %d",
|
|
dp_debug("final pktlen %d .11len %d",
|
|
(uint32_t)qdf_nbuf_len(nbuf), hdrsize);
|
|
(uint32_t)qdf_nbuf_len(nbuf), hdrsize);
|
|
@@ -871,21 +874,12 @@ static void dp_rx_frag_pull_hdr(qdf_nbuf_t nbuf, uint16_t hdrsize)
|
|
*
|
|
*
|
|
* Returns: 0 on success, non zero on failure
|
|
* Returns: 0 on success, non zero on failure
|
|
*/
|
|
*/
|
|
-static int dp_rx_defrag_pn_check(qdf_nbuf_t msdu,
|
|
|
|
|
|
+static int dp_rx_defrag_pn_check(struct dp_soc *soc, qdf_nbuf_t msdu,
|
|
uint64_t *cur_pn128, uint64_t *prev_pn128)
|
|
uint64_t *cur_pn128, uint64_t *prev_pn128)
|
|
{
|
|
{
|
|
- struct rx_pkt_tlvs *rx_pkt_tlv =
|
|
|
|
- (struct rx_pkt_tlvs *)qdf_nbuf_data(msdu);
|
|
|
|
- struct rx_mpdu_info *rx_mpdu_info_details =
|
|
|
|
- &rx_pkt_tlv->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
|
|
|
|
int out_of_order = 0;
|
|
int out_of_order = 0;
|
|
|
|
|
|
- cur_pn128[0] = rx_mpdu_info_details->pn_31_0;
|
|
|
|
- cur_pn128[0] |=
|
|
|
|
- ((uint64_t)rx_mpdu_info_details->pn_63_32 << 32);
|
|
|
|
- cur_pn128[1] = rx_mpdu_info_details->pn_95_64;
|
|
|
|
- cur_pn128[1] |=
|
|
|
|
- ((uint64_t)rx_mpdu_info_details->pn_127_96 << 32);
|
|
|
|
|
|
+ hal_rx_tlv_get_pn_num(soc->hal_soc, qdf_nbuf_data(msdu), cur_pn128);
|
|
|
|
|
|
if (cur_pn128[1] == prev_pn128[1])
|
|
if (cur_pn128[1] == prev_pn128[1])
|
|
out_of_order = (cur_pn128[0] - prev_pn128[0] != 1);
|
|
out_of_order = (cur_pn128[0] - prev_pn128[0] != 1);
|
|
@@ -909,6 +903,7 @@ static int
|
|
dp_rx_construct_fraglist(struct dp_peer *peer, int tid, qdf_nbuf_t head,
|
|
dp_rx_construct_fraglist(struct dp_peer *peer, int tid, qdf_nbuf_t head,
|
|
uint16_t hdrsize)
|
|
uint16_t hdrsize)
|
|
{
|
|
{
|
|
|
|
+ struct dp_soc *soc = peer->vdev->pdev->soc;
|
|
qdf_nbuf_t msdu = qdf_nbuf_next(head);
|
|
qdf_nbuf_t msdu = qdf_nbuf_next(head);
|
|
qdf_nbuf_t rx_nbuf = msdu;
|
|
qdf_nbuf_t rx_nbuf = msdu;
|
|
struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];
|
|
struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];
|
|
@@ -921,13 +916,14 @@ dp_rx_construct_fraglist(struct dp_peer *peer, int tid, qdf_nbuf_t head,
|
|
prev_pn128[0] = rx_tid->pn128[0];
|
|
prev_pn128[0] = rx_tid->pn128[0];
|
|
prev_pn128[1] = rx_tid->pn128[1];
|
|
prev_pn128[1] = rx_tid->pn128[1];
|
|
|
|
|
|
- index = hal_rx_msdu_is_wlan_mcast(msdu) ? dp_sec_mcast : dp_sec_ucast;
|
|
|
|
|
|
+ index = hal_rx_msdu_is_wlan_mcast(soc->hal_soc, msdu) ? dp_sec_mcast :
|
|
|
|
+ dp_sec_ucast;
|
|
if (qdf_likely(peer->security[index].sec_type != cdp_sec_type_none))
|
|
if (qdf_likely(peer->security[index].sec_type != cdp_sec_type_none))
|
|
needs_pn_check = 1;
|
|
needs_pn_check = 1;
|
|
|
|
|
|
while (msdu) {
|
|
while (msdu) {
|
|
if (qdf_likely(needs_pn_check))
|
|
if (qdf_likely(needs_pn_check))
|
|
- out_of_order = dp_rx_defrag_pn_check(msdu,
|
|
|
|
|
|
+ out_of_order = dp_rx_defrag_pn_check(soc, msdu,
|
|
&cur_pn128[0],
|
|
&cur_pn128[0],
|
|
&prev_pn128[0]);
|
|
&prev_pn128[0]);
|
|
|
|
|
|
@@ -946,13 +942,13 @@ dp_rx_construct_fraglist(struct dp_peer *peer, int tid, qdf_nbuf_t head,
|
|
* Iterating through all msdus and dropping fragments if even
|
|
* Iterating through all msdus and dropping fragments if even
|
|
* one of them has mcast/bcast destination address.
|
|
* one of them has mcast/bcast destination address.
|
|
*/
|
|
*/
|
|
- if (hal_rx_msdu_is_wlan_mcast(msdu)) {
|
|
|
|
|
|
+ if (hal_rx_msdu_is_wlan_mcast(soc->hal_soc, msdu)) {
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
|
|
"Dropping multicast/broadcast fragments");
|
|
"Dropping multicast/broadcast fragments");
|
|
return QDF_STATUS_E_FAILURE;
|
|
return QDF_STATUS_E_FAILURE;
|
|
}
|
|
}
|
|
|
|
|
|
- dp_rx_frag_pull_hdr(msdu, hdrsize);
|
|
|
|
|
|
+ dp_rx_frag_pull_hdr(soc, msdu, hdrsize);
|
|
len += qdf_nbuf_len(msdu);
|
|
len += qdf_nbuf_len(msdu);
|
|
msdu = qdf_nbuf_next(msdu);
|
|
msdu = qdf_nbuf_next(msdu);
|
|
}
|
|
}
|
|
@@ -989,7 +985,7 @@ static void dp_rx_defrag_err(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
|
{
|
|
{
|
|
struct ol_if_ops *tops = NULL;
|
|
struct ol_if_ops *tops = NULL;
|
|
struct dp_pdev *pdev = vdev->pdev;
|
|
struct dp_pdev *pdev = vdev->pdev;
|
|
- int rx_desc_len = SIZE_OF_DATA_RX_TLV;
|
|
|
|
|
|
+ int rx_desc_len = pdev->soc->rx_pkt_tlv_size;
|
|
uint8_t *orig_hdr;
|
|
uint8_t *orig_hdr;
|
|
struct ieee80211_frame *wh;
|
|
struct ieee80211_frame *wh;
|
|
struct cdp_rx_mic_err_info mic_failure_info;
|
|
struct cdp_rx_mic_err_info mic_failure_info;
|
|
@@ -1035,22 +1031,12 @@ dp_rx_defrag_nwifi_to_8023(struct dp_soc *soc, struct dp_peer *peer, int tid,
|
|
uint8_t ether_type[2];
|
|
uint8_t ether_type[2];
|
|
uint16_t fc = 0;
|
|
uint16_t fc = 0;
|
|
union dp_align_mac_addr mac_addr;
|
|
union dp_align_mac_addr mac_addr;
|
|
- uint8_t *rx_desc_info = qdf_mem_malloc(RX_PKT_TLVS_LEN);
|
|
|
|
- struct rx_pkt_tlvs *rx_pkt_tlv =
|
|
|
|
- (struct rx_pkt_tlvs *)qdf_nbuf_data(nbuf);
|
|
|
|
- struct rx_mpdu_info *rx_mpdu_info_details =
|
|
|
|
- &rx_pkt_tlv->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
|
|
|
|
|
|
+ uint8_t *rx_desc_info = qdf_mem_malloc(soc->rx_pkt_tlv_size);
|
|
struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];
|
|
struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];
|
|
|
|
|
|
- dp_debug("head_nbuf pn_31_0 0x%x pn_63_32 0x%x pn_95_64 0x%x pn_127_96 0x%x\n",
|
|
|
|
- rx_mpdu_info_details->pn_31_0, rx_mpdu_info_details->pn_63_32,
|
|
|
|
- rx_mpdu_info_details->pn_95_64,
|
|
|
|
- rx_mpdu_info_details->pn_127_96);
|
|
|
|
|
|
+ hal_rx_tlv_get_pn_num(soc->hal_soc, qdf_nbuf_data(nbuf), rx_tid->pn128);
|
|
|
|
|
|
- rx_tid->pn128[0] = rx_mpdu_info_details->pn_31_0;
|
|
|
|
- rx_tid->pn128[0] |= ((uint64_t)rx_mpdu_info_details->pn_63_32 << 32);
|
|
|
|
- rx_tid->pn128[1] = rx_mpdu_info_details->pn_95_64;
|
|
|
|
- rx_tid->pn128[1] |= ((uint64_t)rx_mpdu_info_details->pn_127_96 << 32);
|
|
|
|
|
|
+ hal_rx_print_pn(soc->hal_soc, qdf_nbuf_data(nbuf));
|
|
|
|
|
|
if (!rx_desc_info) {
|
|
if (!rx_desc_info) {
|
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
|
|
@@ -1059,13 +1045,13 @@ dp_rx_defrag_nwifi_to_8023(struct dp_soc *soc, struct dp_peer *peer, int tid,
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- qdf_mem_copy(rx_desc_info, qdf_nbuf_data(nbuf), RX_PKT_TLVS_LEN);
|
|
|
|
|
|
+ qdf_mem_copy(rx_desc_info, qdf_nbuf_data(nbuf), soc->rx_pkt_tlv_size);
|
|
|
|
|
|
llchdr = (struct llc_snap_hdr_t *)(qdf_nbuf_data(nbuf) +
|
|
llchdr = (struct llc_snap_hdr_t *)(qdf_nbuf_data(nbuf) +
|
|
- RX_PKT_TLVS_LEN + hdrsize);
|
|
|
|
|
|
+ soc->rx_pkt_tlv_size + hdrsize);
|
|
qdf_mem_copy(ether_type, llchdr->ethertype, 2);
|
|
qdf_mem_copy(ether_type, llchdr->ethertype, 2);
|
|
|
|
|
|
- qdf_nbuf_pull_head(nbuf, (RX_PKT_TLVS_LEN + hdrsize +
|
|
|
|
|
|
+ qdf_nbuf_pull_head(nbuf, (soc->rx_pkt_tlv_size + hdrsize +
|
|
sizeof(struct llc_snap_hdr_t) -
|
|
sizeof(struct llc_snap_hdr_t) -
|
|
sizeof(struct ethernet_hdr_t)));
|
|
sizeof(struct ethernet_hdr_t)));
|
|
|
|
|
|
@@ -1073,7 +1059,7 @@ dp_rx_defrag_nwifi_to_8023(struct dp_soc *soc, struct dp_peer *peer, int tid,
|
|
|
|
|
|
if (hal_rx_get_mpdu_frame_control_valid(soc->hal_soc,
|
|
if (hal_rx_get_mpdu_frame_control_valid(soc->hal_soc,
|
|
rx_desc_info))
|
|
rx_desc_info))
|
|
- fc = hal_rx_get_frame_ctrl_field(rx_desc_info);
|
|
|
|
|
|
+ fc = hal_rx_get_frame_ctrl_field(soc->hal_soc, rx_desc_info);
|
|
|
|
|
|
dp_debug("Frame control type: 0x%x", fc);
|
|
dp_debug("Frame control type: 0x%x", fc);
|
|
|
|
|
|
@@ -1128,8 +1114,8 @@ dp_rx_defrag_nwifi_to_8023(struct dp_soc *soc, struct dp_peer *peer, int tid,
|
|
qdf_mem_copy(eth_hdr->ethertype, ether_type,
|
|
qdf_mem_copy(eth_hdr->ethertype, ether_type,
|
|
sizeof(ether_type));
|
|
sizeof(ether_type));
|
|
|
|
|
|
- qdf_nbuf_push_head(nbuf, RX_PKT_TLVS_LEN);
|
|
|
|
- qdf_mem_copy(qdf_nbuf_data(nbuf), rx_desc_info, RX_PKT_TLVS_LEN);
|
|
|
|
|
|
+ qdf_nbuf_push_head(nbuf, soc->rx_pkt_tlv_size);
|
|
|
|
+ qdf_mem_copy(qdf_nbuf_data(nbuf), rx_desc_info, soc->rx_pkt_tlv_size);
|
|
qdf_mem_free(rx_desc_info);
|
|
qdf_mem_free(rx_desc_info);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1156,7 +1142,7 @@ static inline void dp_rx_defrag_deliver(struct dp_peer *peer,
|
|
|
|
|
|
QDF_NBUF_CB_RX_VDEV_ID(head) = vdev->vdev_id;
|
|
QDF_NBUF_CB_RX_VDEV_ID(head) = vdev->vdev_id;
|
|
qdf_nbuf_set_tid_val(head, tid);
|
|
qdf_nbuf_set_tid_val(head, tid);
|
|
- qdf_nbuf_pull_head(head, RX_PKT_TLVS_LEN);
|
|
|
|
|
|
+ qdf_nbuf_pull_head(head, soc->rx_pkt_tlv_size);
|
|
|
|
|
|
DP_RX_LIST_APPEND(deliver_list_head, deliver_list_tail,
|
|
DP_RX_LIST_APPEND(deliver_list_head, deliver_list_tail,
|
|
head);
|
|
head);
|
|
@@ -1289,12 +1275,16 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
|
|
|
|
|
|
hal_rx_reo_buf_paddr_get(dst_ring_desc, &buf_info);
|
|
hal_rx_reo_buf_paddr_get(dst_ring_desc, &buf_info);
|
|
|
|
|
|
|
|
+ /* buffer_addr_info is the first element of ring_desc */
|
|
|
|
+ hal_rx_buf_cookie_rbm_get(soc->hal_soc, (uint32_t *)dst_ring_desc,
|
|
|
|
+ &buf_info);
|
|
|
|
+
|
|
link_desc_va = dp_rx_cookie_2_link_desc_va(soc, &buf_info);
|
|
link_desc_va = dp_rx_cookie_2_link_desc_va(soc, &buf_info);
|
|
|
|
|
|
qdf_assert_always(link_desc_va);
|
|
qdf_assert_always(link_desc_va);
|
|
|
|
|
|
msdu0 = hal_rx_msdu0_buffer_addr_lsb(soc->hal_soc, link_desc_va);
|
|
msdu0 = hal_rx_msdu0_buffer_addr_lsb(soc->hal_soc, link_desc_va);
|
|
- nbuf_len = qdf_nbuf_len(head) - RX_PKT_TLVS_LEN;
|
|
|
|
|
|
+ nbuf_len = qdf_nbuf_len(head) - soc->rx_pkt_tlv_size;
|
|
|
|
|
|
HAL_RX_UNIFORM_HDR_SET(link_desc_va, OWNER, UNI_DESC_OWNER_SW);
|
|
HAL_RX_UNIFORM_HDR_SET(link_desc_va, OWNER, UNI_DESC_OWNER_SW);
|
|
HAL_RX_UNIFORM_HDR_SET(link_desc_va, BUFFER_TYPE,
|
|
HAL_RX_UNIFORM_HDR_SET(link_desc_va, BUFFER_TYPE,
|
|
@@ -1323,8 +1313,7 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
|
|
DA_IS_VALID, 1);
|
|
DA_IS_VALID, 1);
|
|
|
|
|
|
/* change RX TLV's */
|
|
/* change RX TLV's */
|
|
- hal_rx_msdu_start_msdu_len_set(
|
|
|
|
- qdf_nbuf_data(head), nbuf_len);
|
|
|
|
|
|
+ hal_rx_tlv_msdu_len_set(soc->hal_soc, qdf_nbuf_data(head), nbuf_len);
|
|
|
|
|
|
cookie = HAL_RX_BUF_COOKIE_GET(msdu0);
|
|
cookie = HAL_RX_BUF_COOKIE_GET(msdu0);
|
|
rx_desc_pool = &soc->rx_desc_buf[pdev->lmac_id];
|
|
rx_desc_pool = &soc->rx_desc_buf[pdev->lmac_id];
|
|
@@ -1360,7 +1349,8 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
|
|
return QDF_STATUS_E_FAILURE;
|
|
return QDF_STATUS_E_FAILURE;
|
|
}
|
|
}
|
|
|
|
|
|
- hal_rxdma_buff_addr_info_set(msdu0, paddr, cookie, DP_DEFRAG_RBM);
|
|
|
|
|
|
+ hal_rxdma_buff_addr_info_set(soc->hal_osc, msdu0, paddr, cookie,
|
|
|
|
+ DP_DEFRAG_RBM);
|
|
|
|
|
|
/* Lets fill entrance ring now !!! */
|
|
/* Lets fill entrance ring now !!! */
|
|
if (qdf_unlikely(hal_srng_access_start(soc->hal_soc, hal_srng))) {
|
|
if (qdf_unlikely(hal_srng_access_start(soc->hal_soc, hal_srng))) {
|
|
@@ -1374,7 +1364,7 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
|
|
dp_rx_reinject_ring_record_entry(soc, paddr, cookie, DP_DEFRAG_RBM);
|
|
dp_rx_reinject_ring_record_entry(soc, paddr, cookie, DP_DEFRAG_RBM);
|
|
paddr = (uint64_t)buf_info.paddr;
|
|
paddr = (uint64_t)buf_info.paddr;
|
|
/* buf addr */
|
|
/* buf addr */
|
|
- hal_rxdma_buff_addr_info_set(ent_ring_desc, paddr,
|
|
|
|
|
|
+ hal_rxdma_buff_addr_info_set(soc->hal_soc, ent_ring_desc, paddr,
|
|
buf_info.sw_cookie,
|
|
buf_info.sw_cookie,
|
|
HAL_RX_BUF_RBM_WBM_IDLE_DESC_LIST);
|
|
HAL_RX_BUF_RBM_WBM_IDLE_DESC_LIST);
|
|
/* mpdu desc info */
|
|
/* mpdu desc info */
|
|
@@ -1427,6 +1417,7 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
|
|
|
|
|
|
/*
|
|
/*
|
|
* dp_rx_defrag_gcmp_demic(): Remove MIC information from GCMP fragment
|
|
* dp_rx_defrag_gcmp_demic(): Remove MIC information from GCMP fragment
|
|
|
|
+ * @soc: Datapath soc structure
|
|
* @nbuf: Pointer to the fragment buffer
|
|
* @nbuf: Pointer to the fragment buffer
|
|
* @hdrlen: 802.11 header length
|
|
* @hdrlen: 802.11 header length
|
|
*
|
|
*
|
|
@@ -1434,10 +1425,11 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
|
|
*
|
|
*
|
|
* Returns: QDF_STATUS
|
|
* Returns: QDF_STATUS
|
|
*/
|
|
*/
|
|
-static QDF_STATUS dp_rx_defrag_gcmp_demic(qdf_nbuf_t nbuf, uint16_t hdrlen)
|
|
|
|
|
|
+static QDF_STATUS dp_rx_defrag_gcmp_demic(struct dp_soc *soc, qdf_nbuf_t nbuf,
|
|
|
|
+ uint16_t hdrlen)
|
|
{
|
|
{
|
|
uint8_t *ivp, *orig_hdr;
|
|
uint8_t *ivp, *orig_hdr;
|
|
- int rx_desc_len = SIZE_OF_DATA_RX_TLV;
|
|
|
|
|
|
+ int rx_desc_len = soc->rx_pkt_tlv_size;
|
|
|
|
|
|
/* start of the 802.11 header */
|
|
/* start of the 802.11 header */
|
|
orig_hdr = (uint8_t *)(qdf_nbuf_data(nbuf) + rx_desc_len);
|
|
orig_hdr = (uint8_t *)(qdf_nbuf_data(nbuf) + rx_desc_len);
|
|
@@ -1479,7 +1471,7 @@ static QDF_STATUS dp_rx_defrag(struct dp_peer *peer, unsigned tid,
|
|
uint8_t status = 0;
|
|
uint8_t status = 0;
|
|
|
|
|
|
hdr_space = dp_rx_defrag_hdrsize(soc, cur);
|
|
hdr_space = dp_rx_defrag_hdrsize(soc, cur);
|
|
- index = hal_rx_msdu_is_wlan_mcast(cur) ?
|
|
|
|
|
|
+ index = hal_rx_msdu_is_wlan_mcast(soc->hal_soc, cur) ?
|
|
dp_sec_mcast : dp_sec_ucast;
|
|
dp_sec_mcast : dp_sec_ucast;
|
|
|
|
|
|
/* Remove FCS from all fragments */
|
|
/* Remove FCS from all fragments */
|
|
@@ -1504,7 +1496,7 @@ static QDF_STATUS dp_rx_defrag(struct dp_peer *peer, unsigned tid,
|
|
case cdp_sec_type_tkip_nomic:
|
|
case cdp_sec_type_tkip_nomic:
|
|
while (cur) {
|
|
while (cur) {
|
|
tmp_next = qdf_nbuf_next(cur);
|
|
tmp_next = qdf_nbuf_next(cur);
|
|
- if (dp_rx_defrag_tkip_decap(cur, hdr_space)) {
|
|
|
|
|
|
+ if (dp_rx_defrag_tkip_decap(soc, cur, hdr_space)) {
|
|
|
|
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
QDF_TRACE_LEVEL_ERROR,
|
|
QDF_TRACE_LEVEL_ERROR,
|
|
@@ -1522,7 +1514,7 @@ static QDF_STATUS dp_rx_defrag(struct dp_peer *peer, unsigned tid,
|
|
case cdp_sec_type_aes_ccmp:
|
|
case cdp_sec_type_aes_ccmp:
|
|
while (cur) {
|
|
while (cur) {
|
|
tmp_next = qdf_nbuf_next(cur);
|
|
tmp_next = qdf_nbuf_next(cur);
|
|
- if (dp_rx_defrag_ccmp_demic(cur, hdr_space)) {
|
|
|
|
|
|
+ if (dp_rx_defrag_ccmp_demic(soc, cur, hdr_space)) {
|
|
|
|
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
QDF_TRACE_LEVEL_ERROR,
|
|
QDF_TRACE_LEVEL_ERROR,
|
|
@@ -1530,7 +1522,7 @@ static QDF_STATUS dp_rx_defrag(struct dp_peer *peer, unsigned tid,
|
|
|
|
|
|
return QDF_STATUS_E_DEFRAG_ERROR;
|
|
return QDF_STATUS_E_DEFRAG_ERROR;
|
|
}
|
|
}
|
|
- if (dp_rx_defrag_ccmp_decap(cur, hdr_space)) {
|
|
|
|
|
|
+ if (dp_rx_defrag_ccmp_decap(soc, cur, hdr_space)) {
|
|
|
|
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
QDF_TRACE_LEVEL_ERROR,
|
|
QDF_TRACE_LEVEL_ERROR,
|
|
@@ -1550,7 +1542,7 @@ static QDF_STATUS dp_rx_defrag(struct dp_peer *peer, unsigned tid,
|
|
case cdp_sec_type_wep128:
|
|
case cdp_sec_type_wep128:
|
|
while (cur) {
|
|
while (cur) {
|
|
tmp_next = qdf_nbuf_next(cur);
|
|
tmp_next = qdf_nbuf_next(cur);
|
|
- if (dp_rx_defrag_wep_decap(cur, hdr_space)) {
|
|
|
|
|
|
+ if (dp_rx_defrag_wep_decap(soc, cur, hdr_space)) {
|
|
|
|
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
QDF_TRACE_LEVEL_ERROR,
|
|
QDF_TRACE_LEVEL_ERROR,
|
|
@@ -1568,7 +1560,7 @@ static QDF_STATUS dp_rx_defrag(struct dp_peer *peer, unsigned tid,
|
|
case cdp_sec_type_aes_gcmp_256:
|
|
case cdp_sec_type_aes_gcmp_256:
|
|
while (cur) {
|
|
while (cur) {
|
|
tmp_next = qdf_nbuf_next(cur);
|
|
tmp_next = qdf_nbuf_next(cur);
|
|
- if (dp_rx_defrag_gcmp_demic(cur, hdr_space)) {
|
|
|
|
|
|
+ if (dp_rx_defrag_gcmp_demic(soc, cur, hdr_space)) {
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
QDF_TRACE(QDF_MODULE_ID_TXRX,
|
|
QDF_TRACE_LEVEL_ERROR,
|
|
QDF_TRACE_LEVEL_ERROR,
|
|
"dp_rx_defrag: GCMP demic failed");
|
|
"dp_rx_defrag: GCMP demic failed");
|
|
@@ -1589,8 +1581,8 @@ static QDF_STATUS dp_rx_defrag(struct dp_peer *peer, unsigned tid,
|
|
qdf_mem_copy(key,
|
|
qdf_mem_copy(key,
|
|
&peer->security[index].michael_key[0],
|
|
&peer->security[index].michael_key[0],
|
|
IEEE80211_WEP_MICLEN);
|
|
IEEE80211_WEP_MICLEN);
|
|
- status = dp_rx_defrag_tkip_demic(key, msdu,
|
|
|
|
- RX_PKT_TLVS_LEN +
|
|
|
|
|
|
+ status = dp_rx_defrag_tkip_demic(soc, key, msdu,
|
|
|
|
+ soc->rx_pkt_tlv_size +
|
|
hdr_space);
|
|
hdr_space);
|
|
|
|
|
|
if (status) {
|
|
if (status) {
|
|
@@ -1725,9 +1717,10 @@ dp_rx_defrag_store_fragment(struct dp_soc *soc,
|
|
goto err_free_desc;
|
|
goto err_free_desc;
|
|
}
|
|
}
|
|
|
|
|
|
- msdu_len = hal_rx_msdu_start_msdu_len_get(rx_desc->rx_buf_start);
|
|
|
|
|
|
+ msdu_len = hal_rx_msdu_start_msdu_len_get(soc->hal_soc,
|
|
|
|
+ rx_desc->rx_buf_start);
|
|
|
|
|
|
- qdf_nbuf_set_pktlen(frag, (msdu_len + RX_PKT_TLVS_LEN));
|
|
|
|
|
|
+ qdf_nbuf_set_pktlen(frag, (msdu_len + soc->rx_pkt_tlv_size));
|
|
qdf_nbuf_append_ext_list(frag, NULL, 0);
|
|
qdf_nbuf_append_ext_list(frag, NULL, 0);
|
|
|
|
|
|
/* Check if the packet is from a valid peer */
|
|
/* Check if the packet is from a valid peer */
|
|
@@ -1782,12 +1775,12 @@ dp_rx_defrag_store_fragment(struct dp_soc *soc,
|
|
}
|
|
}
|
|
|
|
|
|
/* Current mpdu sequence */
|
|
/* Current mpdu sequence */
|
|
- more_frag = dp_rx_frag_get_more_frag_bit(rx_desc->rx_buf_start);
|
|
|
|
|
|
+ more_frag = dp_rx_frag_get_more_frag_bit(soc, rx_desc->rx_buf_start);
|
|
|
|
|
|
/* HW does not populate the fragment number as of now
|
|
/* HW does not populate the fragment number as of now
|
|
* need to get from the 802.11 header
|
|
* need to get from the 802.11 header
|
|
*/
|
|
*/
|
|
- fragno = dp_rx_frag_get_mpdu_frag_number(rx_desc->rx_buf_start);
|
|
|
|
|
|
+ fragno = dp_rx_frag_get_mpdu_frag_number(soc, rx_desc->rx_buf_start);
|
|
|
|
|
|
rx_reorder_array_elem = peer->rx_tid[tid].array;
|
|
rx_reorder_array_elem = peer->rx_tid[tid].array;
|
|
if (!rx_reorder_array_elem) {
|
|
if (!rx_reorder_array_elem) {
|
|
@@ -2103,9 +2096,10 @@ QDF_STATUS dp_rx_defrag_add_last_frag(struct dp_soc *soc,
|
|
goto fail;
|
|
goto fail;
|
|
}
|
|
}
|
|
|
|
|
|
- msdu_len = hal_rx_msdu_start_msdu_len_get(qdf_nbuf_data(nbuf));
|
|
|
|
|
|
+ msdu_len = hal_rx_msdu_start_msdu_len_get(soc->hal_soc,
|
|
|
|
+ qdf_nbuf_data(nbuf));
|
|
|
|
|
|
- qdf_nbuf_set_pktlen(nbuf, (msdu_len + RX_PKT_TLVS_LEN));
|
|
|
|
|
|
+ qdf_nbuf_set_pktlen(nbuf, (msdu_len + soc->rx_pkt_tlv_size));
|
|
|
|
|
|
status = dp_rx_defrag_fraglist_insert(peer, tid,
|
|
status = dp_rx_defrag_fraglist_insert(peer, tid,
|
|
&rx_reorder_array_elem->head,
|
|
&rx_reorder_array_elem->head,
|