Commit 497ec1f2 authored by Chunyan Zhang's avatar Chunyan Zhang Committed by David S. Miller

irda: vlsi_ir: Replace timeval with ktime_t

The vlsi ir driver uses 'timeval', which we try to remove in the kernel
because all 32-bit time types will break in the year 2038.

This patch also changes do_gettimeofday() to ktime_get() accordingly,
since ktime_get returns a ktime_t, but do_gettimeofday returns a
struct timeval, and the other reason is that ktime_get() uses
the monotonic clock.

This patch uses ktime_us_delta to get the elapsed time of microsecond,
and uses div_s64_rem to get what seconds & microseconds time elapsed
for printing.

This patch also changes the function 'vlsi_hard_start_xmit' to do the
same things as the others drivers, that is passing the remaining time
into udelay() instead of looping until enough time has passed.
Signed-off-by: default avatarChunyan Zhang <zhang.chunyan@linaro.org>
Reviewed-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 89a07e17
...@@ -33,6 +33,7 @@ MODULE_LICENSE("GPL"); ...@@ -33,6 +33,7 @@ MODULE_LICENSE("GPL");
/********************************************************/ /********************************************************/
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/ktime.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/pci.h> #include <linux/pci.h>
...@@ -40,9 +41,9 @@ MODULE_LICENSE("GPL"); ...@@ -40,9 +41,9 @@ MODULE_LICENSE("GPL");
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/time.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/math64.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
...@@ -180,8 +181,7 @@ static void vlsi_proc_ndev(struct seq_file *seq, struct net_device *ndev) ...@@ -180,8 +181,7 @@ static void vlsi_proc_ndev(struct seq_file *seq, struct net_device *ndev)
vlsi_irda_dev_t *idev = netdev_priv(ndev); vlsi_irda_dev_t *idev = netdev_priv(ndev);
u8 byte; u8 byte;
u16 word; u16 word;
unsigned delta1, delta2; s32 sec, usec;
struct timeval now;
unsigned iobase = ndev->base_addr; unsigned iobase = ndev->base_addr;
seq_printf(seq, "\n%s link state: %s / %s / %s / %s\n", ndev->name, seq_printf(seq, "\n%s link state: %s / %s / %s / %s\n", ndev->name,
...@@ -277,17 +277,9 @@ static void vlsi_proc_ndev(struct seq_file *seq, struct net_device *ndev) ...@@ -277,17 +277,9 @@ static void vlsi_proc_ndev(struct seq_file *seq, struct net_device *ndev)
seq_printf(seq, "\nsw-state:\n"); seq_printf(seq, "\nsw-state:\n");
seq_printf(seq, "IrPHY setup: %d baud - %s encoding\n", idev->baud, seq_printf(seq, "IrPHY setup: %d baud - %s encoding\n", idev->baud,
(idev->mode==IFF_SIR)?"SIR":((idev->mode==IFF_MIR)?"MIR":"FIR")); (idev->mode==IFF_SIR)?"SIR":((idev->mode==IFF_MIR)?"MIR":"FIR"));
do_gettimeofday(&now); sec = div_s64_rem(ktime_us_delta(ktime_get(), idev->last_rx),
if (now.tv_usec >= idev->last_rx.tv_usec) { USEC_PER_SEC, &usec);
delta2 = now.tv_usec - idev->last_rx.tv_usec; seq_printf(seq, "last rx: %ul.%06u sec\n", sec, usec);
delta1 = 0;
}
else {
delta2 = 1000000 + now.tv_usec - idev->last_rx.tv_usec;
delta1 = 1;
}
seq_printf(seq, "last rx: %lu.%06u sec\n",
now.tv_sec - idev->last_rx.tv_sec - delta1, delta2);
seq_printf(seq, "RX: packets=%lu / bytes=%lu / errors=%lu / dropped=%lu", seq_printf(seq, "RX: packets=%lu / bytes=%lu / errors=%lu / dropped=%lu",
ndev->stats.rx_packets, ndev->stats.rx_bytes, ndev->stats.rx_errors, ndev->stats.rx_packets, ndev->stats.rx_bytes, ndev->stats.rx_errors,
...@@ -661,7 +653,7 @@ static void vlsi_rx_interrupt(struct net_device *ndev) ...@@ -661,7 +653,7 @@ static void vlsi_rx_interrupt(struct net_device *ndev)
} }
} }
do_gettimeofday(&idev->last_rx); /* remember "now" for later mtt delay */ idev->last_rx = ktime_get(); /* remember "now" for later mtt delay */
vlsi_fill_rx(r); vlsi_fill_rx(r);
...@@ -858,9 +850,8 @@ static netdev_tx_t vlsi_hard_start_xmit(struct sk_buff *skb, ...@@ -858,9 +850,8 @@ static netdev_tx_t vlsi_hard_start_xmit(struct sk_buff *skb,
unsigned iobase = ndev->base_addr; unsigned iobase = ndev->base_addr;
u8 status; u8 status;
u16 config; u16 config;
int mtt; int mtt, diff;
int len, speed; int len, speed;
struct timeval now, ready;
char *msg = NULL; char *msg = NULL;
speed = irda_get_next_speed(skb); speed = irda_get_next_speed(skb);
...@@ -940,22 +931,11 @@ static netdev_tx_t vlsi_hard_start_xmit(struct sk_buff *skb, ...@@ -940,22 +931,11 @@ static netdev_tx_t vlsi_hard_start_xmit(struct sk_buff *skb,
spin_unlock_irqrestore(&idev->lock, flags); spin_unlock_irqrestore(&idev->lock, flags);
if ((mtt = irda_get_mtt(skb)) > 0) { if ((mtt = irda_get_mtt(skb)) > 0) {
diff = ktime_us_delta(ktime_get(), idev->last_rx);
ready.tv_usec = idev->last_rx.tv_usec + mtt; if (mtt > diff)
ready.tv_sec = idev->last_rx.tv_sec; udelay(mtt - diff);
if (ready.tv_usec >= 1000000) {
ready.tv_usec -= 1000000;
ready.tv_sec++; /* IrLAP 1.1: mtt always < 1 sec */
}
for(;;) {
do_gettimeofday(&now);
if (now.tv_sec > ready.tv_sec ||
(now.tv_sec==ready.tv_sec && now.tv_usec>=ready.tv_usec))
break;
udelay(100);
/* must not sleep here - called under netif_tx_lock! */ /* must not sleep here - called under netif_tx_lock! */
} }
}
/* tx buffer already owned by CPU due to pci_dma_sync_single_for_cpu() /* tx buffer already owned by CPU due to pci_dma_sync_single_for_cpu()
* after subsequent tx-completion * after subsequent tx-completion
...@@ -1333,7 +1313,7 @@ static int vlsi_start_hw(vlsi_irda_dev_t *idev) ...@@ -1333,7 +1313,7 @@ static int vlsi_start_hw(vlsi_irda_dev_t *idev)
vlsi_fill_rx(idev->rx_ring); vlsi_fill_rx(idev->rx_ring);
do_gettimeofday(&idev->last_rx); /* first mtt may start from now on */ idev->last_rx = ktime_get(); /* first mtt may start from now on */
outw(0, iobase+VLSI_PIO_PROMPT); /* kick hw state machine */ outw(0, iobase+VLSI_PIO_PROMPT); /* kick hw state machine */
...@@ -1520,7 +1500,7 @@ static int vlsi_open(struct net_device *ndev) ...@@ -1520,7 +1500,7 @@ static int vlsi_open(struct net_device *ndev)
if (!idev->irlap) if (!idev->irlap)
goto errout_free_ring; goto errout_free_ring;
do_gettimeofday(&idev->last_rx); /* first mtt may start from now on */ idev->last_rx = ktime_get(); /* first mtt may start from now on */
idev->new_baud = 9600; /* start with IrPHY using 9600(SIR) mode */ idev->new_baud = 9600; /* start with IrPHY using 9600(SIR) mode */
......
...@@ -723,7 +723,7 @@ typedef struct vlsi_irda_dev { ...@@ -723,7 +723,7 @@ typedef struct vlsi_irda_dev {
void *virtaddr; void *virtaddr;
struct vlsi_ring *tx_ring, *rx_ring; struct vlsi_ring *tx_ring, *rx_ring;
struct timeval last_rx; ktime_t last_rx;
spinlock_t lock; spinlock_t lock;
struct mutex mtx; struct mutex mtx;
......
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