Commit 9734cb23 authored by Tomas Winkler's avatar Tomas Winkler Committed by John W. Linville

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: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c90a74ba
...@@ -163,6 +163,13 @@ enum { ...@@ -163,6 +163,13 @@ enum {
/* iwl_cmd_header flags value */ /* iwl_cmd_header flags value */
#define IWL_CMD_FAILED_MSK 0x40 #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 * struct iwl_cmd_header
* *
...@@ -171,7 +178,7 @@ enum { ...@@ -171,7 +178,7 @@ enum {
*/ */
struct iwl_cmd_header { struct iwl_cmd_header {
u8 cmd; /* Command ID: REPLY_RXON, etc. */ 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. * 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 * uCode does not use this value, but passes it back to the driver
...@@ -187,11 +194,12 @@ struct iwl_cmd_header { ...@@ -187,11 +194,12 @@ struct iwl_cmd_header {
* *
* The Linux driver uses the following format: * The Linux driver uses the following format:
* *
* 0:7 index/position within Tx queue * 0:7 tfd index - position within TX queue
* 8:13 Tx queue selection * 8:12 TX queue id
* 14:14 driver sets this to indicate command is in the 'huge' * 13 reserved
* storage at the end of the command buffers, i.e. scan cmd * 14 huge - driver sets this to indicate command is in the
* 15:15 uCode sets this in uCode-originated response/notification * 'huge' storage at the end of the command buffers
* 15 unsolicited RX or uCode-originated notification
*/ */
__le16 sequence; __le16 sequence;
......
...@@ -225,12 +225,6 @@ struct iwl_frame { ...@@ -225,12 +225,6 @@ struct iwl_frame {
struct list_head list; 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 SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
#define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ) #define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ)
#define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4) #define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4)
......
...@@ -1057,7 +1057,7 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) ...@@ -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) | out_cmd->hdr.sequence = cpu_to_le16(QUEUE_TO_SEQ(IWL_CMD_QUEUE_NUM) |
INDEX_TO_SEQ(q->write_ptr)); INDEX_TO_SEQ(q->write_ptr));
if (out_cmd->meta.flags & CMD_SIZE_HUGE) 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) ? len = (idx == TFD_CMD_SLOTS) ?
IWL_MAX_SCAN_SIZE : sizeof(struct iwl_cmd); IWL_MAX_SCAN_SIZE : sizeof(struct iwl_cmd);
phys_addr = pci_map_single(priv->pci_dev, out_cmd, len, 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) ...@@ -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); u16 sequence = le16_to_cpu(pkt->hdr.sequence);
int txq_id = SEQ_TO_QUEUE(sequence); int txq_id = SEQ_TO_QUEUE(sequence);
int index = SEQ_TO_INDEX(sequence); int index = SEQ_TO_INDEX(sequence);
int huge = sequence & SEQ_HUGE_FRAME;
int cmd_index; int cmd_index;
bool huge = !!(pkt->hdr.sequence & SEQ_HUGE_FRAME);
struct iwl_cmd *cmd; struct iwl_cmd *cmd;
/* If a Tx command is being handled and it isn't in the actual /* If a Tx command is being handled and it isn't in the actual
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment