sdla_chdlc.c 121 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428
  1. /*****************************************************************************
  2. * sdla_chdlc.c WANPIPE(tm) Multiprotocol WAN Link Driver. Cisco HDLC module.
  3. *
  4. * Authors: Nenad Corbic <ncorbic@sangoma.com>
  5. * Gideon Hack
  6. *
  7. * Copyright: (c) 1995-2001 Sangoma Technologies Inc.
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License
  11. * as published by the Free Software Foundation; either version
  12. * 2 of the License, or (at your option) any later version.
  13. * ============================================================================
  14. * Feb 28, 2001 Nenad Corbic Updated if_tx_timeout() routine for
  15. * 2.4.X kernels.
  16. * Jan 25, 2001 Nenad Corbic Added a TTY Sync serial driver over the
  17. * HDLC streaming protocol
  18. * Added a TTY Async serial driver over the
  19. * Async protocol.
  20. * Dec 15, 2000 Nenad Corbic Updated for 2.4.X Kernel support
  21. * Nov 13, 2000 Nenad Corbic Added true interface type encoding option.
  22. * Tcpdump doesn't support CHDLC inteface
  23. * types, to fix this "true type" option will set
  24. * the interface type to RAW IP mode.
  25. * Nov 07, 2000 Nenad Corbic Added security features for UDP debugging:
  26. * Deny all and specify allowed requests.
  27. * Jun 20, 2000 Nenad Corbic Fixed the API IP ERROR bug. Caused by the
  28. * latest update.
  29. * May 09, 2000 Nenad Corbic Option to bring down an interface
  30. * upon disconnect.
  31. * Mar 23, 2000 Nenad Corbic Improved task queue, bh handling.
  32. * Mar 16, 2000 Nenad Corbic Fixed the SLARP Dynamic IP addressing.
  33. * Mar 06, 2000 Nenad Corbic Bug Fix: corrupted mbox recovery.
  34. * Feb 10, 2000 Gideon Hack Added ASYNC support.
  35. * Feb 09, 2000 Nenad Corbic Fixed two shutdown bugs in update() and
  36. * if_stats() functions.
  37. * Jan 24, 2000 Nenad Corbic Fixed a startup wanpipe state racing,
  38. * condition between if_open and isr.
  39. * Jan 10, 2000 Nenad Corbic Added new socket API support.
  40. * Dev 15, 1999 Nenad Corbic Fixed up header files for 2.0.X kernels
  41. * Nov 20, 1999 Nenad Corbic Fixed zero length API bug.
  42. * Sep 30, 1999 Nenad Corbic Fixed dynamic IP and route setup.
  43. * Sep 23, 1999 Nenad Corbic Added SMP support, fixed tracing
  44. * Sep 13, 1999 Nenad Corbic Split up Port 0 and 1 into separate devices.
  45. * Jun 02, 1999 Gideon Hack Added support for the S514 adapter.
  46. * Oct 30, 1998 Jaspreet Singh Added Support for CHDLC API (HDLC STREAMING).
  47. * Oct 28, 1998 Jaspreet Singh Added Support for Dual Port CHDLC.
  48. * Aug 07, 1998 David Fong Initial version.
  49. *****************************************************************************/
  50. #include <linux/module.h>
  51. #include <linux/kernel.h> /* printk(), and other useful stuff */
  52. #include <linux/stddef.h> /* offsetof(), etc. */
  53. #include <linux/errno.h> /* return codes */
  54. #include <linux/string.h> /* inline memset(), etc. */
  55. #include <linux/slab.h> /* kmalloc(), kfree() */
  56. #include <linux/wanrouter.h> /* WAN router definitions */
  57. #include <linux/wanpipe.h> /* WANPIPE common user API definitions */
  58. #include <linux/if_arp.h> /* ARPHRD_* defines */
  59. #include <asm/uaccess.h>
  60. #include <linux/inetdevice.h>
  61. #include <linux/netdevice.h>
  62. #include <linux/in.h> /* sockaddr_in */
  63. #include <linux/inet.h>
  64. #include <linux/if.h>
  65. #include <asm/byteorder.h> /* htons(), etc. */
  66. #include <linux/sdlapci.h>
  67. #include <asm/io.h>
  68. #include <linux/sdla_chdlc.h> /* CHDLC firmware API definitions */
  69. #include <linux/sdla_asy.h> /* CHDLC (async) API definitions */
  70. #include <linux/if_wanpipe_common.h> /* Socket Driver common area */
  71. #include <linux/if_wanpipe.h>
  72. /* TTY Includes */
  73. #include <linux/tty.h>
  74. #include <linux/tty_flip.h>
  75. #include <linux/serial.h>
  76. /****** Defines & Macros ****************************************************/
  77. /* reasons for enabling the timer interrupt on the adapter */
  78. #define TMR_INT_ENABLED_UDP 0x01
  79. #define TMR_INT_ENABLED_UPDATE 0x02
  80. #define TMR_INT_ENABLED_CONFIG 0x10
  81. #define MAX_IP_ERRORS 10
  82. #define TTY_CHDLC_MAX_MTU 2000
  83. #define CHDLC_DFLT_DATA_LEN 1500 /* default MTU */
  84. #define CHDLC_HDR_LEN 1
  85. #define CHDLC_API 0x01
  86. #define PORT(x) (x == 0 ? "PRIMARY" : "SECONDARY" )
  87. #define MAX_BH_BUFF 10
  88. //#define PRINT_DEBUG
  89. #ifdef PRINT_DEBUG
  90. #define dbg_printk(format, a...) printk(format, ## a)
  91. #else
  92. #define dbg_printk(format, a...)
  93. #endif
  94. /******Data Structures*****************************************************/
  95. /* This structure is placed in the private data area of the device structure.
  96. * The card structure used to occupy the private area but now the following
  97. * structure will incorporate the card structure along with CHDLC specific data
  98. */
  99. typedef struct chdlc_private_area
  100. {
  101. wanpipe_common_t common;
  102. sdla_t *card;
  103. int TracingEnabled; /* For enabling Tracing */
  104. unsigned long curr_trace_addr; /* Used for Tracing */
  105. unsigned long start_trace_addr;
  106. unsigned long end_trace_addr;
  107. unsigned long base_addr_trace_buffer;
  108. unsigned long end_addr_trace_buffer;
  109. unsigned short number_trace_elements;
  110. unsigned available_buffer_space;
  111. unsigned long router_start_time;
  112. unsigned char route_status;
  113. unsigned char route_removed;
  114. unsigned long tick_counter; /* For 5s timeout counter */
  115. unsigned long router_up_time;
  116. u32 IP_address; /* IP addressing */
  117. u32 IP_netmask;
  118. u32 ip_local;
  119. u32 ip_remote;
  120. u32 ip_local_tmp;
  121. u32 ip_remote_tmp;
  122. u8 ip_error;
  123. u8 config_chdlc;
  124. u8 config_chdlc_timeout;
  125. unsigned char mc; /* Mulitcast support on/off */
  126. unsigned short udp_pkt_lgth; /* udp packet processing */
  127. char udp_pkt_src;
  128. char udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT];
  129. unsigned short timer_int_enabled;
  130. char update_comms_stats; /* updating comms stats */
  131. bh_data_t *bh_head; /* Circular buffer for chdlc_bh */
  132. unsigned long tq_working;
  133. volatile int bh_write;
  134. volatile int bh_read;
  135. atomic_t bh_buff_used;
  136. unsigned char interface_down;
  137. /* Polling work queue entry. Each interface
  138. * has its own work queue entry, which is used
  139. * to defer events from the interrupt */
  140. struct work_struct poll_work;
  141. struct timer_list poll_delay_timer;
  142. u8 gateway;
  143. u8 true_if_encoding;
  144. //FIXME: add driver stats as per frame relay!
  145. } chdlc_private_area_t;
  146. /* Route Status options */
  147. #define NO_ROUTE 0x00
  148. #define ADD_ROUTE 0x01
  149. #define ROUTE_ADDED 0x02
  150. #define REMOVE_ROUTE 0x03
  151. /* variable for keeping track of enabling/disabling FT1 monitor status */
  152. static int rCount = 0;
  153. /* variable for tracking how many interfaces to open for WANPIPE on the
  154. two ports */
  155. extern void disable_irq(unsigned int);
  156. extern void enable_irq(unsigned int);
  157. /****** Function Prototypes *************************************************/
  158. /* WAN link driver entry points. These are called by the WAN router module. */
  159. static int update(struct wan_device* wandev);
  160. static int new_if(struct wan_device* wandev, struct net_device* dev,
  161. wanif_conf_t* conf);
  162. /* Network device interface */
  163. static int if_init(struct net_device* dev);
  164. static int if_open(struct net_device* dev);
  165. static int if_close(struct net_device* dev);
  166. static int if_header(struct sk_buff* skb, struct net_device* dev,
  167. unsigned short type, void* daddr, void* saddr,
  168. unsigned len);
  169. static int if_rebuild_hdr (struct sk_buff *skb);
  170. static struct net_device_stats* if_stats(struct net_device* dev);
  171. static int if_send(struct sk_buff* skb, struct net_device* dev);
  172. /* CHDLC Firmware interface functions */
  173. static int chdlc_configure (sdla_t* card, void* data);
  174. static int chdlc_comm_enable (sdla_t* card);
  175. static int chdlc_read_version (sdla_t* card, char* str);
  176. static int chdlc_set_intr_mode (sdla_t* card, unsigned mode);
  177. static int chdlc_send (sdla_t* card, void* data, unsigned len);
  178. static int chdlc_read_comm_err_stats (sdla_t* card);
  179. static int chdlc_read_op_stats (sdla_t* card);
  180. static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb);
  181. static int chdlc_disable_comm_shutdown (sdla_t *card);
  182. static void if_tx_timeout(struct net_device *dev);
  183. /* Miscellaneous CHDLC Functions */
  184. static int set_chdlc_config (sdla_t* card);
  185. static void init_chdlc_tx_rx_buff( sdla_t* card);
  186. static int process_chdlc_exception(sdla_t *card);
  187. static int process_global_exception(sdla_t *card);
  188. static int update_comms_stats(sdla_t* card,
  189. chdlc_private_area_t* chdlc_priv_area);
  190. static int configure_ip (sdla_t* card);
  191. static int unconfigure_ip (sdla_t* card);
  192. static void process_route(sdla_t *card);
  193. static void port_set_state (sdla_t *card, int);
  194. static int config_chdlc (sdla_t *card);
  195. static void disable_comm (sdla_t *card);
  196. static void trigger_chdlc_poll(struct net_device *dev);
  197. static void chdlc_poll(struct net_device *dev);
  198. static void chdlc_poll_delay (unsigned long dev_ptr);
  199. /* Miscellaneous asynchronous interface Functions */
  200. static int set_asy_config (sdla_t* card);
  201. static int asy_comm_enable (sdla_t* card);
  202. /* Interrupt handlers */
  203. static void wpc_isr (sdla_t* card);
  204. static void rx_intr (sdla_t* card);
  205. static void timer_intr(sdla_t *);
  206. /* Bottom half handlers */
  207. static void chdlc_work(struct net_device *dev);
  208. static int chdlc_work_cleanup(struct net_device *dev);
  209. static int bh_enqueue(struct net_device *dev, struct sk_buff *skb);
  210. /* Miscellaneous functions */
  211. static int chk_bcast_mcast_addr(sdla_t* card, struct net_device* dev,
  212. struct sk_buff *skb);
  213. static int reply_udp( unsigned char *data, unsigned int mbox_len );
  214. static int intr_test( sdla_t* card);
  215. static int udp_pkt_type( struct sk_buff *skb , sdla_t* card);
  216. static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card,
  217. struct sk_buff *skb, struct net_device* dev,
  218. chdlc_private_area_t* chdlc_priv_area);
  219. static int process_udp_mgmt_pkt(sdla_t* card, struct net_device* dev,
  220. chdlc_private_area_t* chdlc_priv_area);
  221. static unsigned short calc_checksum (char *, int);
  222. static void s508_lock (sdla_t *card, unsigned long *smp_flags);
  223. static void s508_unlock (sdla_t *card, unsigned long *smp_flags);
  224. static int Intr_test_counter;
  225. /* TTY Global Definitions */
  226. #define NR_PORTS 4
  227. #define WAN_TTY_MAJOR 226
  228. #define WAN_TTY_MINOR 0
  229. #define WAN_CARD(port) (tty_card_map[port])
  230. #define MIN_PORT 0
  231. #define MAX_PORT NR_PORTS-1
  232. #define CRC_LENGTH 2
  233. static int wanpipe_tty_init(sdla_t *card);
  234. static void wanpipe_tty_receive(sdla_t *, unsigned, unsigned int);
  235. static void wanpipe_tty_trigger_poll(sdla_t *card);
  236. static struct tty_driver serial_driver;
  237. static int tty_init_cnt=0;
  238. static struct serial_state rs_table[NR_PORTS];
  239. static char tty_driver_mode=WANOPT_TTY_SYNC;
  240. static char *opt_decode[] = {"NONE","CRTSCTS","XONXOFF-RX",
  241. "CRTSCTS XONXOFF-RX","XONXOFF-TX",
  242. "CRTSCTS XONXOFF-TX","CRTSCTS XONXOFF"};
  243. static char *p_decode[] = {"NONE","ODD","EVEN"};
  244. static void* tty_card_map[NR_PORTS] = {NULL,NULL,NULL,NULL};
  245. /****** Public Functions ****************************************************/
  246. /*============================================================================
  247. * Cisco HDLC protocol initialization routine.
  248. *
  249. * This routine is called by the main WANPIPE module during setup. At this
  250. * point adapter is completely initialized and firmware is running.
  251. * o read firmware version (to make sure it's alive)
  252. * o configure adapter
  253. * o initialize protocol-specific fields of the adapter data space.
  254. *
  255. * Return: 0 o.k.
  256. * < 0 failure.
  257. */
  258. int wpc_init (sdla_t* card, wandev_conf_t* conf)
  259. {
  260. unsigned char port_num;
  261. int err;
  262. unsigned long max_permitted_baud = 0;
  263. SHARED_MEMORY_INFO_STRUCT *flags;
  264. union
  265. {
  266. char str[80];
  267. } u;
  268. volatile CHDLC_MAILBOX_STRUCT* mb;
  269. CHDLC_MAILBOX_STRUCT* mb1;
  270. unsigned long timeout;
  271. /* Verify configuration ID */
  272. if (conf->config_id != WANCONFIG_CHDLC) {
  273. printk(KERN_INFO "%s: invalid configuration ID %u!\n",
  274. card->devname, conf->config_id);
  275. return -EINVAL;
  276. }
  277. /* Find out which Port to use */
  278. if ((conf->comm_port == WANOPT_PRI) || (conf->comm_port == WANOPT_SEC)){
  279. if (card->next){
  280. if (conf->comm_port != card->next->u.c.comm_port){
  281. card->u.c.comm_port = conf->comm_port;
  282. }else{
  283. printk(KERN_INFO "%s: ERROR - %s port used!\n",
  284. card->wandev.name, PORT(conf->comm_port));
  285. return -EINVAL;
  286. }
  287. }else{
  288. card->u.c.comm_port = conf->comm_port;
  289. }
  290. }else{
  291. printk(KERN_INFO "%s: ERROR - Invalid Port Selected!\n",
  292. card->wandev.name);
  293. return -EINVAL;
  294. }
  295. /* Initialize protocol-specific fields */
  296. if(card->hw.type != SDLA_S514){
  297. if (card->u.c.comm_port == WANOPT_PRI){
  298. card->mbox = (void *) card->hw.dpmbase;
  299. }else{
  300. card->mbox = (void *) card->hw.dpmbase +
  301. SEC_BASE_ADDR_MB_STRUCT - PRI_BASE_ADDR_MB_STRUCT;
  302. }
  303. }else{
  304. /* for a S514 adapter, set a pointer to the actual mailbox in the */
  305. /* allocated virtual memory area */
  306. if (card->u.c.comm_port == WANOPT_PRI){
  307. card->mbox = (void *) card->hw.dpmbase + PRI_BASE_ADDR_MB_STRUCT;
  308. }else{
  309. card->mbox = (void *) card->hw.dpmbase + SEC_BASE_ADDR_MB_STRUCT;
  310. }
  311. }
  312. mb = mb1 = card->mbox;
  313. if (!card->configured){
  314. /* The board will place an 'I' in the return code to indicate that it is
  315. ready to accept commands. We expect this to be completed in less
  316. than 1 second. */
  317. timeout = jiffies;
  318. while (mb->return_code != 'I') /* Wait 1s for board to initialize */
  319. if ((jiffies - timeout) > 1*HZ) break;
  320. if (mb->return_code != 'I') {
  321. printk(KERN_INFO
  322. "%s: Initialization not completed by adapter\n",
  323. card->devname);
  324. printk(KERN_INFO "Please contact Sangoma representative.\n");
  325. return -EIO;
  326. }
  327. }
  328. /* Read firmware version. Note that when adapter initializes, it
  329. * clears the mailbox, so it may appear that the first command was
  330. * executed successfully when in fact it was merely erased. To work
  331. * around this, we execute the first command twice.
  332. */
  333. if (chdlc_read_version(card, u.str))
  334. return -EIO;
  335. printk(KERN_INFO "%s: Running Cisco HDLC firmware v%s\n",
  336. card->devname, u.str);
  337. card->isr = &wpc_isr;
  338. card->poll = NULL;
  339. card->exec = NULL;
  340. card->wandev.update = &update;
  341. card->wandev.new_if = &new_if;
  342. card->wandev.del_if = NULL;
  343. card->wandev.udp_port = conf->udp_port;
  344. card->disable_comm = &disable_comm;
  345. card->wandev.new_if_cnt = 0;
  346. /* reset the number of times the 'update()' proc has been called */
  347. card->u.c.update_call_count = 0;
  348. card->wandev.ttl = conf->ttl;
  349. card->wandev.interface = conf->interface;
  350. if ((card->u.c.comm_port == WANOPT_SEC && conf->interface == WANOPT_V35)&&
  351. card->hw.type != SDLA_S514){
  352. printk(KERN_INFO "%s: ERROR - V35 Interface not supported on S508 %s port \n",
  353. card->devname, PORT(card->u.c.comm_port));
  354. return -EIO;
  355. }
  356. card->wandev.clocking = conf->clocking;
  357. port_num = card->u.c.comm_port;
  358. /* in API mode, we can configure for "receive only" buffering */
  359. if(card->hw.type == SDLA_S514) {
  360. card->u.c.receive_only = conf->receive_only;
  361. if(conf->receive_only) {
  362. printk(KERN_INFO
  363. "%s: Configured for 'receive only' mode\n",
  364. card->devname);
  365. }
  366. }
  367. /* Setup Port Bps */
  368. if(card->wandev.clocking) {
  369. if((port_num == WANOPT_PRI) || card->u.c.receive_only) {
  370. /* For Primary Port 0 */
  371. max_permitted_baud =
  372. (card->hw.type == SDLA_S514) ?
  373. PRI_MAX_BAUD_RATE_S514 :
  374. PRI_MAX_BAUD_RATE_S508;
  375. }else if(port_num == WANOPT_SEC) {
  376. /* For Secondary Port 1 */
  377. max_permitted_baud =
  378. (card->hw.type == SDLA_S514) ?
  379. SEC_MAX_BAUD_RATE_S514 :
  380. SEC_MAX_BAUD_RATE_S508;
  381. }
  382. if(conf->bps > max_permitted_baud) {
  383. conf->bps = max_permitted_baud;
  384. printk(KERN_INFO "%s: Baud too high!\n",
  385. card->wandev.name);
  386. printk(KERN_INFO "%s: Baud rate set to %lu bps\n",
  387. card->wandev.name, max_permitted_baud);
  388. }
  389. card->wandev.bps = conf->bps;
  390. }else{
  391. card->wandev.bps = 0;
  392. }
  393. /* Setup the Port MTU */
  394. if((port_num == WANOPT_PRI) || card->u.c.receive_only) {
  395. /* For Primary Port 0 */
  396. card->wandev.mtu =
  397. (conf->mtu >= MIN_LGTH_CHDLC_DATA_CFG) ?
  398. min_t(unsigned int, conf->mtu, PRI_MAX_NO_DATA_BYTES_IN_FRAME) :
  399. CHDLC_DFLT_DATA_LEN;
  400. } else if(port_num == WANOPT_SEC) {
  401. /* For Secondary Port 1 */
  402. card->wandev.mtu =
  403. (conf->mtu >= MIN_LGTH_CHDLC_DATA_CFG) ?
  404. min_t(unsigned int, conf->mtu, SEC_MAX_NO_DATA_BYTES_IN_FRAME) :
  405. CHDLC_DFLT_DATA_LEN;
  406. }
  407. /* Set up the interrupt status area */
  408. /* Read the CHDLC Configuration and obtain:
  409. * Ptr to shared memory infor struct
  410. * Use this pointer to calculate the value of card->u.c.flags !
  411. */
  412. mb1->buffer_length = 0;
  413. mb1->command = READ_CHDLC_CONFIGURATION;
  414. err = sdla_exec(mb1) ? mb1->return_code : CMD_TIMEOUT;
  415. if(err != COMMAND_OK) {
  416. if(card->hw.type != SDLA_S514)
  417. enable_irq(card->hw.irq);
  418. chdlc_error(card, err, mb1);
  419. return -EIO;
  420. }
  421. if(card->hw.type == SDLA_S514){
  422. card->u.c.flags = (void *)(card->hw.dpmbase +
  423. (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)->
  424. ptr_shared_mem_info_struct));
  425. }else{
  426. card->u.c.flags = (void *)(card->hw.dpmbase +
  427. (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)->
  428. ptr_shared_mem_info_struct % SDLA_WINDOWSIZE));
  429. }
  430. flags = card->u.c.flags;
  431. /* This is for the ports link state */
  432. card->wandev.state = WAN_DUALPORT;
  433. card->u.c.state = WAN_DISCONNECTED;
  434. if (!card->wandev.piggyback){
  435. int err;
  436. /* Perform interrupt testing */
  437. err = intr_test(card);
  438. if(err || (Intr_test_counter < MAX_INTR_TEST_COUNTER)) {
  439. printk(KERN_INFO "%s: Interrupt test failed (%i)\n",
  440. card->devname, Intr_test_counter);
  441. printk(KERN_INFO "%s: Please choose another interrupt\n",
  442. card->devname);
  443. return -EIO;
  444. }
  445. printk(KERN_INFO "%s: Interrupt test passed (%i)\n",
  446. card->devname, Intr_test_counter);
  447. card->configured = 1;
  448. }
  449. if ((card->tty_opt=conf->tty) == WANOPT_YES){
  450. int err;
  451. card->tty_minor = conf->tty_minor;
  452. /* On ASYNC connections internal clocking
  453. * is mandatory */
  454. if ((card->u.c.async_mode = conf->tty_mode)){
  455. card->wandev.clocking = 1;
  456. }
  457. err=wanpipe_tty_init(card);
  458. if (err){
  459. return err;
  460. }
  461. }else{
  462. if (chdlc_set_intr_mode(card, APP_INT_ON_TIMER)){
  463. printk (KERN_INFO "%s: "
  464. "Failed to set interrupt triggers!\n",
  465. card->devname);
  466. return -EIO;
  467. }
  468. /* Mask the Timer interrupt */
  469. flags->interrupt_info_struct.interrupt_permission &=
  470. ~APP_INT_ON_TIMER;
  471. }
  472. /* If we are using CHDLC in backup mode, this flag will
  473. * indicate not to look for IP addresses in config_chdlc()*/
  474. card->u.c.backup = conf->backup;
  475. printk(KERN_INFO "\n");
  476. return 0;
  477. }
  478. /******* WAN Device Driver Entry Points *************************************/
  479. /*============================================================================
  480. * Update device status & statistics
  481. * This procedure is called when updating the PROC file system and returns
  482. * various communications statistics. These statistics are accumulated from 3
  483. * different locations:
  484. * 1) The 'if_stats' recorded for the device.
  485. * 2) Communication error statistics on the adapter.
  486. * 3) CHDLC operational statistics on the adapter.
  487. * The board level statistics are read during a timer interrupt. Note that we
  488. * read the error and operational statistics during consecitive timer ticks so
  489. * as to minimize the time that we are inside the interrupt handler.
  490. *
  491. */
  492. static int update(struct wan_device* wandev)
  493. {
  494. sdla_t* card = wandev->private;
  495. struct net_device* dev;
  496. volatile chdlc_private_area_t* chdlc_priv_area;
  497. SHARED_MEMORY_INFO_STRUCT *flags;
  498. unsigned long timeout;
  499. /* sanity checks */
  500. if((wandev == NULL) || (wandev->private == NULL))
  501. return -EFAULT;
  502. if(wandev->state == WAN_UNCONFIGURED)
  503. return -ENODEV;
  504. /* more sanity checks */
  505. if(!card->u.c.flags)
  506. return -ENODEV;
  507. if(test_bit(PERI_CRIT, (void*)&card->wandev.critical))
  508. return -EAGAIN;
  509. if((dev=card->wandev.dev) == NULL)
  510. return -ENODEV;
  511. if((chdlc_priv_area=dev->priv) == NULL)
  512. return -ENODEV;
  513. flags = card->u.c.flags;
  514. if(chdlc_priv_area->update_comms_stats){
  515. return -EAGAIN;
  516. }
  517. /* we will need 2 timer interrupts to complete the */
  518. /* reading of the statistics */
  519. chdlc_priv_area->update_comms_stats = 2;
  520. flags->interrupt_info_struct.interrupt_permission |= APP_INT_ON_TIMER;
  521. chdlc_priv_area->timer_int_enabled = TMR_INT_ENABLED_UPDATE;
  522. /* wait a maximum of 1 second for the statistics to be updated */
  523. timeout = jiffies;
  524. for(;;) {
  525. if(chdlc_priv_area->update_comms_stats == 0)
  526. break;
  527. if ((jiffies - timeout) > (1 * HZ)){
  528. chdlc_priv_area->update_comms_stats = 0;
  529. chdlc_priv_area->timer_int_enabled &=
  530. ~TMR_INT_ENABLED_UPDATE;
  531. return -EAGAIN;
  532. }
  533. }
  534. return 0;
  535. }
  536. /*============================================================================
  537. * Create new logical channel.
  538. * This routine is called by the router when ROUTER_IFNEW IOCTL is being
  539. * handled.
  540. * o parse media- and hardware-specific configuration
  541. * o make sure that a new channel can be created
  542. * o allocate resources, if necessary
  543. * o prepare network device structure for registaration.
  544. *
  545. * Return: 0 o.k.
  546. * < 0 failure (channel will not be created)
  547. */
  548. static int new_if(struct wan_device* wandev, struct net_device* dev,
  549. wanif_conf_t* conf)
  550. {
  551. sdla_t* card = wandev->private;
  552. chdlc_private_area_t* chdlc_priv_area;
  553. printk(KERN_INFO "%s: Configuring Interface: %s\n",
  554. card->devname, conf->name);
  555. if ((conf->name[0] == '\0') || (strlen(conf->name) > WAN_IFNAME_SZ)) {
  556. printk(KERN_INFO "%s: Invalid interface name!\n",
  557. card->devname);
  558. return -EINVAL;
  559. }
  560. /* allocate and initialize private data */
  561. chdlc_priv_area = kmalloc(sizeof(chdlc_private_area_t), GFP_KERNEL);
  562. if(chdlc_priv_area == NULL)
  563. return -ENOMEM;
  564. memset(chdlc_priv_area, 0, sizeof(chdlc_private_area_t));
  565. chdlc_priv_area->card = card;
  566. chdlc_priv_area->common.sk = NULL;
  567. chdlc_priv_area->common.func = NULL;
  568. /* initialize data */
  569. strcpy(card->u.c.if_name, conf->name);
  570. if(card->wandev.new_if_cnt > 0) {
  571. kfree(chdlc_priv_area);
  572. return -EEXIST;
  573. }
  574. card->wandev.new_if_cnt++;
  575. chdlc_priv_area->TracingEnabled = 0;
  576. chdlc_priv_area->route_status = NO_ROUTE;
  577. chdlc_priv_area->route_removed = 0;
  578. card->u.c.async_mode = conf->async_mode;
  579. /* setup for asynchronous mode */
  580. if(conf->async_mode) {
  581. printk(KERN_INFO "%s: Configuring for asynchronous mode\n",
  582. wandev->name);
  583. if(card->u.c.comm_port == WANOPT_PRI) {
  584. printk(KERN_INFO
  585. "%s:Asynchronous mode on secondary port only\n",
  586. wandev->name);
  587. kfree(chdlc_priv_area);
  588. return -EINVAL;
  589. }
  590. if(strcmp(conf->usedby, "WANPIPE") == 0) {
  591. printk(KERN_INFO
  592. "%s: Running in WANIPE Async Mode\n", wandev->name);
  593. card->u.c.usedby = WANPIPE;
  594. }else{
  595. card->u.c.usedby = API;
  596. }
  597. if(!card->wandev.clocking) {
  598. printk(KERN_INFO
  599. "%s: Asynch. clocking must be 'Internal'\n",
  600. wandev->name);
  601. kfree(chdlc_priv_area);
  602. return -EINVAL;
  603. }
  604. if((card->wandev.bps < MIN_ASY_BAUD_RATE) ||
  605. (card->wandev.bps > MAX_ASY_BAUD_RATE)) {
  606. printk(KERN_INFO "%s: Selected baud rate is invalid.\n",
  607. wandev->name);
  608. printk(KERN_INFO "Must be between %u and %u bps.\n",
  609. MIN_ASY_BAUD_RATE, MAX_ASY_BAUD_RATE);
  610. kfree(chdlc_priv_area);
  611. return -EINVAL;
  612. }
  613. card->u.c.api_options = 0;
  614. if (conf->asy_data_trans == WANOPT_YES) {
  615. card->u.c.api_options |= ASY_RX_DATA_TRANSPARENT;
  616. }
  617. card->u.c.protocol_options = 0;
  618. if (conf->rts_hs_for_receive == WANOPT_YES) {
  619. card->u.c.protocol_options |= ASY_RTS_HS_FOR_RX;
  620. }
  621. if (conf->xon_xoff_hs_for_receive == WANOPT_YES) {
  622. card->u.c.protocol_options |= ASY_XON_XOFF_HS_FOR_RX;
  623. }
  624. if (conf->xon_xoff_hs_for_transmit == WANOPT_YES) {
  625. card->u.c.protocol_options |= ASY_XON_XOFF_HS_FOR_TX;
  626. }
  627. if (conf->dcd_hs_for_transmit == WANOPT_YES) {
  628. card->u.c.protocol_options |= ASY_DCD_HS_FOR_TX;
  629. }
  630. if (conf->cts_hs_for_transmit == WANOPT_YES) {
  631. card->u.c.protocol_options |= ASY_CTS_HS_FOR_TX;
  632. }
  633. card->u.c.tx_bits_per_char = conf->tx_bits_per_char;
  634. card->u.c.rx_bits_per_char = conf->rx_bits_per_char;
  635. card->u.c.stop_bits = conf->stop_bits;
  636. card->u.c.parity = conf->parity;
  637. card->u.c.break_timer = conf->break_timer;
  638. card->u.c.inter_char_timer = conf->inter_char_timer;
  639. card->u.c.rx_complete_length = conf->rx_complete_length;
  640. card->u.c.xon_char = conf->xon_char;
  641. } else { /* setup for synchronous mode */
  642. card->u.c.protocol_options = 0;
  643. if (conf->ignore_dcd == WANOPT_YES){
  644. card->u.c.protocol_options |= IGNORE_DCD_FOR_LINK_STAT;
  645. }
  646. if (conf->ignore_cts == WANOPT_YES){
  647. card->u.c.protocol_options |= IGNORE_CTS_FOR_LINK_STAT;
  648. }
  649. if (conf->ignore_keepalive == WANOPT_YES) {
  650. card->u.c.protocol_options |=
  651. IGNORE_KPALV_FOR_LINK_STAT;
  652. card->u.c.kpalv_tx = MIN_Tx_KPALV_TIMER;
  653. card->u.c.kpalv_rx = MIN_Rx_KPALV_TIMER;
  654. card->u.c.kpalv_err = MIN_KPALV_ERR_TOL;
  655. } else { /* Do not ignore keepalives */
  656. card->u.c.kpalv_tx =
  657. ((conf->keepalive_tx_tmr - MIN_Tx_KPALV_TIMER)
  658. >= 0) ?
  659. min_t(unsigned int, conf->keepalive_tx_tmr,MAX_Tx_KPALV_TIMER) :
  660. DEFAULT_Tx_KPALV_TIMER;
  661. card->u.c.kpalv_rx =
  662. ((conf->keepalive_rx_tmr - MIN_Rx_KPALV_TIMER)
  663. >= 0) ?
  664. min_t(unsigned int, conf->keepalive_rx_tmr,MAX_Rx_KPALV_TIMER) :
  665. DEFAULT_Rx_KPALV_TIMER;
  666. card->u.c.kpalv_err =
  667. ((conf->keepalive_err_margin-MIN_KPALV_ERR_TOL)
  668. >= 0) ?
  669. min_t(unsigned int, conf->keepalive_err_margin,
  670. MAX_KPALV_ERR_TOL) :
  671. DEFAULT_KPALV_ERR_TOL;
  672. }
  673. /* Setup slarp timer to control delay between slarps */
  674. card->u.c.slarp_timer =
  675. ((conf->slarp_timer - MIN_SLARP_REQ_TIMER) >= 0) ?
  676. min_t(unsigned int, conf->slarp_timer, MAX_SLARP_REQ_TIMER) :
  677. DEFAULT_SLARP_REQ_TIMER;
  678. if (conf->hdlc_streaming == WANOPT_YES) {
  679. printk(KERN_INFO "%s: Enabling HDLC STREAMING Mode\n",
  680. wandev->name);
  681. card->u.c.protocol_options = HDLC_STREAMING_MODE;
  682. }
  683. if ((chdlc_priv_area->true_if_encoding = conf->true_if_encoding) == WANOPT_YES){
  684. printk(KERN_INFO
  685. "%s: Enabling, true interface type encoding.\n",
  686. card->devname);
  687. }
  688. /* Setup wanpipe as a router (WANPIPE) or as an API */
  689. if( strcmp(conf->usedby, "WANPIPE") == 0) {
  690. printk(KERN_INFO "%s: Running in WANPIPE mode!\n",
  691. wandev->name);
  692. card->u.c.usedby = WANPIPE;
  693. /* Option to bring down the interface when
  694. * the link goes down */
  695. if (conf->if_down){
  696. set_bit(DYN_OPT_ON,&chdlc_priv_area->interface_down);
  697. printk(KERN_INFO
  698. "%s: Dynamic interface configuration enabled\n",
  699. card->devname);
  700. }
  701. } else if( strcmp(conf->usedby, "API") == 0) {
  702. card->u.c.usedby = API;
  703. printk(KERN_INFO "%s: Running in API mode !\n",
  704. wandev->name);
  705. }
  706. }
  707. /* Tells us that if this interface is a
  708. * gateway or not */
  709. if ((chdlc_priv_area->gateway = conf->gateway) == WANOPT_YES){
  710. printk(KERN_INFO "%s: Interface %s is set as a gateway.\n",
  711. card->devname,card->u.c.if_name);
  712. }
  713. /* Get Multicast Information */
  714. chdlc_priv_area->mc = conf->mc;
  715. /* prepare network device data space for registration */
  716. strcpy(dev->name,card->u.c.if_name);
  717. dev->init = &if_init;
  718. dev->priv = chdlc_priv_area;
  719. /* Initialize the polling work routine */
  720. INIT_WORK(&chdlc_priv_area->poll_work, (void*)(void*)chdlc_poll, dev);
  721. /* Initialize the polling delay timer */
  722. init_timer(&chdlc_priv_area->poll_delay_timer);
  723. chdlc_priv_area->poll_delay_timer.data = (unsigned long)dev;
  724. chdlc_priv_area->poll_delay_timer.function = chdlc_poll_delay;
  725. printk(KERN_INFO "\n");
  726. return 0;
  727. }
  728. /****** Network Device Interface ********************************************/
  729. /*============================================================================
  730. * Initialize Linux network interface.
  731. *
  732. * This routine is called only once for each interface, during Linux network
  733. * interface registration. Returning anything but zero will fail interface
  734. * registration.
  735. */
  736. static int if_init(struct net_device* dev)
  737. {
  738. chdlc_private_area_t* chdlc_priv_area = dev->priv;
  739. sdla_t* card = chdlc_priv_area->card;
  740. struct wan_device* wandev = &card->wandev;
  741. /* Initialize device driver entry points */
  742. dev->open = &if_open;
  743. dev->stop = &if_close;
  744. dev->hard_header = &if_header;
  745. dev->rebuild_header = &if_rebuild_hdr;
  746. dev->hard_start_xmit = &if_send;
  747. dev->get_stats = &if_stats;
  748. dev->tx_timeout = &if_tx_timeout;
  749. dev->watchdog_timeo = TX_TIMEOUT;
  750. /* Initialize media-specific parameters */
  751. dev->flags |= IFF_POINTOPOINT;
  752. dev->flags |= IFF_NOARP;
  753. /* Enable Mulitcasting if user selected */
  754. if (chdlc_priv_area->mc == WANOPT_YES){
  755. dev->flags |= IFF_MULTICAST;
  756. }
  757. if (chdlc_priv_area->true_if_encoding){
  758. dev->type = ARPHRD_HDLC; /* This breaks the tcpdump */
  759. }else{
  760. dev->type = ARPHRD_PPP;
  761. }
  762. dev->mtu = card->wandev.mtu;
  763. /* for API usage, add the API header size to the requested MTU size */
  764. if(card->u.c.usedby == API) {
  765. dev->mtu += sizeof(api_tx_hdr_t);
  766. }
  767. dev->hard_header_len = CHDLC_HDR_LEN;
  768. /* Initialize hardware parameters */
  769. dev->irq = wandev->irq;
  770. dev->dma = wandev->dma;
  771. dev->base_addr = wandev->ioport;
  772. dev->mem_start = wandev->maddr;
  773. dev->mem_end = wandev->maddr + wandev->msize - 1;
  774. /* Set transmit buffer queue length
  775. * If too low packets will not be retransmitted
  776. * by stack.
  777. */
  778. dev->tx_queue_len = 100;
  779. SET_MODULE_OWNER(dev);
  780. return 0;
  781. }
  782. /*============================================================================
  783. * Open network interface.
  784. * o enable communications and interrupts.
  785. * o prevent module from unloading by incrementing use count
  786. *
  787. * Return 0 if O.k. or errno.
  788. */
  789. static int if_open(struct net_device* dev)
  790. {
  791. chdlc_private_area_t* chdlc_priv_area = dev->priv;
  792. sdla_t* card = chdlc_priv_area->card;
  793. struct timeval tv;
  794. int err = 0;
  795. /* Only one open per interface is allowed */
  796. if (netif_running(dev))
  797. return -EBUSY;
  798. /* Initialize the work queue entry */
  799. chdlc_priv_area->tq_working=0;
  800. INIT_WORK(&chdlc_priv_area->common.wanpipe_work,
  801. (void *)(void *)chdlc_work, dev);
  802. /* Allocate and initialize BH circular buffer */
  803. /* Add 1 to MAX_BH_BUFF so we don't have test with (MAX_BH_BUFF-1) */
  804. chdlc_priv_area->bh_head = kmalloc((sizeof(bh_data_t)*(MAX_BH_BUFF+1)),GFP_ATOMIC);
  805. memset(chdlc_priv_area->bh_head,0,(sizeof(bh_data_t)*(MAX_BH_BUFF+1)));
  806. atomic_set(&chdlc_priv_area->bh_buff_used, 0);
  807. do_gettimeofday(&tv);
  808. chdlc_priv_area->router_start_time = tv.tv_sec;
  809. netif_start_queue(dev);
  810. wanpipe_open(card);
  811. /* TTY is configured during wanpipe_set_termios
  812. * call, not here */
  813. if (card->tty_opt)
  814. return err;
  815. set_bit(0,&chdlc_priv_area->config_chdlc);
  816. chdlc_priv_area->config_chdlc_timeout=jiffies;
  817. /* Start the CHDLC configuration after 1sec delay.
  818. * This will give the interface initilization time
  819. * to finish its configuration */
  820. mod_timer(&chdlc_priv_area->poll_delay_timer, jiffies + HZ);
  821. return err;
  822. }
  823. /*============================================================================
  824. * Close network interface.
  825. * o if this is the last close, then disable communications and interrupts.
  826. * o reset flags.
  827. */
  828. static int if_close(struct net_device* dev)
  829. {
  830. chdlc_private_area_t* chdlc_priv_area = dev->priv;
  831. sdla_t* card = chdlc_priv_area->card;
  832. if (chdlc_priv_area->bh_head){
  833. int i;
  834. struct sk_buff *skb;
  835. for (i=0; i<(MAX_BH_BUFF+1); i++){
  836. skb = ((bh_data_t *)&chdlc_priv_area->bh_head[i])->skb;
  837. if (skb != NULL){
  838. dev_kfree_skb_any(skb);
  839. }
  840. }
  841. kfree(chdlc_priv_area->bh_head);
  842. chdlc_priv_area->bh_head=NULL;
  843. }
  844. netif_stop_queue(dev);
  845. wanpipe_close(card);
  846. del_timer(&chdlc_priv_area->poll_delay_timer);
  847. return 0;
  848. }
  849. static void disable_comm (sdla_t *card)
  850. {
  851. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  852. if (card->u.c.comm_enabled){
  853. chdlc_disable_comm_shutdown (card);
  854. }else{
  855. flags->interrupt_info_struct.interrupt_permission = 0;
  856. }
  857. if (!tty_init_cnt)
  858. return;
  859. if (card->tty_opt){
  860. struct serial_state * state;
  861. if (!(--tty_init_cnt)){
  862. int e1;
  863. serial_driver.refcount=0;
  864. if ((e1 = tty_unregister_driver(&serial_driver)))
  865. printk("SERIAL: failed to unregister serial driver (%d)\n",
  866. e1);
  867. printk(KERN_INFO "%s: Unregistering TTY Driver, Major %i\n",
  868. card->devname,WAN_TTY_MAJOR);
  869. }
  870. card->tty=NULL;
  871. tty_card_map[card->tty_minor]=NULL;
  872. state = &rs_table[card->tty_minor];
  873. memset(state, 0, sizeof(*state));
  874. }
  875. return;
  876. }
  877. /*============================================================================
  878. * Build media header.
  879. *
  880. * The trick here is to put packet type (Ethertype) into 'protocol' field of
  881. * the socket buffer, so that we don't forget it. If packet type is not
  882. * supported, set skb->protocol to 0 and discard packet later.
  883. *
  884. * Return: media header length.
  885. */
  886. static int if_header(struct sk_buff* skb, struct net_device* dev,
  887. unsigned short type, void* daddr, void* saddr,
  888. unsigned len)
  889. {
  890. skb->protocol = htons(type);
  891. return CHDLC_HDR_LEN;
  892. }
  893. /*============================================================================
  894. * Handle transmit timeout event from netif watchdog
  895. */
  896. static void if_tx_timeout(struct net_device *dev)
  897. {
  898. chdlc_private_area_t* chan = dev->priv;
  899. sdla_t *card = chan->card;
  900. /* If our device stays busy for at least 5 seconds then we will
  901. * kick start the device by making dev->tbusy = 0. We expect
  902. * that our device never stays busy more than 5 seconds. So this
  903. * is only used as a last resort.
  904. */
  905. ++card->wandev.stats.collisions;
  906. printk (KERN_INFO "%s: Transmit timed out on %s\n", card->devname,dev->name);
  907. netif_wake_queue (dev);
  908. }
  909. /*============================================================================
  910. * Re-build media header.
  911. *
  912. * Return: 1 physical address resolved.
  913. * 0 physical address not resolved
  914. */
  915. static int if_rebuild_hdr (struct sk_buff *skb)
  916. {
  917. return 1;
  918. }
  919. /*============================================================================
  920. * Send a packet on a network interface.
  921. * o set tbusy flag (marks start of the transmission) to block a timer-based
  922. * transmit from overlapping.
  923. * o check link state. If link is not up, then drop the packet.
  924. * o execute adapter send command.
  925. * o free socket buffer
  926. *
  927. * Return: 0 complete (socket buffer must be freed)
  928. * non-0 packet may be re-transmitted (tbusy must be set)
  929. *
  930. * Notes:
  931. * 1. This routine is called either by the protocol stack or by the "net
  932. * bottom half" (with interrupts enabled).
  933. * 2. Setting tbusy flag will inhibit further transmit requests from the
  934. * protocol stack and can be used for flow control with protocol layer.
  935. */
  936. static int if_send(struct sk_buff* skb, struct net_device* dev)
  937. {
  938. chdlc_private_area_t *chdlc_priv_area = dev->priv;
  939. sdla_t *card = chdlc_priv_area->card;
  940. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  941. INTERRUPT_INFORMATION_STRUCT *chdlc_int = &flags->interrupt_info_struct;
  942. int udp_type = 0;
  943. unsigned long smp_flags;
  944. int err=0;
  945. netif_stop_queue(dev);
  946. if (skb == NULL){
  947. /* If we get here, some higher layer thinks we've missed an
  948. * tx-done interrupt.
  949. */
  950. printk(KERN_INFO "%s: interface %s got kicked!\n",
  951. card->devname, dev->name);
  952. netif_wake_queue(dev);
  953. return 0;
  954. }
  955. if (ntohs(skb->protocol) != htons(PVC_PROT)){
  956. /* check the udp packet type */
  957. udp_type = udp_pkt_type(skb, card);
  958. if (udp_type == UDP_CPIPE_TYPE){
  959. if(store_udp_mgmt_pkt(UDP_PKT_FRM_STACK, card, skb, dev,
  960. chdlc_priv_area)){
  961. chdlc_int->interrupt_permission |=
  962. APP_INT_ON_TIMER;
  963. }
  964. netif_start_queue(dev);
  965. return 0;
  966. }
  967. /* check to see if the source IP address is a broadcast or */
  968. /* multicast IP address */
  969. if(chk_bcast_mcast_addr(card, dev, skb)){
  970. ++card->wandev.stats.tx_dropped;
  971. dev_kfree_skb_any(skb);
  972. netif_start_queue(dev);
  973. return 0;
  974. }
  975. }
  976. /* Lock the 508 Card: SMP is supported */
  977. if(card->hw.type != SDLA_S514){
  978. s508_lock(card,&smp_flags);
  979. }
  980. if(test_and_set_bit(SEND_CRIT, (void*)&card->wandev.critical)) {
  981. printk(KERN_INFO "%s: Critical in if_send: %lx\n",
  982. card->wandev.name,card->wandev.critical);
  983. ++card->wandev.stats.tx_dropped;
  984. netif_start_queue(dev);
  985. goto if_send_exit_crit;
  986. }
  987. if(card->u.c.state != WAN_CONNECTED){
  988. ++card->wandev.stats.tx_dropped;
  989. netif_start_queue(dev);
  990. }else if(!skb->protocol){
  991. ++card->wandev.stats.tx_errors;
  992. netif_start_queue(dev);
  993. }else {
  994. void* data = skb->data;
  995. unsigned len = skb->len;
  996. unsigned char attr;
  997. /* If it's an API packet pull off the API
  998. * header. Also check that the packet size
  999. * is larger than the API header
  1000. */
  1001. if (card->u.c.usedby == API){
  1002. api_tx_hdr_t* api_tx_hdr;
  1003. /* discard the frame if we are configured for */
  1004. /* 'receive only' mode or if there is no data */
  1005. if (card->u.c.receive_only ||
  1006. (len <= sizeof(api_tx_hdr_t))) {
  1007. ++card->wandev.stats.tx_dropped;
  1008. netif_start_queue(dev);
  1009. goto if_send_exit_crit;
  1010. }
  1011. api_tx_hdr = (api_tx_hdr_t *)data;
  1012. attr = api_tx_hdr->attr;
  1013. data += sizeof(api_tx_hdr_t);
  1014. len -= sizeof(api_tx_hdr_t);
  1015. }
  1016. if(chdlc_send(card, data, len)) {
  1017. netif_stop_queue(dev);
  1018. }else{
  1019. ++card->wandev.stats.tx_packets;
  1020. card->wandev.stats.tx_bytes += len;
  1021. netif_start_queue(dev);
  1022. dev->trans_start = jiffies;
  1023. }
  1024. }
  1025. if_send_exit_crit:
  1026. if (!(err=netif_queue_stopped(dev))) {
  1027. dev_kfree_skb_any(skb);
  1028. }else{
  1029. chdlc_priv_area->tick_counter = jiffies;
  1030. chdlc_int->interrupt_permission |= APP_INT_ON_TX_FRAME;
  1031. }
  1032. clear_bit(SEND_CRIT, (void*)&card->wandev.critical);
  1033. if(card->hw.type != SDLA_S514){
  1034. s508_unlock(card,&smp_flags);
  1035. }
  1036. return err;
  1037. }
  1038. /*============================================================================
  1039. * Check to see if the packet to be transmitted contains a broadcast or
  1040. * multicast source IP address.
  1041. */
  1042. static int chk_bcast_mcast_addr(sdla_t *card, struct net_device* dev,
  1043. struct sk_buff *skb)
  1044. {
  1045. u32 src_ip_addr;
  1046. u32 broadcast_ip_addr = 0;
  1047. struct in_device *in_dev;
  1048. /* read the IP source address from the outgoing packet */
  1049. src_ip_addr = *(u32 *)(skb->data + 12);
  1050. /* read the IP broadcast address for the device */
  1051. in_dev = dev->ip_ptr;
  1052. if(in_dev != NULL) {
  1053. struct in_ifaddr *ifa= in_dev->ifa_list;
  1054. if(ifa != NULL)
  1055. broadcast_ip_addr = ifa->ifa_broadcast;
  1056. else
  1057. return 0;
  1058. }
  1059. /* check if the IP Source Address is a Broadcast address */
  1060. if((dev->flags & IFF_BROADCAST) && (src_ip_addr == broadcast_ip_addr)) {
  1061. printk(KERN_INFO "%s: Broadcast Source Address silently discarded\n",
  1062. card->devname);
  1063. return 1;
  1064. }
  1065. /* check if the IP Source Address is a Multicast address */
  1066. if((ntohl(src_ip_addr) >= 0xE0000001) &&
  1067. (ntohl(src_ip_addr) <= 0xFFFFFFFE)) {
  1068. printk(KERN_INFO "%s: Multicast Source Address silently discarded\n",
  1069. card->devname);
  1070. return 1;
  1071. }
  1072. return 0;
  1073. }
  1074. /*============================================================================
  1075. * Reply to UDP Management system.
  1076. * Return length of reply.
  1077. */
  1078. static int reply_udp( unsigned char *data, unsigned int mbox_len )
  1079. {
  1080. unsigned short len, udp_length, temp, ip_length;
  1081. unsigned long ip_temp;
  1082. int even_bound = 0;
  1083. chdlc_udp_pkt_t *c_udp_pkt = (chdlc_udp_pkt_t *)data;
  1084. /* Set length of packet */
  1085. len = sizeof(ip_pkt_t)+
  1086. sizeof(udp_pkt_t)+
  1087. sizeof(wp_mgmt_t)+
  1088. sizeof(cblock_t)+
  1089. sizeof(trace_info_t)+
  1090. mbox_len;
  1091. /* fill in UDP reply */
  1092. c_udp_pkt->wp_mgmt.request_reply = UDPMGMT_REPLY;
  1093. /* fill in UDP length */
  1094. udp_length = sizeof(udp_pkt_t)+
  1095. sizeof(wp_mgmt_t)+
  1096. sizeof(cblock_t)+
  1097. sizeof(trace_info_t)+
  1098. mbox_len;
  1099. /* put it on an even boundary */
  1100. if ( udp_length & 0x0001 ) {
  1101. udp_length += 1;
  1102. len += 1;
  1103. even_bound = 1;
  1104. }
  1105. temp = (udp_length<<8)|(udp_length>>8);
  1106. c_udp_pkt->udp_pkt.udp_length = temp;
  1107. /* swap UDP ports */
  1108. temp = c_udp_pkt->udp_pkt.udp_src_port;
  1109. c_udp_pkt->udp_pkt.udp_src_port =
  1110. c_udp_pkt->udp_pkt.udp_dst_port;
  1111. c_udp_pkt->udp_pkt.udp_dst_port = temp;
  1112. /* add UDP pseudo header */
  1113. temp = 0x1100;
  1114. *((unsigned short *)(c_udp_pkt->data+mbox_len+even_bound)) = temp;
  1115. temp = (udp_length<<8)|(udp_length>>8);
  1116. *((unsigned short *)(c_udp_pkt->data+mbox_len+even_bound+2)) = temp;
  1117. /* calculate UDP checksum */
  1118. c_udp_pkt->udp_pkt.udp_checksum = 0;
  1119. c_udp_pkt->udp_pkt.udp_checksum = calc_checksum(&data[UDP_OFFSET],udp_length+UDP_OFFSET);
  1120. /* fill in IP length */
  1121. ip_length = len;
  1122. temp = (ip_length<<8)|(ip_length>>8);
  1123. c_udp_pkt->ip_pkt.total_length = temp;
  1124. /* swap IP addresses */
  1125. ip_temp = c_udp_pkt->ip_pkt.ip_src_address;
  1126. c_udp_pkt->ip_pkt.ip_src_address = c_udp_pkt->ip_pkt.ip_dst_address;
  1127. c_udp_pkt->ip_pkt.ip_dst_address = ip_temp;
  1128. /* fill in IP checksum */
  1129. c_udp_pkt->ip_pkt.hdr_checksum = 0;
  1130. c_udp_pkt->ip_pkt.hdr_checksum = calc_checksum(data,sizeof(ip_pkt_t));
  1131. return len;
  1132. } /* reply_udp */
  1133. unsigned short calc_checksum (char *data, int len)
  1134. {
  1135. unsigned short temp;
  1136. unsigned long sum=0;
  1137. int i;
  1138. for( i = 0; i <len; i+=2 ) {
  1139. memcpy(&temp,&data[i],2);
  1140. sum += (unsigned long)temp;
  1141. }
  1142. while (sum >> 16 ) {
  1143. sum = (sum & 0xffffUL) + (sum >> 16);
  1144. }
  1145. temp = (unsigned short)sum;
  1146. temp = ~temp;
  1147. if( temp == 0 )
  1148. temp = 0xffff;
  1149. return temp;
  1150. }
  1151. /*============================================================================
  1152. * Get ethernet-style interface statistics.
  1153. * Return a pointer to struct enet_statistics.
  1154. */
  1155. static struct net_device_stats* if_stats(struct net_device* dev)
  1156. {
  1157. sdla_t *my_card;
  1158. chdlc_private_area_t* chdlc_priv_area;
  1159. if ((chdlc_priv_area=dev->priv) == NULL)
  1160. return NULL;
  1161. my_card = chdlc_priv_area->card;
  1162. return &my_card->wandev.stats;
  1163. }
  1164. /****** Cisco HDLC Firmware Interface Functions *******************************/
  1165. /*============================================================================
  1166. * Read firmware code version.
  1167. * Put code version as ASCII string in str.
  1168. */
  1169. static int chdlc_read_version (sdla_t* card, char* str)
  1170. {
  1171. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1172. int len;
  1173. char err;
  1174. mb->buffer_length = 0;
  1175. mb->command = READ_CHDLC_CODE_VERSION;
  1176. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1177. if(err != COMMAND_OK) {
  1178. chdlc_error(card,err,mb);
  1179. }
  1180. else if (str) { /* is not null */
  1181. len = mb->buffer_length;
  1182. memcpy(str, mb->data, len);
  1183. str[len] = '\0';
  1184. }
  1185. return (err);
  1186. }
  1187. /*-----------------------------------------------------------------------------
  1188. * Configure CHDLC firmware.
  1189. */
  1190. static int chdlc_configure (sdla_t* card, void* data)
  1191. {
  1192. int err;
  1193. CHDLC_MAILBOX_STRUCT *mailbox = card->mbox;
  1194. int data_length = sizeof(CHDLC_CONFIGURATION_STRUCT);
  1195. mailbox->buffer_length = data_length;
  1196. memcpy(mailbox->data, data, data_length);
  1197. mailbox->command = SET_CHDLC_CONFIGURATION;
  1198. err = sdla_exec(mailbox) ? mailbox->return_code : CMD_TIMEOUT;
  1199. if (err != COMMAND_OK) chdlc_error (card, err, mailbox);
  1200. return err;
  1201. }
  1202. /*============================================================================
  1203. * Set interrupt mode -- HDLC Version.
  1204. */
  1205. static int chdlc_set_intr_mode (sdla_t* card, unsigned mode)
  1206. {
  1207. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1208. CHDLC_INT_TRIGGERS_STRUCT* int_data =
  1209. (CHDLC_INT_TRIGGERS_STRUCT *)mb->data;
  1210. int err;
  1211. int_data->CHDLC_interrupt_triggers = mode;
  1212. int_data->IRQ = card->hw.irq;
  1213. int_data->interrupt_timer = 1;
  1214. mb->buffer_length = sizeof(CHDLC_INT_TRIGGERS_STRUCT);
  1215. mb->command = SET_CHDLC_INTERRUPT_TRIGGERS;
  1216. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1217. if (err != COMMAND_OK)
  1218. chdlc_error (card, err, mb);
  1219. return err;
  1220. }
  1221. /*===========================================================
  1222. * chdlc_disable_comm_shutdown
  1223. *
  1224. * Shutdown() disables the communications. We must
  1225. * have a sparate functions, because we must not
  1226. * call chdlc_error() hander since the private
  1227. * area has already been replaced */
  1228. static int chdlc_disable_comm_shutdown (sdla_t *card)
  1229. {
  1230. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1231. CHDLC_INT_TRIGGERS_STRUCT* int_data =
  1232. (CHDLC_INT_TRIGGERS_STRUCT *)mb->data;
  1233. int err;
  1234. /* Disable Interrutps */
  1235. int_data->CHDLC_interrupt_triggers = 0;
  1236. int_data->IRQ = card->hw.irq;
  1237. int_data->interrupt_timer = 1;
  1238. mb->buffer_length = sizeof(CHDLC_INT_TRIGGERS_STRUCT);
  1239. mb->command = SET_CHDLC_INTERRUPT_TRIGGERS;
  1240. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1241. /* Disable Communications */
  1242. if (card->u.c.async_mode) {
  1243. mb->command = DISABLE_ASY_COMMUNICATIONS;
  1244. }else{
  1245. mb->command = DISABLE_CHDLC_COMMUNICATIONS;
  1246. }
  1247. mb->buffer_length = 0;
  1248. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1249. card->u.c.comm_enabled = 0;
  1250. return 0;
  1251. }
  1252. /*============================================================================
  1253. * Enable communications.
  1254. */
  1255. static int chdlc_comm_enable (sdla_t* card)
  1256. {
  1257. int err;
  1258. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1259. mb->buffer_length = 0;
  1260. mb->command = ENABLE_CHDLC_COMMUNICATIONS;
  1261. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1262. if (err != COMMAND_OK)
  1263. chdlc_error(card, err, mb);
  1264. else
  1265. card->u.c.comm_enabled = 1;
  1266. return err;
  1267. }
  1268. /*============================================================================
  1269. * Read communication error statistics.
  1270. */
  1271. static int chdlc_read_comm_err_stats (sdla_t* card)
  1272. {
  1273. int err;
  1274. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1275. mb->buffer_length = 0;
  1276. mb->command = READ_COMMS_ERROR_STATS;
  1277. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1278. if (err != COMMAND_OK)
  1279. chdlc_error(card,err,mb);
  1280. return err;
  1281. }
  1282. /*============================================================================
  1283. * Read CHDLC operational statistics.
  1284. */
  1285. static int chdlc_read_op_stats (sdla_t* card)
  1286. {
  1287. int err;
  1288. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1289. mb->buffer_length = 0;
  1290. mb->command = READ_CHDLC_OPERATIONAL_STATS;
  1291. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1292. if (err != COMMAND_OK)
  1293. chdlc_error(card,err,mb);
  1294. return err;
  1295. }
  1296. /*============================================================================
  1297. * Update communications error and general packet statistics.
  1298. */
  1299. static int update_comms_stats(sdla_t* card,
  1300. chdlc_private_area_t* chdlc_priv_area)
  1301. {
  1302. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1303. COMMS_ERROR_STATS_STRUCT* err_stats;
  1304. CHDLC_OPERATIONAL_STATS_STRUCT *op_stats;
  1305. /* on the first timer interrupt, read the comms error statistics */
  1306. if(chdlc_priv_area->update_comms_stats == 2) {
  1307. if(chdlc_read_comm_err_stats(card))
  1308. return 1;
  1309. err_stats = (COMMS_ERROR_STATS_STRUCT *)mb->data;
  1310. card->wandev.stats.rx_over_errors =
  1311. err_stats->Rx_overrun_err_count;
  1312. card->wandev.stats.rx_crc_errors =
  1313. err_stats->CRC_err_count;
  1314. card->wandev.stats.rx_frame_errors =
  1315. err_stats->Rx_abort_count;
  1316. card->wandev.stats.rx_fifo_errors =
  1317. err_stats->Rx_dis_pri_bfrs_full_count;
  1318. card->wandev.stats.rx_missed_errors =
  1319. card->wandev.stats.rx_fifo_errors;
  1320. card->wandev.stats.tx_aborted_errors =
  1321. err_stats->sec_Tx_abort_count;
  1322. }
  1323. /* on the second timer interrupt, read the operational statistics */
  1324. else {
  1325. if(chdlc_read_op_stats(card))
  1326. return 1;
  1327. op_stats = (CHDLC_OPERATIONAL_STATS_STRUCT *)mb->data;
  1328. card->wandev.stats.rx_length_errors =
  1329. (op_stats->Rx_Data_discard_short_count +
  1330. op_stats->Rx_Data_discard_long_count);
  1331. }
  1332. return 0;
  1333. }
  1334. /*============================================================================
  1335. * Send packet.
  1336. * Return: 0 - o.k.
  1337. * 1 - no transmit buffers available
  1338. */
  1339. static int chdlc_send (sdla_t* card, void* data, unsigned len)
  1340. {
  1341. CHDLC_DATA_TX_STATUS_EL_STRUCT *txbuf = card->u.c.txbuf;
  1342. if (txbuf->opp_flag)
  1343. return 1;
  1344. sdla_poke(&card->hw, txbuf->ptr_data_bfr, data, len);
  1345. txbuf->frame_length = len;
  1346. txbuf->opp_flag = 1; /* start transmission */
  1347. /* Update transmit buffer control fields */
  1348. card->u.c.txbuf = ++txbuf;
  1349. if ((void*)txbuf > card->u.c.txbuf_last)
  1350. card->u.c.txbuf = card->u.c.txbuf_base;
  1351. return 0;
  1352. }
  1353. /****** Firmware Error Handler **********************************************/
  1354. /*============================================================================
  1355. * Firmware error handler.
  1356. * This routine is called whenever firmware command returns non-zero
  1357. * return code.
  1358. *
  1359. * Return zero if previous command has to be cancelled.
  1360. */
  1361. static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb)
  1362. {
  1363. unsigned cmd = mb->command;
  1364. switch (err) {
  1365. case CMD_TIMEOUT:
  1366. printk(KERN_INFO "%s: command 0x%02X timed out!\n",
  1367. card->devname, cmd);
  1368. break;
  1369. case S514_BOTH_PORTS_SAME_CLK_MODE:
  1370. if(cmd == SET_CHDLC_CONFIGURATION) {
  1371. printk(KERN_INFO
  1372. "%s: Configure both ports for the same clock source\n",
  1373. card->devname);
  1374. break;
  1375. }
  1376. default:
  1377. printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!\n",
  1378. card->devname, cmd, err);
  1379. }
  1380. return 0;
  1381. }
  1382. /********** Bottom Half Handlers ********************************************/
  1383. /* NOTE: There is no API, BH support for Kernels lower than 2.2.X.
  1384. * DO NOT INSERT ANY CODE HERE, NOTICE THE
  1385. * PREPROCESSOR STATEMENT ABOVE, UNLESS YOU KNOW WHAT YOU ARE
  1386. * DOING */
  1387. static void chdlc_work(struct net_device * dev)
  1388. {
  1389. chdlc_private_area_t* chan = dev->priv;
  1390. sdla_t *card = chan->card;
  1391. struct sk_buff *skb;
  1392. if (atomic_read(&chan->bh_buff_used) == 0){
  1393. clear_bit(0, &chan->tq_working);
  1394. return;
  1395. }
  1396. while (atomic_read(&chan->bh_buff_used)){
  1397. skb = ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb;
  1398. if (skb != NULL){
  1399. if (chan->common.sk == NULL || chan->common.func == NULL){
  1400. ++card->wandev.stats.rx_dropped;
  1401. dev_kfree_skb_any(skb);
  1402. chdlc_work_cleanup(dev);
  1403. continue;
  1404. }
  1405. if (chan->common.func(skb,dev,chan->common.sk) != 0){
  1406. /* Sock full cannot send, queue us for another
  1407. * try */
  1408. atomic_set(&chan->common.receive_block,1);
  1409. return;
  1410. }else{
  1411. chdlc_work_cleanup(dev);
  1412. }
  1413. }else{
  1414. chdlc_work_cleanup(dev);
  1415. }
  1416. }
  1417. clear_bit(0, &chan->tq_working);
  1418. return;
  1419. }
  1420. static int chdlc_work_cleanup(struct net_device *dev)
  1421. {
  1422. chdlc_private_area_t* chan = dev->priv;
  1423. ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb = NULL;
  1424. if (chan->bh_read == MAX_BH_BUFF){
  1425. chan->bh_read=0;
  1426. }else{
  1427. ++chan->bh_read;
  1428. }
  1429. atomic_dec(&chan->bh_buff_used);
  1430. return 0;
  1431. }
  1432. static int bh_enqueue(struct net_device *dev, struct sk_buff *skb)
  1433. {
  1434. /* Check for full */
  1435. chdlc_private_area_t* chan = dev->priv;
  1436. sdla_t *card = chan->card;
  1437. if (atomic_read(&chan->bh_buff_used) == (MAX_BH_BUFF+1)){
  1438. ++card->wandev.stats.rx_dropped;
  1439. dev_kfree_skb_any(skb);
  1440. return 1;
  1441. }
  1442. ((bh_data_t *)&chan->bh_head[chan->bh_write])->skb = skb;
  1443. if (chan->bh_write == MAX_BH_BUFF){
  1444. chan->bh_write=0;
  1445. }else{
  1446. ++chan->bh_write;
  1447. }
  1448. atomic_inc(&chan->bh_buff_used);
  1449. return 0;
  1450. }
  1451. /* END OF API BH Support */
  1452. /****** Interrupt Handlers **************************************************/
  1453. /*============================================================================
  1454. * Cisco HDLC interrupt service routine.
  1455. */
  1456. static void wpc_isr (sdla_t* card)
  1457. {
  1458. struct net_device* dev;
  1459. SHARED_MEMORY_INFO_STRUCT* flags = NULL;
  1460. int i;
  1461. sdla_t *my_card;
  1462. /* Check for which port the interrupt has been generated
  1463. * Since Secondary Port is piggybacking on the Primary
  1464. * the check must be done here.
  1465. */
  1466. flags = card->u.c.flags;
  1467. if (!flags->interrupt_info_struct.interrupt_type){
  1468. /* Check for a second port (piggybacking) */
  1469. if ((my_card = card->next)){
  1470. flags = my_card->u.c.flags;
  1471. if (flags->interrupt_info_struct.interrupt_type){
  1472. card = my_card;
  1473. card->isr(card);
  1474. return;
  1475. }
  1476. }
  1477. }
  1478. flags = card->u.c.flags;
  1479. card->in_isr = 1;
  1480. dev = card->wandev.dev;
  1481. /* If we get an interrupt with no network device, stop the interrupts
  1482. * and issue an error */
  1483. if (!card->tty_opt && !dev &&
  1484. flags->interrupt_info_struct.interrupt_type !=
  1485. COMMAND_COMPLETE_APP_INT_PEND){
  1486. goto isr_done;
  1487. }
  1488. /* if critical due to peripheral operations
  1489. * ie. update() or getstats() then reset the interrupt and
  1490. * wait for the board to retrigger.
  1491. */
  1492. if(test_bit(PERI_CRIT, (void*)&card->wandev.critical)) {
  1493. printk(KERN_INFO "ISR CRIT TO PERI\n");
  1494. goto isr_done;
  1495. }
  1496. /* On a 508 Card, if critical due to if_send
  1497. * Major Error !!! */
  1498. if(card->hw.type != SDLA_S514) {
  1499. if(test_bit(SEND_CRIT, (void*)&card->wandev.critical)) {
  1500. printk(KERN_INFO "%s: Critical while in ISR: %lx\n",
  1501. card->devname, card->wandev.critical);
  1502. card->in_isr = 0;
  1503. flags->interrupt_info_struct.interrupt_type = 0;
  1504. return;
  1505. }
  1506. }
  1507. switch(flags->interrupt_info_struct.interrupt_type) {
  1508. case RX_APP_INT_PEND: /* 0x01: receive interrupt */
  1509. rx_intr(card);
  1510. break;
  1511. case TX_APP_INT_PEND: /* 0x02: transmit interrupt */
  1512. flags->interrupt_info_struct.interrupt_permission &=
  1513. ~APP_INT_ON_TX_FRAME;
  1514. if (card->tty_opt){
  1515. wanpipe_tty_trigger_poll(card);
  1516. break;
  1517. }
  1518. if (dev && netif_queue_stopped(dev)){
  1519. if (card->u.c.usedby == API){
  1520. netif_start_queue(dev);
  1521. wakeup_sk_bh(dev);
  1522. }else{
  1523. netif_wake_queue(dev);
  1524. }
  1525. }
  1526. break;
  1527. case COMMAND_COMPLETE_APP_INT_PEND:/* 0x04: cmd cplt */
  1528. ++ Intr_test_counter;
  1529. break;
  1530. case CHDLC_EXCEP_COND_APP_INT_PEND: /* 0x20 */
  1531. process_chdlc_exception(card);
  1532. break;
  1533. case GLOBAL_EXCEP_COND_APP_INT_PEND:
  1534. process_global_exception(card);
  1535. break;
  1536. case TIMER_APP_INT_PEND:
  1537. timer_intr(card);
  1538. break;
  1539. default:
  1540. printk(KERN_INFO "%s: spurious interrupt 0x%02X!\n",
  1541. card->devname,
  1542. flags->interrupt_info_struct.interrupt_type);
  1543. printk(KERN_INFO "Code name: ");
  1544. for(i = 0; i < 4; i ++)
  1545. printk(KERN_INFO "%c",
  1546. flags->global_info_struct.codename[i]);
  1547. printk(KERN_INFO "\nCode version: ");
  1548. for(i = 0; i < 4; i ++)
  1549. printk(KERN_INFO "%c",
  1550. flags->global_info_struct.codeversion[i]);
  1551. printk(KERN_INFO "\n");
  1552. break;
  1553. }
  1554. isr_done:
  1555. card->in_isr = 0;
  1556. flags->interrupt_info_struct.interrupt_type = 0;
  1557. return;
  1558. }
  1559. /*============================================================================
  1560. * Receive interrupt handler.
  1561. */
  1562. static void rx_intr (sdla_t* card)
  1563. {
  1564. struct net_device *dev;
  1565. chdlc_private_area_t *chdlc_priv_area;
  1566. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  1567. CHDLC_DATA_RX_STATUS_EL_STRUCT *rxbuf = card->u.c.rxmb;
  1568. struct sk_buff *skb;
  1569. unsigned len;
  1570. unsigned addr = rxbuf->ptr_data_bfr;
  1571. void *buf;
  1572. int i,udp_type;
  1573. if (rxbuf->opp_flag != 0x01) {
  1574. printk(KERN_INFO
  1575. "%s: corrupted Rx buffer @ 0x%X, flag = 0x%02X!\n",
  1576. card->devname, (unsigned)rxbuf, rxbuf->opp_flag);
  1577. printk(KERN_INFO "Code name: ");
  1578. for(i = 0; i < 4; i ++)
  1579. printk(KERN_INFO "%c",
  1580. flags->global_info_struct.codename[i]);
  1581. printk(KERN_INFO "\nCode version: ");
  1582. for(i = 0; i < 4; i ++)
  1583. printk(KERN_INFO "%c",
  1584. flags->global_info_struct.codeversion[i]);
  1585. printk(KERN_INFO "\n");
  1586. /* Bug Fix: Mar 6 2000
  1587. * If we get a corrupted mailbox, it measn that driver
  1588. * is out of sync with the firmware. There is no recovery.
  1589. * If we don't turn off all interrupts for this card
  1590. * the machine will crash.
  1591. */
  1592. printk(KERN_INFO "%s: Critical router failure ...!!!\n", card->devname);
  1593. printk(KERN_INFO "Please contact Sangoma Technologies !\n");
  1594. chdlc_set_intr_mode(card,0);
  1595. return;
  1596. }
  1597. len = rxbuf->frame_length;
  1598. if (card->tty_opt){
  1599. if (rxbuf->error_flag){
  1600. goto rx_exit;
  1601. }
  1602. if (len <= CRC_LENGTH){
  1603. goto rx_exit;
  1604. }
  1605. if (!card->u.c.async_mode){
  1606. len -= CRC_LENGTH;
  1607. }
  1608. wanpipe_tty_receive(card,addr,len);
  1609. goto rx_exit;
  1610. }
  1611. dev = card->wandev.dev;
  1612. if (!dev){
  1613. goto rx_exit;
  1614. }
  1615. if (!netif_running(dev))
  1616. goto rx_exit;
  1617. chdlc_priv_area = dev->priv;
  1618. /* Allocate socket buffer */
  1619. skb = dev_alloc_skb(len);
  1620. if (skb == NULL) {
  1621. printk(KERN_INFO "%s: no socket buffers available!\n",
  1622. card->devname);
  1623. ++card->wandev.stats.rx_dropped;
  1624. goto rx_exit;
  1625. }
  1626. /* Copy data to the socket buffer */
  1627. if((addr + len) > card->u.c.rx_top + 1) {
  1628. unsigned tmp = card->u.c.rx_top - addr + 1;
  1629. buf = skb_put(skb, tmp);
  1630. sdla_peek(&card->hw, addr, buf, tmp);
  1631. addr = card->u.c.rx_base;
  1632. len -= tmp;
  1633. }
  1634. buf = skb_put(skb, len);
  1635. sdla_peek(&card->hw, addr, buf, len);
  1636. skb->protocol = htons(ETH_P_IP);
  1637. card->wandev.stats.rx_packets ++;
  1638. card->wandev.stats.rx_bytes += skb->len;
  1639. udp_type = udp_pkt_type( skb, card );
  1640. if(udp_type == UDP_CPIPE_TYPE) {
  1641. if(store_udp_mgmt_pkt(UDP_PKT_FRM_NETWORK,
  1642. card, skb, dev, chdlc_priv_area)) {
  1643. flags->interrupt_info_struct.
  1644. interrupt_permission |=
  1645. APP_INT_ON_TIMER;
  1646. }
  1647. } else if(card->u.c.usedby == API) {
  1648. api_rx_hdr_t* api_rx_hdr;
  1649. skb_push(skb, sizeof(api_rx_hdr_t));
  1650. api_rx_hdr = (api_rx_hdr_t*)&skb->data[0x00];
  1651. api_rx_hdr->error_flag = rxbuf->error_flag;
  1652. api_rx_hdr->time_stamp = rxbuf->time_stamp;
  1653. skb->protocol = htons(PVC_PROT);
  1654. skb->mac.raw = skb->data;
  1655. skb->dev = dev;
  1656. skb->pkt_type = WAN_PACKET_DATA;
  1657. bh_enqueue(dev, skb);
  1658. if (!test_and_set_bit(0,&chdlc_priv_area->tq_working))
  1659. wanpipe_queue_work(&chdlc_priv_area->common.wanpipe_work);
  1660. }else{
  1661. /* FIXME: we should check to see if the received packet is a
  1662. multicast packet so that we can increment the multicast
  1663. statistic
  1664. ++ chdlc_priv_area->if_stats.multicast;
  1665. */
  1666. /* Pass it up the protocol stack */
  1667. skb->dev = dev;
  1668. skb->mac.raw = skb->data;
  1669. netif_rx(skb);
  1670. dev->last_rx = jiffies;
  1671. }
  1672. rx_exit:
  1673. /* Release buffer element and calculate a pointer to the next one */
  1674. rxbuf->opp_flag = 0x00;
  1675. card->u.c.rxmb = ++ rxbuf;
  1676. if((void*)rxbuf > card->u.c.rxbuf_last){
  1677. card->u.c.rxmb = card->u.c.rxbuf_base;
  1678. }
  1679. }
  1680. /*============================================================================
  1681. * Timer interrupt handler.
  1682. * The timer interrupt is used for two purposes:
  1683. * 1) Processing udp calls from 'cpipemon'.
  1684. * 2) Reading board-level statistics for updating the proc file system.
  1685. */
  1686. void timer_intr(sdla_t *card)
  1687. {
  1688. struct net_device* dev;
  1689. chdlc_private_area_t* chdlc_priv_area = NULL;
  1690. SHARED_MEMORY_INFO_STRUCT* flags = NULL;
  1691. if ((dev = card->wandev.dev)==NULL){
  1692. flags = card->u.c.flags;
  1693. flags->interrupt_info_struct.interrupt_permission &=
  1694. ~APP_INT_ON_TIMER;
  1695. return;
  1696. }
  1697. chdlc_priv_area = dev->priv;
  1698. if (chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_CONFIG) {
  1699. if (!config_chdlc(card)){
  1700. chdlc_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_CONFIG;
  1701. }
  1702. }
  1703. /* process a udp call if pending */
  1704. if(chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_UDP) {
  1705. process_udp_mgmt_pkt(card, dev,
  1706. chdlc_priv_area);
  1707. chdlc_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_UDP;
  1708. }
  1709. /* read the communications statistics if required */
  1710. if(chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_UPDATE) {
  1711. update_comms_stats(card, chdlc_priv_area);
  1712. if(!(-- chdlc_priv_area->update_comms_stats)) {
  1713. chdlc_priv_area->timer_int_enabled &=
  1714. ~TMR_INT_ENABLED_UPDATE;
  1715. }
  1716. }
  1717. /* only disable the timer interrupt if there are no udp or statistic */
  1718. /* updates pending */
  1719. if(!chdlc_priv_area->timer_int_enabled) {
  1720. flags = card->u.c.flags;
  1721. flags->interrupt_info_struct.interrupt_permission &=
  1722. ~APP_INT_ON_TIMER;
  1723. }
  1724. }
  1725. /*------------------------------------------------------------------------------
  1726. Miscellaneous Functions
  1727. - set_chdlc_config() used to set configuration options on the board
  1728. ------------------------------------------------------------------------------*/
  1729. static int set_chdlc_config(sdla_t* card)
  1730. {
  1731. CHDLC_CONFIGURATION_STRUCT cfg;
  1732. memset(&cfg, 0, sizeof(CHDLC_CONFIGURATION_STRUCT));
  1733. if(card->wandev.clocking){
  1734. cfg.baud_rate = card->wandev.bps;
  1735. }
  1736. cfg.line_config_options = (card->wandev.interface == WANOPT_RS232) ?
  1737. INTERFACE_LEVEL_RS232 : INTERFACE_LEVEL_V35;
  1738. cfg.modem_config_options = 0;
  1739. cfg.modem_status_timer = 100;
  1740. cfg.CHDLC_protocol_options = card->u.c.protocol_options;
  1741. if (card->tty_opt){
  1742. cfg.CHDLC_API_options = DISCARD_RX_ERROR_FRAMES;
  1743. }
  1744. cfg.percent_data_buffer_for_Tx = (card->u.c.receive_only) ? 0 : 50;
  1745. cfg.CHDLC_statistics_options = (CHDLC_TX_DATA_BYTE_COUNT_STAT |
  1746. CHDLC_RX_DATA_BYTE_COUNT_STAT);
  1747. if (card->tty_opt){
  1748. card->wandev.mtu = TTY_CHDLC_MAX_MTU;
  1749. }
  1750. cfg.max_CHDLC_data_field_length = card->wandev.mtu;
  1751. cfg.transmit_keepalive_timer = card->u.c.kpalv_tx;
  1752. cfg.receive_keepalive_timer = card->u.c.kpalv_rx;
  1753. cfg.keepalive_error_tolerance = card->u.c.kpalv_err;
  1754. cfg.SLARP_request_timer = card->u.c.slarp_timer;
  1755. if (cfg.SLARP_request_timer) {
  1756. cfg.IP_address = 0;
  1757. cfg.IP_netmask = 0;
  1758. }else if (card->wandev.dev){
  1759. struct net_device *dev = card->wandev.dev;
  1760. chdlc_private_area_t *chdlc_priv_area = dev->priv;
  1761. struct in_device *in_dev = dev->ip_ptr;
  1762. if(in_dev != NULL) {
  1763. struct in_ifaddr *ifa = in_dev->ifa_list;
  1764. if (ifa != NULL ) {
  1765. cfg.IP_address = ntohl(ifa->ifa_local);
  1766. cfg.IP_netmask = ntohl(ifa->ifa_mask);
  1767. chdlc_priv_area->IP_address = ntohl(ifa->ifa_local);
  1768. chdlc_priv_area->IP_netmask = ntohl(ifa->ifa_mask);
  1769. }
  1770. }
  1771. /* FIXME: We must re-think this message in next release
  1772. if((cfg.IP_address & 0x000000FF) > 2) {
  1773. printk(KERN_WARNING "\n");
  1774. printk(KERN_WARNING " WARNING:%s configured with an\n",
  1775. card->devname);
  1776. printk(KERN_WARNING " invalid local IP address.\n");
  1777. printk(KERN_WARNING " Slarp pragmatics will fail.\n");
  1778. printk(KERN_WARNING " IP address should be of the\n");
  1779. printk(KERN_WARNING " format A.B.C.1 or A.B.C.2.\n");
  1780. }
  1781. */
  1782. }
  1783. return chdlc_configure(card, &cfg);
  1784. }
  1785. /*-----------------------------------------------------------------------------
  1786. set_asy_config() used to set asynchronous configuration options on the board
  1787. ------------------------------------------------------------------------------*/
  1788. static int set_asy_config(sdla_t* card)
  1789. {
  1790. ASY_CONFIGURATION_STRUCT cfg;
  1791. CHDLC_MAILBOX_STRUCT *mailbox = card->mbox;
  1792. int err;
  1793. memset(&cfg, 0, sizeof(ASY_CONFIGURATION_STRUCT));
  1794. if(card->wandev.clocking)
  1795. cfg.baud_rate = card->wandev.bps;
  1796. cfg.line_config_options = (card->wandev.interface == WANOPT_RS232) ?
  1797. INTERFACE_LEVEL_RS232 : INTERFACE_LEVEL_V35;
  1798. cfg.modem_config_options = 0;
  1799. cfg.asy_API_options = card->u.c.api_options;
  1800. cfg.asy_protocol_options = card->u.c.protocol_options;
  1801. cfg.Tx_bits_per_char = card->u.c.tx_bits_per_char;
  1802. cfg.Rx_bits_per_char = card->u.c.rx_bits_per_char;
  1803. cfg.stop_bits = card->u.c.stop_bits;
  1804. cfg.parity = card->u.c.parity;
  1805. cfg.break_timer = card->u.c.break_timer;
  1806. cfg.asy_Rx_inter_char_timer = card->u.c.inter_char_timer;
  1807. cfg.asy_Rx_complete_length = card->u.c.rx_complete_length;
  1808. cfg.XON_char = card->u.c.xon_char;
  1809. cfg.XOFF_char = card->u.c.xoff_char;
  1810. cfg.asy_statistics_options = (CHDLC_TX_DATA_BYTE_COUNT_STAT |
  1811. CHDLC_RX_DATA_BYTE_COUNT_STAT);
  1812. mailbox->buffer_length = sizeof(ASY_CONFIGURATION_STRUCT);
  1813. memcpy(mailbox->data, &cfg, mailbox->buffer_length);
  1814. mailbox->command = SET_ASY_CONFIGURATION;
  1815. err = sdla_exec(mailbox) ? mailbox->return_code : CMD_TIMEOUT;
  1816. if (err != COMMAND_OK)
  1817. chdlc_error (card, err, mailbox);
  1818. return err;
  1819. }
  1820. /*============================================================================
  1821. * Enable asynchronous communications.
  1822. */
  1823. static int asy_comm_enable (sdla_t* card)
  1824. {
  1825. int err;
  1826. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1827. mb->buffer_length = 0;
  1828. mb->command = ENABLE_ASY_COMMUNICATIONS;
  1829. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1830. if (err != COMMAND_OK && card->wandev.dev)
  1831. chdlc_error(card, err, mb);
  1832. if (!err)
  1833. card->u.c.comm_enabled = 1;
  1834. return err;
  1835. }
  1836. /*============================================================================
  1837. * Process global exception condition
  1838. */
  1839. static int process_global_exception(sdla_t *card)
  1840. {
  1841. CHDLC_MAILBOX_STRUCT* mbox = card->mbox;
  1842. int err;
  1843. mbox->buffer_length = 0;
  1844. mbox->command = READ_GLOBAL_EXCEPTION_CONDITION;
  1845. err = sdla_exec(mbox) ? mbox->return_code : CMD_TIMEOUT;
  1846. if(err != CMD_TIMEOUT ){
  1847. switch(mbox->return_code) {
  1848. case EXCEP_MODEM_STATUS_CHANGE:
  1849. printk(KERN_INFO "%s: Modem status change\n",
  1850. card->devname);
  1851. switch(mbox->data[0] & (DCD_HIGH | CTS_HIGH)) {
  1852. case (DCD_HIGH):
  1853. printk(KERN_INFO "%s: DCD high, CTS low\n",card->devname);
  1854. break;
  1855. case (CTS_HIGH):
  1856. printk(KERN_INFO "%s: DCD low, CTS high\n",card->devname);
  1857. break;
  1858. case ((DCD_HIGH | CTS_HIGH)):
  1859. printk(KERN_INFO "%s: DCD high, CTS high\n",card->devname);
  1860. break;
  1861. default:
  1862. printk(KERN_INFO "%s: DCD low, CTS low\n",card->devname);
  1863. break;
  1864. }
  1865. break;
  1866. case EXCEP_TRC_DISABLED:
  1867. printk(KERN_INFO "%s: Line trace disabled\n",
  1868. card->devname);
  1869. break;
  1870. case EXCEP_IRQ_TIMEOUT:
  1871. printk(KERN_INFO "%s: IRQ timeout occurred\n",
  1872. card->devname);
  1873. break;
  1874. case 0x17:
  1875. if (card->tty_opt){
  1876. if (card->tty && card->tty_open){
  1877. printk(KERN_INFO
  1878. "%s: Modem Hangup Exception: Hanging Up!\n",
  1879. card->devname);
  1880. tty_hangup(card->tty);
  1881. }
  1882. break;
  1883. }
  1884. /* If TTY is not used just drop throught */
  1885. default:
  1886. printk(KERN_INFO "%s: Global exception %x\n",
  1887. card->devname, mbox->return_code);
  1888. break;
  1889. }
  1890. }
  1891. return 0;
  1892. }
  1893. /*============================================================================
  1894. * Process chdlc exception condition
  1895. */
  1896. static int process_chdlc_exception(sdla_t *card)
  1897. {
  1898. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1899. int err;
  1900. mb->buffer_length = 0;
  1901. mb->command = READ_CHDLC_EXCEPTION_CONDITION;
  1902. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1903. if(err != CMD_TIMEOUT) {
  1904. switch (err) {
  1905. case EXCEP_LINK_ACTIVE:
  1906. port_set_state(card, WAN_CONNECTED);
  1907. trigger_chdlc_poll(card->wandev.dev);
  1908. break;
  1909. case EXCEP_LINK_INACTIVE_MODEM:
  1910. port_set_state(card, WAN_DISCONNECTED);
  1911. unconfigure_ip(card);
  1912. trigger_chdlc_poll(card->wandev.dev);
  1913. break;
  1914. case EXCEP_LINK_INACTIVE_KPALV:
  1915. port_set_state(card, WAN_DISCONNECTED);
  1916. printk(KERN_INFO "%s: Keepalive timer expired.\n",
  1917. card->devname);
  1918. unconfigure_ip(card);
  1919. trigger_chdlc_poll(card->wandev.dev);
  1920. break;
  1921. case EXCEP_IP_ADDRESS_DISCOVERED:
  1922. if (configure_ip(card))
  1923. return -1;
  1924. break;
  1925. case EXCEP_LOOPBACK_CONDITION:
  1926. printk(KERN_INFO "%s: Loopback Condition Detected.\n",
  1927. card->devname);
  1928. break;
  1929. case NO_CHDLC_EXCEP_COND_TO_REPORT:
  1930. printk(KERN_INFO "%s: No exceptions reported.\n",
  1931. card->devname);
  1932. break;
  1933. }
  1934. }
  1935. return 0;
  1936. }
  1937. /*============================================================================
  1938. * Configure IP from SLARP negotiation
  1939. * This adds dynamic routes when SLARP has provided valid addresses
  1940. */
  1941. static int configure_ip (sdla_t* card)
  1942. {
  1943. struct net_device *dev = card->wandev.dev;
  1944. chdlc_private_area_t *chdlc_priv_area;
  1945. char err;
  1946. if (!dev)
  1947. return 0;
  1948. chdlc_priv_area = dev->priv;
  1949. /* set to discover */
  1950. if(card->u.c.slarp_timer != 0x00) {
  1951. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1952. CHDLC_CONFIGURATION_STRUCT *cfg;
  1953. mb->buffer_length = 0;
  1954. mb->command = READ_CHDLC_CONFIGURATION;
  1955. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1956. if(err != COMMAND_OK) {
  1957. chdlc_error(card,err,mb);
  1958. return -1;
  1959. }
  1960. cfg = (CHDLC_CONFIGURATION_STRUCT *)mb->data;
  1961. chdlc_priv_area->IP_address = cfg->IP_address;
  1962. chdlc_priv_area->IP_netmask = cfg->IP_netmask;
  1963. /* Set flag to add route */
  1964. chdlc_priv_area->route_status = ADD_ROUTE;
  1965. /* The idea here is to add the route in the poll routine.
  1966. This way, we aren't in interrupt context when adding routes */
  1967. trigger_chdlc_poll(dev);
  1968. }
  1969. return 0;
  1970. }
  1971. /*============================================================================
  1972. * Un-Configure IP negotiated by SLARP
  1973. * This removes dynamic routes when the link becomes inactive.
  1974. */
  1975. static int unconfigure_ip (sdla_t* card)
  1976. {
  1977. struct net_device *dev = card->wandev.dev;
  1978. chdlc_private_area_t *chdlc_priv_area;
  1979. if (!dev)
  1980. return 0;
  1981. chdlc_priv_area= dev->priv;
  1982. if (chdlc_priv_area->route_status == ROUTE_ADDED) {
  1983. /* Note: If this function is called, the
  1984. * port state has been DISCONNECTED. This state
  1985. * change will trigger a poll_disconnected
  1986. * function, that will check for this condition.
  1987. */
  1988. chdlc_priv_area->route_status = REMOVE_ROUTE;
  1989. }
  1990. return 0;
  1991. }
  1992. /*============================================================================
  1993. * Routine to add/remove routes
  1994. * Called like a polling routine when Routes are flagged to be added/removed.
  1995. */
  1996. static void process_route (sdla_t *card)
  1997. {
  1998. struct net_device *dev = card->wandev.dev;
  1999. unsigned char port_num;
  2000. chdlc_private_area_t *chdlc_priv_area = NULL;
  2001. u32 local_IP_addr = 0;
  2002. u32 remote_IP_addr = 0;
  2003. u32 IP_netmask, IP_addr;
  2004. int err = 0;
  2005. struct in_device *in_dev;
  2006. mm_segment_t fs;
  2007. struct ifreq if_info;
  2008. struct sockaddr_in *if_data1, *if_data2;
  2009. chdlc_priv_area = dev->priv;
  2010. port_num = card->u.c.comm_port;
  2011. /* Bug Fix Mar 16 2000
  2012. * AND the IP address to the Mask before checking
  2013. * the last two bits. */
  2014. if((chdlc_priv_area->route_status == ADD_ROUTE) &&
  2015. ((chdlc_priv_area->IP_address & ~chdlc_priv_area->IP_netmask) > 2)) {
  2016. printk(KERN_INFO "%s: Dynamic route failure.\n",card->devname);
  2017. if(card->u.c.slarp_timer) {
  2018. u32 addr_net = htonl(chdlc_priv_area->IP_address);
  2019. printk(KERN_INFO "%s: Bad IP address %u.%u.%u.%u received\n",
  2020. card->devname,
  2021. NIPQUAD(addr_net));
  2022. printk(KERN_INFO "%s: from remote station.\n",
  2023. card->devname);
  2024. }else{
  2025. u32 addr_net = htonl(chdlc_priv_area->IP_address);
  2026. printk(KERN_INFO "%s: Bad IP address %u.%u.%u.%u issued\n",
  2027. card->devname,
  2028. NIPQUAD(addr_net));
  2029. printk(KERN_INFO "%s: to remote station. Local\n",
  2030. card->devname);
  2031. printk(KERN_INFO "%s: IP address must be A.B.C.1\n",
  2032. card->devname);
  2033. printk(KERN_INFO "%s: or A.B.C.2.\n",card->devname);
  2034. }
  2035. /* remove the route due to the IP address error condition */
  2036. chdlc_priv_area->route_status = REMOVE_ROUTE;
  2037. err = 1;
  2038. }
  2039. /* If we are removing a route with bad IP addressing, then use the */
  2040. /* locally configured IP addresses */
  2041. if((chdlc_priv_area->route_status == REMOVE_ROUTE) && err) {
  2042. /* do not remove a bad route that has already been removed */
  2043. if(chdlc_priv_area->route_removed) {
  2044. return;
  2045. }
  2046. in_dev = dev->ip_ptr;
  2047. if(in_dev != NULL) {
  2048. struct in_ifaddr *ifa = in_dev->ifa_list;
  2049. if (ifa != NULL ) {
  2050. local_IP_addr = ifa->ifa_local;
  2051. IP_netmask = ifa->ifa_mask;
  2052. }
  2053. }
  2054. }else{
  2055. /* According to Cisco HDLC, if the point-to-point address is
  2056. A.B.C.1, then we are the opposite (A.B.C.2), and vice-versa.
  2057. */
  2058. IP_netmask = ntohl(chdlc_priv_area->IP_netmask);
  2059. remote_IP_addr = ntohl(chdlc_priv_area->IP_address);
  2060. /* If Netmask is 255.255.255.255 the local address
  2061. * calculation will fail. Default it back to 255.255.255.0 */
  2062. if (IP_netmask == 0xffffffff)
  2063. IP_netmask &= 0x00ffffff;
  2064. /* Bug Fix Mar 16 2000
  2065. * AND the Remote IP address with IP netmask, instead
  2066. * of static netmask of 255.255.255.0 */
  2067. local_IP_addr = (remote_IP_addr & IP_netmask) +
  2068. (~remote_IP_addr & ntohl(0x0003));
  2069. if(!card->u.c.slarp_timer) {
  2070. IP_addr = local_IP_addr;
  2071. local_IP_addr = remote_IP_addr;
  2072. remote_IP_addr = IP_addr;
  2073. }
  2074. }
  2075. fs = get_fs(); /* Save file system */
  2076. set_fs(get_ds()); /* Get user space block */
  2077. /* Setup a structure for adding/removing routes */
  2078. memset(&if_info, 0, sizeof(if_info));
  2079. strcpy(if_info.ifr_name, dev->name);
  2080. switch (chdlc_priv_area->route_status) {
  2081. case ADD_ROUTE:
  2082. if(!card->u.c.slarp_timer) {
  2083. if_data2 = (struct sockaddr_in *)&if_info.ifr_dstaddr;
  2084. if_data2->sin_addr.s_addr = remote_IP_addr;
  2085. if_data2->sin_family = AF_INET;
  2086. err = devinet_ioctl(SIOCSIFDSTADDR, &if_info);
  2087. } else {
  2088. if_data1 = (struct sockaddr_in *)&if_info.ifr_addr;
  2089. if_data1->sin_addr.s_addr = local_IP_addr;
  2090. if_data1->sin_family = AF_INET;
  2091. if(!(err = devinet_ioctl(SIOCSIFADDR, &if_info))){
  2092. if_data2 = (struct sockaddr_in *)&if_info.ifr_dstaddr;
  2093. if_data2->sin_addr.s_addr = remote_IP_addr;
  2094. if_data2->sin_family = AF_INET;
  2095. err = devinet_ioctl(SIOCSIFDSTADDR, &if_info);
  2096. }
  2097. }
  2098. if(err) {
  2099. printk(KERN_INFO "%s: Add route %u.%u.%u.%u failed (%d)\n",
  2100. card->devname, NIPQUAD(remote_IP_addr), err);
  2101. } else {
  2102. ((chdlc_private_area_t *)dev->priv)->route_status = ROUTE_ADDED;
  2103. printk(KERN_INFO "%s: Dynamic route added.\n",
  2104. card->devname);
  2105. printk(KERN_INFO "%s: Local IP addr : %u.%u.%u.%u\n",
  2106. card->devname, NIPQUAD(local_IP_addr));
  2107. printk(KERN_INFO "%s: Remote IP addr: %u.%u.%u.%u\n",
  2108. card->devname, NIPQUAD(remote_IP_addr));
  2109. chdlc_priv_area->route_removed = 0;
  2110. }
  2111. break;
  2112. case REMOVE_ROUTE:
  2113. /* Change the local ip address of the interface to 0.
  2114. * This will also delete the destination route.
  2115. */
  2116. if(!card->u.c.slarp_timer) {
  2117. if_data2 = (struct sockaddr_in *)&if_info.ifr_dstaddr;
  2118. if_data2->sin_addr.s_addr = 0;
  2119. if_data2->sin_family = AF_INET;
  2120. err = devinet_ioctl(SIOCSIFDSTADDR, &if_info);
  2121. } else {
  2122. if_data1 = (struct sockaddr_in *)&if_info.ifr_addr;
  2123. if_data1->sin_addr.s_addr = 0;
  2124. if_data1->sin_family = AF_INET;
  2125. err = devinet_ioctl(SIOCSIFADDR,&if_info);
  2126. }
  2127. if(err) {
  2128. printk(KERN_INFO
  2129. "%s: Remove route %u.%u.%u.%u failed, (err %d)\n",
  2130. card->devname, NIPQUAD(remote_IP_addr),
  2131. err);
  2132. } else {
  2133. ((chdlc_private_area_t *)dev->priv)->route_status =
  2134. NO_ROUTE;
  2135. printk(KERN_INFO "%s: Dynamic route removed: %u.%u.%u.%u\n",
  2136. card->devname, NIPQUAD(local_IP_addr));
  2137. chdlc_priv_area->route_removed = 1;
  2138. }
  2139. break;
  2140. }
  2141. set_fs(fs); /* Restore file system */
  2142. }
  2143. /*=============================================================================
  2144. * Store a UDP management packet for later processing.
  2145. */
  2146. static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card,
  2147. struct sk_buff *skb, struct net_device* dev,
  2148. chdlc_private_area_t* chdlc_priv_area)
  2149. {
  2150. int udp_pkt_stored = 0;
  2151. if(!chdlc_priv_area->udp_pkt_lgth &&
  2152. (skb->len <= MAX_LGTH_UDP_MGNT_PKT)) {
  2153. chdlc_priv_area->udp_pkt_lgth = skb->len;
  2154. chdlc_priv_area->udp_pkt_src = udp_pkt_src;
  2155. memcpy(chdlc_priv_area->udp_pkt_data, skb->data, skb->len);
  2156. chdlc_priv_area->timer_int_enabled = TMR_INT_ENABLED_UDP;
  2157. udp_pkt_stored = 1;
  2158. }
  2159. if(udp_pkt_src == UDP_PKT_FRM_STACK){
  2160. dev_kfree_skb_any(skb);
  2161. }else{
  2162. dev_kfree_skb_any(skb);
  2163. }
  2164. return(udp_pkt_stored);
  2165. }
  2166. /*=============================================================================
  2167. * Process UDP management packet.
  2168. */
  2169. static int process_udp_mgmt_pkt(sdla_t* card, struct net_device* dev,
  2170. chdlc_private_area_t* chdlc_priv_area )
  2171. {
  2172. unsigned char *buf;
  2173. unsigned int frames, len;
  2174. struct sk_buff *new_skb;
  2175. unsigned short buffer_length, real_len;
  2176. unsigned long data_ptr;
  2177. unsigned data_length;
  2178. int udp_mgmt_req_valid = 1;
  2179. CHDLC_MAILBOX_STRUCT *mb = card->mbox;
  2180. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  2181. chdlc_udp_pkt_t *chdlc_udp_pkt;
  2182. struct timeval tv;
  2183. int err;
  2184. char ut_char;
  2185. chdlc_udp_pkt = (chdlc_udp_pkt_t *) chdlc_priv_area->udp_pkt_data;
  2186. if(chdlc_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK){
  2187. /* Only these commands are support for remote debugging.
  2188. * All others are not */
  2189. switch(chdlc_udp_pkt->cblock.command) {
  2190. case READ_GLOBAL_STATISTICS:
  2191. case READ_MODEM_STATUS:
  2192. case READ_CHDLC_LINK_STATUS:
  2193. case CPIPE_ROUTER_UP_TIME:
  2194. case READ_COMMS_ERROR_STATS:
  2195. case READ_CHDLC_OPERATIONAL_STATS:
  2196. /* These two commands are executed for
  2197. * each request */
  2198. case READ_CHDLC_CONFIGURATION:
  2199. case READ_CHDLC_CODE_VERSION:
  2200. udp_mgmt_req_valid = 1;
  2201. break;
  2202. default:
  2203. udp_mgmt_req_valid = 0;
  2204. break;
  2205. }
  2206. }
  2207. if(!udp_mgmt_req_valid) {
  2208. /* set length to 0 */
  2209. chdlc_udp_pkt->cblock.buffer_length = 0;
  2210. /* set return code */
  2211. chdlc_udp_pkt->cblock.return_code = 0xCD;
  2212. if (net_ratelimit()){
  2213. printk(KERN_INFO
  2214. "%s: Warning, Illegal UDP command attempted from network: %x\n",
  2215. card->devname,chdlc_udp_pkt->cblock.command);
  2216. }
  2217. } else {
  2218. unsigned long trace_status_cfg_addr = 0;
  2219. TRACE_STATUS_EL_CFG_STRUCT trace_cfg_struct;
  2220. TRACE_STATUS_ELEMENT_STRUCT trace_element_struct;
  2221. switch(chdlc_udp_pkt->cblock.command) {
  2222. case CPIPE_ENABLE_TRACING:
  2223. if (!chdlc_priv_area->TracingEnabled) {
  2224. /* OPERATE_DATALINE_MONITOR */
  2225. mb->buffer_length = sizeof(LINE_TRACE_CONFIG_STRUCT);
  2226. mb->command = SET_TRACE_CONFIGURATION;
  2227. ((LINE_TRACE_CONFIG_STRUCT *)mb->data)->
  2228. trace_config = TRACE_ACTIVE;
  2229. /* Trace delay mode is not used because it slows
  2230. down transfer and results in a standoff situation
  2231. when there is a lot of data */
  2232. /* Configure the Trace based on user inputs */
  2233. ((LINE_TRACE_CONFIG_STRUCT *)mb->data)->trace_config |=
  2234. chdlc_udp_pkt->data[0];
  2235. ((LINE_TRACE_CONFIG_STRUCT *)mb->data)->
  2236. trace_deactivation_timer = 4000;
  2237. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  2238. if (err != COMMAND_OK) {
  2239. chdlc_error(card,err,mb);
  2240. card->TracingEnabled = 0;
  2241. chdlc_udp_pkt->cblock.return_code = err;
  2242. mb->buffer_length = 0;
  2243. break;
  2244. }
  2245. /* Get the base address of the trace element list */
  2246. mb->buffer_length = 0;
  2247. mb->command = READ_TRACE_CONFIGURATION;
  2248. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  2249. if (err != COMMAND_OK) {
  2250. chdlc_error(card,err,mb);
  2251. chdlc_priv_area->TracingEnabled = 0;
  2252. chdlc_udp_pkt->cblock.return_code = err;
  2253. mb->buffer_length = 0;
  2254. break;
  2255. }
  2256. trace_status_cfg_addr =((LINE_TRACE_CONFIG_STRUCT *)
  2257. mb->data) -> ptr_trace_stat_el_cfg_struct;
  2258. sdla_peek(&card->hw, trace_status_cfg_addr,
  2259. &trace_cfg_struct, sizeof(trace_cfg_struct));
  2260. chdlc_priv_area->start_trace_addr = trace_cfg_struct.
  2261. base_addr_trace_status_elements;
  2262. chdlc_priv_area->number_trace_elements =
  2263. trace_cfg_struct.number_trace_status_elements;
  2264. chdlc_priv_area->end_trace_addr = (unsigned long)
  2265. ((TRACE_STATUS_ELEMENT_STRUCT *)
  2266. chdlc_priv_area->start_trace_addr +
  2267. (chdlc_priv_area->number_trace_elements - 1));
  2268. chdlc_priv_area->base_addr_trace_buffer =
  2269. trace_cfg_struct.base_addr_trace_buffer;
  2270. chdlc_priv_area->end_addr_trace_buffer =
  2271. trace_cfg_struct.end_addr_trace_buffer;
  2272. chdlc_priv_area->curr_trace_addr =
  2273. trace_cfg_struct.next_trace_element_to_use;
  2274. chdlc_priv_area->available_buffer_space = 2000 -
  2275. sizeof(ip_pkt_t) -
  2276. sizeof(udp_pkt_t) -
  2277. sizeof(wp_mgmt_t) -
  2278. sizeof(cblock_t) -
  2279. sizeof(trace_info_t);
  2280. }
  2281. chdlc_udp_pkt->cblock.return_code = COMMAND_OK;
  2282. mb->buffer_length = 0;
  2283. chdlc_priv_area->TracingEnabled = 1;
  2284. break;
  2285. case CPIPE_DISABLE_TRACING:
  2286. if (chdlc_priv_area->TracingEnabled) {
  2287. /* OPERATE_DATALINE_MONITOR */
  2288. mb->buffer_length = sizeof(LINE_TRACE_CONFIG_STRUCT);
  2289. mb->command = SET_TRACE_CONFIGURATION;
  2290. ((LINE_TRACE_CONFIG_STRUCT *)mb->data)->
  2291. trace_config = TRACE_INACTIVE;
  2292. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  2293. }
  2294. chdlc_priv_area->TracingEnabled = 0;
  2295. chdlc_udp_pkt->cblock.return_code = COMMAND_OK;
  2296. mb->buffer_length = 0;
  2297. break;
  2298. case CPIPE_GET_TRACE_INFO:
  2299. if (!chdlc_priv_area->TracingEnabled) {
  2300. chdlc_udp_pkt->cblock.return_code = 1;
  2301. mb->buffer_length = 0;
  2302. break;
  2303. }
  2304. chdlc_udp_pkt->trace_info.ismoredata = 0x00;
  2305. buffer_length = 0; /* offset of packet already occupied */
  2306. for (frames=0; frames < chdlc_priv_area->number_trace_elements; frames++){
  2307. trace_pkt_t *trace_pkt = (trace_pkt_t *)
  2308. &chdlc_udp_pkt->data[buffer_length];
  2309. sdla_peek(&card->hw, chdlc_priv_area->curr_trace_addr,
  2310. (unsigned char *)&trace_element_struct,
  2311. sizeof(TRACE_STATUS_ELEMENT_STRUCT));
  2312. if (trace_element_struct.opp_flag == 0x00) {
  2313. break;
  2314. }
  2315. /* get pointer to real data */
  2316. data_ptr = trace_element_struct.ptr_data_bfr;
  2317. /* See if there is actual data on the trace buffer */
  2318. if (data_ptr){
  2319. data_length = trace_element_struct.trace_length;
  2320. }else{
  2321. data_length = 0;
  2322. chdlc_udp_pkt->trace_info.ismoredata = 0x01;
  2323. }
  2324. if( (chdlc_priv_area->available_buffer_space - buffer_length)
  2325. < ( sizeof(trace_pkt_t) + data_length) ) {
  2326. /* indicate there are more frames on board & exit */
  2327. chdlc_udp_pkt->trace_info.ismoredata = 0x01;
  2328. break;
  2329. }
  2330. trace_pkt->status = trace_element_struct.trace_type;
  2331. trace_pkt->time_stamp =
  2332. trace_element_struct.trace_time_stamp;
  2333. trace_pkt->real_length =
  2334. trace_element_struct.trace_length;
  2335. /* see if we can fit the frame into the user buffer */
  2336. real_len = trace_pkt->real_length;
  2337. if (data_ptr == 0) {
  2338. trace_pkt->data_avail = 0x00;
  2339. } else {
  2340. unsigned tmp = 0;
  2341. /* get the data from circular buffer
  2342. must check for end of buffer */
  2343. trace_pkt->data_avail = 0x01;
  2344. if ((data_ptr + real_len) >
  2345. chdlc_priv_area->end_addr_trace_buffer + 1){
  2346. tmp = chdlc_priv_area->end_addr_trace_buffer - data_ptr + 1;
  2347. sdla_peek(&card->hw, data_ptr,
  2348. trace_pkt->data,tmp);
  2349. data_ptr = chdlc_priv_area->base_addr_trace_buffer;
  2350. }
  2351. sdla_peek(&card->hw, data_ptr,
  2352. &trace_pkt->data[tmp], real_len - tmp);
  2353. }
  2354. /* zero the opp flag to show we got the frame */
  2355. ut_char = 0x00;
  2356. sdla_poke(&card->hw, chdlc_priv_area->curr_trace_addr, &ut_char, 1);
  2357. /* now move onto the next frame */
  2358. chdlc_priv_area->curr_trace_addr += sizeof(TRACE_STATUS_ELEMENT_STRUCT);
  2359. /* check if we went over the last address */
  2360. if ( chdlc_priv_area->curr_trace_addr > chdlc_priv_area->end_trace_addr ) {
  2361. chdlc_priv_area->curr_trace_addr = chdlc_priv_area->start_trace_addr;
  2362. }
  2363. if(trace_pkt->data_avail == 0x01) {
  2364. buffer_length += real_len - 1;
  2365. }
  2366. /* for the header */
  2367. buffer_length += sizeof(trace_pkt_t);
  2368. } /* For Loop */
  2369. if (frames == chdlc_priv_area->number_trace_elements){
  2370. chdlc_udp_pkt->trace_info.ismoredata = 0x01;
  2371. }
  2372. chdlc_udp_pkt->trace_info.num_frames = frames;
  2373. mb->buffer_length = buffer_length;
  2374. chdlc_udp_pkt->cblock.buffer_length = buffer_length;
  2375. chdlc_udp_pkt->cblock.return_code = COMMAND_OK;
  2376. break;
  2377. case CPIPE_FT1_READ_STATUS:
  2378. ((unsigned char *)chdlc_udp_pkt->data )[0] =
  2379. flags->FT1_info_struct.parallel_port_A_input;
  2380. ((unsigned char *)chdlc_udp_pkt->data )[1] =
  2381. flags->FT1_info_struct.parallel_port_B_input;
  2382. chdlc_udp_pkt->cblock.return_code = COMMAND_OK;
  2383. chdlc_udp_pkt->cblock.buffer_length = 2;
  2384. mb->buffer_length = 2;
  2385. break;
  2386. case CPIPE_ROUTER_UP_TIME:
  2387. do_gettimeofday( &tv );
  2388. chdlc_priv_area->router_up_time = tv.tv_sec -
  2389. chdlc_priv_area->router_start_time;
  2390. *(unsigned long *)&chdlc_udp_pkt->data =
  2391. chdlc_priv_area->router_up_time;
  2392. mb->buffer_length = sizeof(unsigned long);
  2393. chdlc_udp_pkt->cblock.buffer_length = sizeof(unsigned long);
  2394. chdlc_udp_pkt->cblock.return_code = COMMAND_OK;
  2395. break;
  2396. case FT1_MONITOR_STATUS_CTRL:
  2397. /* Enable FT1 MONITOR STATUS */
  2398. if ((chdlc_udp_pkt->data[0] & ENABLE_READ_FT1_STATUS) ||
  2399. (chdlc_udp_pkt->data[0] & ENABLE_READ_FT1_OP_STATS)) {
  2400. if( rCount++ != 0 ) {
  2401. chdlc_udp_pkt->cblock.
  2402. return_code = COMMAND_OK;
  2403. mb->buffer_length = 1;
  2404. break;
  2405. }
  2406. }
  2407. /* Disable FT1 MONITOR STATUS */
  2408. if( chdlc_udp_pkt->data[0] == 0) {
  2409. if( --rCount != 0) {
  2410. chdlc_udp_pkt->cblock.
  2411. return_code = COMMAND_OK;
  2412. mb->buffer_length = 1;
  2413. break;
  2414. }
  2415. }
  2416. goto dflt_1;
  2417. default:
  2418. dflt_1:
  2419. /* it's a board command */
  2420. mb->command = chdlc_udp_pkt->cblock.command;
  2421. mb->buffer_length = chdlc_udp_pkt->cblock.buffer_length;
  2422. if (mb->buffer_length) {
  2423. memcpy(&mb->data, (unsigned char *) chdlc_udp_pkt->
  2424. data, mb->buffer_length);
  2425. }
  2426. /* run the command on the board */
  2427. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  2428. if (err != COMMAND_OK) {
  2429. break;
  2430. }
  2431. /* copy the result back to our buffer */
  2432. memcpy(&chdlc_udp_pkt->cblock, mb, sizeof(cblock_t));
  2433. if (mb->buffer_length) {
  2434. memcpy(&chdlc_udp_pkt->data, &mb->data,
  2435. mb->buffer_length);
  2436. }
  2437. } /* end of switch */
  2438. } /* end of else */
  2439. /* Fill UDP TTL */
  2440. chdlc_udp_pkt->ip_pkt.ttl = card->wandev.ttl;
  2441. len = reply_udp(chdlc_priv_area->udp_pkt_data, mb->buffer_length);
  2442. if(chdlc_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK){
  2443. /* Must check if we interrupted if_send() routine. The
  2444. * tx buffers might be used. If so drop the packet */
  2445. if (!test_bit(SEND_CRIT,&card->wandev.critical)) {
  2446. if(!chdlc_send(card, chdlc_priv_area->udp_pkt_data, len)) {
  2447. ++ card->wandev.stats.tx_packets;
  2448. card->wandev.stats.tx_bytes += len;
  2449. }
  2450. }
  2451. } else {
  2452. /* Pass it up the stack
  2453. Allocate socket buffer */
  2454. if ((new_skb = dev_alloc_skb(len)) != NULL) {
  2455. /* copy data into new_skb */
  2456. buf = skb_put(new_skb, len);
  2457. memcpy(buf, chdlc_priv_area->udp_pkt_data, len);
  2458. /* Decapsulate pkt and pass it up the protocol stack */
  2459. new_skb->protocol = htons(ETH_P_IP);
  2460. new_skb->dev = dev;
  2461. new_skb->mac.raw = new_skb->data;
  2462. netif_rx(new_skb);
  2463. dev->last_rx = jiffies;
  2464. } else {
  2465. printk(KERN_INFO "%s: no socket buffers available!\n",
  2466. card->devname);
  2467. }
  2468. }
  2469. chdlc_priv_area->udp_pkt_lgth = 0;
  2470. return 0;
  2471. }
  2472. /*============================================================================
  2473. * Initialize Receive and Transmit Buffers.
  2474. */
  2475. static void init_chdlc_tx_rx_buff( sdla_t* card)
  2476. {
  2477. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  2478. CHDLC_TX_STATUS_EL_CFG_STRUCT *tx_config;
  2479. CHDLC_RX_STATUS_EL_CFG_STRUCT *rx_config;
  2480. char err;
  2481. mb->buffer_length = 0;
  2482. mb->command = READ_CHDLC_CONFIGURATION;
  2483. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  2484. if(err != COMMAND_OK) {
  2485. if (card->wandev.dev){
  2486. chdlc_error(card,err,mb);
  2487. }
  2488. return;
  2489. }
  2490. if(card->hw.type == SDLA_S514) {
  2491. tx_config = (CHDLC_TX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase +
  2492. (((CHDLC_CONFIGURATION_STRUCT *)mb->data)->
  2493. ptr_CHDLC_Tx_stat_el_cfg_struct));
  2494. rx_config = (CHDLC_RX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase +
  2495. (((CHDLC_CONFIGURATION_STRUCT *)mb->data)->
  2496. ptr_CHDLC_Rx_stat_el_cfg_struct));
  2497. /* Setup Head and Tails for buffers */
  2498. card->u.c.txbuf_base = (void *)(card->hw.dpmbase +
  2499. tx_config->base_addr_Tx_status_elements);
  2500. card->u.c.txbuf_last =
  2501. (CHDLC_DATA_TX_STATUS_EL_STRUCT *)
  2502. card->u.c.txbuf_base +
  2503. (tx_config->number_Tx_status_elements - 1);
  2504. card->u.c.rxbuf_base = (void *)(card->hw.dpmbase +
  2505. rx_config->base_addr_Rx_status_elements);
  2506. card->u.c.rxbuf_last =
  2507. (CHDLC_DATA_RX_STATUS_EL_STRUCT *)
  2508. card->u.c.rxbuf_base +
  2509. (rx_config->number_Rx_status_elements - 1);
  2510. /* Set up next pointer to be used */
  2511. card->u.c.txbuf = (void *)(card->hw.dpmbase +
  2512. tx_config->next_Tx_status_element_to_use);
  2513. card->u.c.rxmb = (void *)(card->hw.dpmbase +
  2514. rx_config->next_Rx_status_element_to_use);
  2515. }
  2516. else {
  2517. tx_config = (CHDLC_TX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase +
  2518. (((CHDLC_CONFIGURATION_STRUCT *)mb->data)->
  2519. ptr_CHDLC_Tx_stat_el_cfg_struct % SDLA_WINDOWSIZE));
  2520. rx_config = (CHDLC_RX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase +
  2521. (((CHDLC_CONFIGURATION_STRUCT *)mb->data)->
  2522. ptr_CHDLC_Rx_stat_el_cfg_struct % SDLA_WINDOWSIZE));
  2523. /* Setup Head and Tails for buffers */
  2524. card->u.c.txbuf_base = (void *)(card->hw.dpmbase +
  2525. (tx_config->base_addr_Tx_status_elements % SDLA_WINDOWSIZE));
  2526. card->u.c.txbuf_last =
  2527. (CHDLC_DATA_TX_STATUS_EL_STRUCT *)card->u.c.txbuf_base
  2528. + (tx_config->number_Tx_status_elements - 1);
  2529. card->u.c.rxbuf_base = (void *)(card->hw.dpmbase +
  2530. (rx_config->base_addr_Rx_status_elements % SDLA_WINDOWSIZE));
  2531. card->u.c.rxbuf_last =
  2532. (CHDLC_DATA_RX_STATUS_EL_STRUCT *)card->u.c.rxbuf_base
  2533. + (rx_config->number_Rx_status_elements - 1);
  2534. /* Set up next pointer to be used */
  2535. card->u.c.txbuf = (void *)(card->hw.dpmbase +
  2536. (tx_config->next_Tx_status_element_to_use % SDLA_WINDOWSIZE));
  2537. card->u.c.rxmb = (void *)(card->hw.dpmbase +
  2538. (rx_config->next_Rx_status_element_to_use % SDLA_WINDOWSIZE));
  2539. }
  2540. /* Setup Actual Buffer Start and end addresses */
  2541. card->u.c.rx_base = rx_config->base_addr_Rx_buffer;
  2542. card->u.c.rx_top = rx_config->end_addr_Rx_buffer;
  2543. }
  2544. /*=============================================================================
  2545. * Perform Interrupt Test by running READ_CHDLC_CODE_VERSION command MAX_INTR
  2546. * _TEST_COUNTER times.
  2547. */
  2548. static int intr_test( sdla_t* card)
  2549. {
  2550. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  2551. int err,i;
  2552. Intr_test_counter = 0;
  2553. err = chdlc_set_intr_mode(card, APP_INT_ON_COMMAND_COMPLETE);
  2554. if (err == CMD_OK) {
  2555. for (i = 0; i < MAX_INTR_TEST_COUNTER; i ++) {
  2556. mb->buffer_length = 0;
  2557. mb->command = READ_CHDLC_CODE_VERSION;
  2558. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  2559. if (err != CMD_OK)
  2560. chdlc_error(card, err, mb);
  2561. }
  2562. }
  2563. else {
  2564. return err;
  2565. }
  2566. err = chdlc_set_intr_mode(card, 0);
  2567. if (err != CMD_OK)
  2568. return err;
  2569. return 0;
  2570. }
  2571. /*==============================================================================
  2572. * Determine what type of UDP call it is. CPIPEAB ?
  2573. */
  2574. static int udp_pkt_type(struct sk_buff *skb, sdla_t* card)
  2575. {
  2576. chdlc_udp_pkt_t *chdlc_udp_pkt = (chdlc_udp_pkt_t *)skb->data;
  2577. #ifdef _WAN_UDP_DEBUG
  2578. printk(KERN_INFO "SIG %s = %s\n\
  2579. UPP %x = %x\n\
  2580. PRT %x = %x\n\
  2581. REQ %i = %i\n\
  2582. 36 th = %x 37th = %x\n",
  2583. chdlc_udp_pkt->wp_mgmt.signature,
  2584. UDPMGMT_SIGNATURE,
  2585. chdlc_udp_pkt->udp_pkt.udp_dst_port,
  2586. ntohs(card->wandev.udp_port),
  2587. chdlc_udp_pkt->ip_pkt.protocol,
  2588. UDPMGMT_UDP_PROTOCOL,
  2589. chdlc_udp_pkt->wp_mgmt.request_reply,
  2590. UDPMGMT_REQUEST,
  2591. skb->data[36], skb->data[37]);
  2592. #endif
  2593. if (!strncmp(chdlc_udp_pkt->wp_mgmt.signature,UDPMGMT_SIGNATURE,8) &&
  2594. (chdlc_udp_pkt->udp_pkt.udp_dst_port == ntohs(card->wandev.udp_port)) &&
  2595. (chdlc_udp_pkt->ip_pkt.protocol == UDPMGMT_UDP_PROTOCOL) &&
  2596. (chdlc_udp_pkt->wp_mgmt.request_reply == UDPMGMT_REQUEST)) {
  2597. return UDP_CPIPE_TYPE;
  2598. }else{
  2599. return UDP_INVALID_TYPE;
  2600. }
  2601. }
  2602. /*============================================================================
  2603. * Set PORT state.
  2604. */
  2605. static void port_set_state (sdla_t *card, int state)
  2606. {
  2607. if (card->u.c.state != state)
  2608. {
  2609. switch (state)
  2610. {
  2611. case WAN_CONNECTED:
  2612. printk (KERN_INFO "%s: Link connected!\n",
  2613. card->devname);
  2614. break;
  2615. case WAN_CONNECTING:
  2616. printk (KERN_INFO "%s: Link connecting...\n",
  2617. card->devname);
  2618. break;
  2619. case WAN_DISCONNECTED:
  2620. printk (KERN_INFO "%s: Link disconnected!\n",
  2621. card->devname);
  2622. break;
  2623. }
  2624. card->wandev.state = card->u.c.state = state;
  2625. if (card->wandev.dev){
  2626. struct net_device *dev = card->wandev.dev;
  2627. chdlc_private_area_t *chdlc_priv_area = dev->priv;
  2628. chdlc_priv_area->common.state = state;
  2629. }
  2630. }
  2631. }
  2632. /*===========================================================================
  2633. * config_chdlc
  2634. *
  2635. * Configure the chdlc protocol and enable communications.
  2636. *
  2637. * The if_open() function binds this function to the poll routine.
  2638. * Therefore, this function will run every time the chdlc interface
  2639. * is brought up. We cannot run this function from the if_open
  2640. * because if_open does not have access to the remote IP address.
  2641. *
  2642. * If the communications are not enabled, proceed to configure
  2643. * the card and enable communications.
  2644. *
  2645. * If the communications are enabled, it means that the interface
  2646. * was shutdown by ether the user or driver. In this case, we
  2647. * have to check that the IP addresses have not changed. If
  2648. * the IP addresses have changed, we have to reconfigure the firmware
  2649. * and update the changed IP addresses. Otherwise, just exit.
  2650. *
  2651. */
  2652. static int config_chdlc (sdla_t *card)
  2653. {
  2654. struct net_device *dev = card->wandev.dev;
  2655. chdlc_private_area_t *chdlc_priv_area = dev->priv;
  2656. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  2657. if (card->u.c.comm_enabled){
  2658. /* Jun 20. 2000: NC
  2659. * IP addresses are not used in the API mode */
  2660. if ((chdlc_priv_area->ip_local_tmp != chdlc_priv_area->ip_local ||
  2661. chdlc_priv_area->ip_remote_tmp != chdlc_priv_area->ip_remote) &&
  2662. card->u.c.usedby == WANPIPE) {
  2663. /* The IP addersses have changed, we must
  2664. * stop the communications and reconfigure
  2665. * the card. Reason: the firmware must know
  2666. * the local and remote IP addresses. */
  2667. disable_comm(card);
  2668. port_set_state(card, WAN_DISCONNECTED);
  2669. printk(KERN_INFO
  2670. "%s: IP addresses changed!\n",
  2671. card->devname);
  2672. printk(KERN_INFO
  2673. "%s: Restarting communications ...\n",
  2674. card->devname);
  2675. }else{
  2676. /* IP addresses are the same and the link is up,
  2677. * we don't have to do anything here. Therefore, exit */
  2678. return 0;
  2679. }
  2680. }
  2681. chdlc_priv_area->ip_local = chdlc_priv_area->ip_local_tmp;
  2682. chdlc_priv_area->ip_remote = chdlc_priv_area->ip_remote_tmp;
  2683. /* Setup the Board for asynchronous mode */
  2684. if (card->u.c.async_mode){
  2685. if (set_asy_config(card)) {
  2686. printk (KERN_INFO "%s: Failed CHDLC Async configuration!\n",
  2687. card->devname);
  2688. return 0;
  2689. }
  2690. }else{
  2691. /* Setup the Board for CHDLC */
  2692. if (set_chdlc_config(card)) {
  2693. printk (KERN_INFO "%s: Failed CHDLC configuration!\n",
  2694. card->devname);
  2695. return 0;
  2696. }
  2697. }
  2698. /* Set interrupt mode and mask */
  2699. if (chdlc_set_intr_mode(card, APP_INT_ON_RX_FRAME |
  2700. APP_INT_ON_GLOBAL_EXCEP_COND |
  2701. APP_INT_ON_TX_FRAME |
  2702. APP_INT_ON_CHDLC_EXCEP_COND | APP_INT_ON_TIMER)){
  2703. printk (KERN_INFO "%s: Failed to set interrupt triggers!\n",
  2704. card->devname);
  2705. return 0;
  2706. }
  2707. /* Mask the Transmit and Timer interrupt */
  2708. flags->interrupt_info_struct.interrupt_permission &=
  2709. ~(APP_INT_ON_TX_FRAME | APP_INT_ON_TIMER);
  2710. /* In TTY mode, receive interrupt will be enabled during
  2711. * wanpipe_tty_open() operation */
  2712. if (card->tty_opt){
  2713. flags->interrupt_info_struct.interrupt_permission &= ~APP_INT_ON_RX_FRAME;
  2714. }
  2715. /* Enable communications */
  2716. if (card->u.c.async_mode){
  2717. if (asy_comm_enable(card) != 0) {
  2718. printk(KERN_INFO "%s: Failed to enable async commnunication!\n",
  2719. card->devname);
  2720. flags->interrupt_info_struct.interrupt_permission = 0;
  2721. card->u.c.comm_enabled=0;
  2722. chdlc_set_intr_mode(card,0);
  2723. return 0;
  2724. }
  2725. }else{
  2726. if (chdlc_comm_enable(card) != 0) {
  2727. printk(KERN_INFO "%s: Failed to enable chdlc communications!\n",
  2728. card->devname);
  2729. flags->interrupt_info_struct.interrupt_permission = 0;
  2730. card->u.c.comm_enabled=0;
  2731. chdlc_set_intr_mode(card,0);
  2732. return 0;
  2733. }
  2734. }
  2735. /* Initialize Rx/Tx buffer control fields */
  2736. init_chdlc_tx_rx_buff(card);
  2737. port_set_state(card, WAN_CONNECTING);
  2738. return 0;
  2739. }
  2740. /*============================================================
  2741. * chdlc_poll
  2742. *
  2743. * Rationale:
  2744. * We cannot manipulate the routing tables, or
  2745. * ip addresses withing the interrupt. Therefore
  2746. * we must perform such actons outside an interrupt
  2747. * at a later time.
  2748. *
  2749. * Description:
  2750. * CHDLC polling routine, responsible for
  2751. * shutting down interfaces upon disconnect
  2752. * and adding/removing routes.
  2753. *
  2754. * Usage:
  2755. * This function is executed for each CHDLC
  2756. * interface through a tq_schedule bottom half.
  2757. *
  2758. * trigger_chdlc_poll() function is used to kick
  2759. * the chldc_poll routine.
  2760. */
  2761. static void chdlc_poll(struct net_device *dev)
  2762. {
  2763. chdlc_private_area_t *chdlc_priv_area;
  2764. sdla_t *card;
  2765. u8 check_gateway=0;
  2766. SHARED_MEMORY_INFO_STRUCT* flags;
  2767. if (!dev || (chdlc_priv_area=dev->priv) == NULL)
  2768. return;
  2769. card = chdlc_priv_area->card;
  2770. flags = card->u.c.flags;
  2771. /* (Re)Configuraiton is in progress, stop what you are
  2772. * doing and get out */
  2773. if (test_bit(PERI_CRIT,&card->wandev.critical)){
  2774. clear_bit(POLL_CRIT,&card->wandev.critical);
  2775. return;
  2776. }
  2777. /* if_open() function has triggered the polling routine
  2778. * to determine the configured IP addresses. Once the
  2779. * addresses are found, trigger the chdlc configuration */
  2780. if (test_bit(0,&chdlc_priv_area->config_chdlc)){
  2781. chdlc_priv_area->ip_local_tmp = get_ip_address(dev,WAN_LOCAL_IP);
  2782. chdlc_priv_area->ip_remote_tmp = get_ip_address(dev,WAN_POINTOPOINT_IP);
  2783. /* Jun 20. 2000 Bug Fix
  2784. * Only perform this check in WANPIPE mode, since
  2785. * IP addresses are not used in the API mode. */
  2786. if (chdlc_priv_area->ip_local_tmp == chdlc_priv_area->ip_remote_tmp &&
  2787. card->u.c.slarp_timer == 0x00 &&
  2788. !card->u.c.backup &&
  2789. card->u.c.usedby == WANPIPE){
  2790. if (++chdlc_priv_area->ip_error > MAX_IP_ERRORS){
  2791. printk(KERN_INFO "\n%s: --- WARNING ---\n",
  2792. card->devname);
  2793. printk(KERN_INFO
  2794. "%s: The local IP address is the same as the\n",
  2795. card->devname);
  2796. printk(KERN_INFO
  2797. "%s: Point-to-Point IP address.\n",
  2798. card->devname);
  2799. printk(KERN_INFO "%s: --- WARNING ---\n\n",
  2800. card->devname);
  2801. }else{
  2802. clear_bit(POLL_CRIT,&card->wandev.critical);
  2803. chdlc_priv_area->poll_delay_timer.expires = jiffies+HZ;
  2804. add_timer(&chdlc_priv_area->poll_delay_timer);
  2805. return;
  2806. }
  2807. }
  2808. clear_bit(0,&chdlc_priv_area->config_chdlc);
  2809. clear_bit(POLL_CRIT,&card->wandev.critical);
  2810. chdlc_priv_area->timer_int_enabled |= TMR_INT_ENABLED_CONFIG;
  2811. flags->interrupt_info_struct.interrupt_permission |= APP_INT_ON_TIMER;
  2812. return;
  2813. }
  2814. /* Dynamic interface implementation, as well as dynamic
  2815. * routing. */
  2816. switch (card->u.c.state){
  2817. case WAN_DISCONNECTED:
  2818. /* If the dynamic interface configuration is on, and interface
  2819. * is up, then bring down the netowrk interface */
  2820. if (test_bit(DYN_OPT_ON,&chdlc_priv_area->interface_down) &&
  2821. !test_bit(DEV_DOWN, &chdlc_priv_area->interface_down) &&
  2822. card->wandev.dev->flags & IFF_UP){
  2823. printk(KERN_INFO "%s: Interface %s down.\n",
  2824. card->devname,card->wandev.dev->name);
  2825. change_dev_flags(card->wandev.dev,(card->wandev.dev->flags&~IFF_UP));
  2826. set_bit(DEV_DOWN,&chdlc_priv_area->interface_down);
  2827. chdlc_priv_area->route_status = NO_ROUTE;
  2828. }else{
  2829. /* We need to check if the local IP address is
  2830. * zero. If it is, we shouldn't try to remove it.
  2831. */
  2832. if (card->wandev.dev->flags & IFF_UP &&
  2833. get_ip_address(card->wandev.dev,WAN_LOCAL_IP) &&
  2834. chdlc_priv_area->route_status != NO_ROUTE &&
  2835. card->u.c.slarp_timer){
  2836. process_route(card);
  2837. }
  2838. }
  2839. break;
  2840. case WAN_CONNECTED:
  2841. /* In SMP machine this code can execute before the interface
  2842. * comes up. In this case, we must make sure that we do not
  2843. * try to bring up the interface before dev_open() is finished */
  2844. /* DEV_DOWN will be set only when we bring down the interface
  2845. * for the very first time. This way we know that it was us
  2846. * that brought the interface down */
  2847. if (test_bit(DYN_OPT_ON,&chdlc_priv_area->interface_down) &&
  2848. test_bit(DEV_DOWN, &chdlc_priv_area->interface_down) &&
  2849. !(card->wandev.dev->flags & IFF_UP)){
  2850. printk(KERN_INFO "%s: Interface %s up.\n",
  2851. card->devname,card->wandev.dev->name);
  2852. change_dev_flags(card->wandev.dev,(card->wandev.dev->flags|IFF_UP));
  2853. clear_bit(DEV_DOWN,&chdlc_priv_area->interface_down);
  2854. check_gateway=1;
  2855. }
  2856. if (chdlc_priv_area->route_status == ADD_ROUTE &&
  2857. card->u.c.slarp_timer){
  2858. process_route(card);
  2859. check_gateway=1;
  2860. }
  2861. if (chdlc_priv_area->gateway && check_gateway)
  2862. add_gateway(card,dev);
  2863. break;
  2864. }
  2865. clear_bit(POLL_CRIT,&card->wandev.critical);
  2866. }
  2867. /*============================================================
  2868. * trigger_chdlc_poll
  2869. *
  2870. * Description:
  2871. * Add a chdlc_poll() work entry into the keventd work queue
  2872. * for a specific dlci/interface. This will kick
  2873. * the fr_poll() routine at a later time.
  2874. *
  2875. * Usage:
  2876. * Interrupts use this to defer a taks to
  2877. * a polling routine.
  2878. *
  2879. */
  2880. static void trigger_chdlc_poll(struct net_device *dev)
  2881. {
  2882. chdlc_private_area_t *chdlc_priv_area;
  2883. sdla_t *card;
  2884. if (!dev)
  2885. return;
  2886. if ((chdlc_priv_area = dev->priv)==NULL)
  2887. return;
  2888. card = chdlc_priv_area->card;
  2889. if (test_and_set_bit(POLL_CRIT,&card->wandev.critical)){
  2890. return;
  2891. }
  2892. if (test_bit(PERI_CRIT,&card->wandev.critical)){
  2893. return;
  2894. }
  2895. schedule_work(&chdlc_priv_area->poll_work);
  2896. }
  2897. static void chdlc_poll_delay (unsigned long dev_ptr)
  2898. {
  2899. struct net_device *dev = (struct net_device *)dev_ptr;
  2900. trigger_chdlc_poll(dev);
  2901. }
  2902. void s508_lock (sdla_t *card, unsigned long *smp_flags)
  2903. {
  2904. spin_lock_irqsave(&card->wandev.lock, *smp_flags);
  2905. if (card->next){
  2906. spin_lock(&card->next->wandev.lock);
  2907. }
  2908. }
  2909. void s508_unlock (sdla_t *card, unsigned long *smp_flags)
  2910. {
  2911. if (card->next){
  2912. spin_unlock(&card->next->wandev.lock);
  2913. }
  2914. spin_unlock_irqrestore(&card->wandev.lock, *smp_flags);
  2915. }
  2916. //*********** TTY SECTION ****************
  2917. static void wanpipe_tty_trigger_tx_irq(sdla_t *card)
  2918. {
  2919. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  2920. INTERRUPT_INFORMATION_STRUCT *chdlc_int = &flags->interrupt_info_struct;
  2921. chdlc_int->interrupt_permission |= APP_INT_ON_TX_FRAME;
  2922. }
  2923. static void wanpipe_tty_trigger_poll(sdla_t *card)
  2924. {
  2925. schedule_work(&card->tty_work);
  2926. }
  2927. static void tty_poll_work (void* data)
  2928. {
  2929. sdla_t *card = (sdla_t*)data;
  2930. struct tty_struct *tty;
  2931. if ((tty=card->tty)==NULL)
  2932. return;
  2933. tty_wakeup(tty);
  2934. #if defined(SERIAL_HAVE_POLL_WAIT)
  2935. wake_up_interruptible(&tty->poll_wait);
  2936. #endif
  2937. return;
  2938. }
  2939. static void wanpipe_tty_close(struct tty_struct *tty, struct file * filp)
  2940. {
  2941. sdla_t *card;
  2942. unsigned long smp_flags;
  2943. if (!tty || !tty->driver_data){
  2944. return;
  2945. }
  2946. card = (sdla_t*)tty->driver_data;
  2947. if (!card)
  2948. return;
  2949. printk(KERN_INFO "%s: Closing TTY Driver!\n",
  2950. card->devname);
  2951. /* Sanity Check */
  2952. if (!card->tty_open)
  2953. return;
  2954. wanpipe_close(card);
  2955. if (--card->tty_open == 0){
  2956. lock_adapter_irq(&card->wandev.lock,&smp_flags);
  2957. card->tty=NULL;
  2958. chdlc_disable_comm_shutdown(card);
  2959. unlock_adapter_irq(&card->wandev.lock,&smp_flags);
  2960. kfree(card->tty_buf);
  2961. card->tty_buf = NULL;
  2962. kfree(card->tty_rx);
  2963. card->tty_rx = NULL;
  2964. }
  2965. return;
  2966. }
  2967. static int wanpipe_tty_open(struct tty_struct *tty, struct file * filp)
  2968. {
  2969. unsigned long smp_flags;
  2970. sdla_t *card;
  2971. if (!tty){
  2972. return -ENODEV;
  2973. }
  2974. if (!tty->driver_data){
  2975. int port;
  2976. port = tty->index;
  2977. if ((port < 0) || (port >= NR_PORTS))
  2978. return -ENODEV;
  2979. tty->driver_data = WAN_CARD(port);
  2980. if (!tty->driver_data)
  2981. return -ENODEV;
  2982. }
  2983. card = (sdla_t*)tty->driver_data;
  2984. if (!card){
  2985. lock_adapter_irq(&card->wandev.lock,&smp_flags);
  2986. card->tty=NULL;
  2987. unlock_adapter_irq(&card->wandev.lock,&smp_flags);
  2988. return -ENODEV;
  2989. }
  2990. printk(KERN_INFO "%s: Opening TTY Driver!\n",
  2991. card->devname);
  2992. if (card->tty_open == 0){
  2993. lock_adapter_irq(&card->wandev.lock,&smp_flags);
  2994. card->tty=tty;
  2995. unlock_adapter_irq(&card->wandev.lock,&smp_flags);
  2996. if (!card->tty_buf){
  2997. card->tty_buf = kmalloc(TTY_CHDLC_MAX_MTU, GFP_KERNEL);
  2998. if (!card->tty_buf){
  2999. card->tty_buf=NULL;
  3000. card->tty=NULL;
  3001. return -ENOMEM;
  3002. }
  3003. }
  3004. if (!card->tty_rx){
  3005. card->tty_rx = kmalloc(TTY_CHDLC_MAX_MTU, GFP_KERNEL);
  3006. if (!card->tty_rx){
  3007. /* Free the buffer above */
  3008. kfree(card->tty_buf);
  3009. card->tty_buf=NULL;
  3010. card->tty=NULL;
  3011. return -ENOMEM;
  3012. }
  3013. }
  3014. }
  3015. ++card->tty_open;
  3016. wanpipe_open(card);
  3017. return 0;
  3018. }
  3019. static int wanpipe_tty_write(struct tty_struct * tty, const unsigned char *buf, int count)
  3020. {
  3021. unsigned long smp_flags=0;
  3022. sdla_t *card=NULL;
  3023. if (!tty){
  3024. dbg_printk(KERN_INFO "NO TTY in Write\n");
  3025. return -ENODEV;
  3026. }
  3027. card = (sdla_t *)tty->driver_data;
  3028. if (!card){
  3029. dbg_printk(KERN_INFO "No Card in TTY Write\n");
  3030. return -ENODEV;
  3031. }
  3032. if (count > card->wandev.mtu){
  3033. dbg_printk(KERN_INFO "Frame too big in Write %i Max: %i\n",
  3034. count,card->wandev.mtu);
  3035. return -EINVAL;
  3036. }
  3037. if (card->wandev.state != WAN_CONNECTED){
  3038. dbg_printk(KERN_INFO "Card not connected in TTY Write\n");
  3039. return -EINVAL;
  3040. }
  3041. /* Lock the 508 Card: SMP is supported */
  3042. if(card->hw.type != SDLA_S514){
  3043. s508_lock(card,&smp_flags);
  3044. }
  3045. if (test_and_set_bit(SEND_CRIT,(void*)&card->wandev.critical)){
  3046. printk(KERN_INFO "%s: Critical in TTY Write\n",
  3047. card->devname);
  3048. /* Lock the 508 Card: SMP is supported */
  3049. if(card->hw.type != SDLA_S514)
  3050. s508_unlock(card,&smp_flags);
  3051. return -EINVAL;
  3052. }
  3053. if (chdlc_send(card,(void*)buf,count)){
  3054. dbg_printk(KERN_INFO "%s: Failed to send, retry later: kernel!\n",
  3055. card->devname);
  3056. clear_bit(SEND_CRIT,(void*)&card->wandev.critical);
  3057. wanpipe_tty_trigger_tx_irq(card);
  3058. if(card->hw.type != SDLA_S514)
  3059. s508_unlock(card,&smp_flags);
  3060. return 0;
  3061. }
  3062. dbg_printk(KERN_INFO "%s: Packet sent OK: %i\n",card->devname,count);
  3063. clear_bit(SEND_CRIT,(void*)&card->wandev.critical);
  3064. if(card->hw.type != SDLA_S514)
  3065. s508_unlock(card,&smp_flags);
  3066. return count;
  3067. }
  3068. static void wanpipe_tty_receive(sdla_t *card, unsigned addr, unsigned int len)
  3069. {
  3070. unsigned offset=0;
  3071. unsigned olen=len;
  3072. char fp=0;
  3073. struct tty_struct *tty;
  3074. int i;
  3075. struct tty_ldisc *ld;
  3076. if (!card->tty_open){
  3077. dbg_printk(KERN_INFO "%s: TTY not open during receive\n",
  3078. card->devname);
  3079. return;
  3080. }
  3081. if ((tty=card->tty) == NULL){
  3082. dbg_printk(KERN_INFO "%s: No TTY on receive\n",
  3083. card->devname);
  3084. return;
  3085. }
  3086. if (!tty->driver_data){
  3087. dbg_printk(KERN_INFO "%s: No Driver Data, or Flip on receive\n",
  3088. card->devname);
  3089. return;
  3090. }
  3091. if (card->u.c.async_mode){
  3092. if ((tty->flip.count+len) >= TTY_FLIPBUF_SIZE){
  3093. if (net_ratelimit()){
  3094. printk(KERN_INFO
  3095. "%s: Received packet size too big: %i bytes, Max: %i!\n",
  3096. card->devname,len,TTY_FLIPBUF_SIZE);
  3097. }
  3098. return;
  3099. }
  3100. if((addr + len) > card->u.c.rx_top + 1) {
  3101. offset = card->u.c.rx_top - addr + 1;
  3102. sdla_peek(&card->hw, addr, tty->flip.char_buf_ptr, offset);
  3103. addr = card->u.c.rx_base;
  3104. len -= offset;
  3105. tty->flip.char_buf_ptr+=offset;
  3106. tty->flip.count+=offset;
  3107. for (i=0;i<offset;i++){
  3108. *tty->flip.flag_buf_ptr = 0;
  3109. tty->flip.flag_buf_ptr++;
  3110. }
  3111. }
  3112. sdla_peek(&card->hw, addr, tty->flip.char_buf_ptr, len);
  3113. tty->flip.char_buf_ptr+=len;
  3114. card->tty->flip.count+=len;
  3115. for (i=0;i<len;i++){
  3116. *tty->flip.flag_buf_ptr = 0;
  3117. tty->flip.flag_buf_ptr++;
  3118. }
  3119. tty->low_latency=1;
  3120. tty_flip_buffer_push(tty);
  3121. }else{
  3122. if (!card->tty_rx){
  3123. if (net_ratelimit()){
  3124. printk(KERN_INFO
  3125. "%s: Receive sync buffer not available!\n",
  3126. card->devname);
  3127. }
  3128. return;
  3129. }
  3130. if (len > TTY_CHDLC_MAX_MTU){
  3131. if (net_ratelimit()){
  3132. printk(KERN_INFO
  3133. "%s: Received packet size too big: %i bytes, Max: %i!\n",
  3134. card->devname,len,TTY_FLIPBUF_SIZE);
  3135. }
  3136. return;
  3137. }
  3138. if((addr + len) > card->u.c.rx_top + 1) {
  3139. offset = card->u.c.rx_top - addr + 1;
  3140. sdla_peek(&card->hw, addr, card->tty_rx, offset);
  3141. addr = card->u.c.rx_base;
  3142. len -= offset;
  3143. }
  3144. sdla_peek(&card->hw, addr, card->tty_rx+offset, len);
  3145. ld = tty_ldisc_ref(tty);
  3146. if (ld) {
  3147. if (ld->receive_buf)
  3148. ld->receive_buf(tty,card->tty_rx,&fp,olen);
  3149. tty_ldisc_deref(ld);
  3150. }else{
  3151. if (net_ratelimit()){
  3152. printk(KERN_INFO
  3153. "%s: NO TTY Sync line discipline!\n",
  3154. card->devname);
  3155. }
  3156. }
  3157. }
  3158. dbg_printk(KERN_INFO "%s: Received Data %i\n",card->devname,olen);
  3159. return;
  3160. }
  3161. #if 0
  3162. static int wanpipe_tty_ioctl(struct tty_struct *tty, struct file * file,
  3163. unsigned int cmd, unsigned long arg)
  3164. {
  3165. return -ENOIOCTLCMD;
  3166. }
  3167. #endif
  3168. static void wanpipe_tty_stop(struct tty_struct *tty)
  3169. {
  3170. return;
  3171. }
  3172. static void wanpipe_tty_start(struct tty_struct *tty)
  3173. {
  3174. return;
  3175. }
  3176. static int config_tty (sdla_t *card)
  3177. {
  3178. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  3179. /* Setup the Board for asynchronous mode */
  3180. if (card->u.c.async_mode){
  3181. if (set_asy_config(card)) {
  3182. printk (KERN_INFO "%s: Failed CHDLC Async configuration!\n",
  3183. card->devname);
  3184. return -EINVAL;
  3185. }
  3186. }else{
  3187. /* Setup the Board for CHDLC */
  3188. if (set_chdlc_config(card)) {
  3189. printk (KERN_INFO "%s: Failed CHDLC configuration!\n",
  3190. card->devname);
  3191. return -EINVAL;
  3192. }
  3193. }
  3194. /* Set interrupt mode and mask */
  3195. if (chdlc_set_intr_mode(card, APP_INT_ON_RX_FRAME |
  3196. APP_INT_ON_GLOBAL_EXCEP_COND |
  3197. APP_INT_ON_TX_FRAME |
  3198. APP_INT_ON_CHDLC_EXCEP_COND | APP_INT_ON_TIMER)){
  3199. printk (KERN_INFO "%s: Failed to set interrupt triggers!\n",
  3200. card->devname);
  3201. return -EINVAL;
  3202. }
  3203. /* Mask the Transmit and Timer interrupt */
  3204. flags->interrupt_info_struct.interrupt_permission &=
  3205. ~(APP_INT_ON_TX_FRAME | APP_INT_ON_TIMER);
  3206. /* Enable communications */
  3207. if (card->u.c.async_mode){
  3208. if (asy_comm_enable(card) != 0) {
  3209. printk(KERN_INFO "%s: Failed to enable async commnunication!\n",
  3210. card->devname);
  3211. flags->interrupt_info_struct.interrupt_permission = 0;
  3212. card->u.c.comm_enabled=0;
  3213. chdlc_set_intr_mode(card,0);
  3214. return -EINVAL;
  3215. }
  3216. }else{
  3217. if (chdlc_comm_enable(card) != 0) {
  3218. printk(KERN_INFO "%s: Failed to enable chdlc communications!\n",
  3219. card->devname);
  3220. flags->interrupt_info_struct.interrupt_permission = 0;
  3221. card->u.c.comm_enabled=0;
  3222. chdlc_set_intr_mode(card,0);
  3223. return -EINVAL;
  3224. }
  3225. }
  3226. /* Initialize Rx/Tx buffer control fields */
  3227. init_chdlc_tx_rx_buff(card);
  3228. port_set_state(card, WAN_CONNECTING);
  3229. return 0;
  3230. }
  3231. static int change_speed(sdla_t *card, struct tty_struct *tty,
  3232. struct termios *old_termios)
  3233. {
  3234. int baud, ret=0;
  3235. unsigned cflag;
  3236. int dbits,sbits,parity,handshaking;
  3237. cflag = tty->termios->c_cflag;
  3238. /* There is always one stop bit */
  3239. sbits=WANOPT_ONE;
  3240. /* Parity is defaulted to NONE */
  3241. parity = WANOPT_NONE;
  3242. handshaking=0;
  3243. /* byte size and parity */
  3244. switch (cflag & CSIZE) {
  3245. case CS5: dbits = 5; break;
  3246. case CS6: dbits = 6; break;
  3247. case CS7: dbits = 7; break;
  3248. case CS8: dbits = 8; break;
  3249. /* Never happens, but GCC is too dumb to figure it out */
  3250. default: dbits = 8; break;
  3251. }
  3252. /* One more stop bit should be supported, thus increment
  3253. * the number of stop bits Max=2 */
  3254. if (cflag & CSTOPB) {
  3255. sbits = WANOPT_TWO;
  3256. }
  3257. if (cflag & PARENB) {
  3258. parity = WANOPT_EVEN;
  3259. }
  3260. if (cflag & PARODD){
  3261. parity = WANOPT_ODD;
  3262. }
  3263. /* Determine divisor based on baud rate */
  3264. baud = tty_get_baud_rate(tty);
  3265. if (!baud)
  3266. baud = 9600; /* B0 transition handled in rs_set_termios */
  3267. if (cflag & CRTSCTS) {
  3268. handshaking|=ASY_RTS_HS_FOR_RX;
  3269. }
  3270. if (I_IGNPAR(tty))
  3271. parity = WANOPT_NONE;
  3272. if (I_IXOFF(tty)){
  3273. handshaking|=ASY_XON_XOFF_HS_FOR_RX;
  3274. handshaking|=ASY_XON_XOFF_HS_FOR_TX;
  3275. }
  3276. if (I_IXON(tty)){
  3277. handshaking|=ASY_XON_XOFF_HS_FOR_RX;
  3278. handshaking|=ASY_XON_XOFF_HS_FOR_TX;
  3279. }
  3280. if (card->u.c.async_mode){
  3281. if (card->wandev.bps != baud)
  3282. ret=1;
  3283. card->wandev.bps = baud;
  3284. }
  3285. if (card->u.c.async_mode){
  3286. if (card->u.c.protocol_options != handshaking)
  3287. ret=1;
  3288. card->u.c.protocol_options = handshaking;
  3289. if (card->u.c.tx_bits_per_char != dbits)
  3290. ret=1;
  3291. card->u.c.tx_bits_per_char = dbits;
  3292. if (card->u.c.rx_bits_per_char != dbits)
  3293. ret=1;
  3294. card->u.c.rx_bits_per_char = dbits;
  3295. if (card->u.c.stop_bits != sbits)
  3296. ret=1;
  3297. card->u.c.stop_bits = sbits;
  3298. if (card->u.c.parity != parity)
  3299. ret=1;
  3300. card->u.c.parity = parity;
  3301. card->u.c.break_timer = 50;
  3302. card->u.c.inter_char_timer = 10;
  3303. card->u.c.rx_complete_length = 100;
  3304. card->u.c.xon_char = 0xFE;
  3305. }else{
  3306. card->u.c.protocol_options = HDLC_STREAMING_MODE;
  3307. }
  3308. return ret;
  3309. }
  3310. static void wanpipe_tty_set_termios(struct tty_struct *tty, struct termios *old_termios)
  3311. {
  3312. sdla_t *card;
  3313. int err=1;
  3314. if (!tty){
  3315. return;
  3316. }
  3317. card = (sdla_t *)tty->driver_data;
  3318. if (!card)
  3319. return;
  3320. if (change_speed(card, tty, old_termios) || !card->u.c.comm_enabled){
  3321. unsigned long smp_flags;
  3322. if (card->u.c.comm_enabled){
  3323. lock_adapter_irq(&card->wandev.lock,&smp_flags);
  3324. chdlc_disable_comm_shutdown(card);
  3325. unlock_adapter_irq(&card->wandev.lock,&smp_flags);
  3326. }
  3327. lock_adapter_irq(&card->wandev.lock,&smp_flags);
  3328. err = config_tty(card);
  3329. unlock_adapter_irq(&card->wandev.lock,&smp_flags);
  3330. if (card->u.c.async_mode){
  3331. printk(KERN_INFO "%s: TTY Async Configuration:\n"
  3332. " Baud =%i\n"
  3333. " Handshaking =%s\n"
  3334. " Tx Dbits =%i\n"
  3335. " Rx Dbits =%i\n"
  3336. " Parity =%s\n"
  3337. " Stop Bits =%i\n",
  3338. card->devname,
  3339. card->wandev.bps,
  3340. opt_decode[card->u.c.protocol_options],
  3341. card->u.c.tx_bits_per_char,
  3342. card->u.c.rx_bits_per_char,
  3343. p_decode[card->u.c.parity] ,
  3344. card->u.c.stop_bits);
  3345. }else{
  3346. printk(KERN_INFO "%s: TTY Sync Configuration:\n"
  3347. " Baud =%i\n"
  3348. " Protocol =HDLC_STREAMING\n",
  3349. card->devname,card->wandev.bps);
  3350. }
  3351. if (!err){
  3352. port_set_state(card,WAN_CONNECTED);
  3353. }else{
  3354. port_set_state(card,WAN_DISCONNECTED);
  3355. }
  3356. }
  3357. return;
  3358. }
  3359. static void wanpipe_tty_put_char(struct tty_struct *tty, unsigned char ch)
  3360. {
  3361. sdla_t *card;
  3362. unsigned long smp_flags=0;
  3363. if (!tty){
  3364. return;
  3365. }
  3366. card = (sdla_t *)tty->driver_data;
  3367. if (!card)
  3368. return;
  3369. if (card->wandev.state != WAN_CONNECTED)
  3370. return;
  3371. if(card->hw.type != SDLA_S514)
  3372. s508_lock(card,&smp_flags);
  3373. if (test_and_set_bit(SEND_CRIT,(void*)&card->wandev.critical)){
  3374. wanpipe_tty_trigger_tx_irq(card);
  3375. if(card->hw.type != SDLA_S514)
  3376. s508_unlock(card,&smp_flags);
  3377. return;
  3378. }
  3379. if (chdlc_send(card,(void*)&ch,1)){
  3380. wanpipe_tty_trigger_tx_irq(card);
  3381. dbg_printk("%s: Failed to TX char!\n",card->devname);
  3382. }
  3383. dbg_printk("%s: Char TX OK\n",card->devname);
  3384. clear_bit(SEND_CRIT,(void*)&card->wandev.critical);
  3385. if(card->hw.type != SDLA_S514)
  3386. s508_unlock(card,&smp_flags);
  3387. return;
  3388. }
  3389. static void wanpipe_tty_flush_chars(struct tty_struct *tty)
  3390. {
  3391. return;
  3392. }
  3393. static void wanpipe_tty_flush_buffer(struct tty_struct *tty)
  3394. {
  3395. if (!tty)
  3396. return;
  3397. #if defined(SERIAL_HAVE_POLL_WAIT)
  3398. wake_up_interruptible(&tty->poll_wait);
  3399. #endif
  3400. tty_wakeup(tty);
  3401. return;
  3402. }
  3403. /*
  3404. * This function is used to send a high-priority XON/XOFF character to
  3405. * the device
  3406. */
  3407. static void wanpipe_tty_send_xchar(struct tty_struct *tty, char ch)
  3408. {
  3409. return;
  3410. }
  3411. static int wanpipe_tty_chars_in_buffer(struct tty_struct *tty)
  3412. {
  3413. return 0;
  3414. }
  3415. static int wanpipe_tty_write_room(struct tty_struct *tty)
  3416. {
  3417. sdla_t *card;
  3418. printk(KERN_INFO "TTY Write Room\n");
  3419. if (!tty){
  3420. return 0;
  3421. }
  3422. card = (sdla_t *)tty->driver_data;
  3423. if (!card)
  3424. return 0;
  3425. if (card->wandev.state != WAN_CONNECTED)
  3426. return 0;
  3427. return SEC_MAX_NO_DATA_BYTES_IN_FRAME;
  3428. }
  3429. static int set_modem_status(sdla_t *card, unsigned char data)
  3430. {
  3431. CHDLC_MAILBOX_STRUCT *mb = card->mbox;
  3432. int err;
  3433. mb->buffer_length=1;
  3434. mb->command=SET_MODEM_STATUS;
  3435. mb->data[0]=data;
  3436. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  3437. if (err != COMMAND_OK)
  3438. chdlc_error (card, err, mb);
  3439. return err;
  3440. }
  3441. static void wanpipe_tty_hangup(struct tty_struct *tty)
  3442. {
  3443. sdla_t *card;
  3444. unsigned long smp_flags;
  3445. printk(KERN_INFO "TTY Hangup!\n");
  3446. if (!tty){
  3447. return;
  3448. }
  3449. card = (sdla_t *)tty->driver_data;
  3450. if (!card)
  3451. return;
  3452. lock_adapter_irq(&card->wandev.lock,&smp_flags);
  3453. set_modem_status(card,0);
  3454. unlock_adapter_irq(&card->wandev.lock,&smp_flags);
  3455. return;
  3456. }
  3457. static void wanpipe_tty_break(struct tty_struct *tty, int break_state)
  3458. {
  3459. return;
  3460. }
  3461. static void wanpipe_tty_wait_until_sent(struct tty_struct *tty, int timeout)
  3462. {
  3463. return;
  3464. }
  3465. static void wanpipe_tty_throttle(struct tty_struct * tty)
  3466. {
  3467. return;
  3468. }
  3469. static void wanpipe_tty_unthrottle(struct tty_struct * tty)
  3470. {
  3471. return;
  3472. }
  3473. int wanpipe_tty_read_proc(char *page, char **start, off_t off, int count,
  3474. int *eof, void *data)
  3475. {
  3476. return 0;
  3477. }
  3478. /*
  3479. * The serial driver boot-time initialization code!
  3480. */
  3481. int wanpipe_tty_init(sdla_t *card)
  3482. {
  3483. struct serial_state * state;
  3484. /* Initialize the tty_driver structure */
  3485. if (card->tty_minor < 0 || card->tty_minor > NR_PORTS){
  3486. printk(KERN_INFO "%s: Illegal Minor TTY number (0-4): %i\n",
  3487. card->devname,card->tty_minor);
  3488. return -EINVAL;
  3489. }
  3490. if (WAN_CARD(card->tty_minor)){
  3491. printk(KERN_INFO "%s: TTY Minor %i, already in use\n",
  3492. card->devname,card->tty_minor);
  3493. return -EBUSY;
  3494. }
  3495. if (tty_init_cnt==0){
  3496. printk(KERN_INFO "%s: TTY %s Driver Init: Major %i, Minor Range %i-%i\n",
  3497. card->devname,
  3498. card->u.c.async_mode ? "ASYNC" : "SYNC",
  3499. WAN_TTY_MAJOR,MIN_PORT,MAX_PORT);
  3500. tty_driver_mode = card->u.c.async_mode;
  3501. memset(&serial_driver, 0, sizeof(struct tty_driver));
  3502. serial_driver.magic = TTY_DRIVER_MAGIC;
  3503. serial_driver.owner = THIS_MODULE;
  3504. serial_driver.driver_name = "wanpipe_tty";
  3505. serial_driver.name = "ttyW";
  3506. serial_driver.major = WAN_TTY_MAJOR;
  3507. serial_driver.minor_start = WAN_TTY_MINOR;
  3508. serial_driver.num = NR_PORTS;
  3509. serial_driver.type = TTY_DRIVER_TYPE_SERIAL;
  3510. serial_driver.subtype = SERIAL_TYPE_NORMAL;
  3511. serial_driver.init_termios = tty_std_termios;
  3512. serial_driver.init_termios.c_cflag =
  3513. B9600 | CS8 | CREAD | HUPCL | CLOCAL;
  3514. serial_driver.flags = TTY_DRIVER_REAL_RAW;
  3515. serial_driver.refcount = 1; /* !@!@^#^&!! */
  3516. serial_driver.open = wanpipe_tty_open;
  3517. serial_driver.close = wanpipe_tty_close;
  3518. serial_driver.write = wanpipe_tty_write;
  3519. serial_driver.put_char = wanpipe_tty_put_char;
  3520. serial_driver.flush_chars = wanpipe_tty_flush_chars;
  3521. serial_driver.write_room = wanpipe_tty_write_room;
  3522. serial_driver.chars_in_buffer = wanpipe_tty_chars_in_buffer;
  3523. serial_driver.flush_buffer = wanpipe_tty_flush_buffer;
  3524. //serial_driver.ioctl = wanpipe_tty_ioctl;
  3525. serial_driver.throttle = wanpipe_tty_throttle;
  3526. serial_driver.unthrottle = wanpipe_tty_unthrottle;
  3527. serial_driver.send_xchar = wanpipe_tty_send_xchar;
  3528. serial_driver.set_termios = wanpipe_tty_set_termios;
  3529. serial_driver.stop = wanpipe_tty_stop;
  3530. serial_driver.start = wanpipe_tty_start;
  3531. serial_driver.hangup = wanpipe_tty_hangup;
  3532. serial_driver.break_ctl = wanpipe_tty_break;
  3533. serial_driver.wait_until_sent = wanpipe_tty_wait_until_sent;
  3534. serial_driver.read_proc = wanpipe_tty_read_proc;
  3535. if (tty_register_driver(&serial_driver)){
  3536. printk(KERN_INFO "%s: Failed to register serial driver!\n",
  3537. card->devname);
  3538. }
  3539. }
  3540. /* The subsequent ports must comply to the initial configuration */
  3541. if (tty_driver_mode != card->u.c.async_mode){
  3542. printk(KERN_INFO "%s: Error: TTY Driver operation mode mismatch!\n",
  3543. card->devname);
  3544. printk(KERN_INFO "%s: The TTY driver is configured for %s!\n",
  3545. card->devname, tty_driver_mode ? "ASYNC" : "SYNC");
  3546. return -EINVAL;
  3547. }
  3548. tty_init_cnt++;
  3549. printk(KERN_INFO "%s: Initializing TTY %s Driver Minor %i\n",
  3550. card->devname,
  3551. tty_driver_mode ? "ASYNC" : "SYNC",
  3552. card->tty_minor);
  3553. tty_card_map[card->tty_minor] = card;
  3554. state = &rs_table[card->tty_minor];
  3555. state->magic = SSTATE_MAGIC;
  3556. state->line = 0;
  3557. state->type = PORT_UNKNOWN;
  3558. state->custom_divisor = 0;
  3559. state->close_delay = 5*HZ/10;
  3560. state->closing_wait = 30*HZ;
  3561. state->icount.cts = state->icount.dsr =
  3562. state->icount.rng = state->icount.dcd = 0;
  3563. state->icount.rx = state->icount.tx = 0;
  3564. state->icount.frame = state->icount.parity = 0;
  3565. state->icount.overrun = state->icount.brk = 0;
  3566. state->irq = card->wandev.irq;
  3567. INIT_WORK(&card->tty_work, tty_poll_work, (void*)card);
  3568. return 0;
  3569. }
  3570. MODULE_LICENSE("GPL");
  3571. /****** End ****************************************************************/