char: pcmcia: cm4000_cs: Replace mdelay with usleep_range in set_protocol
authorJia-Ju Bai <baijiaju1990@gmail.com>
Sun, 18 Mar 2018 14:49:57 +0000 (22:49 +0800)
committerDominik Brodowski <linux@dominikbrodowski.net>
Mon, 1 Oct 2018 10:15:21 +0000 (12:15 +0200)
set_protocol() is never called in atomic context.

The call chains ending up at set_protocol() are:
[1] set_protocol() <- monitor_card()
[2] set_protocol() <- cmm_ioctl()
monitor_card() is only set in setup_timer(), and cmm_ioctl() is only
set as ".unlocked_ioctl" in file_operations structure "cm4000_fops".

Despite never getting called from atomic context, set_protocol() calls
mdelay(10), i.e. busy wait for 10ms.
That is not necessary and can be replaced with usleep_range to
avoid busy waiting.

This is found by a static analysis tool named DCNS written by myself.

Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
Acked-by: Harald Welte <laforge@gnumonks.org>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
drivers/char/pcmcia/cm4000_cs.c

index a219964cb77005ff2462f85edf9106b3c7fd0d41..809507bf8f1cd8c371845e450cfd4e7151b59eb0 100644 (file)
@@ -530,7 +530,7 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
                        DEBUGP(5, dev, "NumRecBytes is valid\n");
                        break;
                }
-               mdelay(10);
+               usleep_range(10000, 11000);
        }
        if (i == 100) {
                DEBUGP(5, dev, "Timeout waiting for NumRecBytes getting "
@@ -546,7 +546,7 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
                        DEBUGP(2, dev, "NumRecBytes = %i\n", num_bytes_read);
                        break;
                }
-               mdelay(10);
+               usleep_range(10000, 11000);
        }
 
        /* check whether it is a short PTS reply? */