diff options
| author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2011-01-13 16:47:42 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2011-01-18 19:13:51 -0500 |
| commit | 5ae2f66fe4626340d4fd9d26b522ce377c780a56 (patch) | |
| tree | f5e9967692bbec0c088760814973e59fe5b8264d | |
| parent | 6ee400aafb60289b78fcde5ebccd8c4973fc53f4 (diff) | |
net/irda/sh_irda: return to RX mode when TX error
sh_irda can not use RX/TX in same time,
but this driver didn't return to RX mode when TX error occurred.
This patch care xmit error case to solve this issue.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/irda/sh_irda.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/net/irda/sh_irda.c b/drivers/net/irda/sh_irda.c index 9e3f4f54281d..4488bd581eca 100644 --- a/drivers/net/irda/sh_irda.c +++ b/drivers/net/irda/sh_irda.c | |||
| @@ -635,7 +635,7 @@ static int sh_irda_hard_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 635 | 635 | ||
| 636 | ret = sh_irda_set_baudrate(self, speed); | 636 | ret = sh_irda_set_baudrate(self, speed); |
| 637 | if (ret < 0) | 637 | if (ret < 0) |
| 638 | return ret; | 638 | goto sh_irda_hard_xmit_end; |
| 639 | 639 | ||
| 640 | self->tx_buff.len = 0; | 640 | self->tx_buff.len = 0; |
| 641 | if (skb->len) { | 641 | if (skb->len) { |
| @@ -652,11 +652,21 @@ static int sh_irda_hard_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
| 652 | 652 | ||
| 653 | sh_irda_write(self, IRTFLR, self->tx_buff.len); | 653 | sh_irda_write(self, IRTFLR, self->tx_buff.len); |
| 654 | sh_irda_write(self, IRTCTR, ARMOD | TE); | 654 | sh_irda_write(self, IRTCTR, ARMOD | TE); |
| 655 | } | 655 | } else |
| 656 | goto sh_irda_hard_xmit_end; | ||
| 656 | 657 | ||
| 657 | dev_kfree_skb(skb); | 658 | dev_kfree_skb(skb); |
| 658 | 659 | ||
| 659 | return 0; | 660 | return 0; |
| 661 | |||
| 662 | sh_irda_hard_xmit_end: | ||
| 663 | sh_irda_set_baudrate(self, 9600); | ||
| 664 | netif_wake_queue(self->ndev); | ||
| 665 | sh_irda_rcv_ctrl(self, 1); | ||
| 666 | dev_kfree_skb(skb); | ||
| 667 | |||
| 668 | return ret; | ||
| 669 | |||
| 660 | } | 670 | } |
| 661 | 671 | ||
| 662 | static int sh_irda_ioctl(struct net_device *ndev, struct ifreq *ifreq, int cmd) | 672 | static int sh_irda_ioctl(struct net_device *ndev, struct ifreq *ifreq, int cmd) |
