newton: improve irda driver
authorlyx <lyx@rock-chips.com>
Mon, 29 Aug 2011 08:04:50 +0000 (01:04 -0700)
committerlyx <lyx@rock-chips.com>
Tue, 30 Aug 2011 03:00:11 +0000 (20:00 -0700)
1.improve err handle
2.improve FIR get length

drivers/net/irda/ir_serial.c

index 29f9722910002577042430aba8d3d95d8be6f7d8..407f58c838aac8efd4f3aca770d795c0de4592ee 100755 (executable)
@@ -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__);\r
        irq_src = irda_hw_get_irqsrc();\r
        printk("[%s][%d], 0x%x\n",__FUNCTION__,__LINE__, irq_src);\r
+\r
+       /* error */\r
+       if (irq_src & (REG_INT_CRC | REG_INT_OE | REG_INT_FE\r
+               | REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) {\r
+               printk("[%s][%d]: do err\n", __FUNCTION__, __LINE__);\r
+               //BU92725GUW_dump_register();\r
+               BU92725GUW_clr_fifo();\r
+               BU92725GUW_reset();\r
+               if ((BU92725GUW_SEND==irda_hw_get_mode())\r
+                       || (BU92725GUW_MULTI_SEND==irda_hw_get_mode())) {\r
+                       s->tx_empty = 1;\r
+               }\r
+       }\r
        \r
        if (irq_src & (REG_INT_DRX | FRM_EVT_RX_EOFRX | FRM_EVT_RX_RDE)) {\r
                len = bu92747_irda_do_rx(s);\r
@@ -273,9 +286,8 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id)
        }\r
 \r
        /* error */\r
-       if (irq_src & (REG_INT_TO| REG_INT_CRC | REG_INT_OE | REG_INT_FE\r
-               | REG_INT_AC | REG_INT_DECE | REG_INT_RDOE | REG_INT_DEX)) {\r
-               BU92747_IRDA_DBG("[%s][%d]: do err\n", __FUNCTION__, __LINE__);\r
+       if (irq_src & REG_INT_TO) {\r
+               BU92747_IRDA_DBG("[%s][%d]: do timeout err\n", __FUNCTION__, __LINE__);\r
                //BU92725GUW_dump_register();\r
                BU92725GUW_clr_fifo();\r
                BU92725GUW_reset();\r
@@ -284,7 +296,7 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id)
                        s->tx_empty = 1;\r
                }\r
        }\r
-       \r
+\r
        return IRQ_HANDLED;\r
 }\r
 \r
@@ -598,6 +610,7 @@ static int bu92747_get_frame_length(struct bu92747_port *s)
        spin_lock(&s->data_lock);\r
        if (get_frame_length(f, &len) != 0) {\r
                printk("line %d: FIR data not ready......\n", __LINE__);\r
+               len = 0;\r
                //atomic_set(&(s->data_ready), 0);\r
        }\r
        spin_unlock(&s->data_lock);\r
@@ -618,7 +631,7 @@ static int bu92747_irda_ioctl(struct uart_port *port, unsigned int cmd, unsigned
        switch (cmd) {\r
        case TTYIR_GETLENGTH:\r
                len = bu92747_get_frame_length(s);\r
-               if (len > 0) {\r
+               if (len >= 0) {\r
                        if (copy_to_user(argp, &len, sizeof(len)))\r
                                ret = -EFAULT;\r
                }\r