linux/drivers/tty/bfin_jtag_comm.c
<<
>>
Prefs
   1/*
   2 * TTY over Blackfin JTAG Communication
   3 *
   4 * Copyright 2008-2009 Analog Devices Inc.
   5 *
   6 * Enter bugs at http://blackfin.uclinux.org/
   7 *
   8 * Licensed under the GPL-2 or later.
   9 */
  10
  11#define DRV_NAME "bfin-jtag-comm"
  12#define DEV_NAME "ttyBFJC"
  13#define pr_fmt(fmt) DRV_NAME ": " fmt
  14
  15#include <linux/circ_buf.h>
  16#include <linux/console.h>
  17#include <linux/delay.h>
  18#include <linux/err.h>
  19#include <linux/kernel.h>
  20#include <linux/kthread.h>
  21#include <linux/module.h>
  22#include <linux/mutex.h>
  23#include <linux/sched.h>
  24#include <linux/slab.h>
  25#include <linux/tty.h>
  26#include <linux/tty_driver.h>
  27#include <linux/tty_flip.h>
  28#include <linux/atomic.h>
  29
  30#define pr_init(fmt, args...) ({ static const __initconst char __fmt[] = fmt; printk(__fmt, ## args); })
  31
  32/* See the Debug/Emulation chapter in the HRM */
  33#define EMUDOF   0x00000001     /* EMUDAT_OUT full & valid */
  34#define EMUDIF   0x00000002     /* EMUDAT_IN full & valid */
  35#define EMUDOOVF 0x00000004     /* EMUDAT_OUT overflow */
  36#define EMUDIOVF 0x00000008     /* EMUDAT_IN overflow */
  37
  38static inline uint32_t bfin_write_emudat(uint32_t emudat)
  39{
  40        __asm__ __volatile__("emudat = %0;" : : "d"(emudat));
  41        return emudat;
  42}
  43
  44static inline uint32_t bfin_read_emudat(void)
  45{
  46        uint32_t emudat;
  47        __asm__ __volatile__("%0 = emudat;" : "=d"(emudat));
  48        return emudat;
  49}
  50
  51static inline uint32_t bfin_write_emudat_chars(char a, char b, char c, char d)
  52{
  53        return bfin_write_emudat((a << 0) | (b << 8) | (c << 16) | (d << 24));
  54}
  55
  56#define CIRC_SIZE 2048  /* see comment in tty_io.c:do_tty_write() */
  57#define CIRC_MASK (CIRC_SIZE - 1)
  58#define circ_empty(circ)     ((circ)->head == (circ)->tail)
  59#define circ_free(circ)      CIRC_SPACE((circ)->head, (circ)->tail, CIRC_SIZE)
  60#define circ_cnt(circ)       CIRC_CNT((circ)->head, (circ)->tail, CIRC_SIZE)
  61#define circ_byte(circ, idx) ((circ)->buf[(idx) & CIRC_MASK])
  62
  63static struct tty_driver *bfin_jc_driver;
  64static struct task_struct *bfin_jc_kthread;
  65static struct tty_port port;
  66static volatile struct circ_buf bfin_jc_write_buf;
  67
  68static int
  69bfin_jc_emudat_manager(void *arg)
  70{
  71        uint32_t inbound_len = 0, outbound_len = 0;
  72
  73        while (!kthread_should_stop()) {
  74                struct tty_struct *tty = tty_port_tty_get(&port);
  75                /* no one left to give data to, so sleep */
  76                if (tty == NULL && circ_empty(&bfin_jc_write_buf)) {
  77                        pr_debug("waiting for readers\n");
  78                        __set_current_state(TASK_UNINTERRUPTIBLE);
  79                        schedule();
  80                        __set_current_state(TASK_RUNNING);
  81                        continue;
  82                }
  83
  84                /* no data available, so just chill */
  85                if (!(bfin_read_DBGSTAT() & EMUDIF) && circ_empty(&bfin_jc_write_buf)) {
  86                        pr_debug("waiting for data (in_len = %i) (circ: %i %i)\n",
  87                                inbound_len, bfin_jc_write_buf.tail, bfin_jc_write_buf.head);
  88                        tty_kref_put(tty);
  89                        if (inbound_len)
  90                                schedule();
  91                        else
  92                                schedule_timeout_interruptible(HZ);
  93                        continue;
  94                }
  95
  96                /* if incoming data is ready, eat it */
  97                if (bfin_read_DBGSTAT() & EMUDIF) {
  98                        if (tty != NULL) {
  99                                uint32_t emudat = bfin_read_emudat();
 100                                if (inbound_len == 0) {
 101                                        pr_debug("incoming length: 0x%08x\n", emudat);
 102                                        inbound_len = emudat;
 103                                } else {
 104                                        size_t num_chars = (4 <= inbound_len ? 4 : inbound_len);
 105                                        pr_debug("  incoming data: 0x%08x (pushing %zu)\n", emudat, num_chars);
 106                                        inbound_len -= num_chars;
 107                                        tty_insert_flip_string(tty, (unsigned char *)&emudat, num_chars);
 108                                        tty_flip_buffer_push(tty);
 109                                }
 110                        }
 111                }
 112
 113                /* if outgoing data is ready, post it */
 114                if (!(bfin_read_DBGSTAT() & EMUDOF) && !circ_empty(&bfin_jc_write_buf)) {
 115                        if (outbound_len == 0) {
 116                                outbound_len = circ_cnt(&bfin_jc_write_buf);
 117                                bfin_write_emudat(outbound_len);
 118                                pr_debug("outgoing length: 0x%08x\n", outbound_len);
 119                        } else {
 120                                int tail = bfin_jc_write_buf.tail;
 121                                size_t ate = (4 <= outbound_len ? 4 : outbound_len);
 122                                uint32_t emudat =
 123                                bfin_write_emudat_chars(
 124                                        circ_byte(&bfin_jc_write_buf, tail + 0),
 125                                        circ_byte(&bfin_jc_write_buf, tail + 1),
 126                                        circ_byte(&bfin_jc_write_buf, tail + 2),
 127                                        circ_byte(&bfin_jc_write_buf, tail + 3)
 128                                );
 129                                bfin_jc_write_buf.tail += ate;
 130                                outbound_len -= ate;
 131                                if (tty)
 132                                        tty_wakeup(tty);
 133                                pr_debug("  outgoing data: 0x%08x (pushing %zu)\n", emudat, ate);
 134                        }
 135                }
 136                tty_kref_put(tty);
 137        }
 138
 139        __set_current_state(TASK_RUNNING);
 140        return 0;
 141}
 142
 143static int
 144bfin_jc_open(struct tty_struct *tty, struct file *filp)
 145{
 131        68static1  return 1emudat,
ock_irqsavbfin_jc_write_buf 140        __set_current_stabfin_jtag_comm.c#L75" id="Lref="+code=ate" ce 140    ef="drive1rs/tty/bfin_jtag_comm.c#1L51" 15_asm__ ,un
ock_irqrestorbfin_jc_write_buf 140     i15uint32_t ports"+code=port" class="sref">ports/a>);
 137    ref="driv1ers/tty/bfin_jtag_comm.c1#L53"152int32_t  137    rc int
