From d32f5dbe19fbcdb0781f962da165668239343bac Mon Sep 17 00:00:00 2001 From: lyx <lyx@rock-chips.com> Date: Mon, 29 Aug 2011 01:04:50 -0700 Subject: [PATCH] newton: improve irda driver 1.improve err handle 2.improve FIR get length --- drivers/net/irda/ir_serial.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/net/irda/ir_serial.c b/drivers/net/irda/ir_serial.c index 29f972291000..407f58c838aa 100755 --- a/drivers/net/irda/ir_serial.c +++ b/drivers/net/irda/ir_serial.c @@ -239,6 +239,19 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) BU92747_IRDA_DBG("line %d, enter %s \n", __LINE__, __FUNCTION__); irq_src = irda_hw_get_irqsrc(); printk("[%s][%d], 0x%x\n",__FUNCTION__,__LINE__, irq_src); + + /* error */ + if (irq_src & (REG_INT_CRC | REG_INT_OE | REG_INT_FE + | REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) { + printk("[%s][%d]: do err\n", __FUNCTION__, __LINE__); + //BU92725GUW_dump_register(); + BU92725GUW_clr_fifo(); + BU92725GUW_reset(); + if ((BU92725GUW_SEND==irda_hw_get_mode()) + || (BU92725GUW_MULTI_SEND==irda_hw_get_mode())) { + s->tx_empty = 1; + } + } if (irq_src & (REG_INT_DRX | FRM_EVT_RX_EOFRX | FRM_EVT_RX_RDE)) { len = bu92747_irda_do_rx(s); @@ -273,9 +286,8 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) } /* error */ - if (irq_src & (REG_INT_TO| REG_INT_CRC | REG_INT_OE | REG_INT_FE - | REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) { - BU92747_IRDA_DBG("[%s][%d]: do err\n", __FUNCTION__, __LINE__); + if (irq_src & REG_INT_TO) { + BU92747_IRDA_DBG("[%s][%d]: do timeout err\n", __FUNCTION__, __LINE__); //BU92725GUW_dump_register(); BU92725GUW_clr_fifo(); BU92725GUW_reset(); @@ -284,7 +296,7 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) s->tx_empty = 1; } } - + return IRQ_HANDLED; } @@ -598,6 +610,7 @@ static int bu92747_get_frame_length(struct bu92747_port *s) spin_lock(&s->data_lock); if (get_frame_length(f, &len) != 0) { printk("line %d: FIR data not ready......\n", __LINE__); + len = 0; //atomic_set(&(s->data_ready), 0); } spin_unlock(&s->data_lock); @@ -618,7 +631,7 @@ static int bu92747_irda_ioctl(struct uart_port *port, unsigned int cmd, unsigned switch (cmd) { case TTYIR_GETLENGTH: len = bu92747_get_frame_length(s); - if (len > 0) { + if (len >= 0) { if (copy_to_user(argp, &len, sizeof(len))) ret = -EFAULT; } -- 2.34.1