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

Commit 92536c96 authored by Sara Sharon's avatar Sara Sharon Committed by Luca Coelho
Browse files

iwlwifi: trans: add a new op for getting DMA data



Op mode will need this data in order to feed FW with it.

Signed-off-by: default avatarSara Sharon <sara.sharon@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent 1b4bbe8b
Loading
Loading
Loading
Loading
+26 −0
Original line number Original line Diff line number Diff line
@@ -439,6 +439,20 @@ struct iwl_trans_txq_scd_cfg {
	int frame_limit;
	int frame_limit;
};
};


/**
 * struct iwl_trans_rxq_dma_data - RX queue DMA data
 * @fr_bd_cb: DMA address of free BD cyclic buffer
 * @fr_bd_wid: Initial write index of the free BD cyclic buffer
 * @urbd_stts_wrptr: DMA address of urbd_stts_wrptr
 * @ur_bd_cb: DMA address of used BD cyclic buffer
 */
struct iwl_trans_rxq_dma_data {
	u64 fr_bd_cb;
	u32 fr_bd_wid;
	u64 urbd_stts_wrptr;
	u64 ur_bd_cb;
};

/**
/**
 * struct iwl_trans_ops - transport specific operations
 * struct iwl_trans_ops - transport specific operations
 *
 *
@@ -559,6 +573,8 @@ struct iwl_trans_ops {
			 int cmd_id, int size,
			 int cmd_id, int size,
			 unsigned int queue_wdg_timeout);
			 unsigned int queue_wdg_timeout);
	void (*txq_free)(struct iwl_trans *trans, int queue);
	void (*txq_free)(struct iwl_trans *trans, int queue);
	int (*rxq_dma_data)(struct iwl_trans *trans, int queue,
			    struct iwl_trans_rxq_dma_data *data);


	void (*txq_set_shared_mode)(struct iwl_trans *trans, u32 txq_id,
	void (*txq_set_shared_mode)(struct iwl_trans *trans, u32 txq_id,
				    bool shared);
				    bool shared);
@@ -947,6 +963,16 @@ iwl_trans_txq_enable_cfg(struct iwl_trans *trans, int queue, u16 ssn,
				      cfg, queue_wdg_timeout);
				      cfg, queue_wdg_timeout);
}
}


static inline int
iwl_trans_get_rxq_dma_data(struct iwl_trans *trans, int queue,
			   struct iwl_trans_rxq_dma_data *data)
{
	if (WARN_ON_ONCE(!trans->ops->rxq_dma_data))
		return -ENOTSUPP;

	return trans->ops->rxq_dma_data(trans, queue, data);
}

static inline void
static inline void
iwl_trans_txq_free(struct iwl_trans *trans, int queue)
iwl_trans_txq_free(struct iwl_trans *trans, int queue)
{
{
+17 −0
Original line number Original line Diff line number Diff line
@@ -2265,6 +2265,22 @@ void iwl_trans_pcie_log_scd_error(struct iwl_trans *trans, struct iwl_txq *txq)
		iwl_read_direct32(trans, FH_TX_TRB_REG(fifo)));
		iwl_read_direct32(trans, FH_TX_TRB_REG(fifo)));
}
}


static int iwl_trans_pcie_rxq_dma_data(struct iwl_trans *trans, int queue,
				       struct iwl_trans_rxq_dma_data *data)
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

	if (queue >= trans->num_rx_queues || !trans_pcie->rxq)
		return -EINVAL;

	data->fr_bd_cb = trans_pcie->rxq[queue].bd_dma;
	data->urbd_stts_wrptr = trans_pcie->rxq[queue].rb_stts_dma;
	data->ur_bd_cb = trans_pcie->rxq[queue].used_bd_dma;
	data->fr_bd_wid = 0;

	return 0;
}

static int iwl_trans_pcie_wait_txq_empty(struct iwl_trans *trans, int txq_idx)
static int iwl_trans_pcie_wait_txq_empty(struct iwl_trans *trans, int txq_idx)
{
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
@@ -3212,6 +3228,7 @@ static const struct iwl_trans_ops trans_ops_pcie_gen2 = {
	.txq_alloc = iwl_trans_pcie_dyn_txq_alloc,
	.txq_alloc = iwl_trans_pcie_dyn_txq_alloc,
	.txq_free = iwl_trans_pcie_dyn_txq_free,
	.txq_free = iwl_trans_pcie_dyn_txq_free,
	.wait_txq_empty = iwl_trans_pcie_wait_txq_empty,
	.wait_txq_empty = iwl_trans_pcie_wait_txq_empty,
	.rxq_dma_data = iwl_trans_pcie_rxq_dma_data,
};
};


struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,