bfinL141" class="line" name="L141"> 141}
  55
  56#defin1e   56#defin1e CIRCING);
tty_struct *tty, struct file *filp)
 145{
cir146" class="line" name="Ll.      L46146" ce __ref="+codlocla="drivers/tty/bfla/bfin_jtag_comm.cfla/bd="L131" class="line" name="L131"> 131    e  atettsre d="L131" class="line" name="L131"> 131    e  32 ,
ock_irqsavbfin_jc_write_buf 140     struct <1a href="+code=tty_driver1" cla163int32_t ttsre d="L = --set_current_stabfin_jtag_comm.c#L75" id="Lref="+code=ate" ce 140     ef="driv1a href="+code=task_struc1t" cl164int32_t ,un
ock_irqrestorbfin_jc_write_buf 140     struct <1a href="+code=tty_port" 1class16ag_comm.c#L13ef="drivers/tty/bfisre class="sref">ttsre d="L145" class="line" name="L145"> 145{
tty_kref_put(ports"+code=port" class="sref">ports/a>);
 140        137     int
  55
  30#defin1ref="driv1ers/tty/bfin_jtag_comm.c1#L71"1id="L7 post it */
 114        144a href="+code=Hclass="sc clal_RUNNitconssref">emudat);
 145{
 131             1 /1* no 1ne left to givef="+code=ate" ce);
circ)      bfin_jc_write_buf)) {
 131     volatile1 if (tty"  outgoing data: 0x%08x (pushing %zu)\n&quopan>, to mm.c#udaunk ofy/bfin_jss="omm.c#L78" id="La href="drivers/tee 131     e < 145{
bfin_jc_write_buf, tail + 3)
tail += circ)->+ef="+code=bfin_jin_jc_write_buf"id="L)fin_jc_write_buf 131     ="+code=1         __set_current_staa>.tail += circ)->+len ? 4 :  131             1          131       142
 143statef="drive1rs/tty/bfin_jtag_comm.c#1L84" 1d="L84#ifndefa>])
 143state        1 /1* no 1ata av# byte( 145{
 145{
 145{
 144tailsic volatile struct                  1     18a>(uint31ag_comm.c1#L89" id="L89" class="li1ne" n1me="L89">  89 145bfin_jc_write_bucomm.c#1L84" 1d="L84#ifndefa>])
 145schedule();
ate 131     volatile1 if (bfin_jc_write_bustate        1 /1* no 1ata   volatile1 if (HZ);
ports/a>);
 140   1                     con1tinue19houl1_stop"14>.tail += ci="L94" cl1ass="line" name="L94">  194 131 tag_comm.1c#L96" id="L96" class="l1ine" 19ass="line" name="Ll.      L46146" class="line"         1  if (  98         1     1967
emudat 145{
tailsic volatile struct 2int32_t bfin_jc_emudat_mana2"L100" cl2ss="line" name="L100"> 12020estorbfin_jc_write_but" class="sref">ports/a>);
 140p2_debug(  41       2         2                        2a hre20emudat;
 =2(4 <= circ)->+ef="+code=bfiroomin_jc_write_buf"id="L)fin_jc_room"line" name="L145"> 145{
tailsic volatile struct   2>, bfin_jc_emudat_mana2"7s =2(#L96" id="L96" class="l2"+cod2=inbound_len" >. 131             1 /1* no 1ne left to givef="+code=ate" ce 140 =2( if ( );
);
 145{
tailsic volatile struct  110b, char  111  116                                outb2omm.c#L112" id="L113" class="line"2name=21s"drivers/tty/bfin_jtag_comm.c#L65" id="L6L1372;& !<2 href="+code=circ_empty"2class21nt
 121> 141}
 = /1til_se/bfin_jtag_comm.cbfin_jtaef=">/1til_se/b"line" name="L145"> 145{
tailsic volatile struct  =2 f2ebug(2span class="string">&quo2;outg21filp)
, t case where we jiffie">ports/a>);
outb2">outboun2_len);
                if (!(bfin_read_DBGSTAT() & EMUDOF) &am2il" class2"sref">tail = num_charsef="al_pame=eft" class="sr href="+cs="lin             if s="linhref="ode=EMUDOF" class="sref">EMUDOF) &am2i> 110outbound_lenoutb2" class="2                        2     2ports/a>);
 133       xpi="L = --set_curreexpi="pan>="ode=EMUDOF" class="sref">EMUDOF) &am2imm.c#L112e="L123"> 123       2     2                  outb2"& !<2te(&circ_b2te(& 1312f">circ_b2te(&circ_2yte(& 145{
emudat, tcode=EMUDOF" class="sref">EMUDOF) &am2ibug(2/a> + 3)
bfi2_jc_w2ite_buf.     int
      2                        2     2  emudflushat" cl"lin="+co t case where we mcommhanflushat" class="sref">emudatate);
circ_b2                        2
/1til_se/b"lino t case where we mcommhanof=">/1til_se/bfin_jtag_comm.cbfin_jtaef=">/1til_se/b"lin      circ_b2136"> 136           2    <2 href=}ef="+code=outbound_len" class="sref">outb2(2ty    er" clae_ua href="drivers/ttinibfin_jtag_comm.cttinibc_wrifin_read_DBGSTAT" classinibfin_jtag_comm.cT" classinibt" claref"ode=EMUDOF" class="sref">EMUDOF) &am2       bfin_jc_emudat_mana2NG" class2"sref">TASK_RUNNING)2
outb2 class="l2ne" name="L140"> 1402     2 return 0;
bfin_jc_write_buode=tty_pinibfin_jtag_comm.code=tty_pinibf="+code=bfin_read_DBGSTAef="+code=tty_struct" class="sref">tty_struct *2142
tty_struct *tty24houl1_stop"146" class="line"L75" id="La href="drivers/t/bfin_jtag_comm.c#L99"o t case where we comm.c#_cm.c=1pr_de1ug" cl#encomm.c#_cm.c=1ty/bfin_jtag_comm.c#L75" id= href="managdr= 114" id="L114" class= href="managdrf="d3"> 133       class="line" name="L145"> 3"> 133      DRV_NAMd="L142" class="DRV_NAMdlass="sref">tty_struct *circ_b2 href="+code=filp" class2"sref2>filp)
 -=IS_ERR="L142" class="IS_ERRty/bfin_jtag_comm.c#L75" id="La href="drivers/t/bfin_jtag_comm.c#L99" "ode=EMUDOF" class="sref">EMUDOF) &am2 ">circ_b2n_jtag_comm.c#L1" id="L42146" 24jc_write_buf" class="  140,
ock_2rqsavbfin_jc_write_burruct <1a href="+crer nam="Lrfin_jc_write_buENOMEMct <1a href="+cENOMEM namef="+code=outbound_len" class="sref">outb2="LL140" 2lass="line" name="L140">2140     f="+code=outbound_len" class="sref">outb2=G" class2bfin_jc_write_bu+ef="+code=bfin_jin_jc_write_buf"id="L)fin_jc_write_buf 120            40" class="line" name="L140"> 140     st2e" class=2sr1ef">i15uint32_t <2 href2"+code=s="sref">ports"+code=p href="drivers/tty/bfin_jtag_comm.c#L120" id="L120" class="line" name   3"> 133      GFP_KERNEass="line" name=GFP_KERNEaL99" id="L140" class="line" name="L140"> 140    ref=2driv1ers/tty/bfin_jtag_c2mm.c12L53"152int32_t     ">ports"+code=p href="drivers/tty/bfin_jtag_comm.c#L120" id="L120" class="line" name  EMUDOF) &am2);
<_up_p2ocesb_RUNNING);
 133       rrs/tty/bfin_jtag_com rrs/tt namef="+code=outbound_len" class="sref">outb2=& !<2ne" name="L137"> 1372   rc2int
b2inL141" class="line" nam2="L1425rite_buf" e 140">circ_b2s="line" name="L55">  552/a>
<2573"152int32_t     ">ports"+code=p href="d+code=y/bfin_jtag_comm.c#L120+code=_k1e"ode=EMUDOF" class="sref">EMUDOF) &am2)name="Ll2f="+code=tty" class="sre2">tty25_write_buf"id="L="L72goto"> 133       rrs+code=y/bfin_jtag_com rrs+code= namef="+code=outbound_len" class="sref">outb2=n>,
ock_2 href="+code=filp" class2"sref25>);
ci2146" 2lass="line" name="Ll.      L46href="d+code=y/bfin_jtag_comm.c#L120+code=_k1e->bfin_read_DBGSTA+code=_r1f"y/bfin_jtag_com+code=_r1f"ss="li t case where we DRV_NAMd="L142" class="DRV_NAMdlassef="+code=outbound_len" class="sref">outb2la/bd="L121" class="line" name="L121"> 126estorbfin_jc_write_bu+ef="+co+code=y/bfin_jtag_comm.c#L120+code=_k1e->bfin_read_DBGSTAr1f"y/bfin_jtag_comr1f"ss="liiiiiiii t case where we DEV_NAMd="L142" class="DEV_NAMdlassef="+code=outbound_len" class="sref">outb2l" class=2 ateoutb2l    ref=2rqsavbfin_jc_write_bu+ef="+co+code=y/bfin_jtag_comm.c#L120+code=_k1e->bfin_read_DBGSTAsubtyp"y/bfin_jtag_comsubtyp""linf="+co t case where we SERIAa_TYPE_NORMAass="line" name=SERIAa_TYPE_NORMAalassef="+code=outbound_len" class="sref">outb2l;
<_up_p2ef="+code=tty_driver1" c2a163i2t32_t emudinib_termiol_k1eo t case where we       d_termiolass="sref">emud      d_termiollassef="+code=outbound_len" class="sref">outb2l& !<2emudat id="L140" class="line" name="L140"> 140 140circ_b2lass="sref">tty_kref_put2/a>(<26ass="line" name="Ll.      L46146" class="line2>       140,
ock_2comm.c);
<_up_procesb_RU2NING<26rqsavboutbound_len -=rruct <1a href="+crer nam"ode=EMUDOF" class="sref">EMUDOF) &am2#L65" id=2L6L137" class="line" nam2="L1327te_buf. 133       rry/bfin_jtag_com rrlassef="+code=outbound_len" class="sref">outb2class="li2e" name="L30">  30#d2fin1r27    e 
ate 140);
emudat<2aING);
{
);
 133       rry/bfin_jtag_com rrlass: circ_b2yports"+code=porm.c#ort"+code=y/bfin_jtag_comm.c#ort"+code=ty/bfin_jtag_comm.c#L75" id=+code=y/bfin_jtag_comm.c#L120+code=_k1e id="L140" class="line" name="L140"> 140 == 0) 2
 133       rrs+code=y/bfin_jtag_com rrs+code= nam: ,
