Previously, the firmware has applied (or rather has stuck)
with the ERP settings of the first rate for all retry rates.
This is now history and the driver can choose between
different ERP settings for each individual retry rate.
Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
static bool wlan_tx_consume_retry(struct carl9170_tx_superframe *super)
{
/* check if this was the last possible retry with this rate */
static bool wlan_tx_consume_retry(struct carl9170_tx_superframe *super)
{
/* check if this was the last possible retry with this rate */
- if (unlikely(super->s.cnt >= super->s.tries[super->s.rix])) {
+ if (unlikely(super->s.cnt >= super->s.ri[super->s.rix].tries)) {
/* end of the road - indicate tx failure */
if (unlikely(super->s.rix == CARL9170_TX_MAX_RETRY_RATES))
return false;
/* end of the road - indicate tx failure */
if (unlikely(super->s.rix == CARL9170_TX_MAX_RETRY_RATES))
return false;
/* finally - mark the old rate as USED */
super->s.rix++;
/* finally - mark the old rate as USED */
super->s.rix++;
+ /* update MAC flags */
+ super->f.hdr.mac.erp_prot = super->s.ri[super->s.rix].erp_prot;
+
/* reinitialize try counter */
super->s.cnt = 1;
} else {
/* reinitialize try counter */
super->s.cnt = 1;
} else {
sizeof(struct ar9170_tx_hwdesc) +
sizeof(struct ieee80211_ba);
sizeof(struct ar9170_tx_hwdesc) +
sizeof(struct ieee80211_ba);
+ baf->s.ri[0].tries = 3;
baf->s.queue = 0;
baf->f.hdr.length = sizeof(struct ieee80211_ba) + FCS_LEN;
baf->s.queue = 0;
baf->f.hdr.length = sizeof(struct ieee80211_ba) + FCS_LEN;
/* these are either-or */
#define AR9170_TX_MAC_PROT_RTS 0x0001
#define AR9170_TX_MAC_PROT_CTS 0x0002
/* these are either-or */
#define AR9170_TX_MAC_PROT_RTS 0x0001
#define AR9170_TX_MAC_PROT_CTS 0x0002
-#define AR9170_TX_MAC_PROT_MASK 0x0003
+#define AR9170_TX_MAC_PROT 0x0003
#define AR9170_TX_MAC_NO_ACK 0x0004
/* if unset, MAC will only do SIFS space before frame */
#define AR9170_TX_MAC_NO_ACK 0x0004
/* if unset, MAC will only do SIFS space before frame */
+struct ar9170_tx_rate_info {
+ u8 tries:3;
+ u8 erp_prot:2;
+ u8 free:3; /* free for use (e.g.:RIFS/TXOP/AMPDU) */
+} __packed;
+
struct carl9170_tx_superdesc {
__le16 len;
u8 rix;
struct carl9170_tx_superdesc {
__le16 len;
u8 rix;
u8 fill_in_tsf:1;
u8 cab:1;
u8 padding2;
u8 fill_in_tsf:1;
u8 cab:1;
u8 padding2;
- u8 tries[CARL9170_TX_MAX_RATES];
+ struct ar9170_tx_rate_info ri[CARL9170_TX_MAX_RATES];
struct ar9170_tx_hw_phy_control rr[CARL9170_TX_MAX_RETRY_RATES];
} __packed;
struct ar9170_tx_hw_phy_control rr[CARL9170_TX_MAX_RETRY_RATES];
} __packed;
#define CARL9170_TX_SUPER_MISC_FILL_IN_TSF 0x40
#define CARL9170_TX_SUPER_MISC_CAB 0x80
#define CARL9170_TX_SUPER_MISC_FILL_IN_TSF 0x40
#define CARL9170_TX_SUPER_MISC_CAB 0x80
+#define CARL9170_TX_SUPER_RI_TRIES 0x7
+#define CARL9170_TX_SUPER_RI_TRIES_S 0
+#define CARL9170_TX_SUPER_RI_ERP_PROT 0x18
+#define CARL9170_TX_SUPER_RI_ERP_PROT_S 3
+
struct _carl9170_tx_superdesc {
__le16 len;
u8 rix;
struct _carl9170_tx_superdesc {
__le16 len;
u8 rix;
u8 ampdu_settings;
u8 misc;
u8 padding;
u8 ampdu_settings;
u8 misc;
u8 padding;
- u8 tries[CARL9170_TX_MAX_RATES];
+ u8 ri[CARL9170_TX_MAX_RATES];
__le32 rr[CARL9170_TX_MAX_RETRY_RATES];
} __packed;
__le32 rr[CARL9170_TX_MAX_RETRY_RATES];
} __packed;