Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2a722eb authored by Tomas Winkler's avatar Tomas Winkler Committed by John W. Linville
Browse files

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: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 7480513f
Loading
Loading
Loading
Loading
+5 −8
Original line number Diff line number Diff line
@@ -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,
+4 −0
Original line number Diff line number Diff line
@@ -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 */
+3 −3
Original line number Diff line number Diff line
@@ -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);