Commit e6515203 authored by Amitoj Kaur Chawla's avatar Amitoj Kaur Chawla Committed by David S. Miller

net: hamradio: baycom_ser_fdx: Replace timeval with timespec64

32 bit systems using 'struct timeval' will break in the year 2038, so
we replace the code appropriately. However, this driver is not broken
in 2038 since we are only using microseconds portion of the time.

This patch replaces 'struct timeval' with 'struct timespec64'. We only
need to find elapsed microseconds rather than absolute time, so it's
better to use monotonic time, so using ktime_get_ts64() makes the code
more efficient and more robust against concurrent settimeofday()
calls.
Signed-off-by: default avatarAmitoj Kaur Chawla <amitoj1606@gmail.com>
Reviewed-by: default avatarArnd Bergmann <arnd@arndb.de>
Reviewed-by: default avatarThomas Sailer <t.sailer@alumni.ethz.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4a92602a
...@@ -80,6 +80,7 @@ ...@@ -80,6 +80,7 @@
#include <linux/hdlcdrv.h> #include <linux/hdlcdrv.h>
#include <linux/baycom.h> #include <linux/baycom.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/time64.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -228,14 +229,15 @@ static inline unsigned int hweight8(unsigned int w) ...@@ -228,14 +229,15 @@ static inline unsigned int hweight8(unsigned int w)
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
static __inline__ void ser12_rx(struct net_device *dev, struct baycom_state *bc, struct timeval *tv, unsigned char curs) static __inline__ void ser12_rx(struct net_device *dev, struct baycom_state *bc, struct timespec64 *ts, unsigned char curs)
{ {
int timediff; int timediff;
int bdus8 = bc->baud_us >> 3; int bdus8 = bc->baud_us >> 3;
int bdus4 = bc->baud_us >> 2; int bdus4 = bc->baud_us >> 2;
int bdus2 = bc->baud_us >> 1; int bdus2 = bc->baud_us >> 1;
timediff = 1000000 + tv->tv_usec - bc->modem.ser12.pll_time; timediff = 1000000 + ts->tv_nsec / NSEC_PER_USEC -
bc->modem.ser12.pll_time;
while (timediff >= 500000) while (timediff >= 500000)
timediff -= 1000000; timediff -= 1000000;
while (timediff >= bdus2) { while (timediff >= bdus2) {
...@@ -287,7 +289,7 @@ static irqreturn_t ser12_interrupt(int irq, void *dev_id) ...@@ -287,7 +289,7 @@ static irqreturn_t ser12_interrupt(int irq, void *dev_id)
{ {
struct net_device *dev = (struct net_device *)dev_id; struct net_device *dev = (struct net_device *)dev_id;
struct baycom_state *bc = netdev_priv(dev); struct baycom_state *bc = netdev_priv(dev);
struct timeval tv; struct timespec64 ts;
unsigned char iir, msr; unsigned char iir, msr;
unsigned int txcount = 0; unsigned int txcount = 0;
...@@ -297,7 +299,7 @@ static irqreturn_t ser12_interrupt(int irq, void *dev_id) ...@@ -297,7 +299,7 @@ static irqreturn_t ser12_interrupt(int irq, void *dev_id)
if ((iir = inb(IIR(dev->base_addr))) & 1) if ((iir = inb(IIR(dev->base_addr))) & 1)
return IRQ_NONE; return IRQ_NONE;
/* get current time */ /* get current time */
do_gettimeofday(&tv); ktime_get_ts64(&ts);
msr = inb(MSR(dev->base_addr)); msr = inb(MSR(dev->base_addr));
/* delta DCD */ /* delta DCD */
if ((msr & 8) && bc->opt_dcd) if ((msr & 8) && bc->opt_dcd)
...@@ -340,7 +342,7 @@ static irqreturn_t ser12_interrupt(int irq, void *dev_id) ...@@ -340,7 +342,7 @@ static irqreturn_t ser12_interrupt(int irq, void *dev_id)
} }
iir = inb(IIR(dev->base_addr)); iir = inb(IIR(dev->base_addr));
} while (!(iir & 1)); } while (!(iir & 1));
ser12_rx(dev, bc, &tv, msr & 0x10); /* CTS */ ser12_rx(dev, bc, &ts, msr & 0x10); /* CTS */
if (bc->modem.ptt && txcount) { if (bc->modem.ptt && txcount) {
if (bc->modem.ser12.txshreg <= 1) { if (bc->modem.ser12.txshreg <= 1) {
bc->modem.ser12.txshreg = 0x10000 | hdlcdrv_getbits(&bc->hdrv); bc->modem.ser12.txshreg = 0x10000 | hdlcdrv_getbits(&bc->hdrv);
......
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