]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
staging: gpib: change return type of t1_delay function to report errors
authorRodrigo Gobbi <rodrigo.gobbi.7@gmail.com>
Tue, 25 Feb 2025 01:44:05 +0000 (22:44 -0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 20 Mar 2025 14:07:50 +0000 (07:07 -0700)
The current code returns "unsigned int" and it doesn't handle errors
correctly if it happens during ioctl call for t1 delay configuration.

The ni_usb_t1_delay(), from NI, is the only function returning -1
at this point. The caller, t1_delay_ioctl(), doesn't check for errors
and sets board->t1_nano_sec to -1 and returns success.
The board->t1_nano_sec value is also used in ni_usb_setup_t1_delay()
besides the ioctl call and a value of -1 is treated as being above 1100ns.
It may or may not have a noticeable effect, but it's obviously not right
considering the content of ni_usb_setup_t1_delay().

Typical delays are in the 200-2000 range, but definitely not more
than INT_MAX so we can fix this code by changing the return type to int
and adding a check for errors. While we're at it, lets change the error
code in ni_usb_t1_delay() from -1 and instead propagate the error from
ni_usb_write_registers().

Fixes: 4e127de14fa7 ("staging: gpib: Add National Instruments USB GPIB driver")
Signed-off-by: Rodrigo Gobbi <rodrigo.gobbi.7@gmail.com>
Link: https://lore.kernel.org/r/20250225014811.77995-1-rodrigo.gobbi.7@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
19 files changed:
drivers/staging/gpib/agilent_82350b/agilent_82350b.c
drivers/staging/gpib/agilent_82357a/agilent_82357a.c
drivers/staging/gpib/cb7210/cb7210.c
drivers/staging/gpib/cec/cec_gpib.c
drivers/staging/gpib/common/gpib_os.c
drivers/staging/gpib/eastwood/fluke_gpib.c
drivers/staging/gpib/fmh_gpib/fmh_gpib.c
drivers/staging/gpib/gpio/gpib_bitbang.c
drivers/staging/gpib/hp_82335/hp82335.c
drivers/staging/gpib/hp_82341/hp_82341.c
drivers/staging/gpib/include/gpib_types.h
drivers/staging/gpib/include/nec7210.h
drivers/staging/gpib/ines/ines.h
drivers/staging/gpib/ines/ines_gpib.c
drivers/staging/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c
drivers/staging/gpib/nec7210/nec7210.c
drivers/staging/gpib/ni_usb/ni_usb_gpib.c
drivers/staging/gpib/pc2/pc2_gpib.c
drivers/staging/gpib/tnt4882/tnt4882_gpib.c

index 15a9c4ab77ba25b02fc9e91bfb61f16cc0792030..445b9380ff98e8316662c26d626e6e490221f229 100644 (file)
@@ -455,8 +455,7 @@ static int agilent_82350b_line_status(const struct gpib_board *board)
        return tms9914_line_status(board, &priv->tms9914_priv);
 }
 
-static unsigned int agilent_82350b_t1_delay(struct gpib_board *board,
-                                           unsigned int nanosec)
+static int agilent_82350b_t1_delay(struct gpib_board *board, unsigned int nanosec)
 {
        struct agilent_82350b_priv *a_priv = board->private_data;
        static const int nanosec_per_clock = 30;
index 85e12c33f118d9ceb9c104ba6d6f383b43e358b9..67bf125645c03ef5c00cf4056416f0d49b10a59e 100644 (file)
@@ -1071,7 +1071,7 @@ static unsigned short nanosec_to_fast_talker_bits(unsigned int *nanosec)
        return bits;
 }
 
-static unsigned int agilent_82357a_t1_delay(struct gpib_board *board, unsigned int nanosec)
+static int agilent_82357a_t1_delay(struct gpib_board *board, unsigned int nanosec)
 {
        struct agilent_82357a_priv *a_priv = board->private_data;
        struct usb_device *usb_dev;
index 621aa8fda91333f314943a1c42cc8ebe7d7f50d2..6b22a33a8c4f5169c975ced32de4179448921f97 100644 (file)
@@ -408,7 +408,7 @@ static int cb7210_line_status(const struct gpib_board *board)
        return status;
 }
 
-static unsigned int cb7210_t1_delay(struct gpib_board *board, unsigned int nano_sec)
+static int cb7210_t1_delay(struct gpib_board *board, unsigned int nano_sec)
 {
        struct cb7210_priv *cb_priv = board->private_data;
        struct nec7210_priv *nec_priv = &cb_priv->nec7210_priv;
index abe5b1b8bc5bc74d22b188067b6480405e8d39cf..a822fa428cd0c13d5b04cca398f1c3af51243de0 100644 (file)
@@ -174,7 +174,7 @@ static uint8_t cec_serial_poll_status(struct gpib_board *board)
        return nec7210_serial_poll_status(board, &priv->nec7210_priv);
 }
 
