提交 e2a722eb 编写于 作者: T Tomas Winkler 提交者: John W. Linville

iwlwifi: Fix byte count table for fragmented packets

This patch fix byte count table update. Table must be updated for each
fragment
Signed-off-by: NTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: NReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 7480513f
...@@ -3141,18 +3141,16 @@ static void iwl4965_hw_card_show_info(struct iwl_priv *priv) ...@@ -3141,18 +3141,16 @@ static void iwl4965_hw_card_show_info(struct iwl_priv *priv)
#define IWL_TX_DELIMITER_SIZE 4 #define IWL_TX_DELIMITER_SIZE 4
/** /**
* iwl4965_tx_queue_update_wr_ptr - Set up entry in Tx byte-count array * iwl4965_txq_update_byte_cnt_tbl - Set up entry in Tx byte-count array
*/ */
int iwl4965_tx_queue_update_wr_ptr(struct iwl_priv *priv, static void iwl4965_txq_update_byte_cnt_tbl(struct iwl_priv *priv,
struct iwl4965_tx_queue *txq, u16 byte_cnt) struct iwl4965_tx_queue *txq,
u16 byte_cnt)
{ {
int len; int len;
int txq_id = txq->q.id; int txq_id = txq->q.id;
struct iwl4965_shared *shared_data = priv->hw_setting.shared_virt; struct iwl4965_shared *shared_data = priv->hw_setting.shared_virt;
if (txq->need_update == 0)
return 0;
len = byte_cnt + IWL_TX_CRC_SIZE + IWL_TX_DELIMITER_SIZE; len = byte_cnt + IWL_TX_CRC_SIZE + IWL_TX_DELIMITER_SIZE;
/* Set up byte count within first 256 entries */ /* Set up byte count within first 256 entries */
...@@ -3164,8 +3162,6 @@ int iwl4965_tx_queue_update_wr_ptr(struct iwl_priv *priv, ...@@ -3164,8 +3162,6 @@ int iwl4965_tx_queue_update_wr_ptr(struct iwl_priv *priv,
IWL_SET_BITS16(shared_data->queues_byte_cnt_tbls[txq_id]. IWL_SET_BITS16(shared_data->queues_byte_cnt_tbls[txq_id].
tfd_offset[IWL4965_QUEUE_SIZE + txq->q.write_ptr], tfd_offset[IWL4965_QUEUE_SIZE + txq->q.write_ptr],
byte_cnt, len); byte_cnt, len);
return 0;
} }
/** /**
...@@ -4934,6 +4930,7 @@ static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = { ...@@ -4934,6 +4930,7 @@ static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = {
static struct iwl_lib_ops iwl4965_lib = { static struct iwl_lib_ops iwl4965_lib = {
.init_drv = iwl4965_init_drv, .init_drv = iwl4965_init_drv,
.txq_update_byte_cnt_tbl = iwl4965_txq_update_byte_cnt_tbl,
.hw_nic_init = iwl4965_hw_nic_init, .hw_nic_init = iwl4965_hw_nic_init,
.is_valid_rtc_data_addr = iwl4965_hw_valid_rtc_data_addr, .is_valid_rtc_data_addr = iwl4965_hw_valid_rtc_data_addr,
.alive_notify = iwl4965_alive_notify, .alive_notify = iwl4965_alive_notify,
......
...@@ -89,6 +89,10 @@ struct iwl_hcmd_utils_ops { ...@@ -89,6 +89,10 @@ struct iwl_hcmd_utils_ops {
struct iwl_lib_ops { struct iwl_lib_ops {
/* iwlwifi driver (priv) init */ /* iwlwifi driver (priv) init */
int (*init_drv)(struct iwl_priv *priv); int (*init_drv)(struct iwl_priv *priv);
void (*txq_update_byte_cnt_tbl)(struct iwl_priv *priv,
struct iwl4965_tx_queue *txq,
u16 byte_cnt);
/* nic init */ /* nic init */
int (*hw_nic_init)(struct iwl_priv *priv); int (*hw_nic_init)(struct iwl_priv *priv);
/* alive notification */ /* alive notification */
......
...@@ -575,11 +575,11 @@ int iwl4965_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) ...@@ -575,11 +575,11 @@ int iwl4965_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
txq->need_update = 1; txq->need_update = 1;
/* Set up entry in queue's byte count circular buffer */ /* Set up entry in queue's byte count circular buffer */
ret = iwl4965_tx_queue_update_wr_ptr(priv, txq, 0); priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq, 0);
/* Increment and update queue's write index */ /* Increment and update queue's write index */
q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
iwl4965_tx_queue_update_write_ptr(priv, txq); ret = iwl4965_tx_queue_update_write_ptr(priv, txq);
spin_unlock_irqrestore(&priv->hcmd_lock, flags); spin_unlock_irqrestore(&priv->hcmd_lock, flags);
return ret ? ret : idx; return ret ? ret : idx;
...@@ -2392,7 +2392,7 @@ static int iwl4965_tx_skb(struct iwl_priv *priv, ...@@ -2392,7 +2392,7 @@ static int iwl4965_tx_skb(struct iwl_priv *priv,
ieee80211_get_hdrlen(fc)); ieee80211_get_hdrlen(fc));
/* Set up entry for this TFD in Tx byte-count array */ /* Set up entry for this TFD in Tx byte-count array */
iwl4965_tx_queue_update_wr_ptr(priv, txq, len); priv->cfg->ops->lib->txq_update_byte_cnt_tbl(priv, txq, len);
/* Tell device the write index *just past* this latest filled TFD */ /* Tell device the write index *just past* this latest filled TFD */
q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd); q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册