sdla_chdlc.c 121 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433
  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. if (card->tty_buf){
  2961. kfree(card->tty_buf);
  2962. card->tty_buf=NULL;
  2963. }
  2964. if (card->tty_rx){
  2965. kfree(card->tty_rx);
  2966. card->tty_rx=NULL;
  2967. }
  2968. }
  2969. return;
  2970. }
  2971. static int wanpipe_tty_open(struct tty_struct *tty, struct file * filp)
  2972. {
  2973. unsigned long smp_flags;
  2974. sdla_t *card;
  2975. if (!tty){
  2976. return -ENODEV;
  2977. }
  2978. if (!tty->driver_data){
  2979. int port;
  2980. port = tty->index;
  2981. if ((port < 0) || (port >= NR_PORTS))
  2982. return -ENODEV;
  2983. tty->driver_data = WAN_CARD(port);
  2984. if (!tty->driver_data)
  2985. return -ENODEV;
  2986. }
  2987. card = (sdla_t*)tty->driver_data;
  2988. if (!card){
  2989. lock_adapter_irq(&card->wandev.lock,&smp_flags);
  2990. card->tty=NULL;
  2991. unlock_adapter_irq(&card->wandev.lock,&smp_flags);
  2992. return -ENODEV;
  2993. }
  2994. printk(KERN_INFO "%s: Opening TTY Driver!\n",
  2995. card->devname);
  2996. if (card->tty_open == 0){
  2997. lock_adapter_irq(&card->wandev.lock,&smp_flags);
  2998. card->tty=tty;
  2999. unlock_adapter_irq(&card->wandev.lock,&smp_flags);
  3000. if (!card->tty_buf){
  3001. card->tty_buf = kmalloc(TTY_CHDLC_MAX_MTU, GFP_KERNEL);
  3002. if (!card->tty_buf){
  3003. card->tty_buf=NULL;
  3004. card->tty=NULL;
  3005. return -ENOMEM;
  3006. }
  3007. }
  3008. if (!card->tty_rx){
  3009. card->tty_rx = kmalloc(TTY_CHDLC_MAX_MTU, GFP_KERNEL);
  3010. if (!card->tty_rx){
  3011. /* Free the buffer above */
  3012. kfree(card->tty_buf);
  3013. card->tty_buf=NULL;
  3014. card->tty=NULL;
  3015. return -ENOMEM;
  3016. }
  3017. }
  3018. }
  3019. ++card->tty_open;
  3020. wanpipe_open(card);
  3021. return 0;
  3022. }
  3023. static int wanpipe_tty_write(struct tty_struct * tty, const unsigned char *buf, int count)
  3024. {
  3025. unsigned long smp_flags=0;
  3026. sdla_t *card=NULL;
  3027. if (!tty){
  3028. dbg_printk(KERN_INFO "NO TTY in Write\n");
  3029. return -ENODEV;
  3030. }
  3031. card = (sdla_t *)tty->driver_data;
  3032. if (!card){
  3033. dbg_printk(KERN_INFO "No Card in TTY Write\n");
  3034. return -ENODEV;
  3035. }
  3036. if (count > card->wandev.mtu){
  3037. dbg_printk(KERN_INFO "Frame too big in Write %i Max: %i\n",
  3038. count,card->wandev.mtu);
  3039. return -EINVAL;
  3040. }
  3041. if (card->wandev.state != WAN_CONNECTED){
  3042. dbg_printk(KERN_INFO "Card not connected in TTY Write\n");
  3043. return -EINVAL;
  3044. }
  3045. /* Lock the 508 Card: SMP is supported */
  3046. if(card->hw.type != SDLA_S514){
  3047. s508_lock(card,&smp_flags);
  3048. }
  3049. if (test_and_set_bit(SEND_CRIT,(void*)&card->wandev.critical)){
  3050. printk(KERN_INFO "%s: Critical in TTY Write\n",
  3051. card->devname);
  3052. /* Lock the 508 Card: SMP is supported */
  3053. if(card->hw.type != SDLA_S514)
  3054. s508_unlock(card,&smp_flags);
  3055. return -EINVAL;
  3056. }
  3057. if (chdlc_send(card,(void*)buf,count)){
  3058. dbg_printk(KERN_INFO "%s: Failed to send, retry later: kernel!\n",
  3059. card->devname);
  3060. clear_bit(SEND_CRIT,(void*)&card->wandev.critical);
  3061. wanpipe_tty_trigger_tx_irq(card);
  3062. if(card->hw.type != SDLA_S514)
  3063. s508_unlock(card,&smp_flags);
  3064. return 0;
  3065. }
  3066. dbg_printk(KERN_INFO "%s: Packet sent OK: %i\n",card->devname,count);
  3067. clear_bit(SEND_CRIT,(void*)&card->wandev.critical);
  3068. if(card->hw.type != SDLA_S514)
  3069. s508_unlock(card,&smp_flags);
  3070. return count;
  3071. }
  3072. static void wanpipe_tty_receive(sdla_t *card, unsigned addr, unsigned int len)
  3073. {
  3074. unsigned offset=0;
  3075. unsigned olen=len;
  3076. char fp=0;
  3077. struct tty_struct *tty;
  3078. int i;
  3079. struct tty_ldisc *ld;
  3080. if (!card->tty_open){
  3081. dbg_printk(KERN_INFO "%s: TTY not open during receive\n",
  3082. card->devname);
  3083. return;
  3084. }
  3085. if ((tty=card->tty) == NULL){
  3086. dbg_printk(KERN_INFO "%s: No TTY on receive\n",
  3087. card->devname);
  3088. return;
  3089. }
  3090. if (!tty->driver_data){
  3091. dbg_printk(KERN_INFO "%s: No Driver Data, or Flip on receive\n",
  3092. card->devname);
  3093. return;
  3094. }
  3095. if (card->u.c.async_mode){
  3096. if ((tty->flip.count+len) >= TTY_FLIPBUF_SIZE){
  3097. if (net_ratelimit()){
  3098. printk(KERN_INFO
  3099. "%s: Received packet size too big: %i bytes, Max: %i!\n",
  3100. card->devname,len,TTY_FLIPBUF_SIZE);
  3101. }
  3102. return;
  3103. }
  3104. if((addr + len) > card->u.c.rx_top + 1) {
  3105. offset = card->u.c.rx_top - addr + 1;
  3106. sdla_peek(&card->hw, addr, tty->flip.char_buf_ptr, offset);
  3107. addr = card->u.c.rx_base;
  3108. len -= offset;
  3109. tty->flip.char_buf_ptr+=offset;
  3110. tty->flip.count+=offset;
  3111. for (i=0;i<offset;i++){
  3112. *tty->flip.flag_buf_ptr = 0;
  3113. tty->flip.flag_buf_ptr++;
  3114. }
  3115. }
  3116. sdla_peek(&card->hw, addr, tty->flip.char_buf_ptr, len);
  3117. tty->flip.char_buf_ptr+=len;
  3118. card->tty->flip.count+=len;
  3119. for (i=0;i<len;i++){
  3120. *tty->flip.flag_buf_ptr = 0;
  3121. tty->flip.flag_buf_ptr++;
  3122. }
  3123. tty->low_latency=1;
  3124. tty_flip_buffer_push(tty);
  3125. }else{
  3126. if (!card->tty_rx){
  3127. if (net_ratelimit()){
  3128. printk(KERN_INFO
  3129. "%s: Receive sync buffer not available!\n",
  3130. card->devname);
  3131. }
  3132. return;
  3133. }
  3134. if (len > TTY_CHDLC_MAX_MTU){
  3135. if (net_ratelimit()){
  3136. printk(KERN_INFO
  3137. "%s: Received packet size too big: %i bytes, Max: %i!\n",
  3138. card->devname,len,TTY_FLIPBUF_SIZE);
  3139. }
  3140. return;
  3141. }
  3142. if((addr + len) > card->u.c.rx_top + 1) {
  3143. offset = card->u.c.rx_top - addr + 1;
  3144. sdla_peek(&card->hw, addr, card->tty_rx, offset);
  3145. addr = card->u.c.rx_base;
  3146. len -= offset;
  3147. }
  3148. sdla_peek(&card->hw, addr, card->tty_rx+offset, len);
  3149. ld = tty_ldisc_ref(tty);
  3150. if (ld) {
  3151. if (ld->receive_buf)
  3152. ld->receive_buf(tty,card->tty_rx,&fp,olen);
  3153. tty_ldisc_deref(ld);
  3154. }else{
  3155. if (net_ratelimit()){
  3156. printk(KERN_INFO
  3157. "%s: NO TTY Sync line discipline!\n",
  3158. card->devname);
  3159. }
  3160. }
  3161. }
  3162. dbg_printk(KERN_INFO "%s: Received Data %i\n",card->devname,olen);
  3163. return;
  3164. }
  3165. #if 0
  3166. static int wanpipe_tty_ioctl(struct tty_struct *tty, struct file * file,
  3167. unsigned int cmd, unsigned long arg)
  3168. {
  3169. return -ENOIOCTLCMD;
  3170. }
  3171. #endif
  3172. static void wanpipe_tty_stop(struct tty_struct *tty)
  3173. {
  3174. return;
  3175. }
  3176. static void wanpipe_tty_start(struct tty_struct *tty)
  3177. {
  3178. return;
  3179. }
  3180. static int config_tty (sdla_t *card)
  3181. {
  3182. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  3183. /* Setup the Board for asynchronous mode */
  3184. if (card->u.c.async_mode){
  3185. if (set_asy_config(card)) {
  3186. printk (KERN_INFO "%s: Failed CHDLC Async configuration!\n",
  3187. card->devname);
  3188. return -EINVAL;
  3189. }
  3190. }else{
  3191. /* Setup the Board for CHDLC */
  3192. if (set_chdlc_config(card)) {
  3193. printk (KERN_INFO "%s: Failed CHDLC configuration!\n",
  3194. card->devname);
  3195. return -EINVAL;
  3196. }
  3197. }
  3198. /* Set interrupt mode and mask */
  3199. if (chdlc_set_intr_mode(card, APP_INT_ON_RX_FRAME |
  3200. APP_INT_ON_GLOBAL_EXCEP_COND |
  3201. APP_INT_ON_TX_FRAME |
  3202. APP_INT_ON_CHDLC_EXCEP_COND | APP_INT_ON_TIMER)){
  3203. printk (KERN_INFO "%s: Failed to set interrupt triggers!\n",
  3204. card->devname);
  3205. return -EINVAL;
  3206. }
  3207. /* Mask the Transmit and Timer interrupt */
  3208. flags->interrupt_info_struct.interrupt_permission &=
  3209. ~(APP_INT_ON_TX_FRAME | APP_INT_ON_TIMER);
  3210. /* Enable communications */
  3211. if (card->u.c.async_mode){
  3212. if (asy_comm_enable(card) != 0) {
  3213. printk(KERN_INFO "%s: Failed to enable async commnunication!\n",
  3214. card->devname);
  3215. flags->interrupt_info_struct.interrupt_permission = 0;
  3216. card->u.c.comm_enabled=0;
  3217. chdlc_set_intr_mode(card,0);
  3218. return -EINVAL;
  3219. }
  3220. }else{
  3221. if (chdlc_comm_enable(card) != 0) {
  3222. printk(KERN_INFO "%s: Failed to enable chdlc communications!\n",
  3223. card->devname);
  3224. flags->interrupt_info_struct.interrupt_permission = 0;
  3225. card->u.c.comm_enabled=0;
  3226. chdlc_set_intr_mode(card,0);
  3227. return -EINVAL;
  3228. }
  3229. }
  3230. /* Initialize Rx/Tx buffer control fields */
  3231. init_chdlc_tx_rx_buff(card);
  3232. port_set_state(card, WAN_CONNECTING);
  3233. return 0;
  3234. }
  3235. static int change_speed(sdla_t *card, struct tty_struct *tty,
  3236. struct termios *old_termios)
  3237. {
  3238. int baud, ret=0;
  3239. unsigned cflag;
  3240. int dbits,sbits,parity,handshaking;
  3241. cflag = tty->termios->c_cflag;
  3242. /* There is always one stop bit */
  3243. sbits=WANOPT_ONE;
  3244. /* Parity is defaulted to NONE */
  3245. parity = WANOPT_NONE;
  3246. handshaking=0;
  3247. /* byte size and parity */
  3248. switch (cflag & CSIZE) {
  3249. case CS5: dbits = 5; break;
  3250. case CS6: dbits = 6; break;
  3251. case CS7: dbits = 7; break;
  3252. case CS8: dbits = 8; break;
  3253. /* Never happens, but GCC is too dumb to figure it out */
  3254. default: dbits = 8; break;
  3255. }
  3256. /* One more stop bit should be supported, thus increment
  3257. * the number of stop bits Max=2 */
  3258. if (cflag & CSTOPB) {
  3259. sbits = WANOPT_TWO;
  3260. }
  3261. if (cflag & PARENB) {
  3262. parity = WANOPT_EVEN;
  3263. }
  3264. if (cflag & PARODD){
  3265. parity = WANOPT_ODD;
  3266. }
  3267. /* Determine divisor based on baud rate */
  3268. baud = tty_get_baud_rate(tty);
  3269. if (!baud)
  3270. baud = 9600; /* B0 transition handled in rs_set_termios */
  3271. if (cflag & CRTSCTS) {
  3272. handshaking|=ASY_RTS_HS_FOR_RX;
  3273. }
  3274. if (I_IGNPAR(tty))
  3275. parity = WANOPT_NONE;
  3276. if (I_IXOFF(tty)){
  3277. handshaking|=ASY_XON_XOFF_HS_FOR_RX;
  3278. handshaking|=ASY_XON_XOFF_HS_FOR_TX;
  3279. }
  3280. if (I_IXON(tty)){
  3281. handshaking|=ASY_XON_XOFF_HS_FOR_RX;
  3282. handshaking|=ASY_XON_XOFF_HS_FOR_TX;
  3283. }
  3284. if (card->u.c.async_mode){
  3285. if (card->wandev.bps != baud)
  3286. ret=1;
  3287. card->wandev.bps = baud;
  3288. }
  3289. if (card->u.c.async_mode){
  3290. if (card->u.c.protocol_options != handshaking)
  3291. ret=1;
  3292. card->u.c.protocol_options = handshaking;
  3293. if (card->u.c.tx_bits_per_char != dbits)
  3294. ret=1;
  3295. card->u.c.tx_bits_per_char = dbits;
  3296. if (card->u.c.rx_bits_per_char != dbits)
  3297. ret=1;
  3298. card->u.c.rx_bits_per_char = dbits;
  3299. if (card->u.c.stop_bits != sbits)
  3300. ret=1;
  3301. card->u.c.stop_bits = sbits;
  3302. if (card->u.c.parity != parity)
  3303. ret=1;
  3304. card->u.c.parity = parity;
  3305. card->u.c.break_timer = 50;
  3306. card->u.c.inter_char_timer = 10;
  3307. card->u.c.rx_complete_length = 100;
  3308. card->u.c.xon_char = 0xFE;
  3309. }else{
  3310. card->u.c.protocol_options = HDLC_STREAMING_MODE;
  3311. }
  3312. return ret;
  3313. }
  3314. static void wanpipe_tty_set_termios(struct tty_struct *tty, struct termios *old_termios)
  3315. {
  3316. sdla_t *card;
  3317. int err=1;
  3318. if (!tty){
  3319. return;
  3320. }
  3321. card = (sdla_t *)tty->driver_data;
  3322. if (!card)
  3323. return;
  3324. if (change_speed(card, tty, old_termios) || !card->u.c.comm_enabled){
  3325. unsigned long smp_flags;
  3326. if (card->u.c.comm_enabled){
  3327. lock_adapter_irq(&card->wandev.lock,&smp_flags);
  3328. chdlc_disable_comm_shutdown(card);
  3329. unlock_adapter_irq(&card->wandev.lock,&smp_flags);
  3330. }
  3331. lock_adapter_irq(&card->wandev.lock,&smp_flags);
  3332. err = config_tty(card);
  3333. unlock_adapter_irq(&card->wandev.lock,&smp_flags);
  3334. if (card->u.c.async_mode){
  3335. printk(KERN_INFO "%s: TTY Async Configuration:\n"
  3336. " Baud =%i\n"
  3337. " Handshaking =%s\n"
  3338. " Tx Dbits =%i\n"
  3339. " Rx Dbits =%i\n"
  3340. " Parity =%s\n"
  3341. " Stop Bits =%i\n",
  3342. card->devname,
  3343. card->wandev.bps,
  3344. opt_decode[card->u.c.protocol_options],
  3345. card->u.c.tx_bits_per_char,
  3346. card->u.c.rx_bits_per_char,
  3347. p_decode[card->u.c.parity] ,
  3348. card->u.c.stop_bits);
  3349. }else{
  3350. printk(KERN_INFO "%s: TTY Sync Configuration:\n"
  3351. " Baud =%i\n"
  3352. " Protocol =HDLC_STREAMING\n",
  3353. card->devname,card->wandev.bps);
  3354. }
  3355. if (!err){
  3356. port_set_state(card,WAN_CONNECTED);
  3357. }else{
  3358. port_set_state(card,WAN_DISCONNECTED);
  3359. }
  3360. }
  3361. return;
  3362. }
  3363. static void wanpipe_tty_put_char(struct tty_struct *tty, unsigned char ch)
  3364. {
  3365. sdla_t *card;
  3366. unsigned long smp_flags=0;
  3367. if (!tty){
  3368. return;
  3369. }
  3370. card = (sdla_t *)tty->driver_data;
  3371. if (!card)
  3372. return;
  3373. if (card->wandev.state != WAN_CONNECTED)
  3374. return;
  3375. if(card->hw.type != SDLA_S514)
  3376. s508_lock(card,&smp_flags);
  3377. if (test_and_set_bit(SEND_CRIT,(void*)&card->wandev.critical)){
  3378. wanpipe_tty_trigger_tx_irq(card);
  3379. if(card->hw.type != SDLA_S514)
  3380. s508_unlock(card,&smp_flags);
  3381. return;
  3382. }
  3383. if (chdlc_send(card,(void*)&ch,1)){
  3384. wanpipe_tty_trigger_tx_irq(card);
  3385. dbg_printk("%s: Failed to TX char!\n",card->devname);
  3386. }
  3387. dbg_printk("%s: Char TX OK\n",card->devname);
  3388. clear_bit(SEND_CRIT,(void*)&card->wandev.critical);
  3389. if(card->hw.type != SDLA_S514)
  3390. s508_unlock(card,&smp_flags);
  3391. return;
  3392. }
  3393. static void wanpipe_tty_flush_chars(struct tty_struct *tty)
  3394. {
  3395. return;
  3396. }
  3397. static void wanpipe_tty_flush_buffer(struct tty_struct *tty)
  3398. {
  3399. if (!tty)
  3400. return;
  3401. #if defined(SERIAL_HAVE_POLL_WAIT)
  3402. wake_up_interruptible(&tty->poll_wait);
  3403. #endif
  3404. tty_wakeup(tty);
  3405. return;
  3406. }
  3407. /*
  3408. * This function is used to send a high-priority XON/XOFF character to
  3409. * the device
  3410. */
  3411. static void wanpipe_tty_send_xchar(struct tty_struct *tty, char ch)
  3412. {
  3413. return;
  3414. }
  3415. static int wanpipe_tty_chars_in_buffer(struct tty_struct *tty)
  3416. {
  3417. return 0;
  3418. }
  3419. static int wanpipe_tty_write_room(struct tty_struct *tty)
  3420. {
  3421. sdla_t *card;
  3422. printk(KERN_INFO "TTY Write Room\n");
  3423. if (!tty){
  3424. return 0;
  3425. }
  3426. card = (sdla_t *)tty->driver_data;
  3427. if (!card)
  3428. return 0;
  3429. if (card->wandev.state != WAN_CONNECTED)
  3430. return 0;
  3431. return SEC_MAX_NO_DATA_BYTES_IN_FRAME;
  3432. }
  3433. static int set_modem_status(sdla_t *card, unsigned char data)
  3434. {
  3435. CHDLC_MAILBOX_STRUCT *mb = card->mbox;
  3436. int err;
  3437. mb->buffer_length=1;
  3438. mb->command=SET_MODEM_STATUS;
  3439. mb->data[0]=data;
  3440. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  3441. if (err != COMMAND_OK)
  3442. chdlc_error (card, err, mb);
  3443. return err;
  3444. }
  3445. static void wanpipe_tty_hangup(struct tty_struct *tty)
  3446. {
  3447. sdla_t *card;
  3448. unsigned long smp_flags;
  3449. printk(KERN_INFO "TTY Hangup!\n");
  3450. if (!tty){
  3451. return;
  3452. }
  3453. card = (sdla_t *)tty->driver_data;
  3454. if (!card)
  3455. return;
  3456. lock_adapter_irq(&card->wandev.lock,&smp_flags);
  3457. set_modem_status(card,0);
  3458. unlock_adapter_irq(&card->wandev.lock,&smp_flags);
  3459. return;
  3460. }
  3461. static void wanpipe_tty_break(struct tty_struct *tty, int break_state)
  3462. {
  3463. return;
  3464. }
  3465. static void wanpipe_tty_wait_until_sent(struct tty_struct *tty, int timeout)
  3466. {
  3467. return;
  3468. }
  3469. static void wanpipe_tty_throttle(struct tty_struct * tty)
  3470. {
  3471. return;
  3472. }
  3473. static void wanpipe_tty_unthrottle(struct tty_struct * tty)
  3474. {
  3475. return;
  3476. }
  3477. int wanpipe_tty_read_proc(char *page, char **start, off_t off, int count,
  3478. int *eof, void *data)
  3479. {
  3480. return 0;
  3481. }
  3482. /*
  3483. * The serial driver boot-time initialization code!
  3484. */
  3485. int wanpipe_tty_init(sdla_t *card)
  3486. {
  3487. struct serial_state * state;
  3488. /* Initialize the tty_driver structure */
  3489. if (card->tty_minor < 0 || card->tty_minor > NR_PORTS){
  3490. printk(KERN_INFO "%s: Illegal Minor TTY number (0-4): %i\n",
  3491. card->devname,card->tty_minor);
  3492. return -EINVAL;
  3493. }
  3494. if (WAN_CARD(card->tty_minor)){
  3495. printk(KERN_INFO "%s: TTY Minor %i, already in use\n",
  3496. card->devname,card->tty_minor);
  3497. return -EBUSY;
  3498. }
  3499. if (tty_init_cnt==0){
  3500. printk(KERN_INFO "%s: TTY %s Driver Init: Major %i, Minor Range %i-%i\n",
  3501. card->devname,
  3502. card->u.c.async_mode ? "ASYNC" : "SYNC",
  3503. WAN_TTY_MAJOR,MIN_PORT,MAX_PORT);
  3504. tty_driver_mode = card->u.c.async_mode;
  3505. memset(&serial_driver, 0, sizeof(struct tty_driver));
  3506. serial_driver.magic = TTY_DRIVER_MAGIC;
  3507. serial_driver.owner = THIS_MODULE;
  3508. serial_driver.driver_name = "wanpipe_tty";
  3509. serial_driver.name = "ttyW";
  3510. serial_driver.major = WAN_TTY_MAJOR;
  3511. serial_driver.minor_start = WAN_TTY_MINOR;
  3512. serial_driver.num = NR_PORTS;
  3513. serial_driver.type = TTY_DRIVER_TYPE_SERIAL;
  3514. serial_driver.subtype = SERIAL_TYPE_NORMAL;
  3515. serial_driver.init_termios = tty_std_termios;
  3516. serial_driver.init_termios.c_cflag =
  3517. B9600 | CS8 | CREAD | HUPCL | CLOCAL;
  3518. serial_driver.flags = TTY_DRIVER_REAL_RAW;
  3519. serial_driver.refcount = 1; /* !@!@^#^&!! */
  3520. serial_driver.open = wanpipe_tty_open;
  3521. serial_driver.close = wanpipe_tty_close;
  3522. serial_driver.write = wanpipe_tty_write;
  3523. serial_driver.put_char = wanpipe_tty_put_char;
  3524. serial_driver.flush_chars = wanpipe_tty_flush_chars;
  3525. serial_driver.write_room = wanpipe_tty_write_room;
  3526. serial_driver.chars_in_buffer = wanpipe_tty_chars_in_buffer;
  3527. serial_driver.flush_buffer = wanpipe_tty_flush_buffer;
  3528. //serial_driver.ioctl = wanpipe_tty_ioctl;
  3529. serial_driver.throttle = wanpipe_tty_throttle;
  3530. serial_driver.unthrottle = wanpipe_tty_unthrottle;
  3531. serial_driver.send_xchar = wanpipe_tty_send_xchar;
  3532. serial_driver.set_termios = wanpipe_tty_set_termios;
  3533. serial_driver.stop = wanpipe_tty_stop;
  3534. serial_driver.start = wanpipe_tty_start;
  3535. serial_driver.hangup = wanpipe_tty_hangup;
  3536. serial_driver.break_ctl = wanpipe_tty_break;
  3537. serial_driver.wait_until_sent = wanpipe_tty_wait_until_sent;
  3538. serial_driver.read_proc = wanpipe_tty_read_proc;
  3539. if (tty_register_driver(&serial_driver)){
  3540. printk(KERN_INFO "%s: Failed to register serial driver!\n",
  3541. card->devname);
  3542. }
  3543. }
  3544. /* The subsequent ports must comply to the initial configuration */
  3545. if (tty_driver_mode != card->u.c.async_mode){
  3546. printk(KERN_INFO "%s: Error: TTY Driver operation mode mismatch!\n",
  3547. card->devname);
  3548. printk(KERN_INFO "%s: The TTY driver is configured for %s!\n",
  3549. card->devname, tty_driver_mode ? "ASYNC" : "SYNC");
  3550. return -EINVAL;
  3551. }
  3552. tty_init_cnt++;
  3553. printk(KERN_INFO "%s: Initializing TTY %s Driver Minor %i\n",
  3554. card->devname,
  3555. tty_driver_mode ? "ASYNC" : "SYNC",
  3556. card->tty_minor);
  3557. tty_card_map[card->tty_minor] = card;
  3558. state = &rs_table[card->tty_minor];
  3559. state->magic = SSTATE_MAGIC;
  3560. state->line = 0;
  3561. state->type = PORT_UNKNOWN;
  3562. state->custom_divisor = 0;
  3563. state->close_delay = 5*HZ/10;
  3564. state->closing_wait = 30*HZ;
  3565. state->icount.cts = state->icount.dsr =
  3566. state->icount.rng = state->icount.dcd = 0;
  3567. state->icount.rx = state->icount.tx = 0;
  3568. state->icount.frame = state->icount.parity = 0;
  3569. state->icount.overrun = state->icount.brk = 0;
  3570. state->irq = card->wandev.irq;
  3571. INIT_WORK(&card->tty_work, tty_poll_work, (void*)card);
  3572. return 0;
  3573. }
  3574. MODULE_LICENSE("GPL");
  3575. /****** End ****************************************************************/