Commit 9f9797c7 authored by Johannes Berg's avatar Johannes Berg

wifi: iwlwifi: pcie: fix RB status reading

On newer hardware, a queue's RB status / write pointer
can be bigger than 4095 (0xFFF), so we cannot mask the
value by 0xFFF unconditionally. Since anyway that's
only necessary on older hardware, move the masking to
the helper function and apply it only for older HW.
This also moves the endian conversion in to handle it
more easily.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230830112059.7be2a3fff6f4.I94f11dee314a4f7c1941d2d223936b1fa8aa9ee4@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 09212dd7
...@@ -192,17 +192,17 @@ struct iwl_rb_allocator { ...@@ -192,17 +192,17 @@ struct iwl_rb_allocator {
* @trans: transport pointer (for configuration) * @trans: transport pointer (for configuration)
* @rxq: the rxq to get the rb stts from * @rxq: the rxq to get the rb stts from
*/ */
static inline __le16 iwl_get_closed_rb_stts(struct iwl_trans *trans, static inline u16 iwl_get_closed_rb_stts(struct iwl_trans *trans,
struct iwl_rxq *rxq) struct iwl_rxq *rxq)
{ {
if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) { if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) {
__le16 *rb_stts = rxq->rb_stts; __le16 *rb_stts = rxq->rb_stts;
return READ_ONCE(*rb_stts); return le16_to_cpu(READ_ONCE(*rb_stts));
} else { } else {
struct iwl_rb_status *rb_stts = rxq->rb_stts; struct iwl_rb_status *rb_stts = rxq->rb_stts;
return READ_ONCE(rb_stts->closed_rb_num); return le16_to_cpu(READ_ONCE(rb_stts->closed_rb_num)) & 0xFFF;
} }
} }
......
...@@ -1510,7 +1510,7 @@ static int iwl_pcie_rx_handle(struct iwl_trans *trans, int queue, int budget) ...@@ -1510,7 +1510,7 @@ static int iwl_pcie_rx_handle(struct iwl_trans *trans, int queue, int budget)
spin_lock(&rxq->lock); spin_lock(&rxq->lock);
/* uCode's read index (stored in shared DRAM) indicates the last Rx /* uCode's read index (stored in shared DRAM) indicates the last Rx
* buffer that the driver may process (last buffer filled by ucode). */ * buffer that the driver may process (last buffer filled by ucode). */
r = le16_to_cpu(iwl_get_closed_rb_stts(trans, rxq)) & 0x0FFF; r = iwl_get_closed_rb_stts(trans, rxq);
i = rxq->read; i = rxq->read;
/* W/A 9000 device step A0 wrap-around bug */ /* W/A 9000 device step A0 wrap-around bug */
......
...@@ -2712,11 +2712,9 @@ static ssize_t iwl_dbgfs_rx_queue_read(struct file *file, ...@@ -2712,11 +2712,9 @@ static ssize_t iwl_dbgfs_rx_queue_read(struct file *file,
pos += scnprintf(buf + pos, bufsz - pos, "\tfree_count: %u\n", pos += scnprintf(buf + pos, bufsz - pos, "\tfree_count: %u\n",
rxq->free_count); rxq->free_count);
if (rxq->rb_stts) { if (rxq->rb_stts) {
u32 r = __le16_to_cpu(iwl_get_closed_rb_stts(trans, u32 r = iwl_get_closed_rb_stts(trans, rxq);
rxq));
pos += scnprintf(buf + pos, bufsz - pos, pos += scnprintf(buf + pos, bufsz - pos,
"\tclosed_rb_num: %u\n", "\tclosed_rb_num: %u\n", r);
r & 0x0FFF);
} else { } else {
pos += scnprintf(buf + pos, bufsz - pos, pos += scnprintf(buf + pos, bufsz - pos,
"\tclosed_rb_num: Not Allocated\n"); "\tclosed_rb_num: Not Allocated\n");
...@@ -3089,7 +3087,7 @@ static u32 iwl_trans_pcie_dump_rbs(struct iwl_trans *trans, ...@@ -3089,7 +3087,7 @@ static u32 iwl_trans_pcie_dump_rbs(struct iwl_trans *trans,
spin_lock(&rxq->lock); spin_lock(&rxq->lock);
r = le16_to_cpu(iwl_get_closed_rb_stts(trans, rxq)) & 0x0FFF; r = iwl_get_closed_rb_stts(trans, rxq);
for (i = rxq->read, j = 0; for (i = rxq->read, j = 0;
i != r && j < allocated_rb_nums; i != r && j < allocated_rb_nums;
...@@ -3385,9 +3383,7 @@ iwl_trans_pcie_dump_data(struct iwl_trans *trans, ...@@ -3385,9 +3383,7 @@ iwl_trans_pcie_dump_data(struct iwl_trans *trans,
/* Dump RBs is supported only for pre-9000 devices (1 queue) */ /* Dump RBs is supported only for pre-9000 devices (1 queue) */
struct iwl_rxq *rxq = &trans_pcie->rxq[0]; struct iwl_rxq *rxq = &trans_pcie->rxq[0];
/* RBs */ /* RBs */
num_rbs = num_rbs = iwl_get_closed_rb_stts(trans, rxq);
le16_to_cpu(iwl_get_closed_rb_stts(trans, rxq))
& 0x0FFF;
num_rbs = (num_rbs - rxq->read) & RX_QUEUE_MASK; num_rbs = (num_rbs - rxq->read) & RX_QUEUE_MASK;
len += num_rbs * (sizeof(*data) + len += num_rbs * (sizeof(*data) +
sizeof(struct iwl_fw_error_dump_rb) + sizeof(struct iwl_fw_error_dump_rb) +
......
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