staging: brcm80211: convert endianess before handling the frame
The received frame from the device is in little-endian order and converted in the receive path. However, the phy code was doing the rssi calculation with packet in LE order. This has been changed to do the le_to_cpu conversion before doing the rssi computation and further receive processing. Reviewed-by: Roland Vossen <rvossen@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Franky Lin <frankyl@broadcom.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
e053edb69a
commit
f32f116bda
|
@ -813,11 +813,23 @@ brcms_b_recv(struct brcms_hardware *wlc_hw, uint fifo, bool bound)
|
||||||
wlc_rxhdr = (struct brcms_d11rxhdr *) p->data;
|
wlc_rxhdr = (struct brcms_d11rxhdr *) p->data;
|
||||||
rxh = (struct d11rxhdr *)p->data;
|
rxh = (struct d11rxhdr *)p->data;
|
||||||
|
|
||||||
|
/* fixup rx header endianness */
|
||||||
|
rxh->RxFrameSize = le16_to_cpu(rxh->RxFrameSize);
|
||||||
|
rxh->PhyRxStatus_0 = le16_to_cpu(rxh->PhyRxStatus_0);
|
||||||
|
rxh->PhyRxStatus_1 = le16_to_cpu(rxh->PhyRxStatus_1);
|
||||||
|
rxh->PhyRxStatus_2 = le16_to_cpu(rxh->PhyRxStatus_2);
|
||||||
|
rxh->PhyRxStatus_3 = le16_to_cpu(rxh->PhyRxStatus_3);
|
||||||
|
rxh->PhyRxStatus_4 = le16_to_cpu(rxh->PhyRxStatus_4);
|
||||||
|
rxh->PhyRxStatus_5 = le16_to_cpu(rxh->PhyRxStatus_5);
|
||||||
|
rxh->RxStatus1 = le16_to_cpu(rxh->RxStatus1);
|
||||||
|
rxh->RxStatus2 = le16_to_cpu(rxh->RxStatus2);
|
||||||
|
rxh->RxTSFTime = le16_to_cpu(rxh->RxTSFTime);
|
||||||
|
rxh->RxChan = le16_to_cpu(rxh->RxChan);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* compute the RSSI from d11rxhdr and record it in wlc_rxd11hr
|
* compute the RSSI from d11rxhdr and record it in wlc_rxd11hr
|
||||||
*/
|
*/
|
||||||
wlc_rxhdr->rssi = wlc_phy_rssi_compute(wlc_hw->band->pi, rxh);
|
wlc_rxhdr->rssi = wlc_phy_rssi_compute(wlc_hw->band->pi, rxh);
|
||||||
|
|
||||||
brcms_c_recv(wlc_hw->wlc, p);
|
brcms_c_recv(wlc_hw->wlc, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8289,19 +8301,6 @@ void brcms_c_recv(struct brcms_c_info *wlc, struct sk_buff *p)
|
||||||
/* strip off rxhdr */
|
/* strip off rxhdr */
|
||||||
skb_pull(p, BRCMS_HWRXOFF);
|
skb_pull(p, BRCMS_HWRXOFF);
|
||||||
|
|
||||||
/* fixup rx header endianness */
|
|
||||||
rxh->RxFrameSize = le16_to_cpu(rxh->RxFrameSize);
|
|
||||||
rxh->PhyRxStatus_0 = le16_to_cpu(rxh->PhyRxStatus_0);
|
|
||||||
rxh->PhyRxStatus_1 = le16_to_cpu(rxh->PhyRxStatus_1);
|
|
||||||
rxh->PhyRxStatus_2 = le16_to_cpu(rxh->PhyRxStatus_2);
|
|
||||||
rxh->PhyRxStatus_3 = le16_to_cpu(rxh->PhyRxStatus_3);
|
|
||||||
rxh->PhyRxStatus_4 = le16_to_cpu(rxh->PhyRxStatus_4);
|
|
||||||
rxh->PhyRxStatus_5 = le16_to_cpu(rxh->PhyRxStatus_5);
|
|
||||||
rxh->RxStatus1 = le16_to_cpu(rxh->RxStatus1);
|
|
||||||
rxh->RxStatus2 = le16_to_cpu(rxh->RxStatus2);
|
|
||||||
rxh->RxTSFTime = le16_to_cpu(rxh->RxTSFTime);
|
|
||||||
rxh->RxChan = le16_to_cpu(rxh->RxChan);
|
|
||||||
|
|
||||||
/* MAC inserts 2 pad bytes for a4 headers or QoS or A-MSDU subframes */
|
/* MAC inserts 2 pad bytes for a4 headers or QoS or A-MSDU subframes */
|
||||||
if (rxh->RxStatus1 & RXS_PBPRES) {
|
if (rxh->RxStatus1 & RXS_PBPRES) {
|
||||||
if (p->len < 2) {
|
if (p->len < 2) {
|
||||||
|
|
|
@ -2613,18 +2613,18 @@ void wlc_phy_compute_dB(u32 *cmplx_pwr, s8 *p_cmplx_pwr_dB, u8 core)
|
||||||
int wlc_phy_rssi_compute(struct brcms_phy_pub *pih,
|
int wlc_phy_rssi_compute(struct brcms_phy_pub *pih,
|
||||||
struct d11rxhdr *rxh)
|
struct d11rxhdr *rxh)
|
||||||
{
|
{
|
||||||
int rssi = le16_to_cpu(rxh->PhyRxStatus_1) & PRXS1_JSSI_MASK;
|
int rssi = rxh->PhyRxStatus_1 & PRXS1_JSSI_MASK;
|
||||||
uint radioid = pih->radioid;
|
uint radioid = pih->radioid;
|
||||||
struct brcms_phy *pi = (struct brcms_phy *) pih;
|
struct brcms_phy *pi = (struct brcms_phy *) pih;
|
||||||
|
|
||||||
if ((pi->sh->corerev >= 11)
|
if ((pi->sh->corerev >= 11)
|
||||||
&& !(le16_to_cpu(rxh->RxStatus2) & RXS_PHYRXST_VALID)) {
|
&& !(rxh->RxStatus2 & RXS_PHYRXST_VALID)) {
|
||||||
rssi = BRCMS_RSSI_INVALID;
|
rssi = BRCMS_RSSI_INVALID;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ISLCNPHY(pi)) {
|
if (ISLCNPHY(pi)) {
|
||||||
u8 gidx = (le16_to_cpu(rxh->PhyRxStatus_2) & 0xFC00) >> 10;
|
u8 gidx = (rxh->PhyRxStatus_2 & 0xFC00) >> 10;
|
||||||
struct brcms_phy_lcnphy *pi_lcn = pi->u.pi_lcnphy;
|
struct brcms_phy_lcnphy *pi_lcn = pi->u.pi_lcnphy;
|
||||||
|
|
||||||
if (rssi > 127)
|
if (rssi > 127)
|
||||||
|
|
|
@ -23115,16 +23115,16 @@ wlc_phy_rssi_compute_nphy(struct brcms_phy *pi, struct d11rxhdr *rxh)
|
||||||
s16 phyRx0_l, phyRx2_l;
|
s16 phyRx0_l, phyRx2_l;
|
||||||
|
|
||||||
rxpwr = 0;
|
rxpwr = 0;
|
||||||
rxpwr0 = le16_to_cpu(rxh->PhyRxStatus_1) & PRXS1_nphy_PWR0_MASK;
|
rxpwr0 = rxh->PhyRxStatus_1 & PRXS1_nphy_PWR0_MASK;
|
||||||
rxpwr1 = (le16_to_cpu(rxh->PhyRxStatus_1) & PRXS1_nphy_PWR1_MASK) >> 8;
|
rxpwr1 = (rxh->PhyRxStatus_1 & PRXS1_nphy_PWR1_MASK) >> 8;
|
||||||
|
|
||||||
if (rxpwr0 > 127)
|
if (rxpwr0 > 127)
|
||||||
rxpwr0 -= 256;
|
rxpwr0 -= 256;
|
||||||
if (rxpwr1 > 127)
|
if (rxpwr1 > 127)
|
||||||
rxpwr1 -= 256;
|
rxpwr1 -= 256;
|
||||||
|
|
||||||
phyRx0_l = le16_to_cpu(rxh->PhyRxStatus_0) & 0x00ff;
|
phyRx0_l = rxh->PhyRxStatus_0 & 0x00ff;
|
||||||
phyRx2_l = le16_to_cpu(rxh->PhyRxStatus_2) & 0x00ff;
|
phyRx2_l = rxh->PhyRxStatus_2 & 0x00ff;
|
||||||
if (phyRx2_l > 127)
|
if (phyRx2_l > 127)
|
||||||
phyRx2_l -= 256;
|
phyRx2_l -= 256;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue