When building this on a 64-bit platform gcc rightly warns that the
error checking is broken (-ENOMEM stored in an u32 does not compare
greater than (unsigned long)-MAX_ERRNO). Instead, change the
ucc_fast_[tr]x_virtual_fifo_base_offset members to s32 and use an
ordinary check-for-negative. Also, this avoids treating 0 as "this
cannot have been returned from qe_muram_alloc() so don't free it".

Signed-off-by: Rasmus Villemoes <li...@rasmusvillemoes.dk>
---
 drivers/soc/fsl/qe/ucc_fast.c | 15 ++++++---------
 include/soc/fsl/qe/ucc_fast.h |  4 ++--
 2 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/drivers/soc/fsl/qe/ucc_fast.c b/drivers/soc/fsl/qe/ucc_fast.c
index ca0452497a20..ad6193ea4597 100644
--- a/drivers/soc/fsl/qe/ucc_fast.c
+++ b/drivers/soc/fsl/qe/ucc_fast.c
@@ -197,6 +197,8 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct 
ucc_fast_private ** ucc
                        __func__);
                return -ENOMEM;
        }
+       uccf->ucc_fast_tx_virtual_fifo_base_offset = -1;
+       uccf->ucc_fast_rx_virtual_fifo_base_offset = -1;
 
        /* Fill fast UCC structure */
        uccf->uf_info = uf_info;
@@ -265,10 +267,9 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct 
ucc_fast_private ** ucc
        /* Allocate memory for Tx Virtual Fifo */
        uccf->ucc_fast_tx_virtual_fifo_base_offset =
            qe_muram_alloc(uf_info->utfs, UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
-       if (IS_ERR_VALUE(uccf->ucc_fast_tx_virtual_fifo_base_offset)) {
+       if (uccf->ucc_fast_tx_virtual_fifo_base_offset < 0) {
                printk(KERN_ERR "%s: cannot allocate MURAM for TX FIFO\n",
                        __func__);
-               uccf->ucc_fast_tx_virtual_fifo_base_offset = 0;
                ucc_fast_free(uccf);
                return -ENOMEM;
        }
@@ -278,10 +279,9 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct 
ucc_fast_private ** ucc
                qe_muram_alloc(uf_info->urfs +
                           UCC_FAST_RECEIVE_VIRTUAL_FIFO_SIZE_FUDGE_FACTOR,
                           UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
-       if (IS_ERR_VALUE(uccf->ucc_fast_rx_virtual_fifo_base_offset)) {
+       if (uccf->ucc_fast_rx_virtual_fifo_base_offset < 0) {
                printk(KERN_ERR "%s: cannot allocate MURAM for RX FIFO\n",
                        __func__);
-               uccf->ucc_fast_rx_virtual_fifo_base_offset = 0;
                ucc_fast_free(uccf);
                return -ENOMEM;
        }
@@ -384,11 +384,8 @@ void ucc_fast_free(struct ucc_fast_private * uccf)
        if (!uccf)
                return;
 
-       if (uccf->ucc_fast_tx_virtual_fifo_base_offset)
-               qe_muram_free(uccf->ucc_fast_tx_virtual_fifo_base_offset);
-
-       if (uccf->ucc_fast_rx_virtual_fifo_base_offset)
-               qe_muram_free(uccf->ucc_fast_rx_virtual_fifo_base_offset);
+       qe_muram_free(uccf->ucc_fast_tx_virtual_fifo_base_offset);
+       qe_muram_free(uccf->ucc_fast_rx_virtual_fifo_base_offset);
 
        if (uccf->uf_regs)
                iounmap(uccf->uf_regs);
diff --git a/include/soc/fsl/qe/ucc_fast.h b/include/soc/fsl/qe/ucc_fast.h
index e9cc46042a83..ba0e838f962a 100644
--- a/include/soc/fsl/qe/ucc_fast.h
+++ b/include/soc/fsl/qe/ucc_fast.h
@@ -188,9 +188,9 @@ struct ucc_fast_private {
        int stopped_tx;         /* Whether channel has been stopped for Tx
                                   (STOP_TX, etc.) */
        int stopped_rx;         /* Whether channel has been stopped for Rx */
-       u32 ucc_fast_tx_virtual_fifo_base_offset;/* pointer to base of Tx
+       s32 ucc_fast_tx_virtual_fifo_base_offset;/* pointer to base of Tx
                                                    virtual fifo */
-       u32 ucc_fast_rx_virtual_fifo_base_offset;/* pointer to base of Rx
+       s32 ucc_fast_rx_virtual_fifo_base_offset;/* pointer to base of Rx
                                                    virtual fifo */
 #ifdef STATISTICS
        u32 tx_frames;          /* Transmitted frames counter. */
-- 
2.23.0

Reply via email to