iwlwifi: mvm: disentangle union in TX status struct
This improves documentation, since kernel-doc can't deal with the union well. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
This commit is contained in:
parent
3e73148406
commit
a6a621934e
|
@ -513,7 +513,7 @@ struct agg_tx_status {
|
||||||
#define IWL_MVM_TX_RES_GET_RA(_ra_tid) ((_ra_tid) >> 4)
|
#define IWL_MVM_TX_RES_GET_RA(_ra_tid) ((_ra_tid) >> 4)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct iwl_mvm_tx_resp - notifies that fw is TXing a packet
|
* struct iwl_mvm_tx_resp_v3 - notifies that fw is TXing a packet
|
||||||
* ( REPLY_TX = 0x1c )
|
* ( REPLY_TX = 0x1c )
|
||||||
* @frame_count: 1 no aggregation, >1 aggregation
|
* @frame_count: 1 no aggregation, >1 aggregation
|
||||||
* @bt_kill_count: num of times blocked by bluetooth (unused for agg)
|
* @bt_kill_count: num of times blocked by bluetooth (unused for agg)
|
||||||
|
@ -540,7 +540,63 @@ struct agg_tx_status {
|
||||||
* @tx_queue: TX queue for this response
|
* @tx_queue: TX queue for this response
|
||||||
* @status: for non-agg: frame status TX_STATUS_*
|
* @status: for non-agg: frame status TX_STATUS_*
|
||||||
* for agg: status of 1st frame, AGG_TX_STATE_*; other frame status fields
|
* for agg: status of 1st frame, AGG_TX_STATE_*; other frame status fields
|
||||||
* follow this one, up to frame_count.
|
* follow this one, up to frame_count. Length in @frame_count.
|
||||||
|
*
|
||||||
|
* After the array of statuses comes the SSN of the SCD. Look at
|
||||||
|
* %iwl_mvm_get_scd_ssn for more details.
|
||||||
|
*/
|
||||||
|
struct iwl_mvm_tx_resp_v3 {
|
||||||
|
u8 frame_count;
|
||||||
|
u8 bt_kill_count;
|
||||||
|
u8 failure_rts;
|
||||||
|
u8 failure_frame;
|
||||||
|
__le32 initial_rate;
|
||||||
|
__le16 wireless_media_time;
|
||||||
|
|
||||||
|
u8 pa_status;
|
||||||
|
u8 pa_integ_res_a[3];
|
||||||
|
u8 pa_integ_res_b[3];
|
||||||
|
u8 pa_integ_res_c[3];
|
||||||
|
__le16 measurement_req_id;
|
||||||
|
u8 reduced_tpc;
|
||||||
|
u8 reserved;
|
||||||
|
|
||||||
|
__le32 tfd_info;
|
||||||
|
__le16 seq_ctl;
|
||||||
|
__le16 byte_cnt;
|
||||||
|
u8 tlc_info;
|
||||||
|
u8 ra_tid;
|
||||||
|
__le16 frame_ctrl;
|
||||||
|
struct agg_tx_status status[];
|
||||||
|
} __packed; /* TX_RSP_API_S_VER_3 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct iwl_mvm_tx_resp - notifies that fw is TXing a packet
|
||||||
|
* ( REPLY_TX = 0x1c )
|
||||||
|
* @frame_count: 1 no aggregation, >1 aggregation
|
||||||
|
* @bt_kill_count: num of times blocked by bluetooth (unused for agg)
|
||||||
|
* @failure_rts: num of failures due to unsuccessful RTS
|
||||||
|
* @failure_frame: num failures due to no ACK (unused for agg)
|
||||||
|
* @initial_rate: for non-agg: rate of the successful Tx. For agg: rate of the
|
||||||
|
* Tx of all the batch. RATE_MCS_*
|
||||||
|
* @wireless_media_time: for non-agg: RTS + CTS + frame tx attempts time + ACK.
|
||||||
|
* for agg: RTS + CTS + aggregation tx time + block-ack time.
|
||||||
|
* in usec.
|
||||||
|
* @pa_status: tx power info
|
||||||
|
* @pa_integ_res_a: tx power info
|
||||||
|
* @pa_integ_res_b: tx power info
|
||||||
|
* @pa_integ_res_c: tx power info
|
||||||
|
* @measurement_req_id: tx power info
|
||||||
|
* @reduced_tpc: transmit power reduction used
|
||||||
|
* @reserved: reserved
|
||||||
|
* @tfd_info: TFD information set by the FH
|
||||||
|
* @seq_ctl: sequence control from the Tx cmd
|
||||||
|
* @byte_cnt: byte count from the Tx cmd
|
||||||
|
* @tlc_info: TLC rate info
|
||||||
|
* @ra_tid: bits [3:0] = ra, bits [7:4] = tid
|
||||||
|
* @frame_ctrl: frame control
|
||||||
|
* @tx_queue: TX queue for this response
|
||||||
|
* @status: for non-agg: frame status TX_STATUS_*
|
||||||
* For version 6 TX response isn't received for aggregation at all.
|
* For version 6 TX response isn't received for aggregation at all.
|
||||||
*
|
*
|
||||||
* After the array of statuses comes the SSN of the SCD. Look at
|
* After the array of statuses comes the SSN of the SCD. Look at
|
||||||
|
@ -568,16 +624,9 @@ struct iwl_mvm_tx_resp {
|
||||||
u8 tlc_info;
|
u8 tlc_info;
|
||||||
u8 ra_tid;
|
u8 ra_tid;
|
||||||
__le16 frame_ctrl;
|
__le16 frame_ctrl;
|
||||||
union {
|
__le16 tx_queue;
|
||||||
struct {
|
__le16 reserved2;
|
||||||
struct agg_tx_status status;
|
struct agg_tx_status status;
|
||||||
} v3;/* TX_RSP_API_S_VER_3 */
|
|
||||||
struct {
|
|
||||||
__le16 tx_queue;
|
|
||||||
__le16 reserved2;
|
|
||||||
struct agg_tx_status status;
|
|
||||||
} v6;
|
|
||||||
};
|
|
||||||
} __packed; /* TX_RSP_API_S_VER_6 */
|
} __packed; /* TX_RSP_API_S_VER_6 */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -217,7 +217,8 @@ enum iwl_legacy_cmds {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @TX_CMD: uses &struct iwl_tx_cmd or &struct iwl_tx_cmd_gen2,
|
* @TX_CMD: uses &struct iwl_tx_cmd or &struct iwl_tx_cmd_gen2,
|
||||||
* response in &struct iwl_mvm_tx_resp
|
* response in &struct iwl_mvm_tx_resp or
|
||||||
|
* &struct iwl_mvm_tx_resp_v3
|
||||||
*/
|
*/
|
||||||
TX_CMD = 0x1c,
|
TX_CMD = 0x1c,
|
||||||
|
|
||||||
|
|
|
@ -1296,14 +1296,13 @@ static inline bool iwl_mvm_is_cdb_supported(struct iwl_mvm *mvm)
|
||||||
IWL_UCODE_TLV_CAPA_CDB_SUPPORT);
|
IWL_UCODE_TLV_CAPA_CDB_SUPPORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct agg_tx_status*
|
static inline struct agg_tx_status *
|
||||||
iwl_mvm_get_agg_status(struct iwl_mvm *mvm,
|
iwl_mvm_get_agg_status(struct iwl_mvm *mvm, void *tx_resp)
|
||||||
struct iwl_mvm_tx_resp *tx_resp)
|
|
||||||
{
|
{
|
||||||
if (iwl_mvm_has_new_tx_api(mvm))
|
if (iwl_mvm_has_new_tx_api(mvm))
|
||||||
return &tx_resp->v6.status;
|
return &((struct iwl_mvm_tx_resp *)tx_resp)->status;
|
||||||
else
|
else
|
||||||
return &tx_resp->v3.status;
|
return ((struct iwl_mvm_tx_resp_v3 *)tx_resp)->status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool iwl_mvm_is_tt_in_fw(struct iwl_mvm *mvm)
|
static inline bool iwl_mvm_is_tt_in_fw(struct iwl_mvm *mvm)
|
||||||
|
|
|
@ -1331,6 +1331,7 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
|
||||||
struct ieee80211_sta *sta;
|
struct ieee80211_sta *sta;
|
||||||
u16 sequence = le16_to_cpu(pkt->hdr.sequence);
|
u16 sequence = le16_to_cpu(pkt->hdr.sequence);
|
||||||
int txq_id = SEQ_TO_QUEUE(sequence);
|
int txq_id = SEQ_TO_QUEUE(sequence);
|
||||||
|
/* struct iwl_mvm_tx_resp_v3 is almost the same */
|
||||||
struct iwl_mvm_tx_resp *tx_resp = (void *)pkt->data;
|
struct iwl_mvm_tx_resp *tx_resp = (void *)pkt->data;
|
||||||
int sta_id = IWL_MVM_TX_RES_GET_RA(tx_resp->ra_tid);
|
int sta_id = IWL_MVM_TX_RES_GET_RA(tx_resp->ra_tid);
|
||||||
int tid = IWL_MVM_TX_RES_GET_TID(tx_resp->ra_tid);
|
int tid = IWL_MVM_TX_RES_GET_TID(tx_resp->ra_tid);
|
||||||
|
@ -1348,7 +1349,7 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
|
||||||
__skb_queue_head_init(&skbs);
|
__skb_queue_head_init(&skbs);
|
||||||
|
|
||||||
if (iwl_mvm_has_new_tx_api(mvm))
|
if (iwl_mvm_has_new_tx_api(mvm))
|
||||||
txq_id = le16_to_cpu(tx_resp->v6.tx_queue);
|
txq_id = le16_to_cpu(tx_resp->tx_queue);
|
||||||
|
|
||||||
seq_ctl = le16_to_cpu(tx_resp->seq_ctl);
|
seq_ctl = le16_to_cpu(tx_resp->seq_ctl);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue