iwm: Set flag for pad bytes in offload_assist.

Though we don't otherwise use firmware's offload capabilities, we need
to set this flag when the MAC header's size isn't a multiple of four.

MFC after:	2 weeks
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Mark Johnston 2019-11-07 23:38:36 +00:00
parent 49c76634fb
commit d2c7b21a56
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=354513
2 changed files with 35 additions and 6 deletions

View File

@ -3882,11 +3882,12 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac)
if (hdrlen & 3) {
/* First segment length must be a multiple of 4. */
flags |= IWM_TX_CMD_FLG_MH_PAD;
tx->offload_assist |= htole16(1 << IWM_TX_CMD_OFFLD_PAD);
pad = 4 - (hdrlen & 3);
} else
} else {
tx->offload_assist = 0;
pad = 0;
tx->next_frame_len = 0;
}
tx->len = htole16(totlen);
tx->tid_tspec = tid;

View File

@ -4477,13 +4477,41 @@ enum iwm_tx_pm_timeouts {
#define IWM_BAR_DFAULT_RETRY_LIMIT 60
#define IWM_LOW_RETRY_LIMIT 7
/**
* enum iwm_tx_offload_assist_flags_pos - set %iwm_tx_cmd offload_assist values
* @IWM_TX_CMD_OFFLD_IP_HDR: offset to start of IP header (in words)
* from mac header end. For normal case it is 4 words for SNAP.
* note: tx_cmd, mac header and pad are not counted in the offset.
* This is used to help the offload in case there is tunneling such as
* IPv6 in IPv4, in such case the ip header offset should point to the
* inner ip header and IPv4 checksum of the external header should be
* calculated by driver.
* @IWM_TX_CMD_OFFLD_L4_EN: enable TCP/UDP checksum
* @IWM_TX_CMD_OFFLD_L3_EN: enable IP header checksum
* @IWM_TX_CMD_OFFLD_MH_SIZE: size of the mac header in words. Includes the IV
* field. Doesn't include the pad.
* @IWM_TX_CMD_OFFLD_PAD: mark 2-byte pad was inserted after the mac header for
* alignment
* @IWM_TX_CMD_OFFLD_AMSDU: mark TX command is A-MSDU
*/
enum iwm_tx_offload_assist_flags_pos {
IWM_TX_CMD_OFFLD_IP_HDR = 0,
IWM_TX_CMD_OFFLD_L4_EN = 6,
IWM_TX_CMD_OFFLD_L3_EN = 7,
IWM_TX_CMD_OFFLD_MH_SIZE = 8,
IWM_TX_CMD_OFFLD_PAD = 13,
IWM_TX_CMD_OFFLD_AMSDU = 14,
};
#define IWM_TX_CMD_OFFLD_MH_MASK 0x1f
#define IWM_TX_CMD_OFFLD_IP_HDR_MASK 0x3f
/* TODO: complete documentation for try_cnt and btkill_cnt */
/**
* struct iwm_tx_cmd - TX command struct to FW
* ( IWM_TX_CMD = 0x1c )
* @len: in bytes of the payload, see below for details
* @next_frame_len: same as len, but for next frame (0 if not applicable)
* Used for fragmentation and bursting, but not in 11n aggregation.
* @offload_assist: TX offload configuration
* @tx_flags: combination of IWM_TX_CMD_FLG_*
* @rate_n_flags: rate for *all* Tx attempts, if IWM_TX_CMD_FLG_STA_RATE_MSK is
* cleared. Combination of IWM_RATE_MCS_*
@ -4519,7 +4547,7 @@ enum iwm_tx_pm_timeouts {
*/
struct iwm_tx_cmd {
uint16_t len;
uint16_t next_frame_len;
uint16_t offload_assist;
uint32_t tx_flags;
struct {
uint8_t try_cnt;