ock_2tail += circ)->kame="L131"> 131k        1">ports"+code=p href="drivers/tty/bfin_jtag_comm.c#L120" id="L120" class="line" name   140__s2t_curre> 133       rrs/tty/bfin_jtag_com rrs/tt nam: )-&2t+len ? 4 : bfin_jc_write_bucomm.c#_sto);
 140 outb2ite_buf"i2="L131" class="line" nam2="L132"> 131="L131" class="line" name="L131"> 1312"L143" cl2ss="line" name="L143"> 12328
 140{
 141}
EMUDOF) &am2f="+code=2f1in_re1d_DBGS# byte2bfin_jc_emudat_mana25" class=2line" name="L145"> 145{
);
 140,
ock_2 88                 2     28" class="sref">circ)->kame="L131"> 131k        1">ports"+code=p href="drivers/tty/bfin_jtag_comm.c#L120" id="L120" class="line" name   140 140bfin_jc_write_bum.c#ort"+code=y/bfin_jtag_comm.c#ort"+code=ty/bfin_jtag_comm.c#L75" id=+code=y/bfin_jtag_comm.c#L120+code=_k1e id="L140" class="line" name="L140"> 140schedule();
  41       2       140HZ);
tty_struct * 142
EMUDOF) &am2="L94" cl2ass="line" name="L94">  294 141}
.tailsic volatile struct , struct f2ine" name2="L98">  98         2     29filp)
pr_debug< 40" class="line" name="L140"> 140     st3s="sref">3int32_t tailsic volatile struct  13030=bfin_jc_write_buf" c"L1tinue class="line" name="L140"> 140     st3s2100" cl3sf">schedule();
ate =
 =
 131     volatile1 if (pr_debug< d="La href="drivers/teeEMUDOF) &am3>emudat;
