Skip to content

Commit

Permalink
rtl8xxxu: Split filling of TX descriptors into separate functions
Browse files Browse the repository at this point in the history
Split the filling of TX descriptors into a generic portion used on all
devices, and format specific helper functions provided in the fops
structure.

This also cleaned up some mess, even if non harmful, in the handling
of txdesc40 descriptors, where the code randomly would switch between
the pointer to tx_desc and tx_desc40.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
  • Loading branch information
Jes Sorensen authored and Kalle Valo committed Sep 3, 2016
1 parent 99afaac commit b59415c
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 89 deletions.
12 changes: 12 additions & 0 deletions drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
Original file line number Diff line number Diff line change
Expand Up @@ -1336,6 +1336,10 @@ struct rtl8xxxu_fileops {
u32 ramask, int sgi);
void (*report_connect) (struct rtl8xxxu_priv *priv,
u8 macid, bool connect);
void (*fill_txdesc) (struct ieee80211_hdr *hdr,
struct rtl8xxxu_txdesc32 *tx_desc, u32 rate,
u16 rate_flag, bool sgi, bool short_preamble,
bool ampdu_enable);
int writeN_block_size;
int rx_agg_buf_size;
char tx_desc_size;
Expand Down Expand Up @@ -1429,6 +1433,14 @@ int rtl8xxxu_parse_rxdesc24(struct rtl8xxxu_priv *priv, struct sk_buff *skb);
int rtl8xxxu_gen2_channel_to_group(int channel);
bool rtl8xxxu_gen2_simularity_compare(struct rtl8xxxu_priv *priv,
int result[][8], int c1, int c2);
void rtl8xxxu_fill_txdesc_v1(struct ieee80211_hdr *hdr,
struct rtl8xxxu_txdesc32 *tx_desc, u32 rate,
u16 rate_flag, bool sgi, bool short_preamble,
bool ampdu_enable);
void rtl8xxxu_fill_txdesc_v2(struct ieee80211_hdr *hdr,
struct rtl8xxxu_txdesc32 *tx_desc32, u32 rate,
u16 rate_flag, bool sgi, bool short_preamble,
bool ampdu_enable);

extern struct rtl8xxxu_fileops rtl8192cu_fops;
extern struct rtl8xxxu_fileops rtl8192eu_fops;
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192c.c
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,7 @@ struct rtl8xxxu_fileops rtl8192cu_fops = {
.set_tx_power = rtl8xxxu_gen1_set_tx_power,
.update_rate_mask = rtl8xxxu_update_rate_mask,
.report_connect = rtl8xxxu_gen1_report_connect,
.fill_txdesc = rtl8xxxu_fill_txdesc_v1,
.writeN_block_size = 128,
.rx_agg_buf_size = 16000,
.tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c
Original file line number Diff line number Diff line change
Expand Up @@ -1501,6 +1501,7 @@ struct rtl8xxxu_fileops rtl8192eu_fops = {
.set_tx_power = rtl8192e_set_tx_power,
.update_rate_mask = rtl8xxxu_gen2_update_rate_mask,
.report_connect = rtl8xxxu_gen2_report_connect,
.fill_txdesc = rtl8xxxu_fill_txdesc_v2,
.writeN_block_size = 128,
.tx_desc_size = sizeof(struct rtl8xxxu_txdesc40),
.rx_desc_size = sizeof(struct rtl8xxxu_rxdesc24),
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723a.c
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,7 @@ struct rtl8xxxu_fileops rtl8723au_fops = {
.set_tx_power = rtl8xxxu_gen1_set_tx_power,
.update_rate_mask = rtl8xxxu_update_rate_mask,
.report_connect = rtl8xxxu_gen1_report_connect,
.fill_txdesc = rtl8xxxu_fill_txdesc_v1,
.writeN_block_size = 1024,
.rx_agg_buf_size = 16000,
.tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c
Original file line number Diff line number Diff line change
Expand Up @@ -1662,6 +1662,7 @@ struct rtl8xxxu_fileops rtl8723bu_fops = {
.set_tx_power = rtl8723b_set_tx_power,
.update_rate_mask = rtl8xxxu_gen2_update_rate_mask,
.report_connect = rtl8xxxu_gen2_report_connect,
.fill_txdesc = rtl8xxxu_fill_txdesc_v2,
.writeN_block_size = 1024,
.tx_desc_size = sizeof(struct rtl8xxxu_txdesc40),
.rx_desc_size = sizeof(struct rtl8xxxu_rxdesc24),
Expand Down
198 changes: 109 additions & 89 deletions drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -4750,6 +4750,113 @@ static void rtl8xxxu_dump_action(struct device *dev,
}
}

/*
* Fill in v1 (gen1) specific TX descriptor bits.
* This format is used on 8188cu/8192cu/8723au
*/
void
rtl8xxxu_fill_txdesc_v1(struct ieee80211_hdr *hdr,
struct rtl8xxxu_txdesc32 *tx_desc, u32 rate,
u16 rate_flag, bool sgi, bool short_preamble,
bool ampdu_enable)
{
u16 seq_number;

seq_number = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));

tx_desc->txdw5 = cpu_to_le32(rate);

if (ieee80211_is_data(hdr->frame_control))
tx_desc->txdw5 |= cpu_to_le32(0x0001ff00);

tx_desc->txdw3 = cpu_to_le32((u32)seq_number << TXDESC32_SEQ_SHIFT);

if (ampdu_enable)
tx_desc->txdw1 |= cpu_to_le32(TXDESC32_AGG_ENABLE);
else
tx_desc->txdw1 |= cpu_to_le32(TXDESC32_AGG_BREAK);

if (ieee80211_is_mgmt(hdr->frame_control)) {
tx_desc->txdw5 = cpu_to_le32(rate);
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_USE_DRIVER_RATE);
tx_desc->txdw5 |= cpu_to_le32(6 << TXDESC32_RETRY_LIMIT_SHIFT);
tx_desc->txdw5 |= cpu_to_le32(TXDESC32_RETRY_LIMIT_ENABLE);
}

if (ieee80211_is_data_qos(hdr->frame_control))
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_QOS);