-static unsigned int cec_t1_delay(struct gpib_board *board, unsigned int nano_sec)
+static int cec_t1_delay(struct gpib_board *board, unsigned int nano_sec)
 {
        struct cec_priv *priv = board->private_data;
 
index 9bf2076cbbb3e5df9c8a983ce2a2fafe07895168..cb77fe0a4b9ad16e2aba4fa839c7e26c4841137d 100644 (file)
@@ -1990,8 +1990,11 @@ static int t1_delay_ioctl(struct gpib_board *board, unsigned long arg)
 
        delay = cmd;
 
-       board->t1_nano_sec = board->interface->t1_delay(board, delay);
+       retval = board->interface->t1_delay(board, delay);
+       if (retval < 0)
+               return retval;
 
+       board->t1_nano_sec = retval;
        return 0;
 }
 
index b3b629c892e24b12acf14c7f3e6c76384c4ae4e2..a6b1ac169f94a4766d0fff27bd608e214568c33b 100644 (file)
@@ -224,7 +224,7 @@ static int fluke_line_status(const struct gpib_board *board)
        return status;
 }
 
-static unsigned int fluke_t1_delay(struct gpib_board *board, unsigned int nano_sec)
+static int fluke_t1_delay(struct gpib_board *board, unsigned int nano_sec)
 {
        struct fluke_priv *e_priv = board->private_data;
        struct nec7210_priv *nec_priv = &e_priv->nec7210_priv;
index f6bf127441f815deef5e9148e2121674eea5a5eb..53f4b3fccc3c4865bee71d4d7132e3197f6bc84d 100644 (file)
@@ -261,7 +261,7 @@ static int fmh_gpib_line_status(const struct gpib_board *board)
        return status;
 }
 
-static unsigned int fmh_gpib_t1_delay(struct gpib_board *board, unsigned int nano_sec)
+static int fmh_gpib_t1_delay(struct gpib_board *board, unsigned int nano_sec)
 {
        struct fmh_priv *e_priv = board->private_data;
        struct nec7210_priv *nec_priv = &e_priv->nec7210_priv;
index 611ff58b94ca1d838f0afb8547dc0cd9d6f00aeb..86bdd381472a0bb973d4c58992a808ab04303e74 100644 (file)
@@ -1009,7 +1009,7 @@ static uint8_t bb_serial_poll_status(struct gpib_board *board)
        return 0; // -ENOENT;
 }
 
-static unsigned int bb_t1_delay(struct gpib_board *board,  unsigned int nano_sec)
+static int bb_t1_delay(struct gpib_board *board,  unsigned int nano_sec)
 {
        struct bb_priv *priv = board->private_data;
 
index 368e60c6ecd2df5274e919e5649e993eb4fad04d..fd23b1cb80f9de6b1959d78080e6fe94a077dd40 100644 (file)
@@ -165,7 +165,7 @@ static int hp82335_line_status(const struct gpib_board *board)
        return tms9914_line_status(board, &priv->tms9914_priv);
 }
 
-static unsigned int hp82335_t1_delay(struct gpib_board *board, unsigned int nano_sec)
+static int hp82335_t1_delay(struct gpib_board *board, unsigned int nano_sec)
 {
        struct hp82335_priv *priv = board->private_data;
 
index 5d76d01f6b32d36e31b70602d223629936c3e384..f52e673dc86990f036eb580431b4cdf515f6f234 100644 (file)
@@ -396,7 +396,7 @@ static int hp_82341_line_status(const struct gpib_board *board)
        return tms9914_line_status(board, &priv->tms9914_priv);
 }
 