tailsic volatile struct                     con3nboun30rs/tty/bfin_jtag_comme_buf" c"L1tinue class="line" name="L140"> 140     st3s6mudatss="line" name="L94">  3>,  dif45> =
emudat =
pr_debug<]L145" class="line" pr_debug<+1]L145" class="line" pr_debug<+2]L145" class="line" pr_debug<+3]   volatile1 if (#L96" id="L96" class="l3"+cod30jc_write_buf" class="="drive1rs/tty/a" class="sref">pr_debug< += 4  volatile1 if ( if (  41       3         3               41       3ss="sref"3tty);
 145{
 110 pr_debug<+6);
);
bfin_jtag_comm.c#L99" id="L1402/"h2         2  if ( ty"1 clas3k"L140"7gc idru00"7gc idru00"7gc idru00"7gc idruomm.c#L  *3ass21nt
<3 circ_b2 href="+code=sto);
 *3abug<+3]  ="driv1ers/tty/bfin_jtag3comm.31y"1 clas3 7mudat#L96" id="L96" c#L96" id="L96" class="l2ine" 29hr1ef="drive1rs/tty/bfin_jtastraightmef="drnode00"7gc idru00"7gc idru00"7gc idruomm.c#L <="> =
 =
 1f="dr nam3">tailsic volatile s3ruct 31y"1 clas3 8muelsety/bfin_jtag_comm.c#"line" name="L131"> 1f="+codlo"ruct f2ebugdat#L96" id="L96" c#L96" id"dring %zu)\n&quopan>, t case where we mcommhandl 3f="dr nam3f="+code=outbound_len" c3ass="3ref">o   3         3             ) ef">pr_2yte(& ty"1 clas3k"Lclasgc idru0te=1tty_indexe="L140"> ty"1 index clast *3pi="pan>=3ode=EMUDOF" class="sref"3EMUDO3) ct *3"+cobm.ck3f="+code=outbound_len" c3ass="3ref">outb2"&amgc idru0te=1tty_indexe="L140"> ty"1 index claref="+codlocla="drk1e="L140"> ty"1 clas3ksre +ef="+co+code=y/bfdexe="L140"> ty"1 index cla_k1ef_id="131" class="line" name="L131"> 3fss21nt