if (short_preamble)
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_SHORT_PREAMBLE);

if (sgi)
tx_desc->txdw5 |= cpu_to_le32(TXDESC32_SHORT_GI);

if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) {
/*
* Use RTS rate 24M - does the mac80211 tell
* us which to use?
*/
tx_desc->txdw4 |= cpu_to_le32(DESC_RATE_24M <<
TXDESC32_RTS_RATE_SHIFT);
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_RTS_CTS_ENABLE);
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_HW_RTS_ENABLE);
}
}

/*
* Fill in v2 (gen2) specific TX descriptor bits.
* This format is used on 8192eu/8723bu
*/
void
rtl8xxxu_fill_txdesc_v2(struct ieee80211_hdr *hdr,
struct rtl8xxxu_txdesc32 *tx_desc32, u32 rate,
u16 rate_flag, bool sgi, bool short_preamble,
bool ampdu_enable)
{
struct rtl8xxxu_txdesc40 *tx_desc40;
u16 seq_number;

tx_desc40 = (struct rtl8xxxu_txdesc40 *)tx_desc32;

seq_number = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));

tx_desc40->txdw4 = cpu_to_le32(rate);
if (ieee80211_is_data(hdr->frame_control)) {
tx_desc40->txdw4 |= cpu_to_le32(0x1f <<
TXDESC40_DATA_RATE_FB_SHIFT);
}

tx_desc40->txdw9 = cpu_to_le32((u32)seq_number << TXDESC40_SEQ_SHIFT);

if (ampdu_enable)
tx_desc40->txdw2 |= cpu_to_le32(TXDESC40_AGG_ENABLE);
else
tx_desc40->txdw2 |= cpu_to_le32(TXDESC40_AGG_BREAK);

if (ieee80211_is_mgmt(hdr->frame_control)) {
tx_desc40->txdw4 = cpu_to_le32(rate);
tx_desc40->txdw3 |= cpu_to_le32(TXDESC40_USE_DRIVER_RATE);
tx_desc40->txdw4 |=
cpu_to_le32(6 << TXDESC40_RETRY_LIMIT_SHIFT);
tx_desc40->txdw4 |= cpu_to_le32(TXDESC40_RETRY_LIMIT_ENABLE);
}

if (short_preamble)
tx_desc40->txdw5 |= cpu_to_le32(TXDESC40_SHORT_PREAMBLE);

if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) {
/*
* Use RTS rate 24M - does the mac80211 tell
* us which to use?
*/
tx_desc40->txdw4 |= cpu_to_le32(DESC_RATE_24M <<
TXDESC40_RTS_RATE_SHIFT);
tx_desc40->txdw3 |= cpu_to_le32(TXDESC40_RTS_CTS_ENABLE);
tx_desc40->txdw3 |= cpu_to_le32(TXDESC40_HW_RTS_ENABLE);
}
}

