From: lyx Date: Sun, 9 Oct 2011 09:49:29 +0000 (+0800) Subject: newton: update irda bu92747 drivers X-Git-Tag: firefly_0821_release~9766^2~34 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=49428a0bdcb7ed1f85477cb16795a182f8e11fd6;p=firefly-linux-kernel-4.4.55.git newton: update irda bu92747 drivers 1.同步newton服务器上的irda代码 --- diff --git a/drivers/net/irda/bu92725guw.c b/drivers/net/irda/bu92725guw.c index 9578707482ae..cf00fe1c69fc 100755 --- a/drivers/net/irda/bu92725guw.c +++ b/drivers/net/irda/bu92725guw.c @@ -352,7 +352,6 @@ void BU92725GUW_set_trans_way(u32 way) /* set bu92725guw registers */ /* [Modify] AIC 2011/09/27 - * MS_EN(TRCR5)¤Ë¤è¤ëͨÐÅ¥â©`¥ÉÇÐÌæ„Ó×÷¤òÐФï¤Ê¤¤¤è¤¦¤ËÐÞÕý¤·¤Þ¤·¤¿¡£ * * internal_set(1); */ @@ -714,17 +713,17 @@ static void internal_set(u8 modeChg) break; case BU92725GUW_FIR_REV: /* FIR use */ - val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF + val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF \ | REG_INT_AC | REG_INT_DECE; //IER1,2, 4, 5, 6, 7 break; case BU92725GUW_MULTI_REV: /* not used */ - val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE + val = REG_INT_STFRX | REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE \ | REG_INT_RDOE | REG_INT_DEX | REG_INT_RDUE; //IER1,2, 4, 5, 6, 7, 8, 9, 10 break; case BU92725GUW_AUTO_MULTI_REV: /* M/FIR use */ - val = REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE + val = REG_INT_TO | REG_INT_CRC | REG_INT_OE | REG_INT_EOF | REG_INT_AC | REG_INT_DECE\ | REG_INT_RDOE | REG_INT_DEX | REG_INT_RDE; //IER2, 4, 5, 6, 7, 8, 9, 12 break; @@ -754,4 +753,9 @@ void BU92725GUW_dump_register(void) printk("IER: 0x%x\n", BU92725GUW_READ_REG(REG_IER_ADDR)); } - +/* [Add] AIC 2011/09/29 */ +int BU92725GUW_get_length_in_fifo_buffer(void) +{ + return( (int)BU92725GUW_READ_REG(REG_FLV_ADDR) ); +} +/* [Add-end] AIC 2011/09/29 */ diff --git a/drivers/net/irda/bu92725guw.h b/drivers/net/irda/bu92725guw.h index 70c7f06344e1..5355d87e300a 100755 --- a/drivers/net/irda/bu92725guw.h +++ b/drivers/net/irda/bu92725guw.h @@ -227,5 +227,8 @@ int irda_hw_shutdown(void); int irda_hw_startup(void); int irda_hw_set_speed(u32 speed); +/* [Add] AIC 2011/09/29 */ +int BU92725GUW_get_length_in_fifo_buffer(void); +/* [Add-end] AIC 2011/09/29 */ #endif /*__BU92725GUW_H*/ diff --git a/drivers/net/irda/ir_serial.c b/drivers/net/irda/ir_serial.c index ec601f680603..4816b94fe57d 100755 --- a/drivers/net/irda/ir_serial.c +++ b/drivers/net/irda/ir_serial.c @@ -198,10 +198,6 @@ static int bu92747_irda_do_tx(struct bu92747_port *s) } /* [Modify] AIC 2011/09/27 - * ËÍÐťХåե¡¤«¤é¥Ç©`¥¿¤òÈ¡¤ê³ö¤¹·½·¨¤Ë†–î}¤¬¤¢¤ê¡¢Ò»²¿¤Î - * ¥Ç©`¥¿¤¬Õý¤·¤¯Ëͤì¤Ê¤¤¤³¤È¤¬¤¢¤ë¤¿¤á¤Ë¡¢ËÍÐťǩ`¥¿¤Î - * È¡µÃ·½·¨¤òÐÞÕý¤·¤Þ¤·¤¿¡£ - * * BU92725GUW_send_data(xmit->buf+xmit->tail, len, NULL, 0); */ if ( (xmit->tail + len) > UART_XMIT_SIZE ) { @@ -269,6 +265,26 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) } if (irq_src & (REG_INT_DRX | FRM_EVT_RX_EOFRX | FRM_EVT_RX_RDE)) { + //fixing CA001 (IrSimple mode sending) failing issue + /* modified to process a frame ending processing first, when RDE_EI and EOF_EI are happen at the same time. + * Before the modification, disconnect packet was processed as the previous packet, + * not as a disconnect packet. The packets were combined. + */ + if ((irq_src & REG_INT_EOF) && (s->port.state->port.tty != NULL)) { + tty_flip_buffer_push(s->port.state->port.tty); + if (IS_FIR(s)) { + spin_lock(&s->data_lock); + if (add_frame_length(f, s->cur_frame_length) == 0) { + s->cur_frame_length = 0; + } + else { + printk("func %s,line %d: FIR frame length buf full......\n", __FUNCTION__, __LINE__); + } + spin_unlock(&s->data_lock); + } + } + //~ + len = bu92747_irda_do_rx(s); if (!IS_FIR(s)) tty_flip_buffer_push(s->port.state->port.tty); @@ -280,38 +296,49 @@ static irqreturn_t bu92747_irda_irq(int irqno, void *dev_id) } if ((irq_src & REG_INT_EOF) && (s->port.state->port.tty != NULL)) { + spin_lock(&s->data_lock); // [Modify] AIC 2011/09/30 tty_flip_buffer_push(s->port.state->port.tty); if (IS_FIR(s)) { - spin_lock(&s->data_lock); + /* [Modify] AIC 2011/09/30 + * spin_lock(&s->data_lock); + */ if (add_frame_length(f, s->cur_frame_length) == 0) { s->cur_frame_length = 0; } else { printk("func %s,line %d: FIR frame length buf full......\n", __FUNCTION__, __LINE__); } - spin_unlock(&s->data_lock); + /* [Modify] AIC 2011/09/30 + * spin_unlock(&s->data_lock); + */ } + spin_unlock(&s->data_lock); // [Modify] AIC 2011/09/30 } /* [Modify] AIC 2011/09/27 - * WRE_EI(EIR11)¸î¤êÞz¤ß¤Î•rµã¤Ç¡¢ËÍÐÅ¥â©`¥É¤«¤éÊÜÐÅ¥â©`¥É¤Ø - * ÇФêÌæ¤¨¤Æ¤·¤Þ¤¦¤È¡¢ËÍÐťǩ`¥¿¤Î×îáá¤Î²¿·Ö¤¬ËÍÐŤµ¤ì¤Ê¤¤¤³¤È¤¬ - * ¤¢¤ë¤¿¤á¡¢ËÍÐÅÍêÁ˸î¤êÞz¤ß(TXE_EI:EIR3)¤ò´ý¤Ä¤è¤¦¤ËÐÞÕý¤·¤Þ¤·¤¿¡£ * * if (irq_src & (FRM_EVT_TX_TXE | FRM_EVT_TX_WRE)) { * s->tx_empty = 1; * irda_hw_set_moderx(); * } */ - if (irq_src & (FRM_EVT_TX_TXE | FRM_EVT_TX_WRE)) { - /* ËÍÐŤ¬¾A¤¯ˆöºÏ¤Ï¡¢¤³¤³¤Ç´Î¤Î¥Ç©`¥¿¤¬ËÍÐÅ¿ÉÄܤȤʤë */ + /* [Modify] AIC 2011/09/29 + * + * if (irq_src & (FRM_EVT_TX_TXE | FRM_EVT_TX_WRE)) { + * s->tx_empty = 1; + * if ( irq_src & FRM_EVT_TX_TXE ) { + * irda_hw_set_moderx(); + * } + */ + if ( (irq_src & (FRM_EVT_TX_TXE | FRM_EVT_TX_WRE)) && + (BU92725GUW_get_length_in_fifo_buffer() == 0) ) { s->tx_empty = 1; - if (irq_src & FRM_EVT_TX_TXE) { - /* ÍêÈ«¤ËËÍÐÅÍêÁˤȤʤ俈öºÏ¡¢ÊÜÐÅ¥â©`¥É¤ØÇФêÌæ¤¨¤ë */ + + if ( irq_src & FRM_EVT_TX_TXE ) { irda_hw_set_moderx(); } } - /* [Modify-end] AIC 2011/09/27 */ + /* [Modify-end] AIC 2011/09/29 */ #if 0 /* error */ if (irq_src & REG_INT_TO) {