<3ers/tty/bfin_jtag_comm.c3L65" 32code=tty2d">c     2  1          3fbug<+3]  "L131" class="line" name3"L1313> 131<   3         3              140, t3ode=EMUDOF" class="sref"3EMUDO329a>) ef">pr_2yte(&3 class="l3     /1ti3slinhref=3     /1ti3slass="lin=1bfin_jc_emudat_manager3 1cla3s16="L30"2/a>      2            0" class="line" name="L140"de=ff" cl_ommef="dr=282_ANYTIin_jtag_comr1f"ss282_ANYTIin140"d="L142" class="li282_m.c#CBUFFE24jc_write_buf" 282_m.c#CBUFFE2a29a1til_se/bfin_jtag_comm.cbfin_jtaef=">/1ti3si="pan>=3      ty"1 index clare=ff-11til_se/bfin_jtag_comm.cbfin_jtaef=">/1ti3s+cobm.ck3     circ_b2136"> 136           2   3f="dr"lin3     circ_b2136"> 136           2   3fbug<+3]           er" clae_ua href="drivers/ttincode=bfi_jtag_comm.cmodulepinibty/bcode=bfi_jta_read_DBGSTAT" classexibfin_jtag_comm.cT" classexi3<2 href=}3f="+code=outbound_len" c3ass="33 href="h2         2  if (,
ock_2rqsav 3t" claref3ode=EMUDOF" class="sref"3EMUDO34e=1         pr_dat24udat_3anager" class="sref">bfi3_jc_e34"sref">circ)->+len ? 4 :  3tlass="linn 0;
);
tty_struct *2132
tty_struct * 1102132="dr"lin3sref">tty_struct *    er" cltty2d="L142" 2lass="line" name="L142">2132bug<+3]  ode=EMUDOF" class="sref"3EMUDO34#L55"1id2tag_comm.2c#L96" idearly"h2         2  if (href="dru0te=1tty_k1ef_hrefi2n class="line" name="L140"7gc idru0te=1tty_k1e="L140"> ty"1 clas3k"L140"7gc idru00"7gc idru00"7gc idru00"7gc idruomm.c#L .,
ock_2rqsav =
 1NOMEM nam3f="+code=outbound_len" c3ass="35ef">o   3         3             ) ef">pr_2yte(&    erdata" clae_ua href="driv_hrefi2n class="line" name="L140"7   2       *3RNEaL99" 3d="L140" class="line" na3e="L13516="L30"2/a>      2          bfin_jtag_comm.c#L120+code=_k1=ifin_read_DBGSTADRV_NAMd="L1early"BFJC_jc_write_buf *3R" class=3ode=EMUDOF" class="sref"3EMUDO35lass="sr2fmm.c#L1127;08x (pus              2   *3R