static void rtl8xxxu_tx(struct ieee80211_hw *hw,
struct ieee80211_tx_control *control,
struct sk_buff *skb)
Expand All @@ -4759,7 +4866,6 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
struct ieee80211_rate *tx_rate = ieee80211_get_tx_rate(hw, tx_info);
struct rtl8xxxu_priv *priv = hw->priv;
struct rtl8xxxu_txdesc32 *tx_desc;
struct rtl8xxxu_txdesc40 *tx_desc40;
struct rtl8xxxu_tx_urb *tx_urb;
struct ieee80211_sta *sta = NULL;
struct ieee80211_vif *vif = tx_info->control.vif;
Expand Down Expand Up @@ -4865,95 +4971,9 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
short_preamble = true;

seq_number = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
if (!usedesc40) {
tx_desc->txdw5 = cpu_to_le32(rate);

if (ieee80211_is_data(hdr->frame_control))
tx_desc->txdw5 |= cpu_to_le32(0x0001ff00);

tx_desc->txdw3 =
cpu_to_le32((u32)seq_number << TXDESC32_SEQ_SHIFT);

if (ampdu_enable)
tx_desc->txdw1 |= cpu_to_le32(TXDESC32_AGG_ENABLE);
else
tx_desc->txdw1 |= cpu_to_le32(TXDESC32_AGG_BREAK);

if (ieee80211_is_mgmt(hdr->frame_control)) {
tx_desc->txdw5 = cpu_to_le32(rate);
tx_desc->txdw4 |=
cpu_to_le32(TXDESC32_USE_DRIVER_RATE);
tx_desc->txdw5 |=
cpu_to_le32(6 << TXDESC32_RETRY_LIMIT_SHIFT);
tx_desc->txdw5 |=
cpu_to_le32(TXDESC32_RETRY_LIMIT_ENABLE);
}

if (ieee80211_is_data_qos(hdr->frame_control))
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_QOS);

if (short_preamble)
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_SHORT_PREAMBLE);

if (sgi)
tx_desc->txdw5 |= cpu_to_le32(TXDESC32_SHORT_GI);

if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) {
/*
* Use RTS rate 24M - does the mac80211 tell
* us which to use?
*/
tx_desc->txdw4 |=
cpu_to_le32(DESC_RATE_24M <<
TXDESC32_RTS_RATE_SHIFT);
tx_desc->txdw4 |=
cpu_to_le32(TXDESC32_RTS_CTS_ENABLE);
tx_desc->txdw4 |= cpu_to_le32(TXDESC32_HW_RTS_ENABLE);
}
} else {
tx_desc40 = (struct rtl8xxxu_txdesc40 *)tx_desc;

tx_desc40->txdw4 = cpu_to_le32(rate);
if (ieee80211_is_data(hdr->frame_control)) {
tx_desc->txdw4 |=
cpu_to_le32(0x1f <<
TXDESC40_DATA_RATE_FB_SHIFT);
}

tx_desc40->txdw9 =
cpu_to_le32((u32)seq_number << TXDESC40_SEQ_SHIFT);

if (ampdu_enable)
tx_desc40->txdw2 |= cpu_to_le32(TXDESC40_AGG_ENABLE);
else
tx_desc40->txdw2 |= cpu_to_le32(TXDESC40_AGG_BREAK);

if (ieee80211_is_mgmt(hdr->frame_control)) {
tx_desc40->txdw4 = cpu_to_le32(rate);
tx_desc40->txdw3 |=
cpu_to_le32(TXDESC40_USE_DRIVER_RATE);
tx_desc40->txdw4 |=
cpu_to_le32(6 << TXDESC40_RETRY_LIMIT_SHIFT);
tx_desc40->txdw4 |=
cpu_to_le32(TXDESC40_RETRY_LIMIT_ENABLE);
}

if (short_preamble)
tx_desc40->txdw5 |=
cpu_to_le32(TXDESC40_SHORT_PREAMBLE);

if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) {
/*
* Use RTS rate 24M - does the mac80211 tell
* us which to use?
*/
tx_desc->txdw4 |=
cpu_to_le32(DESC_RATE_24M <<
TXDESC40_RTS_RATE_SHIFT);
tx_desc->txdw3 |= cpu_to_le32(TXDESC40_RTS_CTS_ENABLE);
tx_desc->txdw3 |= cpu_to_le32(TXDESC40_HW_RTS_ENABLE);
}
}
priv->fops->fill_txdesc(hdr, tx_desc, rate, rate_flag,
sgi, short_preamble, ampdu_enable);

rtl8xxxu_calc_tx_desc_csum(tx_desc);

Expand Down

0 comments on commit b59415c

Please sign in to comment.