-static unsigned int hp_82341_t1_delay(struct gpib_board *board, unsigned int nano_sec)
+static int hp_82341_t1_delay(struct gpib_board *board, unsigned int nano_sec)
 {
        struct hp_82341_priv *priv = board->private_data;
 
index 31b35f2cb2e182af8982bea5e31751e337227890..2d9b9be683f8a68bab64c0117c60b1b5583ccea4 100644 (file)
@@ -170,7 +170,7 @@ struct gpib_interface_struct {
         */
        uint8_t (*serial_poll_status)(struct gpib_board *board);
        /* adjust T1 delay */
-       unsigned int (*t1_delay)(struct gpib_board *board, unsigned int nano_sec);
+       int (*t1_delay)(struct gpib_board *board, unsigned int nano_sec);
        /* go to local mode */
        void (*return_to_local)(struct gpib_board *board);
        /* board does not support 7 bit eos comparisons */
index 6c49283bd1395035a169d65efdbb16abda9ca239..069896456230eb89a26e3c4ba47371b83efc9cfa 100644 (file)
@@ -108,8 +108,8 @@ void nec7210_parallel_poll_response(struct gpib_board *board,
                                    struct nec7210_priv *priv, int ist);
 uint8_t nec7210_serial_poll_status(struct gpib_board *board,
                                   struct nec7210_priv *priv);
-unsigned int nec7210_t1_delay(struct gpib_board *board,
-                             struct nec7210_priv *priv, unsigned int nano_sec);
+int nec7210_t1_delay(struct gpib_board *board,
+                    struct nec7210_priv *priv, unsigned int nano_sec);
 void nec7210_return_to_local(const struct gpib_board *board, struct nec7210_priv *priv);
 
 // utility functions
index b17475aed04646e0dcdb98d0b4c5dd15fc0775af..ff27f055a0ff2dfe1016f96dcd9ebb1d11fbb55c 100644 (file)
@@ -60,7 +60,7 @@ void ines_parallel_poll_response(struct gpib_board *board, int ist);
 void ines_serial_poll_response(struct gpib_board *board, uint8_t status);
 uint8_t ines_serial_poll_status(struct gpib_board *board);
 int ines_line_status(const struct gpib_board *board);
-unsigned int ines_t1_delay(struct gpib_board *board, unsigned int nano_sec);
+int ines_t1_delay(struct gpib_board *board, unsigned int nano_sec);
 void ines_return_to_local(struct gpib_board *board);
 
 // interrupt service routines
index 983bb88a4376ddc57ca3e664fe6f2005c9106882..d93eb05dab903811f16a7347227e9f4aec047a4a 100644 (file)
@@ -65,7 +65,7 @@ void ines_set_xfer_counter(struct ines_priv *priv, unsigned int count)
        ines_outb(priv, count & 0xff, XFER_COUNT_LOWER);
 }
 
-unsigned int ines_t1_delay(struct gpib_board *board, unsigned int nano_sec)
+int ines_t1_delay(struct gpib_board *board, unsigned int nano_sec)
 {
        struct ines_priv *ines_priv = board->private_data;
        struct nec7210_priv *nec_priv = &ines_priv->nec7210_priv;
index 282d7387574e9ca9fbbe215f3839bed8f715fec5..faf96e9cc4a1078b5650e8176466aa1fe3d28000 100644 (file)
@@ -1044,7 +1044,7 @@ static uint8_t usb_gpib_serial_poll_status(struct gpib_board *board)
 
 /* t1_delay */
 
-static unsigned int usb_gpib_t1_delay(struct gpib_board *board, unsigned int nano_sec)
+static int usb_gpib_t1_delay(struct gpib_board *board, unsigned int nano_sec)
 {
        return 0;
 }
index 773495cde9d8ad29ff31b2d4c38bb656565cb79c..846c0a3fa1dc31eaadb46a4d767cf271c50ef6b4 100644 (file)
@@ -373,8 +373,8 @@ void nec7210_release_rfd_holdoff(struct gpib_board *board, struct nec7210_priv *
 }
 EXPORT_SYMBOL(nec7210_release_rfd_holdoff);
 
-unsigned int nec7210_t1_delay(struct gpib_board *board, struct nec7210_priv *priv,
-                             unsigned int nano_sec)
+int nec7210_t1_delay(struct gpib_board *board, struct nec7210_priv *priv,
+                    unsigned int nano_sec)
 {
        unsigned int retval;
 
index fdc8077d646edd43f915af4b1e287ed3d6fc9093..14f7049a8e5ef8d10e8b1fd009f89801f3cc6dcc 100644 (file)
@@ -1616,7 +1616,7 @@ static int ni_usb_setup_t1_delay(struct ni_usb_register *reg, unsigned int nano_
        return i;
 }
 
-static unsigned int ni_usb_t1_delay(struct gpib_board *board, unsigned int nano_sec)
+static int ni_usb_t1_delay(struct gpib_board *board, unsigned int nano_sec)
 {
        int retval;
        struct ni_usb_priv *ni_priv = board->private_data;
@@ -1633,7 +1633,7 @@ static unsigned int ni_usb_t1_delay(struct gpib_board *board, unsigned int nano_
        retval = ni_usb_write_registers(ni_priv, writes, i, &ibsta);
        if (retval < 0) {
                dev_err(&usb_dev->dev, "register write failed, retval=%i\n", retval);
-               return -1;      //FIXME should change return type to int for error reporting
+               return retval;
        }
        board->t1_nano_sec = actual_ns;
        ni_usb_soft_update_status(board, ibsta, 0);
index d8e0733d8ab0685e1d9181566efd20761096fcac..96d3c09f2273be7fe71d56da1a0163974aedae10 100644 (file)
@@ -218,7 +218,7 @@ static uint8_t pc2_serial_poll_status(struct gpib_board *board)
        return nec7210_serial_poll_status(board, &priv->nec7210_priv);
 }
 
-static unsigned int pc2_t1_delay(struct gpib_board *board, unsigned int nano_sec)
+static int pc2_t1_delay(struct gpib_board *board, unsigned int nano_sec)
 {
        struct pc2_priv *priv = board->private_data;
 
index bc99526f2d0c0631cbccc7ad4e33bd63eb1bc304..c35b084b6fd0fbe003808e857f0e55ffc9fbe2c5 100644 (file)
@@ -178,7 +178,7 @@ static int tnt4882_line_status(const struct gpib_board *board)
        return status;
 }
 
-static unsigned int tnt4882_t1_delay(struct gpib_board *board, unsigned int nano_sec)
+static int tnt4882_t1_delay(struct gpib_board *board, unsigned int nano_sec)
 {
        struct tnt4882_priv *tnt_priv = board->private_data;
        struct nec7210_priv *nec_priv = &tnt_priv->nec7210_priv;