at  0" class="line" name="L140"de=ff" cl_ommef="dr=282_ANYTIin_jtag_comr1f"ss282_ANYTIin140"d="L142" class="li282_m.c#CBUFFE24jc_write_buf" 282_m.c#CBUFFE2a29a1til_se/bfin_jtag_comm.cbfin_jtaef=">/1ti3 rc2int
<3  ty"1 index clare=ff-11til_se/bfin_jtag_comm.cbfin_jtaef=">/1ti3e=ty/bf1 3d="L140" class="line" na3e="L135lass="sr2f">circ_b2136"> 136           2   3code=_k1e3ode=EMUDOF" class="sref"3EMUDO35"> 140) efef="dru0te=1tty_k1ef_hrefi2n class="line" name="L140"7g.c2L7etcoole_
ocksame="L137"2 137<2a>    er" cltty2d="L142" 2lass="line" name="L142">213ref25>);
3a hrclass="s"drivers/tty3bfin_3tag_co" cl_ommef="dr= 114" idearly"_jtag_comm.cmodulepinibty/bearly"_jtarnodea href="+/a>oct *3_NAMdlass3f="+code=outbound_len" c3ass="36"> 140circ_b2136"> 136           2   3ERIAalass3f="+code=outbound_len" c3ass="36ef">outb2ite_buf"i2="L131" class="line" nam2="3ORMAalass3f="+code=outbound_len" c3ass="3ref">o   3ss="sref"3tty);
 140{
 3d="L140" class="line" na3e="L130"> 14" id=+code=y/bfMODULE_AUTHO24jc_write_buf" MODULE_AUTHO2rnode0in_read_DBGSTADRV_NAMd="L1Mike FrysRV_er_com vapier@gentoo.orgre +NAMdlass )      bfin_jc_write_buf: inibializedtag_co3=_k1e, 0 3d="L140" class="line" na3e="L136#L55"1id2tag_comm.2cMODULE_DESCRIPTION4jc_write_buf" MODULE_DESCRIPTIONrnode0in_read_DBGSTADRV_NAMd="L1TTY orit Blackini "+co Cdtaunic"lineNAMdlass )      bfin_jc_write_buf: inibializedtag_co3=ode=_k1e3line" name="Ll.      L46346" c36cksref"145" class="lMODULE_LICENSn_jtag_comr1f"ssMODULE_LICENSnrnode0in_read_DBGSTADRV_NAMd="L1GPLNAMdlass )      bfin_jc_write_buf: inibializedtag_co3=ode= nam3d="L140" class="line" na3e="L130"> 14


The original LXR software by thNFIG_BFIN_Jhttp://sourceforge.net/projects/lx2<>LXR cdtauni lx2@assux.no .
lx2.assux.no kindly host="+by IG_BFIN_Jhttp://www.redpill-asspro.no">Redpill Lsspro AS