wifi: iwlwifi: pcie: fix RB status reading
authorJohannes Berg <johannes.berg@intel.com>
Wed, 30 Aug 2023 08:31:03 +0000 (11:31 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 11 Sep 2023 10:36:29 +0000 (12:36 +0200)
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: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230830112059.7be2a3fff6f4.I94f11dee314a4f7c1941d2d223936b1fa8aa9ee4@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/pcie/internal.h
drivers/net/wireless/intel/iwlwifi/pcie/rx.c
drivers/net/wireless/intel/iwlwifi/pcie/trans.c

index e4b0c454342407e6056fcbf1942ff66ad50837ce..56def20374f30cc29eafbeeb2d3a8c43c11d7368 100644 (file)
@@ -192,17 +192,17 @@ struct iwl_rb_allocator {
  * @trans: transport pointer (for configuration)
  * @rxq: the rxq to get the rb stts from
  */
-static inline __le16 iwl_get_closed_rb_stts(struct iwl_trans *trans,
-                                           struct iwl_rxq *rxq)
+static inline u16 iwl_get_closed_rb_stts(struct iwl_trans *trans,
+                                        struct iwl_rxq *rxq)
 {
        if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) {
                __le16 *rb_stts = rxq->rb_stts;
 
-               return READ_ONCE(*rb_stts);
+               return le16_to_cpu(READ_ONCE(*rb_stts));
        } else {
                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;
        }
 }
 
index 4614acee9f7bacd748681d4ca1ace355c2887d84..607c180d1eb3c244fe39c6778fdfd0e08416656e 100644 (file)
@@ -1510,7 +1510,7 @@ restart:
        spin_lock(&rxq->lock);
        /* uCode's read index (stored in shared DRAM) indicates the last Rx
         * 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;
 
        /* W/A 9000 device step A0 wrap-around bug */
index 198933f853c5574902f6d9cd87d0cf00f79e0f79..a9e00a2cd9ba1ec94c5c752489a4b043258771c7 100644 (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",
                                 rxq->free_count);
                if (rxq->rb_stts) {
-                       u32 r = __le16_to_cpu(iwl_get_closed_rb_stts(trans,
-                                                                    rxq));
+                       u32 r = iwl_get_closed_rb_stts(trans, rxq);
                        pos += scnprintf(buf + pos, bufsz - pos,
-                                        "\tclosed_rb_num: %u\n",
-                                        r & 0x0FFF);
+                                        "\tclosed_rb_num: %u\n", r);
                } else {
                        pos += scnprintf(buf + pos, bufsz - pos,
                                         "\tclosed_rb_num: Not Allocated\n");
@@ -3089,7 +3087,7 @@ static u32 iwl_trans_pcie_dump_rbs(struct iwl_trans *trans,
 
        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;
             i != r && j < allocated_rb_nums;
@@ -3385,9 +3383,7 @@ iwl_trans_pcie_dump_data(struct iwl_trans *trans,
                /* Dump RBs is supported only for pre-9000 devices (1 queue) */
                struct iwl_rxq *rxq = &trans_pcie->rxq[0];
                /* RBs */
-               num_rbs =
-                       le16_to_cpu(iwl_get_closed_rb_stts(trans, rxq))
-                       & 0x0FFF;
+               num_rbs = iwl_get_closed_rb_stts(trans, rxq);
                num_rbs = (num_rbs - rxq->read) & RX_QUEUE_MASK;
                len += num_rbs * (sizeof(*data) +
                                  sizeof(struct iwl_fw_error_dump_rb) +