mirror of https://gitee.com/openkylin/linux.git
iwlwifi: fix host command header according the HW spec
This patch aligns definition of host command with the spec. The inaccuracies weren't critical though. Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Zhu Yi <yi.zhu@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
c90a74bae1
commit
9734cb23a0
|
@ -163,6 +163,13 @@ enum {
|
|||
/* iwl_cmd_header flags value */
|
||||
#define IWL_CMD_FAILED_MSK 0x40
|
||||
|
||||
#define SEQ_TO_QUEUE(s) (((s) >> 8) & 0x1f)
|
||||
#define QUEUE_TO_SEQ(q) (((q) & 0x1f) << 8)
|
||||
#define SEQ_TO_INDEX(s) ((s) & 0xff)
|
||||
#define INDEX_TO_SEQ(i) ((i) & 0xff)
|
||||
#define SEQ_HUGE_FRAME __constant_cpu_to_le16(0x4000)
|
||||
#define SEQ_RX_FRAME __constant_cpu_to_le16(0x8000)
|
||||
|
||||
/**
|
||||
* struct iwl_cmd_header
|
||||
*
|
||||
|
@ -171,7 +178,7 @@ enum {
|
|||
*/
|
||||
struct iwl_cmd_header {
|
||||
u8 cmd; /* Command ID: REPLY_RXON, etc. */
|
||||
u8 flags; /* IWL_CMD_* */
|
||||
u8 flags; /* 0:5 reserved, 6 abort, 7 internal */
|
||||
/*
|
||||
* The driver sets up the sequence number to values of its chosing.
|
||||
* uCode does not use this value, but passes it back to the driver
|
||||
|
@ -187,11 +194,12 @@ struct iwl_cmd_header {
|
|||
*
|
||||
* The Linux driver uses the following format:
|
||||
*
|
||||
* 0:7 index/position within Tx queue
|
||||
* 8:13 Tx queue selection
|
||||
* 14:14 driver sets this to indicate command is in the 'huge'
|
||||
* storage at the end of the command buffers, i.e. scan cmd
|
||||
* 15:15 uCode sets this in uCode-originated response/notification
|
||||
* 0:7 tfd index - position within TX queue
|
||||
* 8:12 TX queue id
|
||||
* 13 reserved
|
||||
* 14 huge - driver sets this to indicate command is in the
|
||||
* 'huge' storage at the end of the command buffers
|
||||
* 15 unsolicited RX or uCode-originated notification
|
||||
*/
|
||||
__le16 sequence;
|
||||
|
||||
|
|
|
@ -225,12 +225,6 @@ struct iwl_frame {
|
|||
struct list_head list;
|
||||
};
|
||||
|
||||
#define SEQ_TO_QUEUE(x) ((x >> 8) & 0xbf)
|
||||
#define QUEUE_TO_SEQ(x) ((x & 0xbf) << 8)
|
||||
#define SEQ_TO_INDEX(x) ((u8)(x & 0xff))
|
||||
#define INDEX_TO_SEQ(x) ((u8)(x & 0xff))
|
||||
#define SEQ_HUGE_FRAME (0x4000)
|
||||
#define SEQ_RX_FRAME __constant_cpu_to_le16(0x8000)
|
||||
#define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
|
||||
#define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ)
|
||||
#define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4)
|
||||
|
|
|
@ -1057,7 +1057,7 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
out_cmd->hdr.sequence = cpu_to_le16(QUEUE_TO_SEQ(IWL_CMD_QUEUE_NUM) |
|
||||
INDEX_TO_SEQ(q->write_ptr));
|
||||
if (out_cmd->meta.flags & CMD_SIZE_HUGE)
|
||||
out_cmd->hdr.sequence |= cpu_to_le16(SEQ_HUGE_FRAME);
|
||||
out_cmd->hdr.sequence |= SEQ_HUGE_FRAME;
|
||||
len = (idx == TFD_CMD_SLOTS) ?
|
||||
IWL_MAX_SCAN_SIZE : sizeof(struct iwl_cmd);
|
||||
phys_addr = pci_map_single(priv->pci_dev, out_cmd, len,
|
||||
|
@ -1192,8 +1192,8 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
|
|||
u16 sequence = le16_to_cpu(pkt->hdr.sequence);
|
||||
int txq_id = SEQ_TO_QUEUE(sequence);
|
||||
int index = SEQ_TO_INDEX(sequence);
|
||||
int huge = sequence & SEQ_HUGE_FRAME;
|
||||
int cmd_index;
|
||||
bool huge = !!(pkt->hdr.sequence & SEQ_HUGE_FRAME);
|
||||
struct iwl_cmd *cmd;
|
||||
|
||||
/* If a Tx command is being handled and it isn't in the actual
|
||||
|
|
Loading…
Reference in New Issue