mirror of
https://github.com/adulau/aha.git
synced 2025-01-04 23:23:18 +00:00
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: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
7480513f5b
commit
e2a722eba1
3 changed files with 12 additions and 11 deletions
|
@ -3141,18 +3141,16 @@ static void iwl4965_hw_card_show_info(struct iwl_priv *priv)
|
|||
#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,
|
||||
struct iwl4965_tx_queue *txq, u16 byte_cnt)
|
||||
static void iwl4965_txq_update_byte_cnt_tbl(struct iwl_priv *priv,
|
||||
struct iwl4965_tx_queue *txq,
|
||||
u16 byte_cnt)
|
||||
{
|
||||
int len;
|
||||
int txq_id = txq->q.id;
|
||||
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;
|
||||
|
||||
/* Set up byte count within first 256 entries */
|
||||
|
@ -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].
|
||||
tfd_offset[IWL4965_QUEUE_SIZE + txq->q.write_ptr],
|
||||
byte_cnt, len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -4934,6 +4930,7 @@ static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = {
|
|||
|
||||
static struct iwl_lib_ops iwl4965_lib = {
|
||||
.init_drv = iwl4965_init_drv,
|
||||
.txq_update_byte_cnt_tbl = iwl4965_txq_update_byte_cnt_tbl,
|
||||
.hw_nic_init = iwl4965_hw_nic_init,
|
||||
.is_valid_rtc_data_addr = iwl4965_hw_valid_rtc_data_addr,
|
||||
.alive_notify = iwl4965_alive_notify,
|
||||
|
|
|
@ -89,6 +89,10 @@ struct iwl_hcmd_utils_ops {
|
|||
struct iwl_lib_ops {
|
||||
/* iwlwifi driver (priv) init */
|
||||
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 */
|
||||
int (*hw_nic_init)(struct iwl_priv *priv);
|
||||
/* alive notification */
|
||||
|
|
|
@ -575,11 +575,11 @@ int iwl4965_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
txq->need_update = 1;
|
||||
|
||||
/* 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 */
|
||||
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);
|
||||
return ret ? ret : idx;
|
||||
|
@ -2392,7 +2392,7 @@ static int iwl4965_tx_skb(struct iwl_priv *priv,
|
|||
ieee80211_get_hdrlen(fc));
|
||||
|
||||
/* 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 */
|
||||
q->write_ptr = iwl_queue_inc_wrap(q->write_ptr, q->n_bd);
|
||||
|
|
Loading…
Reference in a new issue