sdla_fr.c 137 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061
  1. /*****************************************************************************
  2. * sdla_fr.c WANPIPE(tm) Multiprotocol WAN Link Driver. Frame relay module.
  3. *
  4. * Author(s): 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. * Nov 23, 2000 Nenad Corbic o Added support for 2.4.X kernels
  15. * Nov 15, 2000 David Rokavarg
  16. * Nenad Corbic o Added frame relay bridging support.
  17. * Original code from Mark Wells and Kristian Hoffmann has
  18. * been integrated into the frame relay driver.
  19. * Nov 13, 2000 Nenad Corbic o Added true interface type encoding option.
  20. * Tcpdump doesn't support Frame Relay inteface
  21. * types, to fix this true type option will set
  22. * the interface type to RAW IP mode.
  23. * Nov 07, 2000 Nenad Corbic o Added security features for UDP debugging:
  24. * Deny all and specify allowed requests.
  25. * Nov 06, 2000 Nenad Corbic o Wanpipe interfaces conform to raw packet interfaces.
  26. * Moved the if_header into the if_send() routine.
  27. * The if_header() was breaking the libpcap
  28. * support. i.e. support for tcpdump, ethereal ...
  29. * Oct 12. 2000 Nenad Corbic o Added error message in fr_configure
  30. * Jul 31, 2000 Nenad Corbic o Fixed the Router UP Time.
  31. * Apr 28, 2000 Nenad Corbic o Added the option to shutdown an interface
  32. * when the channel gets disconnected.
  33. * Apr 28, 2000 Nenad Corbic o Added M.Grants patch: disallow duplicate
  34. * interface setups.
  35. * Apr 25, 2000 Nenad Corbic o Added M.Grants patch: dynamically add/remove
  36. * new dlcis/interfaces.
  37. * Mar 23, 2000 Nenad Corbic o Improved task queue, bh handling.
  38. * Mar 16, 2000 Nenad Corbic o Added Inverse ARP support
  39. * Mar 13, 2000 Nenad Corbic o Added new socket API support.
  40. * Mar 06, 2000 Nenad Corbic o Bug Fix: corrupted mbox recovery.
  41. * Feb 24, 2000 Nenad Corbic o Fixed up FT1 UDP debugging problem.
  42. * Dev 15, 1999 Nenad Corbic o Fixed up header files for 2.0.X kernels
  43. *
  44. * Nov 08, 1999 Nenad Corbic o Combined all debug UDP calls into one function
  45. * o Removed the ARP support. This has to be done
  46. * in the next version.
  47. * o Only a Node can implement NO signalling.
  48. * Initialize DLCI during if_open() if NO
  49. * signalling.
  50. * o Took out IPX support, implement in next
  51. * version
  52. * Sep 29, 1999 Nenad Corbic o Added SMP support and changed the update
  53. * function to use timer interrupt.
  54. * o Fixed the CIR bug: Set the value of BC
  55. * to CIR when the CIR is enabled.
  56. * o Updated comments, statistics and tracing.
  57. * Jun 02, 1999 Gideon Hack o Updated for S514 support.
  58. * Sep 18, 1998 Jaspreet Singh o Updated for 2.2.X kernels.
  59. * Jul 31, 1998 Jaspreet Singh o Removed wpf_poll routine. The channel/DLCI
  60. * status is received through an event interrupt.
  61. * Jul 08, 1998 David Fong o Added inverse ARP support.
  62. * Mar 26, 1997 Jaspreet Singh o Returning return codes for failed UDP cmds.
  63. * Jan 28, 1997 Jaspreet Singh o Improved handling of inactive DLCIs.
  64. * Dec 30, 1997 Jaspreet Singh o Replaced dev_tint() with mark_bh(NET_BH)
  65. * Dec 16, 1997 Jaspreet Singh o Implemented Multiple IPX support.
  66. * Nov 26, 1997 Jaspreet Singh o Improved load sharing with multiple boards
  67. * o Added Cli() to protect enabling of interrupts
  68. * while polling is called.
  69. * Nov 24, 1997 Jaspreet Singh o Added counters to avoid enabling of interrupts
  70. * when they have been disabled by another
  71. * interface or routine (eg. wpf_poll).
  72. * Nov 06, 1997 Jaspreet Singh o Added INTR_TEST_MODE to avoid polling
  73. * routine disable interrupts during interrupt
  74. * testing.
  75. * Oct 20, 1997 Jaspreet Singh o Added hooks in for Router UP time.
  76. * Oct 16, 1997 Jaspreet Singh o The critical flag is used to maintain flow
  77. * control by avoiding RACE conditions. The
  78. * cli() and restore_flags() are taken out.
  79. * The fr_channel structure is appended for
  80. * Driver Statistics.
  81. * Oct 15, 1997 Farhan Thawar o updated if_send() and receive for IPX
  82. * Aug 29, 1997 Farhan Thawar o Removed most of the cli() and sti()
  83. * o Abstracted the UDP management stuff
  84. * o Now use tbusy and critical more intelligently
  85. * Jul 21, 1997 Jaspreet Singh o Can configure T391, T392, N391, N392 & N393
  86. * through router.conf.
  87. * o Protected calls to sdla_peek() by adDing
  88. * save_flags(), cli() and restore_flags().
  89. * o Added error message for Inactive DLCIs in
  90. * fr_event() and update_chan_state().
  91. * o Fixed freeing up of buffers using kfree()
  92. * when packets are received.
  93. * Jul 07, 1997 Jaspreet Singh o Added configurable TTL for UDP packets
  94. * o Added ability to discard multicast and
  95. * broadcast source addressed packets
  96. * Jun 27, 1997 Jaspreet Singh o Added FT1 monitor capabilities
  97. * New case (0x44) statement in if_send routine
  98. * Added a global variable rCount to keep track
  99. * of FT1 status enabled on the board.
  100. * May 29, 1997 Jaspreet Singh o Fixed major Flow Control Problem
  101. * With multiple boards a problem was seen where
  102. * the second board always stopped transmitting
  103. * packet after running for a while. The code
  104. * got into a stage where the interrupts were
  105. * disabled and dev->tbusy was set to 1.
  106. * This caused the If_send() routine to get into
  107. * the if clause for it(0,dev->tbusy)
  108. * forever.
  109. * The code got into this stage due to an
  110. * interrupt occurring within the if clause for
  111. * set_bit(0,dev->tbusy). Since an interrupt
  112. * disables furhter transmit interrupt and
  113. * makes dev->tbusy = 0, this effect was undone
  114. * by making dev->tbusy = 1 in the if clause.
  115. * The Fix checks to see if Transmit interrupts
  116. * are disabled then do not make dev->tbusy = 1
  117. * Introduced a global variable: int_occur and
  118. * added tx_int_enabled in the wan_device
  119. * structure.
  120. * May 21, 1997 Jaspreet Singh o Fixed UDP Management for multiple
  121. * boards.
  122. *
  123. * Apr 25, 1997 Farhan Thawar o added UDP Management stuff
  124. * o fixed bug in if_send() and tx_intr() to
  125. * sleep and wakeup all devices
  126. * Mar 11, 1997 Farhan Thawar Version 3.1.1
  127. * o fixed (+1) bug in fr508_rx_intr()
  128. * o changed if_send() to return 0 if
  129. * wandev.critical() is true
  130. * o free socket buffer in if_send() if
  131. * returning 0
  132. * o added tx_intr() routine
  133. * Jan 30, 1997 Gene Kozin Version 3.1.0
  134. * o implemented exec() entry point
  135. * o fixed a bug causing driver configured as
  136. * a FR switch to be stuck in WAN_
  137. * mode
  138. * Jan 02, 1997 Gene Kozin Initial version.
  139. *****************************************************************************/
  140. #include <linux/module.h>
  141. #include <linux/kernel.h> /* printk(), and other useful stuff */
  142. #include <linux/stddef.h> /* offsetof(), etc. */
  143. #include <linux/errno.h> /* return codes */
  144. #include <linux/string.h> /* inline memset(), etc. */
  145. #include <linux/slab.h> /* kmalloc(), kfree() */
  146. #include <linux/wanrouter.h> /* WAN router definitions */
  147. #include <linux/wanpipe.h> /* WANPIPE common user API definitions */
  148. #include <linux/workqueue.h>
  149. #include <linux/if_arp.h> /* ARPHRD_* defines */
  150. #include <asm/byteorder.h> /* htons(), etc. */
  151. #include <asm/io.h> /* for inb(), outb(), etc. */
  152. #include <linux/time.h> /* for do_gettimeofday */
  153. #include <linux/in.h> /* sockaddr_in */
  154. #include <linux/jiffies.h> /* time_after() macro */
  155. #include <asm/errno.h>
  156. #include <linux/ip.h>
  157. #include <linux/if.h>
  158. #include <linux/if_wanpipe_common.h> /* Wanpipe Socket */
  159. #include <linux/if_wanpipe.h>
  160. #include <linux/sdla_fr.h> /* frame relay firmware API definitions */
  161. #include <asm/uaccess.h>
  162. #include <linux/inetdevice.h>
  163. #include <linux/netdevice.h>
  164. #include <net/route.h> /* Dynamic Route Creation */
  165. #include <linux/etherdevice.h> /* eth_type_trans() used for bridging */
  166. #include <linux/random.h>
  167. /****** Defines & Macros ****************************************************/
  168. #define MAX_CMD_RETRY 10 /* max number of firmware retries */
  169. #define FR_HEADER_LEN 8 /* max encapsulation header size */
  170. #define FR_CHANNEL_MTU 1500 /* unfragmented logical channel MTU */
  171. /* Q.922 frame types */
  172. #define Q922_UI 0x03 /* Unnumbered Info frame */
  173. #define Q922_XID 0xAF
  174. /* DLCI configured or not */
  175. #define DLCI_NOT_CONFIGURED 0x00
  176. #define DLCI_CONFIG_PENDING 0x01
  177. #define DLCI_CONFIGURED 0x02
  178. /* CIR enabled or not */
  179. #define CIR_ENABLED 0x00
  180. #define CIR_DISABLED 0x01
  181. #define FRAME_RELAY_API 1
  182. #define MAX_BH_BUFF 10
  183. /* For handle_IPXWAN() */
  184. #define CVHexToAscii(b) (((unsigned char)(b) > (unsigned char)9) ? ((unsigned char)'A' + ((unsigned char)(b) - (unsigned char)10)) : ((unsigned char)'0' + (unsigned char)(b)))
  185. /****** Data Structures *****************************************************/
  186. /* This is an extention of the 'struct device' we create for each network
  187. * interface to keep the rest of channel-specific data.
  188. */
  189. typedef struct fr_channel
  190. {
  191. wanpipe_common_t common;
  192. char name[WAN_IFNAME_SZ+1]; /* interface name, ASCIIZ */
  193. unsigned dlci_configured ; /* check whether configured or not */
  194. unsigned cir_status; /* check whether CIR enabled or not */
  195. unsigned dlci; /* logical channel number */
  196. unsigned cir; /* committed information rate */
  197. unsigned bc; /* committed burst size */
  198. unsigned be; /* excess burst size */
  199. unsigned mc; /* multicast support on or off */
  200. unsigned tx_int_status; /* Transmit Interrupt Status */
  201. unsigned short pkt_length; /* Packet Length */
  202. unsigned long router_start_time;/* Router start time in seconds */
  203. unsigned long tick_counter; /* counter for transmit time out */
  204. char dev_pending_devtint; /* interface pending dev_tint() */
  205. void *dlci_int_interface; /* pointer to the DLCI Interface */
  206. unsigned long IB_addr; /* physical address of Interface Byte */
  207. unsigned long state_tick; /* time of the last state change */
  208. unsigned char enable_IPX; /* Enable/Disable the use of IPX */
  209. unsigned long network_number; /* Internal Network Number for IPX*/
  210. sdla_t *card; /* -> owner */
  211. unsigned route_flag; /* Add/Rem dest addr in route tables */
  212. unsigned inarp; /* Inverse Arp Request status */
  213. long inarp_ready; /* Ready to send requests */
  214. int inarp_interval; /* Time between InArp Requests */
  215. unsigned long inarp_tick; /* InArp jiffies tick counter */
  216. long interface_down; /* Bring interface down on disconnect */
  217. struct net_device_stats ifstats; /* interface statistics */
  218. if_send_stat_t drvstats_if_send;
  219. rx_intr_stat_t drvstats_rx_intr;
  220. pipe_mgmt_stat_t drvstats_gen;
  221. unsigned long router_up_time;
  222. unsigned short transmit_length;
  223. struct sk_buff *delay_skb;
  224. bh_data_t *bh_head; /* Circular buffer for chdlc_bh */
  225. unsigned long tq_working;
  226. volatile int bh_write;
  227. volatile int bh_read;
  228. atomic_t bh_buff_used;
  229. /* Polling task queue. Each interface
  230. * has its own task queue, which is used
  231. * to defer events from the interrupt */
  232. struct work_struct fr_poll_work;
  233. struct timer_list fr_arp_timer;
  234. u32 ip_local;
  235. u32 ip_remote;
  236. long config_dlci;
  237. long unconfig_dlci;
  238. /* Whether this interface should be setup as a gateway.
  239. * Used by dynamic route setup code */
  240. u8 gateway;
  241. /* True interface type */
  242. u8 true_if_encoding;
  243. u8 fr_header[FR_HEADER_LEN];
  244. char fr_header_len;
  245. } fr_channel_t;
  246. /* Route Flag options */
  247. #define NO_ROUTE 0x00
  248. #define ADD_ROUTE 0x01
  249. #define ROUTE_ADDED 0x02
  250. #define REMOVE_ROUTE 0x03
  251. #define ARP_REQ 0x04
  252. /* inarp options */
  253. #define INARP_NONE 0x00
  254. #define INARP_REQUEST 0x01
  255. #define INARP_CONFIGURED 0x02
  256. /* reasons for enabling the timer interrupt on the adapter */
  257. #define TMR_INT_ENABLED_UDP 0x01
  258. #define TMR_INT_ENABLED_UPDATE 0x02
  259. #define TMR_INT_ENABLED_ARP 0x04
  260. #define TMR_INT_ENABLED_UPDATE_STATE 0x08
  261. #define TMR_INT_ENABLED_CONFIG 0x10
  262. #define TMR_INT_ENABLED_UNCONFIG 0x20
  263. typedef struct dlci_status
  264. {
  265. unsigned short dlci PACKED;
  266. unsigned char state PACKED;
  267. } dlci_status_t;
  268. typedef struct dlci_IB_mapping
  269. {
  270. unsigned short dlci PACKED;
  271. unsigned long addr_value PACKED;
  272. } dlci_IB_mapping_t;
  273. /* This structure is used for DLCI list Tx interrupt mode. It is used to
  274. enable interrupt bit and set the packet length for transmission
  275. */
  276. typedef struct fr_dlci_interface
  277. {
  278. unsigned char gen_interrupt PACKED;
  279. unsigned short packet_length PACKED;
  280. unsigned char reserved PACKED;
  281. } fr_dlci_interface_t;
  282. /* variable for keeping track of enabling/disabling FT1 monitor status */
  283. static int rCount = 0;
  284. extern void disable_irq(unsigned int);
  285. extern void enable_irq(unsigned int);
  286. /* variable for keeping track of number of interrupts generated during
  287. * interrupt test routine
  288. */
  289. static int Intr_test_counter;
  290. /****** Function Prototypes *************************************************/
  291. /* WAN link driver entry points. These are called by the WAN router module. */
  292. static int update(struct wan_device *wandev);
  293. static int new_if(struct wan_device *wandev, struct net_device *dev,
  294. wanif_conf_t *conf);
  295. static int del_if(struct wan_device *wandev, struct net_device *dev);
  296. static void disable_comm (sdla_t *card);
  297. /* WANPIPE-specific entry points */
  298. static int wpf_exec(struct sdla *card, void *u_cmd, void *u_data);
  299. /* Network device interface */
  300. static int if_init(struct net_device *dev);
  301. static int if_open(struct net_device *dev);
  302. static int if_close(struct net_device *dev);
  303. static void if_tx_timeout(struct net_device *dev);
  304. static int if_rebuild_hdr (struct sk_buff *skb);
  305. static int if_send(struct sk_buff *skb, struct net_device *dev);
  306. static int chk_bcast_mcast_addr(sdla_t *card, struct net_device* dev,
  307. struct sk_buff *skb);
  308. static struct net_device_stats *if_stats(struct net_device *dev);
  309. /* Interrupt handlers */
  310. static void fr_isr(sdla_t *card);
  311. static void rx_intr(sdla_t *card);
  312. static void tx_intr(sdla_t *card);
  313. static void timer_intr(sdla_t *card);
  314. static void spur_intr(sdla_t *card);
  315. /* Frame relay firmware interface functions */
  316. static int fr_read_version(sdla_t *card, char *str);
  317. static int fr_configure(sdla_t *card, fr_conf_t *conf);
  318. static int fr_dlci_configure(sdla_t *card, fr_dlc_conf_t *conf, unsigned dlci);
  319. static int fr_init_dlci (sdla_t *card, fr_channel_t *chan);
  320. static int fr_set_intr_mode (sdla_t *card, unsigned mode, unsigned mtu, unsigned short timeout);
  321. static int fr_comm_enable(sdla_t *card);
  322. static void fr_comm_disable(sdla_t *card);
  323. static int fr_get_err_stats(sdla_t *card);
  324. static int fr_get_stats(sdla_t *card);
  325. static int fr_add_dlci(sdla_t *card, int dlci);
  326. static int fr_activate_dlci(sdla_t *card, int dlci);
  327. static int fr_delete_dlci (sdla_t* card, int dlci);
  328. static int fr_issue_isf(sdla_t *card, int isf);
  329. static int fr_send(sdla_t *card, int dlci, unsigned char attr, int len,
  330. void *buf);
  331. static int fr_send_data_header(sdla_t *card, int dlci, unsigned char attr, int len,
  332. void *buf,unsigned char hdr_len);
  333. static unsigned int fr_send_hdr(sdla_t *card, int dlci, unsigned int offset);
  334. static int check_dlci_config (sdla_t *card, fr_channel_t *chan);
  335. static void initialize_rx_tx_buffers (sdla_t *card);
  336. /* Firmware asynchronous event handlers */
  337. static int fr_event(sdla_t *card, int event, fr_mbox_t *mbox);
  338. static int fr_modem_failure(sdla_t *card, fr_mbox_t *mbox);
  339. static int fr_dlci_change(sdla_t *card, fr_mbox_t *mbox);
  340. /* Miscellaneous functions */
  341. static int update_chan_state(struct net_device *dev);
  342. static void set_chan_state(struct net_device *dev, int state);
  343. static struct net_device *find_channel(sdla_t *card, unsigned dlci);
  344. static int is_tx_ready(sdla_t *card, fr_channel_t *chan);
  345. static unsigned int dec_to_uint(unsigned char *str, int len);
  346. static int reply_udp( unsigned char *data, unsigned int mbox_len );
  347. static int intr_test( sdla_t* card );
  348. static void init_chan_statistics( fr_channel_t* chan );
  349. static void init_global_statistics( sdla_t* card );
  350. static void read_DLCI_IB_mapping( sdla_t* card, fr_channel_t* chan );
  351. static int setup_for_delayed_transmit(struct net_device* dev,
  352. struct sk_buff *skb);
  353. struct net_device *move_dev_to_next(sdla_t *card, struct net_device *dev);
  354. static int check_tx_status(sdla_t *card, struct net_device *dev);
  355. /* Frame Relay Socket API */
  356. static void trigger_fr_bh (fr_channel_t *);
  357. static void fr_bh(struct net_device *dev);
  358. static int fr_bh_cleanup(struct net_device *dev);
  359. static int bh_enqueue(struct net_device *dev, struct sk_buff *skb);
  360. static void trigger_fr_poll(struct net_device *dev);
  361. static void fr_poll(struct net_device *dev);
  362. //static void add_gateway(struct net_device *dev);
  363. static void trigger_unconfig_fr(struct net_device *dev);
  364. static void unconfig_fr (sdla_t *);
  365. static void trigger_config_fr (sdla_t *);
  366. static void config_fr (sdla_t *);
  367. /* Inverse ARP and Dynamic routing functions */
  368. int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, struct net_device *dev);
  369. int is_arp(void *buf);
  370. int send_inarp_request(sdla_t *card, struct net_device *dev);
  371. static void trigger_fr_arp(struct net_device *dev);
  372. static void fr_arp (unsigned long data);
  373. /* Udp management functions */
  374. static int process_udp_mgmt_pkt(sdla_t *card);
  375. static int udp_pkt_type( struct sk_buff *skb, sdla_t *card );
  376. static int store_udp_mgmt_pkt(int udp_type, char udp_pkt_src, sdla_t* card,
  377. struct sk_buff *skb, int dlci);
  378. /* IPX functions */
  379. static void switch_net_numbers(unsigned char *sendpacket,
  380. unsigned long network_number, unsigned char incoming);
  381. static int handle_IPXWAN(unsigned char *sendpacket, char *devname,
  382. unsigned char enable_IPX, unsigned long network_number);
  383. /* Lock Functions: SMP supported */
  384. void s508_s514_unlock(sdla_t *card, unsigned long *smp_flags);
  385. void s508_s514_lock(sdla_t *card, unsigned long *smp_flags);
  386. unsigned short calc_checksum (char *, int);
  387. static int setup_fr_header(struct sk_buff *skb,
  388. struct net_device* dev, char op_mode);
  389. /****** Public Functions ****************************************************/
  390. /*============================================================================
  391. * Frame relay protocol initialization routine.
  392. *
  393. * This routine is called by the main WANPIPE module during setup. At this
  394. * point adapter is completely initialized and firmware is running.
  395. * o read firmware version (to make sure it's alive)
  396. * o configure adapter
  397. * o initialize protocol-specific fields of the adapter data space.
  398. *
  399. * Return: 0 o.k.
  400. * < 0 failure.
  401. */
  402. int wpf_init(sdla_t *card, wandev_conf_t *conf)
  403. {
  404. int err;
  405. fr508_flags_t* flags;
  406. union
  407. {
  408. char str[80];
  409. fr_conf_t cfg;
  410. } u;
  411. fr_buf_info_t* buf_info;
  412. int i;
  413. printk(KERN_INFO "\n");
  414. /* Verify configuration ID */
  415. if (conf->config_id != WANCONFIG_FR) {
  416. printk(KERN_INFO "%s: invalid configuration ID %u!\n",
  417. card->devname, conf->config_id);
  418. return -EINVAL;
  419. }
  420. /* Initialize protocol-specific fields of adapter data space */
  421. switch (card->hw.fwid) {
  422. case SFID_FR508:
  423. card->mbox = (void*)(card->hw.dpmbase +
  424. FR508_MBOX_OFFS);
  425. card->flags = (void*)(card->hw.dpmbase +
  426. FR508_FLAG_OFFS);
  427. if(card->hw.type == SDLA_S514) {
  428. card->mbox += FR_MB_VECTOR;
  429. card->flags += FR_MB_VECTOR;
  430. }
  431. card->isr = &fr_isr;
  432. break;
  433. default:
  434. return -EINVAL;
  435. }
  436. flags = card->flags;
  437. /* Read firmware version. Note that when adapter initializes, it
  438. * clears the mailbox, so it may appear that the first command was
  439. * executed successfully when in fact it was merely erased. To work
  440. * around this, we execute the first command twice.
  441. */
  442. if (fr_read_version(card, NULL) || fr_read_version(card, u.str))
  443. return -EIO;
  444. printk(KERN_INFO "%s: running frame relay firmware v%s\n",
  445. card->devname, u.str);
  446. /* Adjust configuration */
  447. conf->mtu += FR_HEADER_LEN;
  448. conf->mtu = (conf->mtu >= MIN_LGTH_FR_DATA_CFG) ?
  449. min_t(unsigned int, conf->mtu, FR_MAX_NO_DATA_BYTES_IN_FRAME) :
  450. FR_CHANNEL_MTU + FR_HEADER_LEN;
  451. conf->bps = min_t(unsigned int, conf->bps, 2048000);
  452. /* Initialze the configuration structure sent to the board to zero */
  453. memset(&u.cfg, 0, sizeof(u.cfg));
  454. memset(card->u.f.dlci_to_dev_map, 0, sizeof(card->u.f.dlci_to_dev_map));
  455. /* Configure adapter firmware */
  456. u.cfg.mtu = conf->mtu;
  457. u.cfg.kbps = conf->bps / 1000;
  458. u.cfg.cir_fwd = u.cfg.cir_bwd = 16;
  459. u.cfg.bc_fwd = u.cfg.bc_bwd = 16;
  460. u.cfg.options = 0x0000;
  461. printk(KERN_INFO "%s: Global CIR enabled by Default\n", card->devname);
  462. switch (conf->u.fr.signalling) {
  463. case WANOPT_FR_ANSI:
  464. u.cfg.options = 0x0000;
  465. break;
  466. case WANOPT_FR_Q933:
  467. u.cfg.options |= 0x0200;
  468. break;
  469. case WANOPT_FR_LMI:
  470. u.cfg.options |= 0x0400;
  471. break;
  472. case WANOPT_NO:
  473. u.cfg.options |= 0x0800;
  474. break;
  475. default:
  476. printk(KERN_INFO "%s: Illegal Signalling option\n",
  477. card->wandev.name);
  478. return -EINVAL;
  479. }
  480. card->wandev.signalling = conf->u.fr.signalling;
  481. if (conf->station == WANOPT_CPE) {
  482. if (conf->u.fr.signalling == WANOPT_NO){
  483. printk(KERN_INFO
  484. "%s: ERROR - For NO signalling, station must be set to Node!",
  485. card->devname);
  486. return -EINVAL;
  487. }
  488. u.cfg.station = 0;
  489. u.cfg.options |= 0x8000; /* auto config DLCI */
  490. card->u.f.dlci_num = 0;
  491. } else {
  492. u.cfg.station = 1; /* switch emulation mode */
  493. /* For switch emulation we have to create a list of dlci(s)
  494. * that will be sent to be global SET_DLCI_CONFIGURATION
  495. * command in fr_configure() routine.
  496. */
  497. card->u.f.dlci_num = min_t(unsigned int, max_t(unsigned int, conf->u.fr.dlci_num, 1), 100);
  498. for ( i = 0; i < card->u.f.dlci_num; i++) {
  499. card->u.f.node_dlci[i] = (unsigned short)
  500. conf->u.fr.dlci[i] ? conf->u.fr.dlci[i] : 16;
  501. }
  502. }
  503. if (conf->clocking == WANOPT_INTERNAL)
  504. u.cfg.port |= 0x0001;
  505. if (conf->interface == WANOPT_RS232)
  506. u.cfg.port |= 0x0002;
  507. if (conf->u.fr.t391)
  508. u.cfg.t391 = min_t(unsigned int, conf->u.fr.t391, 30);
  509. else
  510. u.cfg.t391 = 5;
  511. if (conf->u.fr.t392)
  512. u.cfg.t392 = min_t(unsigned int, conf->u.fr.t392, 30);
  513. else
  514. u.cfg.t392 = 15;
  515. if (conf->u.fr.n391)
  516. u.cfg.n391 = min_t(unsigned int, conf->u.fr.n391, 255);
  517. else
  518. u.cfg.n391 = 2;
  519. if (conf->u.fr.n392)
  520. u.cfg.n392 = min_t(unsigned int, conf->u.fr.n392, 10);
  521. else
  522. u.cfg.n392 = 3;
  523. if (conf->u.fr.n393)
  524. u.cfg.n393 = min_t(unsigned int, conf->u.fr.n393, 10);
  525. else
  526. u.cfg.n393 = 4;
  527. if (fr_configure(card, &u.cfg))
  528. return -EIO;
  529. if (card->hw.type == SDLA_S514) {
  530. buf_info = (void*)(card->hw.dpmbase + FR_MB_VECTOR +
  531. FR508_RXBC_OFFS);
  532. card->rxmb = (void*)(buf_info->rse_next + card->hw.dpmbase);
  533. card->u.f.rxmb_base =
  534. (void*)(buf_info->rse_base + card->hw.dpmbase);
  535. card->u.f.rxmb_last =
  536. (void*)(buf_info->rse_base +
  537. (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) +
  538. card->hw.dpmbase);
  539. }else{
  540. buf_info = (void*)(card->hw.dpmbase + FR508_RXBC_OFFS);
  541. card->rxmb = (void*)(buf_info->rse_next -
  542. FR_MB_VECTOR + card->hw.dpmbase);
  543. card->u.f.rxmb_base =
  544. (void*)(buf_info->rse_base -
  545. FR_MB_VECTOR + card->hw.dpmbase);
  546. card->u.f.rxmb_last =
  547. (void*)(buf_info->rse_base +
  548. (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) -
  549. FR_MB_VECTOR + card->hw.dpmbase);
  550. }
  551. card->u.f.rx_base = buf_info->buf_base;
  552. card->u.f.rx_top = buf_info->buf_top;
  553. card->u.f.tx_interrupts_pending = 0;
  554. card->wandev.mtu = conf->mtu;
  555. card->wandev.bps = conf->bps;
  556. card->wandev.interface = conf->interface;
  557. card->wandev.clocking = conf->clocking;
  558. card->wandev.station = conf->station;
  559. card->poll = NULL;
  560. card->exec = &wpf_exec;
  561. card->wandev.update = &update;
  562. card->wandev.new_if = &new_if;
  563. card->wandev.del_if = &del_if;
  564. card->wandev.state = WAN_DISCONNECTED;
  565. card->wandev.ttl = conf->ttl;
  566. card->wandev.udp_port = conf->udp_port;
  567. card->disable_comm = &disable_comm;
  568. card->u.f.arp_dev = NULL;
  569. /* Intialize global statistics for a card */
  570. init_global_statistics( card );
  571. card->TracingEnabled = 0;
  572. /* Interrupt Test */
  573. Intr_test_counter = 0;
  574. card->intr_mode = INTR_TEST_MODE;
  575. err = intr_test( card );
  576. printk(KERN_INFO "%s: End of Interrupt Test rc=0x%x count=%i\n",
  577. card->devname,err,Intr_test_counter);
  578. if (err || (Intr_test_counter < MAX_INTR_TEST_COUNTER)) {
  579. printk(KERN_ERR "%s: Interrupt Test Failed, Counter: %i\n",
  580. card->devname, Intr_test_counter);
  581. printk(KERN_ERR "Please choose another interrupt\n");
  582. err = -EIO;
  583. return err;
  584. }
  585. printk(KERN_INFO "%s: Interrupt Test Passed, Counter: %i\n",
  586. card->devname, Intr_test_counter);
  587. /* Apr 28 2000. Nenad Corbic
  588. * Enable commnunications here, not in if_open or new_if, since
  589. * interfaces come down when the link is disconnected.
  590. */
  591. /* If you enable comms and then set ints, you get a Tx int as you
  592. * perform the SET_INT_TRIGGERS command. So, we only set int
  593. * triggers and then adjust the interrupt mask (to disable Tx ints)
  594. * before enabling comms.
  595. */
  596. if (fr_set_intr_mode(card, (FR_INTR_RXRDY | FR_INTR_TXRDY |
  597. FR_INTR_DLC | FR_INTR_TIMER | FR_INTR_TX_MULT_DLCIs) ,
  598. card->wandev.mtu, 0)) {
  599. return -EIO;
  600. }
  601. flags->imask &= ~(FR_INTR_TXRDY | FR_INTR_TIMER);
  602. if (fr_comm_enable(card)) {
  603. return -EIO;
  604. }
  605. wanpipe_set_state(card, WAN_CONNECTED);
  606. spin_lock_init(&card->u.f.if_send_lock);
  607. printk(KERN_INFO "\n");
  608. return 0;
  609. }
  610. /******* WAN Device Driver Entry Points *************************************/
  611. /*============================================================================
  612. * Update device status & statistics.
  613. */
  614. static int update(struct wan_device* wandev)
  615. {
  616. volatile sdla_t* card;
  617. unsigned long timeout;
  618. fr508_flags_t* flags;
  619. /* sanity checks */
  620. if ((wandev == NULL) || (wandev->private == NULL))
  621. return -EFAULT;
  622. if (wandev->state == WAN_UNCONFIGURED)
  623. return -ENODEV;
  624. card = wandev->private;
  625. flags = card->flags;
  626. card->u.f.update_comms_stats = 1;
  627. card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UPDATE;
  628. flags->imask |= FR_INTR_TIMER;
  629. timeout = jiffies;
  630. for(;;) {
  631. if(card->u.f.update_comms_stats == 0)
  632. break;
  633. if (time_after(jiffies, timeout + 1 * HZ)){
  634. card->u.f.update_comms_stats = 0;
  635. return -EAGAIN;
  636. }
  637. }
  638. return 0;
  639. }
  640. /*============================================================================
  641. * Create new logical channel.
  642. * This routine is called by the router when ROUTER_IFNEW IOCTL is being
  643. * handled.
  644. * o parse media- and hardware-specific configuration
  645. * o make sure that a new channel can be created
  646. * o allocate resources, if necessary
  647. * o prepare network device structure for registaration.
  648. *
  649. * Return: 0 o.k.
  650. * < 0 failure (channel will not be created)
  651. */
  652. static int new_if(struct wan_device* wandev, struct net_device* dev,
  653. wanif_conf_t* conf)
  654. {
  655. sdla_t* card = wandev->private;
  656. fr_channel_t* chan;
  657. int dlci = 0;
  658. int err = 0;
  659. if ((conf->name[0] == '\0') || (strlen(conf->name) > WAN_IFNAME_SZ)) {
  660. printk(KERN_INFO "%s: Invalid interface name!\n",
  661. card->devname);
  662. return -EINVAL;
  663. }
  664. /* allocate and initialize private data */
  665. chan = kmalloc(sizeof(fr_channel_t), GFP_KERNEL);
  666. if (chan == NULL)
  667. return -ENOMEM;
  668. memset(chan, 0, sizeof(fr_channel_t));
  669. strcpy(chan->name, conf->name);
  670. chan->card = card;
  671. /* verify media address */
  672. if (is_digit(conf->addr[0])) {
  673. dlci = dec_to_uint(conf->addr, 0);
  674. if (dlci && (dlci <= HIGHEST_VALID_DLCI)) {
  675. chan->dlci = dlci;
  676. } else {
  677. printk(KERN_ERR
  678. "%s: Invalid DLCI %u on interface %s!\n",
  679. wandev->name, dlci, chan->name);
  680. err = -EINVAL;
  681. }
  682. } else {
  683. printk(KERN_ERR
  684. "%s: Invalid media address on interface %s!\n",
  685. wandev->name, chan->name);
  686. err = -EINVAL;
  687. }
  688. if ((chan->true_if_encoding = conf->true_if_encoding) == WANOPT_YES){
  689. printk(KERN_INFO
  690. "%s: Enabling, true interface type encoding.\n",
  691. card->devname);
  692. }
  693. /* Setup wanpipe as a router (WANPIPE) even if it is
  694. * a bridged DLCI, or as an API
  695. */
  696. if (strcmp(conf->usedby, "WANPIPE") == 0 ||
  697. strcmp(conf->usedby, "BRIDGE") == 0 ||
  698. strcmp(conf->usedby, "BRIDGE_N") == 0){
  699. if(strcmp(conf->usedby, "WANPIPE") == 0){
  700. chan->common.usedby = WANPIPE;
  701. printk(KERN_INFO "%s: Running in WANPIPE mode.\n",
  702. card->devname);
  703. }else if(strcmp(conf->usedby, "BRIDGE") == 0){
  704. chan->common.usedby = BRIDGE;
  705. printk(KERN_INFO "%s: Running in WANPIPE (BRIDGE) mode.\n",
  706. card->devname);
  707. }else if( strcmp(conf->usedby, "BRIDGE_N") == 0 ){
  708. chan->common.usedby = BRIDGE_NODE;
  709. printk(KERN_INFO "%s: Running in WANPIPE (BRIDGE_NODE) mode.\n",
  710. card->devname);
  711. }
  712. if (!err){
  713. /* Dynamic interface configuration option.
  714. * On disconnect, if the options is selected,
  715. * the interface will be brought down */
  716. if (conf->if_down == WANOPT_YES){
  717. set_bit(DYN_OPT_ON,&chan->interface_down);
  718. printk(KERN_INFO
  719. "%s: Dynamic interface configuration enabled.\n",
  720. card->devname);
  721. }
  722. }
  723. } else if(strcmp(conf->usedby, "API") == 0){
  724. chan->common.usedby = API;
  725. printk(KERN_INFO "%s: Running in API mode.\n",
  726. wandev->name);
  727. }
  728. if (err) {
  729. kfree(chan);
  730. return err;
  731. }
  732. /* place cir,be,bc and other channel specific information into the
  733. * chan structure
  734. */
  735. if (conf->cir) {
  736. chan->cir = max_t(unsigned int, 1,
  737. min_t(unsigned int, conf->cir, 512));
  738. chan->cir_status = CIR_ENABLED;
  739. /* If CIR is enabled, force BC to equal CIR
  740. * this solves number of potential problems if CIR is
  741. * set and BC is not
  742. */
  743. chan->bc = chan->cir;
  744. if (conf->be){
  745. chan->be = max_t(unsigned int,
  746. 0, min_t(unsigned int, conf->be, 511));
  747. }else{
  748. conf->be = 0;
  749. }
  750. printk (KERN_INFO "%s: CIR enabled for DLCI %i \n",
  751. wandev->name,chan->dlci);
  752. printk (KERN_INFO "%s: CIR = %i ; BC = %i ; BE = %i\n",
  753. wandev->name,chan->cir,chan->bc,chan->be);
  754. }else{
  755. chan->cir_status = CIR_DISABLED;
  756. printk (KERN_INFO "%s: CIR disabled for DLCI %i\n",
  757. wandev->name,chan->dlci);
  758. }
  759. chan->mc = conf->mc;
  760. if (conf->inarp == WANOPT_YES){
  761. printk(KERN_INFO "%s: Inverse ARP Support Enabled\n",card->devname);
  762. chan->inarp = conf->inarp ? INARP_REQUEST : INARP_NONE;
  763. chan->inarp_interval = conf->inarp_interval ? conf->inarp_interval : 10;
  764. }else{
  765. printk(KERN_INFO "%s: Inverse ARP Support Disabled\n",card->devname);
  766. chan->inarp = INARP_NONE;
  767. chan->inarp_interval = 10;
  768. }
  769. chan->dlci_configured = DLCI_NOT_CONFIGURED;
  770. /*FIXME: IPX disabled in this WANPIPE version */
  771. if (conf->enable_IPX == WANOPT_YES){
  772. printk(KERN_INFO "%s: ERROR - This version of WANPIPE doesn't support IPX\n",
  773. card->devname);
  774. kfree(chan);
  775. return -EINVAL;
  776. }else{
  777. chan->enable_IPX = WANOPT_NO;
  778. }
  779. if (conf->network_number){
  780. chan->network_number = conf->network_number;
  781. }else{
  782. chan->network_number = 0xDEADBEEF;
  783. }
  784. chan->route_flag = NO_ROUTE;
  785. init_chan_statistics(chan);
  786. chan->transmit_length = 0;
  787. /* prepare network device data space for registration */
  788. strcpy(dev->name,chan->name);
  789. dev->init = &if_init;
  790. dev->priv = chan;
  791. /* Initialize FR Polling Task Queue
  792. * We need a poll routine for each network
  793. * interface.
  794. */
  795. INIT_WORK(&chan->fr_poll_work, (void *)fr_poll, dev);
  796. init_timer(&chan->fr_arp_timer);
  797. chan->fr_arp_timer.data=(unsigned long)dev;
  798. chan->fr_arp_timer.function = fr_arp;
  799. wandev->new_if_cnt++;
  800. /* Tells us that if this interface is a
  801. * gateway or not */
  802. if ((chan->gateway = conf->gateway) == WANOPT_YES){
  803. printk(KERN_INFO "%s: Interface %s is set as a gateway.\n",
  804. card->devname,dev->name);
  805. }
  806. /* M. Grant Patch Apr 28 2000
  807. * Disallow duplicate dlci configurations. */
  808. if (card->u.f.dlci_to_dev_map[chan->dlci] != NULL) {
  809. kfree(chan);
  810. return -EBUSY;
  811. }
  812. /* Configure this dlci at a later date, when
  813. * the interface comes up. i.e. when if_open()
  814. * executes */
  815. set_bit(0,&chan->config_dlci);
  816. printk(KERN_INFO "\n");
  817. return 0;
  818. }
  819. /*============================================================================
  820. * Delete logical channel.
  821. */
  822. static int del_if(struct wan_device* wandev, struct net_device* dev)
  823. {
  824. fr_channel_t* chan = dev->priv;
  825. unsigned long smp_flags=0;
  826. /* This interface is dead, make sure the
  827. * ARP timer is stopped */
  828. del_timer(&chan->fr_arp_timer);
  829. /* If we are a NODE, we must unconfigure this DLCI
  830. * Trigger an unconfigure command that will
  831. * be executed in timer interrupt. We must wait
  832. * for the command to complete. */
  833. trigger_unconfig_fr(dev);
  834. lock_adapter_irq(&wandev->lock, &smp_flags);
  835. wandev->new_if_cnt--;
  836. unlock_adapter_irq(&wandev->lock, &smp_flags);
  837. return 0;
  838. }
  839. /*=====================================================================
  840. * disable_comm
  841. *
  842. * Description:
  843. * Disable communications.
  844. * This code runs in shutdown (sdlamain.c)
  845. * under critical flag. Therefore it is not
  846. * necessary to set a critical flag here
  847. *
  848. * Usage:
  849. * Commnunications are disabled only on a card
  850. * shutdown.
  851. */
  852. static void disable_comm (sdla_t *card)
  853. {
  854. printk(KERN_INFO "%s: Disabling Communications!\n",
  855. card->devname);
  856. fr_comm_disable(card);
  857. }
  858. /****** WANPIPE-specific entry points ***************************************/
  859. /*============================================================================
  860. * Execute adapter interface command.
  861. */
  862. static int wpf_exec (struct sdla* card, void* u_cmd, void* u_data)
  863. {
  864. fr_mbox_t* mbox = card->mbox;
  865. int retry = MAX_CMD_RETRY;
  866. int err, len;
  867. fr_cmd_t cmd;
  868. if(copy_from_user((void*)&cmd, u_cmd, sizeof(cmd)))
  869. return -EFAULT;
  870. /* execute command */
  871. do
  872. {
  873. memcpy(&mbox->cmd, &cmd, sizeof(cmd));
  874. if (cmd.length){
  875. if( copy_from_user((void*)&mbox->data, u_data, cmd.length))
  876. return -EFAULT;
  877. }
  878. if (sdla_exec(mbox))
  879. err = mbox->cmd.result;
  880. else return -EIO;
  881. } while (err && retry-- && fr_event(card, err, mbox));
  882. /* return result */
  883. if (copy_to_user(u_cmd, (void*)&mbox->cmd, sizeof(fr_cmd_t)))
  884. return -EFAULT;
  885. len = mbox->cmd.length;
  886. if (len && u_data && !copy_to_user(u_data, (void*)&mbox->data, len))
  887. return -EFAULT;
  888. return 0;
  889. }
  890. /****** Network Device Interface ********************************************/
  891. /*============================================================================
  892. * Initialize Linux network interface.
  893. *
  894. * This routine is called only once for each interface, during Linux network
  895. * interface registration. Returning anything but zero will fail interface
  896. * registration.
  897. */
  898. static int if_init(struct net_device* dev)
  899. {
  900. fr_channel_t* chan = dev->priv;
  901. sdla_t* card = chan->card;
  902. struct wan_device* wandev = &card->wandev;
  903. /* Initialize device driver entry points */
  904. dev->open = &if_open;
  905. dev->stop = &if_close;
  906. dev->hard_header = NULL;
  907. dev->rebuild_header = &if_rebuild_hdr;
  908. dev->hard_start_xmit = &if_send;
  909. dev->get_stats = &if_stats;
  910. dev->tx_timeout = &if_tx_timeout;
  911. dev->watchdog_timeo = TX_TIMEOUT;
  912. if (chan->common.usedby == WANPIPE || chan->common.usedby == API){
  913. /* Initialize media-specific parameters */
  914. if (chan->true_if_encoding){
  915. dev->type = ARPHRD_DLCI; /* This breaks tcpdump */
  916. }else{
  917. dev->type = ARPHRD_PPP; /* ARP h/w type */
  918. }
  919. dev->flags |= IFF_POINTOPOINT;
  920. dev->flags |= IFF_NOARP;
  921. /* Enable Multicast addressing */
  922. if (chan->mc == WANOPT_YES){
  923. dev->flags |= IFF_MULTICAST;
  924. }
  925. dev->mtu = wandev->mtu - FR_HEADER_LEN;
  926. /* For an API, the maximum number of bytes that the stack will pass
  927. to the driver is (dev->mtu + dev->hard_header_len). So, adjust the
  928. mtu so that a frame of maximum size can be transmitted by the API.
  929. */
  930. if(chan->common.usedby == API) {
  931. dev->mtu += (sizeof(api_tx_hdr_t) - FR_HEADER_LEN);
  932. }
  933. dev->hard_header_len = FR_HEADER_LEN;/* media header length */
  934. dev->addr_len = 2; /* hardware address length */
  935. *(unsigned short*)dev->dev_addr = htons(chan->dlci);
  936. /* Set transmit buffer queue length */
  937. dev->tx_queue_len = 100;
  938. }else{
  939. /* Setup the interface for Bridging */
  940. int hw_addr=0;
  941. ether_setup(dev);
  942. /* Use a random number to generate the MAC address */
  943. memcpy(dev->dev_addr, "\xFE\xFC\x00\x00\x00\x00", 6);
  944. get_random_bytes(&hw_addr, sizeof(hw_addr));
  945. *(int *)(dev->dev_addr + 2) += hw_addr;
  946. }
  947. /* Initialize hardware parameters (just for reference) */
  948. dev->irq = wandev->irq;
  949. dev->dma = wandev->dma;
  950. dev->base_addr = wandev->ioport;
  951. dev->mem_start = wandev->maddr;
  952. dev->mem_end = wandev->maddr + wandev->msize - 1;
  953. SET_MODULE_OWNER(dev);
  954. return 0;
  955. }
  956. /*============================================================================
  957. * Open network interface.
  958. * o if this is the first open, then enable communications and interrupts.
  959. * o prevent module from unloading by incrementing use count
  960. *
  961. * Return 0 if O.k. or errno.
  962. */
  963. static int if_open(struct net_device* dev)
  964. {
  965. fr_channel_t* chan = dev->priv;
  966. sdla_t* card = chan->card;
  967. int err = 0;
  968. struct timeval tv;
  969. if (netif_running(dev))
  970. return -EBUSY;
  971. /* Initialize the task queue */
  972. chan->tq_working=0;
  973. INIT_WORK(&chan->common.wanpipe_work, (void *)fr_bh, dev);
  974. /* Allocate and initialize BH circular buffer */
  975. chan->bh_head = kmalloc((sizeof(bh_data_t)*MAX_BH_BUFF),GFP_ATOMIC);
  976. memset(chan->bh_head,0,(sizeof(bh_data_t)*MAX_BH_BUFF));
  977. atomic_set(&chan->bh_buff_used, 0);
  978. netif_start_queue(dev);
  979. wanpipe_open(card);
  980. do_gettimeofday( &tv );
  981. chan->router_start_time = tv.tv_sec;
  982. if (test_bit(0,&chan->config_dlci)){
  983. trigger_config_fr (card);
  984. }else if (chan->inarp == INARP_REQUEST){
  985. trigger_fr_arp(dev);
  986. }
  987. return err;
  988. }
  989. /*============================================================================
  990. * Close network interface.
  991. * o if this is the last open, then disable communications and interrupts.
  992. * o reset flags.
  993. */
  994. static int if_close(struct net_device* dev)
  995. {
  996. fr_channel_t* chan = dev->priv;
  997. sdla_t* card = chan->card;
  998. if (chan->inarp == INARP_CONFIGURED) {
  999. chan->inarp = INARP_REQUEST;
  1000. }
  1001. netif_stop_queue(dev);
  1002. wanpipe_close(card);
  1003. return 0;
  1004. }
  1005. /*============================================================================
  1006. * Re-build media header.
  1007. *
  1008. * Return: 1 physical address resolved.
  1009. * 0 physical address not resolved
  1010. */
  1011. static int if_rebuild_hdr (struct sk_buff* skb)
  1012. {
  1013. struct net_device *dev = skb->dev;
  1014. fr_channel_t* chan = dev->priv;
  1015. sdla_t* card = chan->card;
  1016. printk(KERN_INFO "%s: rebuild_header() called for interface %s!\n",
  1017. card->devname, dev->name);
  1018. return 1;
  1019. }
  1020. /*============================================================================
  1021. * Handle transmit timeout event from netif watchdog
  1022. */
  1023. static void if_tx_timeout(struct net_device *dev)
  1024. {
  1025. fr_channel_t* chan = dev->priv;
  1026. sdla_t *card = chan->card;
  1027. /* If our device stays busy for at least 5 seconds then we will
  1028. * kick start the device by making dev->tbusy = 0. We expect
  1029. * that our device never stays busy more than 5 seconds. So this
  1030. * is only used as a last resort.
  1031. */
  1032. chan->drvstats_if_send.if_send_tbusy++;
  1033. ++chan->ifstats.collisions;
  1034. printk (KERN_INFO "%s: Transmit timed out on %s\n",
  1035. card->devname, dev->name);
  1036. chan->drvstats_if_send.if_send_tbusy_timeout++;
  1037. netif_wake_queue (dev);
  1038. }
  1039. /*============================================================================
  1040. * Send a packet on a network interface.
  1041. * o set tbusy flag (marks start of the transmission) to block a timer-based
  1042. * transmit from overlapping.
  1043. * o set critical flag when accessing board.
  1044. * o check link state. If link is not up, then drop the packet.
  1045. * o check channel status. If it's down then initiate a call.
  1046. * o pass a packet to corresponding WAN device.
  1047. * o free socket buffer
  1048. *
  1049. * Return: 0 complete (socket buffer must be freed)
  1050. * non-0 packet may be re-transmitted (tbusy must be set)
  1051. *
  1052. * Notes:
  1053. * 1. This routine is called either by the protocol stack or by the "net
  1054. * bottom half" (with interrupts enabled).
  1055. *
  1056. * 2. Using netif_start_queue() and netif_stop_queue()
  1057. * will inhibit further transmit requests from the protocol stack
  1058. * and can be used for flow control with protocol layer.
  1059. */
  1060. static int if_send(struct sk_buff* skb, struct net_device* dev)
  1061. {
  1062. fr_channel_t* chan = dev->priv;
  1063. sdla_t* card = chan->card;
  1064. int err;
  1065. unsigned char *sendpacket;
  1066. fr508_flags_t* adptr_flags = card->flags;
  1067. int udp_type;
  1068. long delay_tx_queued = 0;
  1069. unsigned long smp_flags=0;
  1070. unsigned char attr = 0;
  1071. chan->drvstats_if_send.if_send_entry++;
  1072. netif_stop_queue(dev);
  1073. if (skb == NULL) {
  1074. /* if we get here, some higher layer thinks we've missed an
  1075. * tx-done interrupt.
  1076. */
  1077. printk(KERN_INFO "%s: interface %s got kicked!\n",
  1078. card->devname, dev->name);
  1079. chan->drvstats_if_send.if_send_skb_null ++;
  1080. netif_wake_queue(dev);
  1081. return 0;
  1082. }
  1083. /* If a peripheral task is running just drop packets */
  1084. if (test_bit(PERI_CRIT, &card->wandev.critical)){
  1085. printk(KERN_INFO "%s: Critical in if_send(): Peripheral running!\n",
  1086. card->devname);
  1087. dev_kfree_skb_any(skb);
  1088. netif_start_queue(dev);
  1089. return 0;
  1090. }
  1091. /* We must set the 'tbusy' flag if we already have a packet queued for
  1092. transmission in the transmit interrupt handler. However, we must
  1093. ensure that the transmit interrupt does not reset the 'tbusy' flag
  1094. just before we set it, as this will result in a "transmit timeout".
  1095. */
  1096. set_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical);
  1097. if(chan->transmit_length) {
  1098. netif_stop_queue(dev);
  1099. chan->tick_counter = jiffies;
  1100. clear_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical);
  1101. return 1;
  1102. }
  1103. clear_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical);
  1104. /* Move the if_header() code to here. By inserting frame
  1105. * relay header in if_header() we would break the
  1106. * tcpdump and other packet sniffers */
  1107. chan->fr_header_len = setup_fr_header(skb,dev,chan->common.usedby);
  1108. if (chan->fr_header_len < 0 ){
  1109. ++chan->ifstats.tx_dropped;
  1110. ++card->wandev.stats.tx_dropped;
  1111. dev_kfree_skb_any(skb);
  1112. netif_start_queue(dev);
  1113. return 0;
  1114. }
  1115. sendpacket = skb->data;
  1116. udp_type = udp_pkt_type(skb, card);
  1117. if(udp_type != UDP_INVALID_TYPE) {
  1118. if(store_udp_mgmt_pkt(udp_type, UDP_PKT_FRM_STACK, card, skb,
  1119. chan->dlci)) {
  1120. adptr_flags->imask |= FR_INTR_TIMER;
  1121. if (udp_type == UDP_FPIPE_TYPE){
  1122. chan->drvstats_if_send.
  1123. if_send_PIPE_request ++;
  1124. }
  1125. }
  1126. netif_start_queue(dev);
  1127. return 0;
  1128. }
  1129. //FIXME: can we do better than sendpacket[2]?
  1130. if ((chan->common.usedby == WANPIPE) && (sendpacket[2] == 0x45)) {
  1131. /* check to see if the source IP address is a broadcast or */
  1132. /* multicast IP address */
  1133. if(chk_bcast_mcast_addr(card, dev, skb)){
  1134. ++chan->ifstats.tx_dropped;
  1135. ++card->wandev.stats.tx_dropped;
  1136. dev_kfree_skb_any(skb);
  1137. netif_start_queue(dev);
  1138. return 0;
  1139. }
  1140. }
  1141. /* Lock the S514/S508 card: SMP Supported */
  1142. s508_s514_lock(card,&smp_flags);
  1143. if (test_and_set_bit(SEND_CRIT, (void*)&card->wandev.critical)) {
  1144. chan->drvstats_if_send.if_send_critical_non_ISR ++;
  1145. chan->ifstats.tx_dropped ++;
  1146. printk(KERN_INFO "%s Critical in IF_SEND: if_send() already running!\n",
  1147. card->devname);
  1148. goto if_send_start_and_exit;
  1149. }
  1150. /* API packet check: minimum packet size must be greater than
  1151. * 16 byte API header */
  1152. if((chan->common.usedby == API) && (skb->len <= sizeof(api_tx_hdr_t))) {
  1153. ++chan->ifstats.tx_dropped;
  1154. ++card->wandev.stats.tx_dropped;
  1155. goto if_send_start_and_exit;
  1156. }else{
  1157. /* During API transmission, get rid of the API header */
  1158. if (chan->common.usedby == API) {
  1159. api_tx_hdr_t* api_tx_hdr;
  1160. api_tx_hdr = (api_tx_hdr_t*)&skb->data[0x00];
  1161. attr = api_tx_hdr->attr;
  1162. skb_pull(skb,sizeof(api_tx_hdr_t));
  1163. }
  1164. }
  1165. if (card->wandev.state != WAN_CONNECTED) {
  1166. chan->drvstats_if_send.if_send_wan_disconnected ++;
  1167. ++chan->ifstats.tx_dropped;
  1168. ++card->wandev.stats.tx_dropped;
  1169. } else if (chan->common.state != WAN_CONNECTED) {
  1170. chan->drvstats_if_send.if_send_dlci_disconnected ++;
  1171. /* Update the DLCI state in timer interrupt */
  1172. card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UPDATE_STATE;
  1173. adptr_flags->imask |= FR_INTR_TIMER;
  1174. ++chan->ifstats.tx_dropped;
  1175. ++card->wandev.stats.tx_dropped;
  1176. } else if (!is_tx_ready(card, chan)) {
  1177. /* No tx buffers available, store for delayed transmit */
  1178. if (!setup_for_delayed_transmit(dev, skb)){
  1179. set_bit(1,&delay_tx_queued);
  1180. }
  1181. chan->drvstats_if_send.if_send_no_bfrs++;
  1182. } else if (!skb->protocol) {
  1183. /* No protocols drop packet */
  1184. chan->drvstats_if_send.if_send_protocol_error ++;
  1185. ++card->wandev.stats.tx_errors;
  1186. } else if (test_bit(ARP_CRIT,&card->wandev.critical)){
  1187. /* We are trying to send an ARP Packet, block IP data until
  1188. * ARP is sent */
  1189. ++chan->ifstats.tx_dropped;
  1190. ++card->wandev.stats.tx_dropped;
  1191. } else {
  1192. //FIXME: IPX is not implemented in this version of Frame Relay ?
  1193. if((chan->common.usedby == WANPIPE) &&
  1194. sendpacket[1] == 0x00 &&
  1195. sendpacket[2] == 0x80 &&
  1196. sendpacket[6] == 0x81 &&
  1197. sendpacket[7] == 0x37) {
  1198. if( chan->enable_IPX ) {
  1199. switch_net_numbers(sendpacket,
  1200. chan->network_number, 0);
  1201. } else {
  1202. //FIXME: Take this out when IPX is fixed
  1203. printk(KERN_INFO
  1204. "%s: WARNING: Unsupported IPX data in send, packet dropped\n",
  1205. card->devname);
  1206. }
  1207. }else{
  1208. err = fr_send_data_header(card, chan->dlci, attr, skb->len, skb->data, chan->fr_header_len);
  1209. if (err) {
  1210. switch(err) {
  1211. case FRRES_CIR_OVERFLOW:
  1212. case FRRES_BUFFER_OVERFLOW:
  1213. if (!setup_for_delayed_transmit(dev, skb)){
  1214. set_bit(1,&delay_tx_queued);
  1215. }
  1216. chan->drvstats_if_send.
  1217. if_send_adptr_bfrs_full ++;
  1218. break;
  1219. case FRRES_TOO_LONG:
  1220. if (net_ratelimit()){
  1221. printk(KERN_INFO
  1222. "%s: Error: Frame too long, transmission failed %i\n",
  1223. card->devname, (unsigned int)skb->len);
  1224. }
  1225. /* Drop down to default */
  1226. default:
  1227. chan->drvstats_if_send.
  1228. if_send_dlci_disconnected ++;
  1229. ++chan->ifstats.tx_dropped;
  1230. ++card->wandev.stats.tx_dropped;
  1231. break;
  1232. }
  1233. } else {
  1234. chan->drvstats_if_send.
  1235. if_send_bfr_passed_to_adptr++;
  1236. ++chan->ifstats.tx_packets;
  1237. ++card->wandev.stats.tx_packets;
  1238. chan->ifstats.tx_bytes += skb->len;
  1239. card->wandev.stats.tx_bytes += skb->len;
  1240. dev->trans_start = jiffies;
  1241. }
  1242. }
  1243. }
  1244. if_send_start_and_exit:
  1245. netif_start_queue(dev);
  1246. /* If we queued the packet for transmission, we must not
  1247. * deallocate it. The packet is unlinked from the IP stack
  1248. * not copied. Therefore, we must keep the original packet */
  1249. if (!test_bit(1,&delay_tx_queued)) {
  1250. dev_kfree_skb_any(skb);
  1251. }else{
  1252. adptr_flags->imask |= FR_INTR_TXRDY;
  1253. card->u.f.tx_interrupts_pending ++;
  1254. }
  1255. clear_bit(SEND_CRIT, (void*)&card->wandev.critical);
  1256. s508_s514_unlock(card,&smp_flags);
  1257. return 0;
  1258. }
  1259. /*============================================================================
  1260. * Setup so that a frame can be transmitted on the occurrence of a transmit
  1261. * interrupt.
  1262. */
  1263. static int setup_for_delayed_transmit(struct net_device* dev,
  1264. struct sk_buff *skb)
  1265. {
  1266. fr_channel_t* chan = dev->priv;
  1267. sdla_t* card = chan->card;
  1268. fr_dlci_interface_t* dlci_interface;
  1269. int len = skb->len;
  1270. /* Check that the dlci is properly configured,
  1271. * before using tx interrupt */
  1272. if (!chan->dlci_int_interface){
  1273. if (net_ratelimit()){
  1274. printk(KERN_INFO
  1275. "%s: ERROR on DLCI %i: Not configured properly !\n",
  1276. card->devname, chan->dlci);
  1277. printk(KERN_INFO "%s: Please contact Sangoma Technologies\n",
  1278. card->devname);
  1279. }
  1280. return 1;
  1281. }
  1282. dlci_interface = chan->dlci_int_interface;
  1283. if(chan->transmit_length) {
  1284. printk(KERN_INFO "%s: Big mess in setup_for_del...\n",
  1285. card->devname);
  1286. return 1;
  1287. }
  1288. if(len > FR_MAX_NO_DATA_BYTES_IN_FRAME) {
  1289. //FIXME: increment some statistic */
  1290. return 1;
  1291. }
  1292. chan->transmit_length = len;
  1293. chan->delay_skb = skb;
  1294. dlci_interface->gen_interrupt |= FR_INTR_TXRDY;
  1295. dlci_interface->packet_length = len;
  1296. /* Turn on TX interrupt at the end of if_send */
  1297. return 0;
  1298. }
  1299. /*============================================================================
  1300. * Check to see if the packet to be transmitted contains a broadcast or
  1301. * multicast source IP address.
  1302. * Return 0 if not broadcast/multicast address, otherwise return 1.
  1303. */
  1304. static int chk_bcast_mcast_addr(sdla_t *card, struct net_device* dev,
  1305. struct sk_buff *skb)
  1306. {
  1307. u32 src_ip_addr;
  1308. u32 broadcast_ip_addr = 0;
  1309. struct in_device *in_dev;
  1310. fr_channel_t* chan = dev->priv;
  1311. /* read the IP source address from the outgoing packet */
  1312. src_ip_addr = *(u32 *)(skb->data + 14);
  1313. /* read the IP broadcast address for the device */
  1314. in_dev = dev->ip_ptr;
  1315. if(in_dev != NULL) {
  1316. struct in_ifaddr *ifa= in_dev->ifa_list;
  1317. if(ifa != NULL)
  1318. broadcast_ip_addr = ifa->ifa_broadcast;
  1319. else
  1320. return 0;
  1321. }
  1322. /* check if the IP Source Address is a Broadcast address */
  1323. if((dev->flags & IFF_BROADCAST) && (src_ip_addr == broadcast_ip_addr)) {
  1324. printk(KERN_INFO
  1325. "%s: Broadcast Source Address silently discarded\n",
  1326. card->devname);
  1327. return 1;
  1328. }
  1329. /* check if the IP Source Address is a Multicast address */
  1330. if((chan->mc == WANOPT_NO) && (ntohl(src_ip_addr) >= 0xE0000001) &&
  1331. (ntohl(src_ip_addr) <= 0xFFFFFFFE)) {
  1332. printk(KERN_INFO
  1333. "%s: Multicast Source Address silently discarded\n",
  1334. card->devname);
  1335. return 1;
  1336. }
  1337. return 0;
  1338. }
  1339. /*============================================================================
  1340. * Reply to UDP Management system.
  1341. * Return nothing.
  1342. */
  1343. static int reply_udp( unsigned char *data, unsigned int mbox_len )
  1344. {
  1345. unsigned short len, udp_length, temp, ip_length;
  1346. unsigned long ip_temp;
  1347. int even_bound = 0;
  1348. fr_udp_pkt_t *fr_udp_pkt = (fr_udp_pkt_t *)data;
  1349. /* Set length of packet */
  1350. len = //sizeof(fr_encap_hdr_t)+
  1351. sizeof(ip_pkt_t)+
  1352. sizeof(udp_pkt_t)+
  1353. sizeof(wp_mgmt_t)+
  1354. sizeof(cblock_t)+
  1355. mbox_len;
  1356. /* fill in UDP reply */
  1357. fr_udp_pkt->wp_mgmt.request_reply = UDPMGMT_REPLY;
  1358. /* fill in UDP length */
  1359. udp_length = sizeof(udp_pkt_t)+
  1360. sizeof(wp_mgmt_t)+
  1361. sizeof(cblock_t)+
  1362. mbox_len;
  1363. /* put it on an even boundary */
  1364. if ( udp_length & 0x0001 ) {
  1365. udp_length += 1;
  1366. len += 1;
  1367. even_bound = 1;
  1368. }
  1369. temp = (udp_length<<8)|(udp_length>>8);
  1370. fr_udp_pkt->udp_pkt.udp_length = temp;
  1371. /* swap UDP ports */
  1372. temp = fr_udp_pkt->udp_pkt.udp_src_port;
  1373. fr_udp_pkt->udp_pkt.udp_src_port =
  1374. fr_udp_pkt->udp_pkt.udp_dst_port;
  1375. fr_udp_pkt->udp_pkt.udp_dst_port = temp;
  1376. /* add UDP pseudo header */
  1377. temp = 0x1100;
  1378. *((unsigned short *)
  1379. (fr_udp_pkt->data+mbox_len+even_bound)) = temp;
  1380. temp = (udp_length<<8)|(udp_length>>8);
  1381. *((unsigned short *)
  1382. (fr_udp_pkt->data+mbox_len+even_bound+2)) = temp;
  1383. /* calculate UDP checksum */
  1384. fr_udp_pkt->udp_pkt.udp_checksum = 0;
  1385. fr_udp_pkt->udp_pkt.udp_checksum =
  1386. calc_checksum(&data[UDP_OFFSET/*+sizeof(fr_encap_hdr_t)*/],
  1387. udp_length+UDP_OFFSET);
  1388. /* fill in IP length */
  1389. ip_length = udp_length + sizeof(ip_pkt_t);
  1390. temp = (ip_length<<8)|(ip_length>>8);
  1391. fr_udp_pkt->ip_pkt.total_length = temp;
  1392. /* swap IP addresses */
  1393. ip_temp = fr_udp_pkt->ip_pkt.ip_src_address;
  1394. fr_udp_pkt->ip_pkt.ip_src_address =
  1395. fr_udp_pkt->ip_pkt.ip_dst_address;
  1396. fr_udp_pkt->ip_pkt.ip_dst_address = ip_temp;
  1397. /* fill in IP checksum */
  1398. fr_udp_pkt->ip_pkt.hdr_checksum = 0;
  1399. fr_udp_pkt->ip_pkt.hdr_checksum =
  1400. calc_checksum(&data[/*sizeof(fr_encap_hdr_t)*/0],
  1401. sizeof(ip_pkt_t));
  1402. return len;
  1403. } /* reply_udp */
  1404. unsigned short calc_checksum (char *data, int len)
  1405. {
  1406. unsigned short temp;
  1407. unsigned long sum=0;
  1408. int i;
  1409. for( i = 0; i <len; i+=2 ) {
  1410. memcpy(&temp,&data[i],2);
  1411. sum += (unsigned long)temp;
  1412. }
  1413. while (sum >> 16 ) {
  1414. sum = (sum & 0xffffUL) + (sum >> 16);
  1415. }
  1416. temp = (unsigned short)sum;
  1417. temp = ~temp;
  1418. if( temp == 0 )
  1419. temp = 0xffff;
  1420. return temp;
  1421. }
  1422. /*
  1423. If incoming is 0 (outgoing)- if the net numbers is ours make it 0
  1424. if incoming is 1 - if the net number is 0 make it ours
  1425. */
  1426. static void switch_net_numbers(unsigned char *sendpacket, unsigned long network_number, unsigned char incoming)
  1427. {
  1428. unsigned long pnetwork_number;
  1429. pnetwork_number = (unsigned long)((sendpacket[14] << 24) +
  1430. (sendpacket[15] << 16) + (sendpacket[16] << 8) +
  1431. sendpacket[17]);
  1432. if (!incoming) {
  1433. /* If the destination network number is ours, make it 0 */
  1434. if( pnetwork_number == network_number) {
  1435. sendpacket[14] = sendpacket[15] = sendpacket[16] =
  1436. sendpacket[17] = 0x00;
  1437. }
  1438. } else {
  1439. /* If the incoming network is 0, make it ours */
  1440. if( pnetwork_number == 0) {
  1441. sendpacket[14] = (unsigned char)(network_number >> 24);
  1442. sendpacket[15] = (unsigned char)((network_number &
  1443. 0x00FF0000) >> 16);
  1444. sendpacket[16] = (unsigned char)((network_number &
  1445. 0x0000FF00) >> 8);
  1446. sendpacket[17] = (unsigned char)(network_number &
  1447. 0x000000FF);
  1448. }
  1449. }
  1450. pnetwork_number = (unsigned long)((sendpacket[26] << 24) +
  1451. (sendpacket[27] << 16) + (sendpacket[28] << 8) +
  1452. sendpacket[29]);
  1453. if( !incoming ) {
  1454. /* If the source network is ours, make it 0 */
  1455. if( pnetwork_number == network_number) {
  1456. sendpacket[26] = sendpacket[27] = sendpacket[28] =
  1457. sendpacket[29] = 0x00;
  1458. }
  1459. } else {
  1460. /* If the source network is 0, make it ours */
  1461. if( pnetwork_number == 0 ) {
  1462. sendpacket[26] = (unsigned char)(network_number >> 24);
  1463. sendpacket[27] = (unsigned char)((network_number &
  1464. 0x00FF0000) >> 16);
  1465. sendpacket[28] = (unsigned char)((network_number &
  1466. 0x0000FF00) >> 8);
  1467. sendpacket[29] = (unsigned char)(network_number &
  1468. 0x000000FF);
  1469. }
  1470. }
  1471. } /* switch_net_numbers */
  1472. /*============================================================================
  1473. * Get ethernet-style interface statistics.
  1474. * Return a pointer to struct enet_statistics.
  1475. */
  1476. static struct net_device_stats *if_stats(struct net_device *dev)
  1477. {
  1478. fr_channel_t* chan = dev->priv;
  1479. if(chan == NULL)
  1480. return NULL;
  1481. return &chan->ifstats;
  1482. }
  1483. /****** Interrupt Handlers **************************************************/
  1484. /*============================================================================
  1485. * fr_isr: S508 frame relay interrupt service routine.
  1486. *
  1487. * Description:
  1488. * Frame relay main interrupt service route. This
  1489. * function check the interrupt type and takes
  1490. * the appropriate action.
  1491. */
  1492. static void fr_isr (sdla_t* card)
  1493. {
  1494. fr508_flags_t* flags = card->flags;
  1495. char *ptr = &flags->iflag;
  1496. int i,err;
  1497. fr_mbox_t* mbox = card->mbox;
  1498. /* This flag prevents nesting of interrupts. See sdla_isr() routine
  1499. * in sdlamain.c. */
  1500. card->in_isr = 1;
  1501. ++card->statistics.isr_entry;
  1502. /* All peripheral (configuraiton, re-configuration) events
  1503. * take presidence over the ISR. Thus, retrigger */
  1504. if (test_bit(PERI_CRIT, (void*)&card->wandev.critical)) {
  1505. ++card->statistics.isr_already_critical;
  1506. goto fr_isr_exit;
  1507. }
  1508. if(card->hw.type != SDLA_S514) {
  1509. if (test_bit(SEND_CRIT, (void*)&card->wandev.critical)) {
  1510. printk(KERN_INFO "%s: Critical while in ISR: If Send Running!\n",
  1511. card->devname);
  1512. ++card->statistics.isr_already_critical;
  1513. goto fr_isr_exit;
  1514. }
  1515. }
  1516. switch (flags->iflag) {
  1517. case FR_INTR_RXRDY: /* receive interrupt */
  1518. ++card->statistics.isr_rx;
  1519. rx_intr(card);
  1520. break;
  1521. case FR_INTR_TXRDY: /* transmit interrupt */
  1522. ++ card->statistics.isr_tx;
  1523. tx_intr(card);
  1524. break;
  1525. case FR_INTR_READY:
  1526. Intr_test_counter++;
  1527. ++card->statistics.isr_intr_test;
  1528. break;
  1529. case FR_INTR_DLC: /* Event interrupt occurred */
  1530. mbox->cmd.command = FR_READ_STATUS;
  1531. mbox->cmd.length = 0;
  1532. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  1533. if (err)
  1534. fr_event(card, err, mbox);
  1535. break;
  1536. case FR_INTR_TIMER: /* Timer interrupt */
  1537. timer_intr(card);
  1538. break;
  1539. default:
  1540. ++card->statistics.isr_spurious;
  1541. spur_intr(card);
  1542. printk(KERN_INFO "%s: Interrupt Type 0x%02X!\n",
  1543. card->devname, flags->iflag);
  1544. printk(KERN_INFO "%s: ID Bytes = ",card->devname);
  1545. for(i = 0; i < 8; i ++)
  1546. printk(KERN_INFO "0x%02X ", *(ptr + 0x28 + i));
  1547. printk(KERN_INFO "\n");
  1548. break;
  1549. }
  1550. fr_isr_exit:
  1551. card->in_isr = 0;
  1552. flags->iflag = 0;
  1553. return;
  1554. }
  1555. /*===========================================================
  1556. * rx_intr Receive interrupt handler.
  1557. *
  1558. * Description
  1559. * Upon receiveing an interrupt:
  1560. * 1. Check that the firmware is in sync with
  1561. * the driver.
  1562. * 2. Find an appropriate network interface
  1563. * based on the received dlci number.
  1564. * 3. Check that the netowrk interface exists
  1565. * and that it's setup properly.
  1566. * 4. Copy the data into an skb buffer.
  1567. * 5. Check the packet type and take
  1568. * appropriate acton: UPD, API, ARP or Data.
  1569. */
  1570. static void rx_intr (sdla_t* card)
  1571. {
  1572. fr_rx_buf_ctl_t* frbuf = card->rxmb;
  1573. fr508_flags_t* flags = card->flags;
  1574. fr_channel_t* chan;
  1575. char *ptr = &flags->iflag;
  1576. struct sk_buff* skb;
  1577. struct net_device* dev;
  1578. void* buf;
  1579. unsigned dlci, len, offs, len_incl_hdr;
  1580. int i, udp_type;
  1581. /* Check that firmware buffers are in sync */
  1582. if (frbuf->flag != 0x01) {
  1583. printk(KERN_INFO
  1584. "%s: corrupted Rx buffer @ 0x%X, flag = 0x%02X!\n",
  1585. card->devname, (unsigned)frbuf, frbuf->flag);
  1586. printk(KERN_INFO "%s: ID Bytes = ",card->devname);
  1587. for(i = 0; i < 8; i ++)
  1588. printk(KERN_INFO "0x%02X ", *(ptr + 0x28 + i));
  1589. printk(KERN_INFO "\n");
  1590. ++card->statistics.rx_intr_corrupt_rx_bfr;
  1591. /* Bug Fix: Mar 6 2000
  1592. * If we get a corrupted mailbox, it means that driver
  1593. * is out of sync with the firmware. There is no recovery.
  1594. * If we don't turn off all interrupts for this card
  1595. * the machine will crash.
  1596. */
  1597. printk(KERN_INFO "%s: Critical router failure ...!!!\n", card->devname);
  1598. printk(KERN_INFO "Please contact Sangoma Technologies !\n");
  1599. fr_set_intr_mode(card, 0, 0, 0);
  1600. return;
  1601. }
  1602. len = frbuf->length;
  1603. dlci = frbuf->dlci;
  1604. offs = frbuf->offset;
  1605. /* Find the network interface for this packet */
  1606. dev = find_channel(card, dlci);
  1607. /* Check that the network interface is active and
  1608. * properly setup */
  1609. if (dev == NULL) {
  1610. if( net_ratelimit()) {
  1611. printk(KERN_INFO "%s: received data on unconfigured DLCI %d!\n",
  1612. card->devname, dlci);
  1613. }
  1614. ++card->statistics.rx_intr_on_orphaned_DLCI;
  1615. ++card->wandev.stats.rx_dropped;
  1616. goto rx_done;
  1617. }
  1618. if ((chan = dev->priv) == NULL){
  1619. if( net_ratelimit()) {
  1620. printk(KERN_INFO "%s: received data on unconfigured DLCI %d!\n",
  1621. card->devname, dlci);
  1622. }
  1623. ++card->statistics.rx_intr_on_orphaned_DLCI;
  1624. ++card->wandev.stats.rx_dropped;
  1625. goto rx_done;
  1626. }
  1627. skb = dev_alloc_skb(len);
  1628. if (!netif_running(dev) || (skb == NULL)){
  1629. ++chan->ifstats.rx_dropped;
  1630. if(skb == NULL) {
  1631. if (net_ratelimit()) {
  1632. printk(KERN_INFO
  1633. "%s: no socket buffers available!\n",
  1634. card->devname);
  1635. }
  1636. chan->drvstats_rx_intr.rx_intr_no_socket ++;
  1637. }
  1638. if (!netif_running(dev)){
  1639. chan->drvstats_rx_intr.
  1640. rx_intr_dev_not_started ++;
  1641. if (skb){
  1642. dev_kfree_skb_any(skb);
  1643. }
  1644. }
  1645. goto rx_done;
  1646. }
  1647. /* Copy data from the board into the socket buffer */
  1648. if ((offs + len) > card->u.f.rx_top + 1) {
  1649. unsigned tmp = card->u.f.rx_top - offs + 1;
  1650. buf = skb_put(skb, tmp);
  1651. sdla_peek(&card->hw, offs, buf, tmp);
  1652. offs = card->u.f.rx_base;
  1653. len -= tmp;
  1654. }
  1655. buf = skb_put(skb, len);
  1656. sdla_peek(&card->hw, offs, buf, len);
  1657. /* We got the packet from the bard.
  1658. * Check the packet type and take appropriate action */
  1659. udp_type = udp_pkt_type( skb, card );
  1660. if(udp_type != UDP_INVALID_TYPE) {
  1661. /* UDP Debug packet received, store the
  1662. * packet and handle it in timer interrupt */
  1663. skb_pull(skb, 1);
  1664. if (wanrouter_type_trans(skb, dev)){
  1665. if(store_udp_mgmt_pkt(udp_type,UDP_PKT_FRM_NETWORK,card,skb,dlci)){
  1666. flags->imask |= FR_INTR_TIMER;
  1667. if (udp_type == UDP_FPIPE_TYPE){
  1668. ++chan->drvstats_rx_intr.rx_intr_PIPE_request;
  1669. }
  1670. }
  1671. }
  1672. }else if (chan->common.usedby == API) {
  1673. /* We are in API mode.
  1674. * Add an API header to the RAW packet
  1675. * and queue it into a circular buffer.
  1676. * Then kick the fr_bh() bottom half handler */
  1677. api_rx_hdr_t* api_rx_hdr;
  1678. chan->drvstats_rx_intr.rx_intr_bfr_passed_to_stack ++;
  1679. chan->ifstats.rx_packets ++;
  1680. card->wandev.stats.rx_packets ++;
  1681. chan->ifstats.rx_bytes += skb->len;
  1682. card->wandev.stats.rx_bytes += skb->len;
  1683. skb_push(skb, sizeof(api_rx_hdr_t));
  1684. api_rx_hdr = (api_rx_hdr_t*)&skb->data[0x00];
  1685. api_rx_hdr->attr = frbuf->attr;
  1686. api_rx_hdr->time_stamp = frbuf->tmstamp;
  1687. skb->protocol = htons(ETH_P_IP);
  1688. skb->mac.raw = skb->data;
  1689. skb->dev = dev;
  1690. skb->pkt_type = WAN_PACKET_DATA;
  1691. bh_enqueue(dev, skb);
  1692. trigger_fr_bh(chan);
  1693. }else if (handle_IPXWAN(skb->data,chan->name,chan->enable_IPX, chan->network_number)){
  1694. //FIXME: Frame Relay IPX is not supported, Yet !
  1695. //if (chan->enable_IPX) {
  1696. // fr_send(card, dlci, 0, skb->len,skb->data);
  1697. //}
  1698. dev_kfree_skb_any(skb);
  1699. } else if (is_arp(skb->data)) {
  1700. /* ARP support enabled Mar 16 2000
  1701. * Process incoming ARP reply/request, setup
  1702. * dynamic routes. */
  1703. if (process_ARP((arphdr_1490_t *)skb->data, card, dev)) {
  1704. if (net_ratelimit()){
  1705. printk (KERN_INFO
  1706. "%s: Error processing ARP Packet.\n",
  1707. card->devname);
  1708. }
  1709. }
  1710. dev_kfree_skb_any(skb);
  1711. } else if (skb->data[0] != 0x03) {
  1712. if (net_ratelimit()) {
  1713. printk(KERN_INFO "%s: Non IETF packet discarded.\n",
  1714. card->devname);
  1715. }
  1716. dev_kfree_skb_any(skb);
  1717. } else {
  1718. len_incl_hdr = skb->len;
  1719. /* Decapsulate packet and pass it up the
  1720. protocol stack */
  1721. skb->dev = dev;
  1722. if (chan->common.usedby == BRIDGE || chan->common.usedby == BRIDGE_NODE){
  1723. /* Make sure it's an Ethernet frame, otherwise drop it */
  1724. if (!memcmp(skb->data, "\x03\x00\x80\x00\x80\xC2\x00\x07", 8)) {
  1725. skb_pull(skb, 8);
  1726. skb->protocol=eth_type_trans(skb,dev);
  1727. }else{
  1728. ++chan->drvstats_rx_intr.rx_intr_bfr_not_passed_to_stack;
  1729. ++chan->ifstats.rx_errors;
  1730. ++card->wandev.stats.rx_errors;
  1731. goto rx_done;
  1732. }
  1733. }else{
  1734. /* remove hardware header */
  1735. buf = skb_pull(skb, 1);
  1736. if (!wanrouter_type_trans(skb, dev)) {
  1737. /* can't decapsulate packet */
  1738. dev_kfree_skb_any(skb);
  1739. ++chan->drvstats_rx_intr.rx_intr_bfr_not_passed_to_stack;
  1740. ++chan->ifstats.rx_errors;
  1741. ++card->wandev.stats.rx_errors;
  1742. goto rx_done;
  1743. }
  1744. skb->mac.raw = skb->data;
  1745. }
  1746. /* Send a packet up the IP stack */
  1747. skb->dev->last_rx = jiffies;
  1748. netif_rx(skb);
  1749. ++chan->drvstats_rx_intr.rx_intr_bfr_passed_to_stack;
  1750. ++chan->ifstats.rx_packets;
  1751. ++card->wandev.stats.rx_packets;
  1752. chan->ifstats.rx_bytes += len_incl_hdr;
  1753. card->wandev.stats.rx_bytes += len_incl_hdr;
  1754. }
  1755. rx_done:
  1756. /* Release buffer element and calculate a pointer to the next one */
  1757. frbuf->flag = 0;
  1758. card->rxmb = ++frbuf;
  1759. if ((void*)frbuf > card->u.f.rxmb_last)
  1760. card->rxmb = card->u.f.rxmb_base;
  1761. }
  1762. /*==================================================================
  1763. * tx_intr: Transmit interrupt handler.
  1764. *
  1765. * Rationale:
  1766. * If the board is busy transmitting, if_send() will
  1767. * buffers a single packet and turn on
  1768. * the tx interrupt. Tx interrupt will be called
  1769. * by the board, once the firmware can send more
  1770. * data. Thus, no polling is required.
  1771. *
  1772. * Description:
  1773. * Tx interrupt is called for each
  1774. * configured dlci channel. Thus:
  1775. * 1. Obtain the netowrk interface based on the
  1776. * dlci number.
  1777. * 2. Check that network interface is up and
  1778. * properly setup.
  1779. * 3. Check for a buffered packet.
  1780. * 4. Transmit the packet.
  1781. * 5. If we are in WANPIPE mode, mark the
  1782. * NET_BH handler.
  1783. * 6. If we are in API mode, kick
  1784. * the AF_WANPIPE socket for more data.
  1785. *
  1786. */
  1787. static void tx_intr(sdla_t *card)
  1788. {
  1789. fr508_flags_t* flags = card->flags;
  1790. fr_tx_buf_ctl_t* bctl;
  1791. struct net_device* dev;
  1792. fr_channel_t* chan;
  1793. if(card->hw.type == SDLA_S514){
  1794. bctl = (void*)(flags->tse_offs + card->hw.dpmbase);
  1795. }else{
  1796. bctl = (void*)(flags->tse_offs - FR_MB_VECTOR +
  1797. card->hw.dpmbase);
  1798. }
  1799. /* Find the structure and make it unbusy */
  1800. dev = find_channel(card, flags->dlci);
  1801. if (dev == NULL){
  1802. printk(KERN_INFO "NO DEV IN TX Interrupt\n");
  1803. goto end_of_tx_intr;
  1804. }
  1805. if ((chan = dev->priv) == NULL){
  1806. printk(KERN_INFO "NO CHAN IN TX Interrupt\n");
  1807. goto end_of_tx_intr;
  1808. }
  1809. if(!chan->transmit_length || !chan->delay_skb) {
  1810. printk(KERN_INFO "%s: tx int error - transmit length zero\n",
  1811. card->wandev.name);
  1812. goto end_of_tx_intr;
  1813. }
  1814. /* If the 'if_send()' procedure is currently checking the 'tbusy'
  1815. status, then we cannot transmit. Instead, we configure the microcode
  1816. so as to re-issue this transmit interrupt at a later stage.
  1817. */
  1818. if (test_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical)) {
  1819. fr_dlci_interface_t* dlci_interface = chan->dlci_int_interface;
  1820. bctl->flag = 0xA0;
  1821. dlci_interface->gen_interrupt |= FR_INTR_TXRDY;
  1822. return;
  1823. }else{
  1824. bctl->dlci = flags->dlci;
  1825. bctl->length = chan->transmit_length+chan->fr_header_len;
  1826. sdla_poke(&card->hw,
  1827. fr_send_hdr(card,bctl->dlci,bctl->offset),
  1828. chan->delay_skb->data,
  1829. chan->delay_skb->len);
  1830. bctl->flag = 0xC0;
  1831. ++chan->ifstats.tx_packets;
  1832. ++card->wandev.stats.tx_packets;
  1833. chan->ifstats.tx_bytes += chan->transmit_length;
  1834. card->wandev.stats.tx_bytes += chan->transmit_length;
  1835. /* We must free an sk buffer, which we used
  1836. * for delayed transmission; Otherwise, the sock
  1837. * will run out of memory */
  1838. dev_kfree_skb_any(chan->delay_skb);
  1839. chan->delay_skb = NULL;
  1840. chan->transmit_length = 0;
  1841. dev->trans_start = jiffies;
  1842. if (netif_queue_stopped(dev)){
  1843. /* If using API, than wakeup socket BH handler */
  1844. if (chan->common.usedby == API){
  1845. netif_start_queue(dev);
  1846. wakeup_sk_bh(dev);
  1847. }else{
  1848. netif_wake_queue(dev);
  1849. }
  1850. }
  1851. }
  1852. end_of_tx_intr:
  1853. /* if any other interfaces have transmit interrupts pending,
  1854. * do not disable the global transmit interrupt */
  1855. if(!(-- card->u.f.tx_interrupts_pending))
  1856. flags->imask &= ~FR_INTR_TXRDY;
  1857. }
  1858. /*============================================================================
  1859. * timer_intr: Timer interrupt handler.
  1860. *
  1861. * Rationale:
  1862. * All commans must be executed within the timer
  1863. * interrupt since no two commands should execute
  1864. * at the same time.
  1865. *
  1866. * Description:
  1867. * The timer interrupt is used to:
  1868. * 1. Processing udp calls from 'fpipemon'.
  1869. * 2. Processing update calls from /proc file system
  1870. * 3. Reading board-level statistics for
  1871. * updating the proc file system.
  1872. * 4. Sending inverse ARP request packets.
  1873. * 5. Configure a dlci/channel.
  1874. * 6. Unconfigure a dlci/channel. (Node only)
  1875. */
  1876. static void timer_intr(sdla_t *card)
  1877. {
  1878. fr508_flags_t* flags = card->flags;
  1879. /* UDP Debuging: fpipemon call */
  1880. if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UDP) {
  1881. if(card->u.f.udp_type == UDP_FPIPE_TYPE) {
  1882. if(process_udp_mgmt_pkt(card)) {
  1883. card->u.f.timer_int_enabled &=
  1884. ~TMR_INT_ENABLED_UDP;
  1885. }
  1886. }
  1887. }
  1888. /* /proc update call : triggered from update() */
  1889. if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UPDATE) {
  1890. fr_get_err_stats(card);
  1891. fr_get_stats(card);
  1892. card->u.f.update_comms_stats = 0;
  1893. card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UPDATE;
  1894. }
  1895. /* Update the channel state call. This is call is
  1896. * triggered by if_send() function */
  1897. if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UPDATE_STATE){
  1898. struct net_device *dev;
  1899. if (card->wandev.state == WAN_CONNECTED){
  1900. for (dev = card->wandev.dev; dev;
  1901. dev = *((struct net_device **)dev->priv)){
  1902. fr_channel_t *chan = dev->priv;
  1903. if (chan->common.state != WAN_CONNECTED){
  1904. update_chan_state(dev);
  1905. }
  1906. }
  1907. }
  1908. card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UPDATE_STATE;
  1909. }
  1910. /* configure a dlci/channel */
  1911. if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_CONFIG){
  1912. config_fr(card);
  1913. card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_CONFIG;
  1914. }
  1915. /* unconfigure a dlci/channel */
  1916. if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UNCONFIG){
  1917. unconfig_fr(card);
  1918. card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UNCONFIG;
  1919. }
  1920. /* Transmit ARP packets */
  1921. if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_ARP){
  1922. int i=0;
  1923. struct net_device *dev;
  1924. if (card->u.f.arp_dev == NULL)
  1925. card->u.f.arp_dev = card->wandev.dev;
  1926. dev = card->u.f.arp_dev;
  1927. for (;;){
  1928. fr_channel_t *chan = dev->priv;
  1929. /* If the interface is brought down cancel sending In-ARPs */
  1930. if (!(dev->flags&IFF_UP)){
  1931. clear_bit(0,&chan->inarp_ready);
  1932. }
  1933. if (test_bit(0,&chan->inarp_ready)){
  1934. if (check_tx_status(card,dev)){
  1935. set_bit(ARP_CRIT,&card->wandev.critical);
  1936. break;
  1937. }
  1938. if (!send_inarp_request(card,dev)){
  1939. trigger_fr_arp(dev);
  1940. chan->inarp_tick = jiffies;
  1941. }
  1942. clear_bit(0,&chan->inarp_ready);
  1943. dev = move_dev_to_next(card,dev);
  1944. break;
  1945. }
  1946. dev = move_dev_to_next(card,dev);
  1947. if (++i == card->wandev.new_if_cnt){
  1948. card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_ARP;
  1949. break;
  1950. }
  1951. }
  1952. card->u.f.arp_dev = dev;
  1953. }
  1954. if(!card->u.f.timer_int_enabled)
  1955. flags->imask &= ~FR_INTR_TIMER;
  1956. }
  1957. /*============================================================================
  1958. * spur_intr: Spurious interrupt handler.
  1959. *
  1960. * Description:
  1961. * We don't know this interrupt.
  1962. * Print a warning.
  1963. */
  1964. static void spur_intr (sdla_t* card)
  1965. {
  1966. if (net_ratelimit()){
  1967. printk(KERN_INFO "%s: spurious interrupt!\n", card->devname);
  1968. }
  1969. }
  1970. //FIXME: Fix the IPX in next version
  1971. /*===========================================================================
  1972. * Return 0 for non-IPXWAN packet
  1973. * 1 for IPXWAN packet or IPX is not enabled!
  1974. * FIXME: Use a IPX structure here not offsets
  1975. */
  1976. static int handle_IPXWAN(unsigned char *sendpacket,
  1977. char *devname, unsigned char enable_IPX,
  1978. unsigned long network_number)
  1979. {
  1980. int i;
  1981. if( sendpacket[1] == 0x00 && sendpacket[2] == 0x80 &&
  1982. sendpacket[6] == 0x81 && sendpacket[7] == 0x37) {
  1983. /* It's an IPX packet */
  1984. if (!enable_IPX){
  1985. /* Return 1 so we don't pass it up the stack. */
  1986. //FIXME: Take this out when IPX is fixed
  1987. if (net_ratelimit()){
  1988. printk (KERN_INFO
  1989. "%s: WARNING: Unsupported IPX packet received and dropped\n",
  1990. devname);
  1991. }
  1992. return 1;
  1993. }
  1994. } else {
  1995. /* It's not IPX so return and pass it up the stack. */
  1996. return 0;
  1997. }
  1998. if( sendpacket[24] == 0x90 && sendpacket[25] == 0x04){
  1999. /* It's IPXWAN */
  2000. if( sendpacket[10] == 0x02 && sendpacket[42] == 0x00){
  2001. /* It's a timer request packet */
  2002. printk(KERN_INFO "%s: Received IPXWAN Timer Request packet\n",
  2003. devname);
  2004. /* Go through the routing options and answer no to every
  2005. * option except Unnumbered RIP/SAP
  2006. */
  2007. for(i = 49; sendpacket[i] == 0x00; i += 5){
  2008. /* 0x02 is the option for Unnumbered RIP/SAP */
  2009. if( sendpacket[i + 4] != 0x02){
  2010. sendpacket[i + 1] = 0;
  2011. }
  2012. }
  2013. /* Skip over the extended Node ID option */
  2014. if( sendpacket[i] == 0x04 ){
  2015. i += 8;
  2016. }
  2017. /* We also want to turn off all header compression opt.
  2018. */
  2019. for(; sendpacket[i] == 0x80 ;){
  2020. sendpacket[i + 1] = 0;
  2021. i += (sendpacket[i + 2] << 8) + (sendpacket[i + 3]) + 4;
  2022. }
  2023. /* Set the packet type to timer response */
  2024. sendpacket[42] = 0x01;
  2025. printk(KERN_INFO "%s: Sending IPXWAN Timer Response\n",
  2026. devname);
  2027. } else if( sendpacket[42] == 0x02 ){
  2028. /* This is an information request packet */
  2029. printk(KERN_INFO
  2030. "%s: Received IPXWAN Information Request packet\n",
  2031. devname);
  2032. /* Set the packet type to information response */
  2033. sendpacket[42] = 0x03;
  2034. /* Set the router name */
  2035. sendpacket[59] = 'F';
  2036. sendpacket[60] = 'P';
  2037. sendpacket[61] = 'I';
  2038. sendpacket[62] = 'P';
  2039. sendpacket[63] = 'E';
  2040. sendpacket[64] = '-';
  2041. sendpacket[65] = CVHexToAscii(network_number >> 28);
  2042. sendpacket[66] = CVHexToAscii((network_number & 0x0F000000)>> 24);
  2043. sendpacket[67] = CVHexToAscii((network_number & 0x00F00000)>> 20);
  2044. sendpacket[68] = CVHexToAscii((network_number & 0x000F0000)>> 16);
  2045. sendpacket[69] = CVHexToAscii((network_number & 0x0000F000)>> 12);
  2046. sendpacket[70] = CVHexToAscii((network_number & 0x00000F00)>> 8);
  2047. sendpacket[71] = CVHexToAscii((network_number & 0x000000F0)>> 4);
  2048. sendpacket[72] = CVHexToAscii(network_number & 0x0000000F);
  2049. for(i = 73; i < 107; i+= 1)
  2050. {
  2051. sendpacket[i] = 0;
  2052. }
  2053. printk(KERN_INFO "%s: Sending IPXWAN Information Response packet\n",
  2054. devname);
  2055. } else {
  2056. printk(KERN_INFO "%s: Unknown IPXWAN packet!\n",devname);
  2057. return 0;
  2058. }
  2059. /* Set the WNodeID to our network address */
  2060. sendpacket[43] = (unsigned char)(network_number >> 24);
  2061. sendpacket[44] = (unsigned char)((network_number & 0x00FF0000) >> 16);
  2062. sendpacket[45] = (unsigned char)((network_number & 0x0000FF00) >> 8);
  2063. sendpacket[46] = (unsigned char)(network_number & 0x000000FF);
  2064. return 1;
  2065. }
  2066. /* If we get here, it's an IPX-data packet so it'll get passed up the
  2067. * stack.
  2068. * switch the network numbers
  2069. */
  2070. switch_net_numbers(sendpacket, network_number ,1);
  2071. return 0;
  2072. }
  2073. /*============================================================================
  2074. * process_route
  2075. *
  2076. * Rationale:
  2077. * If the interface goes down, or we receive an ARP request,
  2078. * we have to change the network interface ip addresses.
  2079. * This cannot be done within the interrupt.
  2080. *
  2081. * Description:
  2082. *
  2083. * This routine is called as a polling routine to dynamically
  2084. * add/delete routes negotiated by inverse ARP. It is in this
  2085. * "task" because we don't want routes to be added while in
  2086. * interrupt context.
  2087. *
  2088. * Usage:
  2089. * This function is called by fr_poll() polling funtion.
  2090. */
  2091. static void process_route(struct net_device *dev)
  2092. {
  2093. fr_channel_t *chan = dev->priv;
  2094. sdla_t *card = chan->card;
  2095. struct ifreq if_info;
  2096. struct sockaddr_in *if_data;
  2097. mm_segment_t fs = get_fs();
  2098. u32 ip_tmp;
  2099. int err;
  2100. switch(chan->route_flag){
  2101. case ADD_ROUTE:
  2102. /* Set remote addresses */
  2103. memset(&if_info, 0, sizeof(if_info));
  2104. strcpy(if_info.ifr_name, dev->name);
  2105. set_fs(get_ds()); /* get user space block */
  2106. if_data = (struct sockaddr_in *)&if_info.ifr_dstaddr;
  2107. if_data->sin_addr.s_addr = chan->ip_remote;
  2108. if_data->sin_family = AF_INET;
  2109. err = devinet_ioctl( SIOCSIFDSTADDR, &if_info );
  2110. set_fs(fs); /* restore old block */
  2111. if (err) {
  2112. printk(KERN_INFO
  2113. "%s: Route Add failed. Error: %d\n",
  2114. card->devname,err);
  2115. printk(KERN_INFO "%s: Address: %u.%u.%u.%u\n",
  2116. chan->name, NIPQUAD(chan->ip_remote));
  2117. }else {
  2118. printk(KERN_INFO "%s: Route Added Successfully: %u.%u.%u.%u\n",
  2119. card->devname,NIPQUAD(chan->ip_remote));
  2120. chan->route_flag = ROUTE_ADDED;
  2121. }
  2122. break;
  2123. case REMOVE_ROUTE:
  2124. /* Set remote addresses */
  2125. memset(&if_info, 0, sizeof(if_info));
  2126. strcpy(if_info.ifr_name, dev->name);
  2127. ip_tmp = get_ip_address(dev,WAN_POINTOPOINT_IP);
  2128. set_fs(get_ds()); /* get user space block */
  2129. if_data = (struct sockaddr_in *)&if_info.ifr_dstaddr;
  2130. if_data->sin_addr.s_addr = 0;
  2131. if_data->sin_family = AF_INET;
  2132. err = devinet_ioctl( SIOCSIFDSTADDR, &if_info );
  2133. set_fs(fs);
  2134. if (err) {
  2135. printk(KERN_INFO
  2136. "%s: Deleting of route failed. Error: %d\n",
  2137. card->devname,err);
  2138. printk(KERN_INFO "%s: Address: %u.%u.%u.%u\n",
  2139. dev->name,NIPQUAD(chan->ip_remote) );
  2140. } else {
  2141. printk(KERN_INFO "%s: Route Removed Sucessfuly: %u.%u.%u.%u\n",
  2142. card->devname,NIPQUAD(ip_tmp));
  2143. chan->route_flag = NO_ROUTE;
  2144. }
  2145. break;
  2146. } /* Case Statement */
  2147. }
  2148. /****** Frame Relay Firmware-Specific Functions *****************************/
  2149. /*============================================================================
  2150. * Read firmware code version.
  2151. * o fill string str with firmware version info.
  2152. */
  2153. static int fr_read_version (sdla_t* card, char* str)
  2154. {
  2155. fr_mbox_t* mbox = card->mbox;
  2156. int retry = MAX_CMD_RETRY;
  2157. int err;
  2158. do
  2159. {
  2160. mbox->cmd.command = FR_READ_CODE_VERSION;
  2161. mbox->cmd.length = 0;
  2162. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2163. } while (err && retry-- && fr_event(card, err, mbox));
  2164. if (!err && str) {
  2165. int len = mbox->cmd.length;
  2166. memcpy(str, mbox->data, len);
  2167. str[len] = '\0';
  2168. }
  2169. return err;
  2170. }
  2171. /*============================================================================
  2172. * Set global configuration.
  2173. */
  2174. static int fr_configure (sdla_t* card, fr_conf_t *conf)
  2175. {
  2176. fr_mbox_t* mbox = card->mbox;
  2177. int retry = MAX_CMD_RETRY;
  2178. int dlci_num = card->u.f.dlci_num;
  2179. int err, i;
  2180. do
  2181. {
  2182. memcpy(mbox->data, conf, sizeof(fr_conf_t));
  2183. if (dlci_num) for (i = 0; i < dlci_num; ++i)
  2184. ((fr_conf_t*)mbox->data)->dlci[i] =
  2185. card->u.f.node_dlci[i];
  2186. mbox->cmd.command = FR_SET_CONFIG;
  2187. mbox->cmd.length =
  2188. sizeof(fr_conf_t) + dlci_num * sizeof(short);
  2189. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2190. } while (err && retry-- && fr_event(card, err, mbox));
  2191. /*NC Oct 12 2000 */
  2192. if (err != CMD_OK){
  2193. printk(KERN_ERR "%s: Frame Relay Configuration Failed: rc=0x%x\n",
  2194. card->devname,err);
  2195. }
  2196. return err;
  2197. }
  2198. /*============================================================================
  2199. * Set DLCI configuration.
  2200. */
  2201. static int fr_dlci_configure (sdla_t* card, fr_dlc_conf_t *conf, unsigned dlci)
  2202. {
  2203. fr_mbox_t* mbox = card->mbox;
  2204. int retry = MAX_CMD_RETRY;
  2205. int err;
  2206. do
  2207. {
  2208. memcpy(mbox->data, conf, sizeof(fr_dlc_conf_t));
  2209. mbox->cmd.dlci = (unsigned short) dlci;
  2210. mbox->cmd.command = FR_SET_CONFIG;
  2211. mbox->cmd.length = sizeof(fr_dlc_conf_t);
  2212. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2213. } while (err && retry--);
  2214. return err;
  2215. }
  2216. /*============================================================================
  2217. * Set interrupt mode.
  2218. */
  2219. static int fr_set_intr_mode (sdla_t* card, unsigned mode, unsigned mtu,
  2220. unsigned short timeout)
  2221. {
  2222. fr_mbox_t* mbox = card->mbox;
  2223. fr508_intr_ctl_t* ictl = (void*)mbox->data;
  2224. int retry = MAX_CMD_RETRY;
  2225. int err;
  2226. do
  2227. {
  2228. memset(ictl, 0, sizeof(fr508_intr_ctl_t));
  2229. ictl->mode = mode;
  2230. ictl->tx_len = mtu;
  2231. ictl->irq = card->hw.irq;
  2232. /* indicate timeout on timer */
  2233. if (mode & 0x20) ictl->timeout = timeout;
  2234. mbox->cmd.length = sizeof(fr508_intr_ctl_t);
  2235. mbox->cmd.command = FR_SET_INTR_MODE;
  2236. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2237. } while (err && retry-- && fr_event(card, err, mbox));
  2238. return err;
  2239. }
  2240. /*============================================================================
  2241. * Enable communications.
  2242. */
  2243. static int fr_comm_enable (sdla_t* card)
  2244. {
  2245. fr_mbox_t* mbox = card->mbox;
  2246. int retry = MAX_CMD_RETRY;
  2247. int err;
  2248. do
  2249. {
  2250. mbox->cmd.command = FR_COMM_ENABLE;
  2251. mbox->cmd.length = 0;
  2252. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2253. } while (err && retry-- && fr_event(card, err, mbox));
  2254. return err;
  2255. }
  2256. /*============================================================================
  2257. * fr_comm_disable
  2258. *
  2259. * Warning: This functin is called by the shutdown() procedure. It is void
  2260. * since dev->priv are has already been deallocated and no
  2261. * error checking is possible using fr_event() function.
  2262. */
  2263. static void fr_comm_disable (sdla_t* card)
  2264. {
  2265. fr_mbox_t* mbox = card->mbox;
  2266. int retry = MAX_CMD_RETRY;
  2267. int err;
  2268. do {
  2269. mbox->cmd.command = FR_SET_MODEM_STATUS;
  2270. mbox->cmd.length = 1;
  2271. mbox->data[0] = 0;
  2272. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2273. } while (err && retry--);
  2274. retry = MAX_CMD_RETRY;
  2275. do
  2276. {
  2277. mbox->cmd.command = FR_COMM_DISABLE;
  2278. mbox->cmd.length = 0;
  2279. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2280. } while (err && retry--);
  2281. return;
  2282. }
  2283. /*============================================================================
  2284. * Get communications error statistics.
  2285. */
  2286. static int fr_get_err_stats (sdla_t* card)
  2287. {
  2288. fr_mbox_t* mbox = card->mbox;
  2289. int retry = MAX_CMD_RETRY;
  2290. int err;
  2291. do
  2292. {
  2293. mbox->cmd.command = FR_READ_ERROR_STATS;
  2294. mbox->cmd.length = 0;
  2295. mbox->cmd.dlci = 0;
  2296. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2297. } while (err && retry-- && fr_event(card, err, mbox));
  2298. if (!err) {
  2299. fr_comm_stat_t* stats = (void*)mbox->data;
  2300. card->wandev.stats.rx_over_errors = stats->rx_overruns;
  2301. card->wandev.stats.rx_crc_errors = stats->rx_bad_crc;
  2302. card->wandev.stats.rx_missed_errors = stats->rx_aborts;
  2303. card->wandev.stats.rx_length_errors = stats->rx_too_long;
  2304. card->wandev.stats.tx_aborted_errors = stats->tx_aborts;
  2305. }
  2306. return err;
  2307. }
  2308. /*============================================================================
  2309. * Get statistics.
  2310. */
  2311. static int fr_get_stats (sdla_t* card)
  2312. {
  2313. fr_mbox_t* mbox = card->mbox;
  2314. int retry = MAX_CMD_RETRY;
  2315. int err;
  2316. do
  2317. {
  2318. mbox->cmd.command = FR_READ_STATISTICS;
  2319. mbox->cmd.length = 0;
  2320. mbox->cmd.dlci = 0;
  2321. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2322. } while (err && retry-- && fr_event(card, err, mbox));
  2323. if (!err) {
  2324. fr_link_stat_t* stats = (void*)mbox->data;
  2325. card->wandev.stats.rx_frame_errors = stats->rx_bad_format;
  2326. card->wandev.stats.rx_dropped =
  2327. stats->rx_dropped + stats->rx_dropped2;
  2328. }
  2329. return err;
  2330. }
  2331. /*============================================================================
  2332. * Add DLCI(s) (Access Node only!).
  2333. * This routine will perform the ADD_DLCIs command for the specified DLCI.
  2334. */
  2335. static int fr_add_dlci (sdla_t* card, int dlci)
  2336. {
  2337. fr_mbox_t* mbox = card->mbox;
  2338. int retry = MAX_CMD_RETRY;
  2339. int err;
  2340. do
  2341. {
  2342. unsigned short* dlci_list = (void*)mbox->data;
  2343. mbox->cmd.length = sizeof(short);
  2344. dlci_list[0] = dlci;
  2345. mbox->cmd.command = FR_ADD_DLCI;
  2346. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2347. } while (err && retry-- && fr_event(card, err, mbox));
  2348. return err;
  2349. }
  2350. /*============================================================================
  2351. * Activate DLCI(s) (Access Node only!).
  2352. * This routine will perform the ACTIVATE_DLCIs command with a DLCI number.
  2353. */
  2354. static int fr_activate_dlci (sdla_t* card, int dlci)
  2355. {
  2356. fr_mbox_t* mbox = card->mbox;
  2357. int retry = MAX_CMD_RETRY;
  2358. int err;
  2359. do
  2360. {
  2361. unsigned short* dlci_list = (void*)mbox->data;
  2362. mbox->cmd.length = sizeof(short);
  2363. dlci_list[0] = dlci;
  2364. mbox->cmd.command = FR_ACTIVATE_DLCI;
  2365. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2366. } while (err && retry-- && fr_event(card, err, mbox));
  2367. return err;
  2368. }
  2369. /*============================================================================
  2370. * Delete DLCI(s) (Access Node only!).
  2371. * This routine will perform the DELETE_DLCIs command with a DLCI number.
  2372. */
  2373. static int fr_delete_dlci (sdla_t* card, int dlci)
  2374. {
  2375. fr_mbox_t* mbox = card->mbox;
  2376. int retry = MAX_CMD_RETRY;
  2377. int err;
  2378. do
  2379. {
  2380. unsigned short* dlci_list = (void*)mbox->data;
  2381. mbox->cmd.length = sizeof(short);
  2382. dlci_list[0] = dlci;
  2383. mbox->cmd.command = FR_DELETE_DLCI;
  2384. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2385. } while (err && retry-- && fr_event(card, err, mbox));
  2386. return err;
  2387. }
  2388. /*============================================================================
  2389. * Issue in-channel signalling frame.
  2390. */
  2391. static int fr_issue_isf (sdla_t* card, int isf)
  2392. {
  2393. fr_mbox_t* mbox = card->mbox;
  2394. int retry = MAX_CMD_RETRY;
  2395. int err;
  2396. do
  2397. {
  2398. mbox->data[0] = isf;
  2399. mbox->cmd.length = 1;
  2400. mbox->cmd.command = FR_ISSUE_IS_FRAME;
  2401. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2402. } while (err && retry-- && fr_event(card, err, mbox));
  2403. return err;
  2404. }
  2405. static unsigned int fr_send_hdr (sdla_t*card, int dlci, unsigned int offset)
  2406. {
  2407. struct net_device *dev = find_channel(card,dlci);
  2408. fr_channel_t *chan;
  2409. if (!dev || !(chan=dev->priv))
  2410. return offset;
  2411. if (chan->fr_header_len){
  2412. sdla_poke(&card->hw, offset, chan->fr_header, chan->fr_header_len);
  2413. }
  2414. return offset+chan->fr_header_len;
  2415. }
  2416. /*============================================================================
  2417. * Send a frame on a selected DLCI.
  2418. */
  2419. static int fr_send_data_header (sdla_t* card, int dlci, unsigned char attr, int len,
  2420. void *buf, unsigned char hdr_len)
  2421. {
  2422. fr_mbox_t* mbox = card->mbox + 0x800;
  2423. int retry = MAX_CMD_RETRY;
  2424. int err;
  2425. do
  2426. {
  2427. mbox->cmd.dlci = dlci;
  2428. mbox->cmd.attr = attr;
  2429. mbox->cmd.length = len+hdr_len;
  2430. mbox->cmd.command = FR_WRITE;
  2431. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2432. } while (err && retry-- && fr_event(card, err, mbox));
  2433. if (!err) {
  2434. fr_tx_buf_ctl_t* frbuf;
  2435. if(card->hw.type == SDLA_S514)
  2436. frbuf = (void*)(*(unsigned long*)mbox->data +
  2437. card->hw.dpmbase);
  2438. else
  2439. frbuf = (void*)(*(unsigned long*)mbox->data -
  2440. FR_MB_VECTOR + card->hw.dpmbase);
  2441. sdla_poke(&card->hw, fr_send_hdr(card,dlci,frbuf->offset), buf, len);
  2442. frbuf->flag = 0x01;
  2443. }
  2444. return err;
  2445. }
  2446. static int fr_send (sdla_t* card, int dlci, unsigned char attr, int len,
  2447. void *buf)
  2448. {
  2449. fr_mbox_t* mbox = card->mbox + 0x800;
  2450. int retry = MAX_CMD_RETRY;
  2451. int err;
  2452. do
  2453. {
  2454. mbox->cmd.dlci = dlci;
  2455. mbox->cmd.attr = attr;
  2456. mbox->cmd.length = len;
  2457. mbox->cmd.command = FR_WRITE;
  2458. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2459. } while (err && retry-- && fr_event(card, err, mbox));
  2460. if (!err) {
  2461. fr_tx_buf_ctl_t* frbuf;
  2462. if(card->hw.type == SDLA_S514)
  2463. frbuf = (void*)(*(unsigned long*)mbox->data +
  2464. card->hw.dpmbase);
  2465. else
  2466. frbuf = (void*)(*(unsigned long*)mbox->data -
  2467. FR_MB_VECTOR + card->hw.dpmbase);
  2468. sdla_poke(&card->hw, frbuf->offset, buf, len);
  2469. frbuf->flag = 0x01;
  2470. }
  2471. return err;
  2472. }
  2473. /****** Firmware Asynchronous Event Handlers ********************************/
  2474. /*============================================================================
  2475. * Main asyncronous event/error handler.
  2476. * This routine is called whenever firmware command returns non-zero
  2477. * return code.
  2478. *
  2479. * Return zero if previous command has to be cancelled.
  2480. */
  2481. static int fr_event (sdla_t *card, int event, fr_mbox_t* mbox)
  2482. {
  2483. fr508_flags_t* flags = card->flags;
  2484. char *ptr = &flags->iflag;
  2485. int i;
  2486. switch (event) {
  2487. case FRRES_MODEM_FAILURE:
  2488. return fr_modem_failure(card, mbox);
  2489. case FRRES_CHANNEL_DOWN: {
  2490. struct net_device *dev;
  2491. /* Remove all routes from associated DLCI's */
  2492. for (dev = card->wandev.dev; dev;
  2493. dev = *((struct net_device **)dev->priv)) {
  2494. fr_channel_t *chan = dev->priv;
  2495. if (chan->route_flag == ROUTE_ADDED) {
  2496. chan->route_flag = REMOVE_ROUTE;
  2497. }
  2498. if (chan->inarp == INARP_CONFIGURED) {
  2499. chan->inarp = INARP_REQUEST;
  2500. }
  2501. /* If the link becomes disconnected then,
  2502. * all channels will be disconnected
  2503. * as well.
  2504. */
  2505. set_chan_state(dev,WAN_DISCONNECTED);
  2506. }
  2507. wanpipe_set_state(card, WAN_DISCONNECTED);
  2508. return 1;
  2509. }
  2510. case FRRES_CHANNEL_UP: {
  2511. struct net_device *dev;
  2512. /* FIXME: Only startup devices that are on the list */
  2513. for (dev = card->wandev.dev; dev;
  2514. dev = *((struct net_device **)dev->priv)) {
  2515. set_chan_state(dev,WAN_CONNECTED);
  2516. }
  2517. wanpipe_set_state(card, WAN_CONNECTED);
  2518. return 1;
  2519. }
  2520. case FRRES_DLCI_CHANGE:
  2521. return fr_dlci_change(card, mbox);
  2522. case FRRES_DLCI_MISMATCH:
  2523. printk(KERN_INFO "%s: DLCI list mismatch!\n",
  2524. card->devname);
  2525. return 1;
  2526. case CMD_TIMEOUT:
  2527. printk(KERN_ERR "%s: command 0x%02X timed out!\n",
  2528. card->devname, mbox->cmd.command);
  2529. printk(KERN_INFO "%s: ID Bytes = ",card->devname);
  2530. for(i = 0; i < 8; i ++)
  2531. printk(KERN_INFO "0x%02X ", *(ptr + 0x18 + i));
  2532. printk(KERN_INFO "\n");
  2533. break;
  2534. case FRRES_DLCI_INACTIVE:
  2535. break;
  2536. case FRRES_CIR_OVERFLOW:
  2537. break;
  2538. case FRRES_BUFFER_OVERFLOW:
  2539. break;
  2540. default:
  2541. printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!\n"
  2542. , card->devname, mbox->cmd.command, event);
  2543. }
  2544. return 0;
  2545. }
  2546. /*============================================================================
  2547. * Handle modem error.
  2548. *
  2549. * Return zero if previous command has to be cancelled.
  2550. */
  2551. static int fr_modem_failure (sdla_t *card, fr_mbox_t* mbox)
  2552. {
  2553. printk(KERN_INFO "%s: physical link down! (modem error 0x%02X)\n",
  2554. card->devname, mbox->data[0]);
  2555. switch (mbox->cmd.command){
  2556. case FR_WRITE:
  2557. case FR_READ:
  2558. return 0;
  2559. }
  2560. return 1;
  2561. }
  2562. /*============================================================================
  2563. * Handle DLCI status change.
  2564. *
  2565. * Return zero if previous command has to be cancelled.
  2566. */
  2567. static int fr_dlci_change (sdla_t *card, fr_mbox_t* mbox)
  2568. {
  2569. dlci_status_t* status = (void*)mbox->data;
  2570. int cnt = mbox->cmd.length / sizeof(dlci_status_t);
  2571. fr_channel_t *chan;
  2572. struct net_device* dev2;
  2573. for (; cnt; --cnt, ++status) {
  2574. unsigned short dlci= status->dlci;
  2575. struct net_device* dev = find_channel(card, dlci);
  2576. if (dev == NULL){
  2577. printk(KERN_INFO
  2578. "%s: CPE contains unconfigured DLCI= %d\n",
  2579. card->devname, dlci);
  2580. printk(KERN_INFO
  2581. "%s: unconfigured DLCI %d reported by network\n"
  2582. , card->devname, dlci);
  2583. }else{
  2584. if (status->state == FR_LINK_INOPER) {
  2585. printk(KERN_INFO
  2586. "%s: DLCI %u is inactive!\n",
  2587. card->devname, dlci);
  2588. if (dev && netif_running(dev))
  2589. set_chan_state(dev, WAN_DISCONNECTED);
  2590. }
  2591. if (status->state & FR_DLCI_DELETED) {
  2592. printk(KERN_INFO
  2593. "%s: DLCI %u has been deleted!\n",
  2594. card->devname, dlci);
  2595. if (dev && netif_running(dev)){
  2596. fr_channel_t *chan = dev->priv;
  2597. if (chan->route_flag == ROUTE_ADDED) {
  2598. chan->route_flag = REMOVE_ROUTE;
  2599. /* The state change will trigger
  2600. * the fr polling routine */
  2601. }
  2602. if (chan->inarp == INARP_CONFIGURED) {
  2603. chan->inarp = INARP_REQUEST;
  2604. }
  2605. set_chan_state(dev, WAN_DISCONNECTED);
  2606. }
  2607. } else if (status->state & FR_DLCI_ACTIVE) {
  2608. chan = dev->priv;
  2609. /* This flag is used for configuring specific
  2610. DLCI(s) when they become active.
  2611. */
  2612. chan->dlci_configured = DLCI_CONFIG_PENDING;
  2613. set_chan_state(dev, WAN_CONNECTED);
  2614. }
  2615. }
  2616. }
  2617. for (dev2 = card->wandev.dev; dev2;
  2618. dev2 = *((struct net_device **)dev2->priv)){
  2619. chan = dev2->priv;
  2620. if (chan->dlci_configured == DLCI_CONFIG_PENDING) {
  2621. if (fr_init_dlci(card, chan)){
  2622. return 1;
  2623. }
  2624. }
  2625. }
  2626. return 1;
  2627. }
  2628. static int fr_init_dlci (sdla_t *card, fr_channel_t *chan)
  2629. {
  2630. fr_dlc_conf_t cfg;
  2631. memset(&cfg, 0, sizeof(cfg));
  2632. if ( chan->cir_status == CIR_DISABLED) {
  2633. cfg.cir_fwd = cfg.cir_bwd = 16;
  2634. cfg.bc_fwd = cfg.bc_bwd = 16;
  2635. cfg.conf_flags = 0x0001;
  2636. }else if (chan->cir_status == CIR_ENABLED) {
  2637. cfg.cir_fwd = cfg.cir_bwd = chan->cir;
  2638. cfg.bc_fwd = cfg.bc_bwd = chan->bc;
  2639. cfg.be_fwd = cfg.be_bwd = chan->be;
  2640. cfg.conf_flags = 0x0000;
  2641. }
  2642. if (fr_dlci_configure( card, &cfg , chan->dlci)){
  2643. printk(KERN_INFO
  2644. "%s: DLCI Configure failed for %d\n",
  2645. card->devname, chan->dlci);
  2646. return 1;
  2647. }
  2648. chan->dlci_configured = DLCI_CONFIGURED;
  2649. /* Read the interface byte mapping into the channel
  2650. * structure.
  2651. */
  2652. read_DLCI_IB_mapping( card, chan );
  2653. return 0;
  2654. }
  2655. /******* Miscellaneous ******************************************************/
  2656. /*============================================================================
  2657. * Update channel state.
  2658. */
  2659. static int update_chan_state(struct net_device* dev)
  2660. {
  2661. fr_channel_t* chan = dev->priv;
  2662. sdla_t* card = chan->card;
  2663. fr_mbox_t* mbox = card->mbox;
  2664. int retry = MAX_CMD_RETRY;
  2665. int err;
  2666. do
  2667. {
  2668. mbox->cmd.command = FR_LIST_ACTIVE_DLCI;
  2669. mbox->cmd.length = 0;
  2670. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2671. } while (err && retry-- && fr_event(card, err, mbox));
  2672. if (!err) {
  2673. unsigned short* list = (void*)mbox->data;
  2674. int cnt = mbox->cmd.length / sizeof(short);
  2675. err=1;
  2676. for (; cnt; --cnt, ++list) {
  2677. if (*list == chan->dlci) {
  2678. set_chan_state(dev, WAN_CONNECTED);
  2679. /* May 23 2000. NC
  2680. * When a dlci is added or restarted,
  2681. * the dlci_int_interface pointer must
  2682. * be reinitialized. */
  2683. if (!chan->dlci_int_interface){
  2684. err=fr_init_dlci (card,chan);
  2685. }
  2686. break;
  2687. }
  2688. }
  2689. }
  2690. return err;
  2691. }
  2692. /*============================================================================
  2693. * Set channel state.
  2694. */
  2695. static void set_chan_state(struct net_device* dev, int state)
  2696. {
  2697. fr_channel_t* chan = dev->priv;
  2698. sdla_t* card = chan->card;
  2699. if (chan->common.state != state) {
  2700. switch (state) {
  2701. case WAN_CONNECTED:
  2702. printk(KERN_INFO
  2703. "%s: Interface %s: DLCI %d connected\n",
  2704. card->devname, dev->name, chan->dlci);
  2705. /* If the interface was previoulsy down,
  2706. * bring it up, since the channel is active */
  2707. trigger_fr_poll (dev);
  2708. trigger_fr_arp (dev);
  2709. break;
  2710. case WAN_CONNECTING:
  2711. printk(KERN_INFO
  2712. "%s: Interface %s: DLCI %d connecting\n",
  2713. card->devname, dev->name, chan->dlci);
  2714. break;
  2715. case WAN_DISCONNECTED:
  2716. printk (KERN_INFO
  2717. "%s: Interface %s: DLCI %d disconnected!\n",
  2718. card->devname, dev->name, chan->dlci);
  2719. /* If the interface is up, bring it down,
  2720. * since the channel is now disconnected */
  2721. trigger_fr_poll (dev);
  2722. break;
  2723. }
  2724. chan->common.state = state;
  2725. }
  2726. chan->state_tick = jiffies;
  2727. }
  2728. /*============================================================================
  2729. * Find network device by its channel number.
  2730. *
  2731. * We need this critical flag because we change
  2732. * the dlci_to_dev_map outside the interrupt.
  2733. *
  2734. * NOTE: del_if() functions updates this array, it uses
  2735. * the spin locks to avoid corruption.
  2736. */
  2737. static struct net_device* find_channel(sdla_t* card, unsigned dlci)
  2738. {
  2739. if(dlci > HIGHEST_VALID_DLCI)
  2740. return NULL;
  2741. return(card->u.f.dlci_to_dev_map[dlci]);
  2742. }
  2743. /*============================================================================
  2744. * Check to see if a frame can be sent. If no transmit buffers available,
  2745. * enable transmit interrupts.
  2746. *
  2747. * Return: 1 - Tx buffer(s) available
  2748. * 0 - no buffers available
  2749. */
  2750. static int is_tx_ready (sdla_t* card, fr_channel_t* chan)
  2751. {
  2752. unsigned char sb;
  2753. if(card->hw.type == SDLA_S514)
  2754. return 1;
  2755. sb = inb(card->hw.port);
  2756. if (sb & 0x02)
  2757. return 1;
  2758. return 0;
  2759. }
  2760. /*============================================================================
  2761. * Convert decimal string to unsigned integer.
  2762. * If len != 0 then only 'len' characters of the string are converted.
  2763. */
  2764. static unsigned int dec_to_uint (unsigned char* str, int len)
  2765. {
  2766. unsigned val;
  2767. if (!len)
  2768. len = strlen(str);
  2769. for (val = 0; len && is_digit(*str); ++str, --len)
  2770. val = (val * 10) + (*str - (unsigned)'0');
  2771. return val;
  2772. }
  2773. /*=============================================================================
  2774. * Store a UDP management packet for later processing.
  2775. */
  2776. static int store_udp_mgmt_pkt(int udp_type, char udp_pkt_src, sdla_t* card,
  2777. struct sk_buff *skb, int dlci)
  2778. {
  2779. int udp_pkt_stored = 0;
  2780. struct net_device *dev = find_channel(card, dlci);
  2781. fr_channel_t *chan;
  2782. if (!dev || !(chan=dev->priv))
  2783. return 1;
  2784. if(!card->u.f.udp_pkt_lgth && (skb->len <= MAX_LGTH_UDP_MGNT_PKT)){
  2785. card->u.f.udp_pkt_lgth = skb->len + chan->fr_header_len;
  2786. card->u.f.udp_type = udp_type;
  2787. card->u.f.udp_pkt_src = udp_pkt_src;
  2788. card->u.f.udp_dlci = dlci;
  2789. memcpy(card->u.f.udp_pkt_data, skb->data, skb->len);
  2790. card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UDP;
  2791. udp_pkt_stored = 1;
  2792. }else{
  2793. printk(KERN_INFO "ERROR: UDP packet not stored for DLCI %d\n",
  2794. dlci);
  2795. }
  2796. if(udp_pkt_src == UDP_PKT_FRM_STACK){
  2797. dev_kfree_skb_any(skb);
  2798. }else{
  2799. dev_kfree_skb_any(skb);
  2800. }
  2801. return(udp_pkt_stored);
  2802. }
  2803. /*==============================================================================
  2804. * Process UDP call of type FPIPE8ND
  2805. */
  2806. static int process_udp_mgmt_pkt(sdla_t* card)
  2807. {
  2808. int c_retry = MAX_CMD_RETRY;
  2809. unsigned char *buf;
  2810. unsigned char frames;
  2811. unsigned int len;
  2812. unsigned short buffer_length;
  2813. struct sk_buff *new_skb;
  2814. fr_mbox_t* mbox = card->mbox;
  2815. int err;
  2816. struct timeval tv;
  2817. int udp_mgmt_req_valid = 1;
  2818. struct net_device* dev;
  2819. fr_channel_t* chan;
  2820. fr_udp_pkt_t *fr_udp_pkt;
  2821. unsigned short num_trc_els;
  2822. fr_trc_el_t* ptr_trc_el;
  2823. fr_trc_el_t trc_el;
  2824. fpipemon_trc_t* fpipemon_trc;
  2825. char udp_pkt_src = card->u.f.udp_pkt_src;
  2826. int dlci = card->u.f.udp_dlci;
  2827. /* Find network interface for this packet */
  2828. dev = find_channel(card, dlci);
  2829. if (!dev){
  2830. card->u.f.udp_pkt_lgth = 0;
  2831. return 1;
  2832. }
  2833. if ((chan = dev->priv) == NULL){
  2834. card->u.f.udp_pkt_lgth = 0;
  2835. return 1;
  2836. }
  2837. /* If the UDP packet is from the network, we are going to have to
  2838. transmit a response. Before doing so, we must check to see that
  2839. we are not currently transmitting a frame (in 'if_send()') and
  2840. that we are not already in a 'delayed transmit' state.
  2841. */
  2842. if(udp_pkt_src == UDP_PKT_FRM_NETWORK) {
  2843. if (check_tx_status(card,dev)){
  2844. card->u.f.udp_pkt_lgth = 0;
  2845. return 1;
  2846. }
  2847. }
  2848. fr_udp_pkt = (fr_udp_pkt_t *)card->u.f.udp_pkt_data;
  2849. if(udp_pkt_src == UDP_PKT_FRM_NETWORK) {
  2850. switch(fr_udp_pkt->cblock.command) {
  2851. case FR_READ_MODEM_STATUS:
  2852. case FR_READ_STATUS:
  2853. case FPIPE_ROUTER_UP_TIME:
  2854. case FR_READ_ERROR_STATS:
  2855. case FPIPE_DRIVER_STAT_GEN:
  2856. case FR_READ_STATISTICS:
  2857. case FR_READ_ADD_DLC_STATS:
  2858. case FR_READ_CONFIG:
  2859. case FR_READ_CODE_VERSION:
  2860. udp_mgmt_req_valid = 1;
  2861. break;
  2862. default:
  2863. udp_mgmt_req_valid = 0;
  2864. break;
  2865. }
  2866. }
  2867. if(!udp_mgmt_req_valid) {
  2868. /* set length to 0 */
  2869. fr_udp_pkt->cblock.length = 0;
  2870. /* set return code */
  2871. fr_udp_pkt->cblock.result = 0xCD;
  2872. chan->drvstats_gen.UDP_PIPE_mgmt_direction_err ++;
  2873. if (net_ratelimit()){
  2874. printk(KERN_INFO
  2875. "%s: Warning, Illegal UDP command attempted from network: %x\n",
  2876. card->devname,fr_udp_pkt->cblock.command);
  2877. }
  2878. } else {
  2879. switch(fr_udp_pkt->cblock.command) {
  2880. case FPIPE_ENABLE_TRACING:
  2881. if(!card->TracingEnabled) {
  2882. do {
  2883. mbox->cmd.command = FR_SET_TRACE_CONFIG;
  2884. mbox->cmd.length = 1;
  2885. mbox->cmd.dlci = 0x00;
  2886. mbox->data[0] = fr_udp_pkt->data[0] |
  2887. RESET_TRC;
  2888. err = sdla_exec(mbox) ?
  2889. mbox->cmd.result : CMD_TIMEOUT;
  2890. } while (err && c_retry-- && fr_event(card, err,
  2891. mbox));
  2892. if(err) {
  2893. card->TracingEnabled = 0;
  2894. /* set the return code */
  2895. fr_udp_pkt->cblock.result =
  2896. mbox->cmd.result;
  2897. mbox->cmd.length = 0;
  2898. break;
  2899. }
  2900. sdla_peek(&card->hw, NO_TRC_ELEMENTS_OFF,
  2901. &num_trc_els, 2);
  2902. sdla_peek(&card->hw, BASE_TRC_ELEMENTS_OFF,
  2903. &card->u.f.trc_el_base, 4);
  2904. card->u.f.curr_trc_el = card->u.f.trc_el_base;
  2905. card->u.f.trc_el_last = card->u.f.curr_trc_el +
  2906. ((num_trc_els - 1) *
  2907. sizeof(fr_trc_el_t));
  2908. /* Calculate the maximum trace data area in */
  2909. /* the UDP packet */
  2910. card->u.f.trc_bfr_space=(MAX_LGTH_UDP_MGNT_PKT -
  2911. //sizeof(fr_encap_hdr_t) -
  2912. sizeof(ip_pkt_t) -
  2913. sizeof(udp_pkt_t) -
  2914. sizeof(wp_mgmt_t) -
  2915. sizeof(cblock_t));
  2916. /* set return code */
  2917. fr_udp_pkt->cblock.result = 0;
  2918. } else {
  2919. /* set return code to line trace already
  2920. enabled */
  2921. fr_udp_pkt->cblock.result = 1;
  2922. }
  2923. mbox->cmd.length = 0;
  2924. card->TracingEnabled = 1;
  2925. break;
  2926. case FPIPE_DISABLE_TRACING:
  2927. if(card->TracingEnabled) {
  2928. do {
  2929. mbox->cmd.command = FR_SET_TRACE_CONFIG;
  2930. mbox->cmd.length = 1;
  2931. mbox->cmd.dlci = 0x00;
  2932. mbox->data[0] = ~ACTIVATE_TRC;
  2933. err = sdla_exec(mbox) ?
  2934. mbox->cmd.result : CMD_TIMEOUT;
  2935. } while (err && c_retry-- && fr_event(card, err, mbox));
  2936. }
  2937. /* set return code */
  2938. fr_udp_pkt->cblock.result = 0;
  2939. mbox->cmd.length = 0;
  2940. card->TracingEnabled = 0;
  2941. break;
  2942. case FPIPE_GET_TRACE_INFO:
  2943. /* Line trace cannot be performed on the 502 */
  2944. if(!card->TracingEnabled) {
  2945. /* set return code */
  2946. fr_udp_pkt->cblock.result = 1;
  2947. mbox->cmd.length = 0;
  2948. break;
  2949. }
  2950. ptr_trc_el = (void *)card->u.f.curr_trc_el;
  2951. buffer_length = 0;
  2952. fr_udp_pkt->data[0x00] = 0x00;
  2953. for(frames = 0; frames < MAX_FRMS_TRACED; frames ++) {
  2954. sdla_peek(&card->hw, (unsigned long)ptr_trc_el,
  2955. (void *)&trc_el.flag,
  2956. sizeof(fr_trc_el_t));
  2957. if(trc_el.flag == 0x00) {
  2958. break;
  2959. }
  2960. if((card->u.f.trc_bfr_space - buffer_length)
  2961. < sizeof(fpipemon_trc_hdr_t)) {
  2962. fr_udp_pkt->data[0x00] |= MORE_TRC_DATA;
  2963. break;
  2964. }
  2965. fpipemon_trc =
  2966. (fpipemon_trc_t *)&fr_udp_pkt->data[buffer_length];
  2967. fpipemon_trc->fpipemon_trc_hdr.status =
  2968. trc_el.attr;
  2969. fpipemon_trc->fpipemon_trc_hdr.tmstamp =
  2970. trc_el.tmstamp;
  2971. fpipemon_trc->fpipemon_trc_hdr.length =
  2972. trc_el.length;
  2973. if(!trc_el.offset || !trc_el.length) {
  2974. fpipemon_trc->fpipemon_trc_hdr.data_passed = 0x00;
  2975. }else if((trc_el.length + sizeof(fpipemon_trc_hdr_t) + 1) >
  2976. (card->u.f.trc_bfr_space - buffer_length)){
  2977. fpipemon_trc->fpipemon_trc_hdr.data_passed = 0x00;
  2978. fr_udp_pkt->data[0x00] |= MORE_TRC_DATA;
  2979. }else {
  2980. fpipemon_trc->fpipemon_trc_hdr.data_passed = 0x01;
  2981. sdla_peek(&card->hw, trc_el.offset,
  2982. fpipemon_trc->data,
  2983. trc_el.length);
  2984. }
  2985. trc_el.flag = 0x00;
  2986. sdla_poke(&card->hw, (unsigned long)ptr_trc_el,
  2987. &trc_el.flag, 1);
  2988. ptr_trc_el ++;
  2989. if((void *)ptr_trc_el > card->u.f.trc_el_last)
  2990. ptr_trc_el = (void*)card->u.f.trc_el_base;
  2991. buffer_length += sizeof(fpipemon_trc_hdr_t);
  2992. if(fpipemon_trc->fpipemon_trc_hdr.data_passed) {
  2993. buffer_length += trc_el.length;
  2994. }
  2995. if(fr_udp_pkt->data[0x00] & MORE_TRC_DATA) {
  2996. break;
  2997. }
  2998. }
  2999. if(frames == MAX_FRMS_TRACED) {
  3000. fr_udp_pkt->data[0x00] |= MORE_TRC_DATA;
  3001. }
  3002. card->u.f.curr_trc_el = (void *)ptr_trc_el;
  3003. /* set the total number of frames passed */
  3004. fr_udp_pkt->data[0x00] |=
  3005. ((frames << 1) & (MAX_FRMS_TRACED << 1));
  3006. /* set the data length and return code */
  3007. fr_udp_pkt->cblock.length = mbox->cmd.length = buffer_length;
  3008. fr_udp_pkt->cblock.result = 0;
  3009. break;
  3010. case FPIPE_FT1_READ_STATUS:
  3011. sdla_peek(&card->hw, 0xF020,
  3012. &fr_udp_pkt->data[0x00] , 2);
  3013. fr_udp_pkt->cblock.length = mbox->cmd.length = 2;
  3014. fr_udp_pkt->cblock.result = 0;
  3015. break;
  3016. case FPIPE_FLUSH_DRIVER_STATS:
  3017. init_chan_statistics(chan);
  3018. init_global_statistics(card);
  3019. mbox->cmd.length = 0;
  3020. break;
  3021. case FPIPE_ROUTER_UP_TIME:
  3022. do_gettimeofday(&tv);
  3023. chan->router_up_time = tv.tv_sec -
  3024. chan->router_start_time;
  3025. *(unsigned long *)&fr_udp_pkt->data =
  3026. chan->router_up_time;
  3027. mbox->cmd.length = fr_udp_pkt->cblock.length = 4;
  3028. fr_udp_pkt->cblock.result = 0;
  3029. break;
  3030. case FPIPE_DRIVER_STAT_IFSEND:
  3031. memcpy(fr_udp_pkt->data,
  3032. &chan->drvstats_if_send.if_send_entry,
  3033. sizeof(if_send_stat_t));
  3034. mbox->cmd.length = fr_udp_pkt->cblock.length =sizeof(if_send_stat_t);
  3035. fr_udp_pkt->cblock.result = 0;
  3036. break;
  3037. case FPIPE_DRIVER_STAT_INTR:
  3038. memcpy(fr_udp_pkt->data,
  3039. &card->statistics.isr_entry,
  3040. sizeof(global_stats_t));
  3041. memcpy(&fr_udp_pkt->data[sizeof(global_stats_t)],
  3042. &chan->drvstats_rx_intr.rx_intr_no_socket,
  3043. sizeof(rx_intr_stat_t));
  3044. mbox->cmd.length = fr_udp_pkt->cblock.length =
  3045. sizeof(global_stats_t) +
  3046. sizeof(rx_intr_stat_t);
  3047. fr_udp_pkt->cblock.result = 0;
  3048. break;
  3049. case FPIPE_DRIVER_STAT_GEN:
  3050. memcpy(fr_udp_pkt->data,
  3051. &chan->drvstats_gen.UDP_PIPE_mgmt_kmalloc_err,
  3052. sizeof(pipe_mgmt_stat_t));
  3053. memcpy(&fr_udp_pkt->data[sizeof(pipe_mgmt_stat_t)],
  3054. &card->statistics, sizeof(global_stats_t));
  3055. mbox->cmd.length = fr_udp_pkt->cblock.length = sizeof(global_stats_t)+
  3056. sizeof(rx_intr_stat_t);
  3057. fr_udp_pkt->cblock.result = 0;
  3058. break;
  3059. case FR_FT1_STATUS_CTRL:
  3060. if(fr_udp_pkt->data[0] == 1) {
  3061. if(rCount++ != 0 ){
  3062. fr_udp_pkt->cblock.result = 0;
  3063. mbox->cmd.length = 1;
  3064. break;
  3065. }
  3066. }
  3067. /* Disable FT1 MONITOR STATUS */
  3068. if(fr_udp_pkt->data[0] == 0) {
  3069. if( --rCount != 0) {
  3070. fr_udp_pkt->cblock.result = 0;
  3071. mbox->cmd.length = 1;
  3072. break;
  3073. }
  3074. }
  3075. goto udp_mgmt_dflt;
  3076. default:
  3077. udp_mgmt_dflt:
  3078. do {
  3079. memcpy(&mbox->cmd,
  3080. &fr_udp_pkt->cblock.command,
  3081. sizeof(fr_cmd_t));
  3082. if(mbox->cmd.length) {
  3083. memcpy(&mbox->data,
  3084. (char *)fr_udp_pkt->data,
  3085. mbox->cmd.length);
  3086. }
  3087. err = sdla_exec(mbox) ? mbox->cmd.result :
  3088. CMD_TIMEOUT;
  3089. } while (err && c_retry-- && fr_event(card, err, mbox));
  3090. if(!err)
  3091. chan->drvstats_gen.
  3092. UDP_PIPE_mgmt_adptr_cmnd_OK ++;
  3093. else
  3094. chan->drvstats_gen.
  3095. UDP_PIPE_mgmt_adptr_cmnd_timeout ++;
  3096. /* copy the result back to our buffer */
  3097. memcpy(&fr_udp_pkt->cblock.command,
  3098. &mbox->cmd, sizeof(fr_cmd_t));
  3099. if(mbox->cmd.length) {
  3100. memcpy(&fr_udp_pkt->data,
  3101. &mbox->data, mbox->cmd.length);
  3102. }
  3103. }
  3104. }
  3105. /* Fill UDP TTL */
  3106. fr_udp_pkt->ip_pkt.ttl = card->wandev.ttl;
  3107. len = reply_udp(card->u.f.udp_pkt_data, mbox->cmd.length);
  3108. if(udp_pkt_src == UDP_PKT_FRM_NETWORK) {
  3109. chan->fr_header_len=2;
  3110. chan->fr_header[0]=Q922_UI;
  3111. chan->fr_header[1]=NLPID_IP;
  3112. err = fr_send_data_header(card, dlci, 0, len,
  3113. card->u.f.udp_pkt_data,chan->fr_header_len);
  3114. if (err){
  3115. chan->drvstats_gen.UDP_PIPE_mgmt_adptr_send_passed ++;
  3116. }else{
  3117. chan->drvstats_gen.UDP_PIPE_mgmt_adptr_send_failed ++;
  3118. }
  3119. } else {
  3120. /* Allocate socket buffer */
  3121. if((new_skb = dev_alloc_skb(len)) != NULL) {
  3122. /* copy data into new_skb */
  3123. buf = skb_put(new_skb, len);
  3124. memcpy(buf, card->u.f.udp_pkt_data, len);
  3125. chan->drvstats_gen.
  3126. UDP_PIPE_mgmt_passed_to_stack ++;
  3127. new_skb->dev = dev;
  3128. new_skb->protocol = htons(ETH_P_IP);
  3129. new_skb->mac.raw = new_skb->data;
  3130. netif_rx(new_skb);
  3131. } else {
  3132. chan->drvstats_gen.UDP_PIPE_mgmt_no_socket ++;
  3133. printk(KERN_INFO
  3134. "%s: UDP mgmt cmnd, no socket buffers available!\n",
  3135. card->devname);
  3136. }
  3137. }
  3138. card->u.f.udp_pkt_lgth = 0;
  3139. return 1;
  3140. }
  3141. /*==============================================================================
  3142. * Send Inverse ARP Request
  3143. */
  3144. int send_inarp_request(sdla_t *card, struct net_device *dev)
  3145. {
  3146. int err=0;
  3147. arphdr_1490_t *ArpPacket;
  3148. arphdr_fr_t *arphdr;
  3149. fr_channel_t *chan = dev->priv;
  3150. struct in_device *in_dev;
  3151. in_dev = dev->ip_ptr;
  3152. if(in_dev != NULL ) {
  3153. ArpPacket = kmalloc(sizeof(arphdr_1490_t) + sizeof(arphdr_fr_t), GFP_ATOMIC);
  3154. /* SNAP Header indicating ARP */
  3155. ArpPacket->control = 0x03;
  3156. ArpPacket->pad = 0x00;
  3157. ArpPacket->NLPID = 0x80;
  3158. ArpPacket->OUI[0] = 0;
  3159. ArpPacket->OUI[1] = 0;
  3160. ArpPacket->OUI[2] = 0;
  3161. ArpPacket->PID = 0x0608;
  3162. arphdr = (arphdr_fr_t *)(ArpPacket + 1); // Go to ARP Packet
  3163. /* InARP request */
  3164. arphdr->ar_hrd = 0x0F00; /* Frame Relay HW type */
  3165. arphdr->ar_pro = 0x0008; /* IP Protocol */
  3166. arphdr->ar_hln = 2; /* HW addr length */
  3167. arphdr->ar_pln = 4; /* IP addr length */
  3168. arphdr->ar_op = htons(0x08); /* InARP Request */
  3169. arphdr->ar_sha = 0; /* src HW DLCI - Doesn't matter */
  3170. if(in_dev->ifa_list != NULL)
  3171. arphdr->ar_sip = in_dev->ifa_list->ifa_local; /* Local Address */else
  3172. arphdr->ar_sip = 0;
  3173. arphdr->ar_tha = 0; /* dst HW DLCI - Doesn't matter */
  3174. arphdr->ar_tip = 0; /* Remote Address -- what we want */
  3175. err = fr_send(card, chan->dlci, 0, sizeof(arphdr_1490_t) + sizeof(arphdr_fr_t),
  3176. (void *)ArpPacket);
  3177. if (!err){
  3178. printk(KERN_INFO "\n%s: Sending InARP request on DLCI %d.\n",
  3179. card->devname, chan->dlci);
  3180. clear_bit(ARP_CRIT,&card->wandev.critical);
  3181. }
  3182. kfree(ArpPacket);
  3183. }else{
  3184. printk(KERN_INFO "%s: INARP ERROR: %s doesn't have a local IP address!\n",
  3185. card->devname,dev->name);
  3186. return 1;
  3187. }
  3188. return 0;
  3189. }
  3190. /*==============================================================================
  3191. * Check packet for ARP Type
  3192. */
  3193. int is_arp(void *buf)
  3194. {
  3195. arphdr_1490_t *arphdr = (arphdr_1490_t *)buf;
  3196. if (arphdr->pad == 0x00 &&
  3197. arphdr->NLPID == 0x80 &&
  3198. arphdr->PID == 0x0608)
  3199. return 1;
  3200. else return 0;
  3201. }
  3202. /*==============================================================================
  3203. * Process ARP Packet Type
  3204. */
  3205. int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, struct net_device* dev)
  3206. {
  3207. arphdr_fr_t *arphdr = (arphdr_fr_t *)(ArpPacket + 1); /* Skip header */
  3208. fr_rx_buf_ctl_t* frbuf = card->rxmb;
  3209. struct in_device *in_dev;
  3210. fr_channel_t *chan = dev->priv;
  3211. /* Before we transmit ARP packet, we must check
  3212. * to see that we are not currently transmitting a
  3213. * frame (in 'if_send()') and that we are not
  3214. * already in a 'delayed transmit' state. */
  3215. if (check_tx_status(card,dev)){
  3216. if (net_ratelimit()){
  3217. printk(KERN_INFO "%s: Disabling comminication to process ARP\n",
  3218. card->devname);
  3219. }
  3220. set_bit(ARP_CRIT,&card->wandev.critical);
  3221. return 0;
  3222. }
  3223. in_dev = dev->ip_ptr;
  3224. /* Check that IP addresses exist for our network address */
  3225. if (in_dev == NULL || in_dev->ifa_list == NULL)
  3226. return -1;
  3227. switch (ntohs(arphdr->ar_op)) {
  3228. case 0x08: // Inverse ARP request -- Send Reply, add route.
  3229. /* Check for valid Address */
  3230. printk(KERN_INFO "%s: Recvd PtP addr -InArp Req: %u.%u.%u.%u\n",
  3231. card->devname, NIPQUAD(arphdr->ar_sip));
  3232. /* Check that the network address is the same as ours, only
  3233. * if the netowrk mask is not 255.255.255.255. Otherwise
  3234. * this check would not make sense */
  3235. if (in_dev->ifa_list->ifa_mask != 0xFFFFFFFF &&
  3236. (in_dev->ifa_list->ifa_mask & arphdr->ar_sip) !=
  3237. (in_dev->ifa_list->ifa_mask & in_dev->ifa_list->ifa_local)){
  3238. printk(KERN_INFO
  3239. "%s: Invalid PtP address. %u.%u.%u.%u InARP ignored.\n",
  3240. card->devname,NIPQUAD(arphdr->ar_sip));
  3241. printk(KERN_INFO "%s: mask %u.%u.%u.%u\n",
  3242. card->devname, NIPQUAD(in_dev->ifa_list->ifa_mask));
  3243. printk(KERN_INFO "%s: local %u.%u.%u.%u\n",
  3244. card->devname,NIPQUAD(in_dev->ifa_list->ifa_local));
  3245. return -1;
  3246. }
  3247. if (in_dev->ifa_list->ifa_local == arphdr->ar_sip){
  3248. printk(KERN_INFO
  3249. "%s: Local addr = PtP addr. InARP ignored.\n",
  3250. card->devname);
  3251. return -1;
  3252. }
  3253. arphdr->ar_op = htons(0x09); /* InARP Reply */
  3254. /* Set addresses */
  3255. arphdr->ar_tip = arphdr->ar_sip;
  3256. arphdr->ar_sip = in_dev->ifa_list->ifa_local;
  3257. chan->ip_local = in_dev->ifa_list->ifa_local;
  3258. chan->ip_remote = arphdr->ar_sip;
  3259. fr_send(card, frbuf->dlci, 0, frbuf->length, (void *)ArpPacket);
  3260. if (test_bit(ARP_CRIT,&card->wandev.critical)){
  3261. if (net_ratelimit()){
  3262. printk(KERN_INFO "%s: ARP Processed Enabling Communication!\n",
  3263. card->devname);
  3264. }
  3265. }
  3266. clear_bit(ARP_CRIT,&card->wandev.critical);
  3267. chan->ip_local = in_dev->ifa_list->ifa_local;
  3268. chan->ip_remote = arphdr->ar_sip;
  3269. /* Add Route Flag */
  3270. /* The route will be added in the polling routine so
  3271. that it is not interrupt context. */
  3272. chan->route_flag = ADD_ROUTE;
  3273. trigger_fr_poll (dev);
  3274. break;
  3275. case 0x09: // Inverse ARP reply
  3276. /* Check for valid Address */
  3277. printk(KERN_INFO "%s: Recvd PtP addr %u.%u.%u.%u -InArp Reply\n",
  3278. card->devname, NIPQUAD(arphdr->ar_sip));
  3279. /* Compare network addresses, only if network mask
  3280. * is not 255.255.255.255 It would not make sense
  3281. * to perform this test if the mask was all 1's */
  3282. if (in_dev->ifa_list->ifa_mask != 0xffffffff &&
  3283. (in_dev->ifa_list->ifa_mask & arphdr->ar_sip) !=
  3284. (in_dev->ifa_list->ifa_mask & in_dev->ifa_list->ifa_local)) {
  3285. printk(KERN_INFO "%s: Invalid PtP address. InARP ignored.\n",
  3286. card->devname);
  3287. return -1;
  3288. }
  3289. /* Make sure that the received IP address is not
  3290. * the same as our own local address */
  3291. if (in_dev->ifa_list->ifa_local == arphdr->ar_sip) {
  3292. printk(KERN_INFO "%s: Local addr = PtP addr. InARP ignored.\n",
  3293. card->devname);
  3294. return -1;
  3295. }
  3296. chan->ip_local = in_dev->ifa_list->ifa_local;
  3297. chan->ip_remote = arphdr->ar_sip;
  3298. /* Add Route Flag */
  3299. /* The route will be added in the polling routine so
  3300. that it is not interrupt context. */
  3301. chan->route_flag = ADD_ROUTE;
  3302. chan->inarp = INARP_CONFIGURED;
  3303. trigger_fr_poll(dev);
  3304. break;
  3305. default:
  3306. break; // ARP's and RARP's -- Shouldn't happen.
  3307. }
  3308. return 0;
  3309. }
  3310. /*============================================================
  3311. * trigger_fr_arp
  3312. *
  3313. * Description:
  3314. * Add an fr_arp() task into a arp
  3315. * timer handler for a specific dlci/interface.
  3316. * This will kick the fr_arp() routine
  3317. * within the specified time interval.
  3318. *
  3319. * Usage:
  3320. * This timer is used to send ARP requests at
  3321. * certain time intervals.
  3322. * Called by an interrupt to request an action
  3323. * at a later date.
  3324. */
  3325. static void trigger_fr_arp(struct net_device *dev)
  3326. {
  3327. fr_channel_t* chan = dev->priv;
  3328. mod_timer(&chan->fr_arp_timer, jiffies + chan->inarp_interval * HZ);
  3329. return;
  3330. }
  3331. /*==============================================================================
  3332. * ARP Request Action
  3333. *
  3334. * This funciton is called by timer interrupt to send an arp request
  3335. * to the remote end.
  3336. */
  3337. static void fr_arp (unsigned long data)
  3338. {
  3339. struct net_device *dev = (struct net_device *)data;
  3340. fr_channel_t *chan = dev->priv;
  3341. volatile sdla_t *card = chan->card;
  3342. fr508_flags_t* flags = card->flags;
  3343. /* Send ARP packets for all devs' until
  3344. * ARP state changes to CONFIGURED */
  3345. if (chan->inarp == INARP_REQUEST &&
  3346. chan->common.state == WAN_CONNECTED &&
  3347. card->wandev.state == WAN_CONNECTED){
  3348. set_bit(0,&chan->inarp_ready);
  3349. card->u.f.timer_int_enabled |= TMR_INT_ENABLED_ARP;
  3350. flags->imask |= FR_INTR_TIMER;
  3351. }
  3352. return;
  3353. }
  3354. /*==============================================================================
  3355. * Perform the Interrupt Test by running the READ_CODE_VERSION command MAX_INTR_
  3356. * TEST_COUNTER times.
  3357. */
  3358. static int intr_test( sdla_t* card )
  3359. {
  3360. fr_mbox_t* mb = card->mbox;
  3361. int err,i;
  3362. err = fr_set_intr_mode(card, FR_INTR_READY, card->wandev.mtu, 0 );
  3363. if (err == CMD_OK) {
  3364. for ( i = 0; i < MAX_INTR_TEST_COUNTER; i++ ) {
  3365. /* Run command READ_CODE_VERSION */
  3366. mb->cmd.length = 0;
  3367. mb->cmd.command = FR_READ_CODE_VERSION;
  3368. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  3369. if (err != CMD_OK)
  3370. fr_event(card, err, mb);
  3371. }
  3372. } else {
  3373. return err;
  3374. }
  3375. err = fr_set_intr_mode( card, 0, card->wandev.mtu, 0 );
  3376. if( err != CMD_OK )
  3377. return err;
  3378. return 0;
  3379. }
  3380. /*==============================================================================
  3381. * Determine what type of UDP call it is. FPIPE8ND ?
  3382. */
  3383. static int udp_pkt_type( struct sk_buff *skb, sdla_t* card )
  3384. {
  3385. fr_udp_pkt_t *fr_udp_pkt = (fr_udp_pkt_t *)skb->data;
  3386. /* Quick HACK */
  3387. if((fr_udp_pkt->ip_pkt.protocol == UDPMGMT_UDP_PROTOCOL) &&
  3388. (fr_udp_pkt->ip_pkt.ver_inet_hdr_length == 0x45) &&
  3389. (fr_udp_pkt->udp_pkt.udp_dst_port ==
  3390. ntohs(card->wandev.udp_port)) &&
  3391. (fr_udp_pkt->wp_mgmt.request_reply ==
  3392. UDPMGMT_REQUEST)) {
  3393. if(!strncmp(fr_udp_pkt->wp_mgmt.signature,
  3394. UDPMGMT_FPIPE_SIGNATURE, 8)){
  3395. return UDP_FPIPE_TYPE;
  3396. }
  3397. }
  3398. return UDP_INVALID_TYPE;
  3399. }
  3400. /*==============================================================================
  3401. * Initializes the Statistics values in the fr_channel structure.
  3402. */
  3403. void init_chan_statistics( fr_channel_t* chan)
  3404. {
  3405. memset(&chan->drvstats_if_send.if_send_entry, 0,
  3406. sizeof(if_send_stat_t));
  3407. memset(&chan->drvstats_rx_intr.rx_intr_no_socket, 0,
  3408. sizeof(rx_intr_stat_t));
  3409. memset(&chan->drvstats_gen.UDP_PIPE_mgmt_kmalloc_err, 0,
  3410. sizeof(pipe_mgmt_stat_t));
  3411. }
  3412. /*==============================================================================
  3413. * Initializes the Statistics values in the Sdla_t structure.
  3414. */
  3415. void init_global_statistics( sdla_t* card )
  3416. {
  3417. /* Intialize global statistics for a card */
  3418. memset(&card->statistics.isr_entry, 0, sizeof(global_stats_t));
  3419. }
  3420. static void read_DLCI_IB_mapping( sdla_t* card, fr_channel_t* chan )
  3421. {
  3422. fr_mbox_t* mbox = card->mbox;
  3423. int retry = MAX_CMD_RETRY;
  3424. dlci_IB_mapping_t* result;
  3425. int err, counter, found;
  3426. do {
  3427. mbox->cmd.command = FR_READ_DLCI_IB_MAPPING;
  3428. mbox->cmd.length = 0;
  3429. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  3430. } while (err && retry-- && fr_event(card, err, mbox));
  3431. if( mbox->cmd.result != 0){
  3432. printk(KERN_INFO "%s: Read DLCI IB Mapping failed\n",
  3433. chan->name);
  3434. }
  3435. counter = mbox->cmd.length / sizeof(dlci_IB_mapping_t);
  3436. result = (void *)mbox->data;
  3437. found = 0;
  3438. for (; counter; --counter, ++result) {
  3439. if ( result->dlci == chan->dlci ) {
  3440. chan->IB_addr = result->addr_value;
  3441. if(card->hw.type == SDLA_S514){
  3442. chan->dlci_int_interface =
  3443. (void*)(card->hw.dpmbase +
  3444. chan->IB_addr);
  3445. }else{
  3446. chan->dlci_int_interface =
  3447. (void*)(card->hw.dpmbase +
  3448. (chan->IB_addr & 0x00001FFF));
  3449. }
  3450. found = 1;
  3451. break;
  3452. }
  3453. }
  3454. if (!found)
  3455. printk( KERN_INFO "%s: DLCI %d not found by IB MAPPING cmd\n",
  3456. card->devname, chan->dlci);
  3457. }
  3458. void s508_s514_lock(sdla_t *card, unsigned long *smp_flags)
  3459. {
  3460. if (card->hw.type != SDLA_S514){
  3461. spin_lock_irqsave(&card->wandev.lock, *smp_flags);
  3462. }else{
  3463. spin_lock(&card->u.f.if_send_lock);
  3464. }
  3465. return;
  3466. }
  3467. void s508_s514_unlock(sdla_t *card, unsigned long *smp_flags)
  3468. {
  3469. if (card->hw.type != SDLA_S514){
  3470. spin_unlock_irqrestore (&card->wandev.lock, *smp_flags);
  3471. }else{
  3472. spin_unlock(&card->u.f.if_send_lock);
  3473. }
  3474. return;
  3475. }
  3476. /*----------------------------------------------------------------------
  3477. RECEIVE INTERRUPT: BOTTOM HALF HANDLERS
  3478. ----------------------------------------------------------------------*/
  3479. /*========================================================
  3480. * bh_enqueue
  3481. *
  3482. * Description:
  3483. * Insert a received packet into a circular
  3484. * rx queue. This packet will be picked up
  3485. * by fr_bh() and sent up the stack to the
  3486. * user.
  3487. *
  3488. * Usage:
  3489. * This function is called by rx interrupt,
  3490. * in API mode.
  3491. *
  3492. */
  3493. static int bh_enqueue(struct net_device *dev, struct sk_buff *skb)
  3494. {
  3495. /* Check for full */
  3496. fr_channel_t* chan = dev->priv;
  3497. sdla_t *card = chan->card;
  3498. if (atomic_read(&chan->bh_buff_used) == MAX_BH_BUFF){
  3499. ++card->wandev.stats.rx_dropped;
  3500. dev_kfree_skb_any(skb);
  3501. return 1;
  3502. }
  3503. ((bh_data_t *)&chan->bh_head[chan->bh_write])->skb = skb;
  3504. if (chan->bh_write == (MAX_BH_BUFF-1)){
  3505. chan->bh_write=0;
  3506. }else{
  3507. ++chan->bh_write;
  3508. }
  3509. atomic_inc(&chan->bh_buff_used);
  3510. return 0;
  3511. }
  3512. /*========================================================
  3513. * trigger_fr_bh
  3514. *
  3515. * Description:
  3516. * Kick the fr_bh() handler
  3517. *
  3518. * Usage:
  3519. * rx interrupt calls this function during
  3520. * the API mode.
  3521. */
  3522. static void trigger_fr_bh (fr_channel_t *chan)
  3523. {
  3524. if (!test_and_set_bit(0,&chan->tq_working)){
  3525. wanpipe_queue_work(&chan->common.wanpipe_work);
  3526. }
  3527. }
  3528. /*========================================================
  3529. * fr_bh
  3530. *
  3531. * Description:
  3532. * Frame relay receive BH handler.
  3533. * Dequeue data from the BH circular
  3534. * buffer and pass it up the API sock.
  3535. *
  3536. * Rationale:
  3537. * This fuction is used to offload the
  3538. * rx_interrupt during API operation mode.
  3539. * The fr_bh() function executes for each
  3540. * dlci/interface.
  3541. *
  3542. * Once receive interrupt copies data from the
  3543. * card into an skb buffer, the skb buffer
  3544. * is appended to a circular BH buffer.
  3545. * Then the interrupt kicks fr_bh() to finish the
  3546. * job at a later time (not within the interrupt).
  3547. *
  3548. * Usage:
  3549. * Interrupts use this to defer a task to
  3550. * a polling routine.
  3551. *
  3552. */
  3553. static void fr_bh(struct net_device * dev)
  3554. {
  3555. fr_channel_t* chan = dev->priv;
  3556. sdla_t *card = chan->card;
  3557. struct sk_buff *skb;
  3558. if (atomic_read(&chan->bh_buff_used) == 0){
  3559. clear_bit(0, &chan->tq_working);
  3560. return;
  3561. }
  3562. while (atomic_read(&chan->bh_buff_used)){
  3563. if (chan->common.sk == NULL || chan->common.func == NULL){
  3564. clear_bit(0, &chan->tq_working);
  3565. return;
  3566. }
  3567. skb = ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb;
  3568. if (skb != NULL){
  3569. if (chan->common.sk == NULL || chan->common.func == NULL){
  3570. ++card->wandev.stats.rx_dropped;
  3571. ++chan->ifstats.rx_dropped;
  3572. dev_kfree_skb_any(skb);
  3573. fr_bh_cleanup(dev);
  3574. continue;
  3575. }
  3576. if (chan->common.func(skb,dev,chan->common.sk) != 0){
  3577. /* Sock full cannot send, queue us for
  3578. * another try */
  3579. atomic_set(&chan->common.receive_block,1);
  3580. return;
  3581. }else{
  3582. fr_bh_cleanup(dev);
  3583. }
  3584. }else{
  3585. fr_bh_cleanup(dev);
  3586. }
  3587. }
  3588. clear_bit(0, &chan->tq_working);
  3589. return;
  3590. }
  3591. static int fr_bh_cleanup(struct net_device *dev)
  3592. {
  3593. fr_channel_t* chan = dev->priv;
  3594. ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb = NULL;
  3595. if (chan->bh_read == (MAX_BH_BUFF-1)){
  3596. chan->bh_read=0;
  3597. }else{
  3598. ++chan->bh_read;
  3599. }
  3600. atomic_dec(&chan->bh_buff_used);
  3601. return 0;
  3602. }
  3603. /*----------------------------------------------------------------------
  3604. POLL BH HANDLERS AND KICK ROUTINES
  3605. ----------------------------------------------------------------------*/
  3606. /*============================================================
  3607. * trigger_fr_poll
  3608. *
  3609. * Description:
  3610. * Add a fr_poll() task into a tq_scheduler bh handler
  3611. * for a specific dlci/interface. This will kick
  3612. * the fr_poll() routine at a later time.
  3613. *
  3614. * Usage:
  3615. * Interrupts use this to defer a taks to
  3616. * a polling routine.
  3617. *
  3618. */
  3619. static void trigger_fr_poll(struct net_device *dev)
  3620. {
  3621. fr_channel_t* chan = dev->priv;
  3622. schedule_work(&chan->fr_poll_work);
  3623. return;
  3624. }
  3625. /*============================================================
  3626. * fr_poll
  3627. *
  3628. * Rationale:
  3629. * We cannot manipulate the routing tables, or
  3630. * ip addresses withing the interrupt. Therefore
  3631. * we must perform such actons outside an interrupt
  3632. * at a later time.
  3633. *
  3634. * Description:
  3635. * Frame relay polling routine, responsible for
  3636. * shutting down interfaces upon disconnect
  3637. * and adding/removing routes.
  3638. *
  3639. * Usage:
  3640. * This function is executed for each frame relay
  3641. * dlci/interface through a tq_schedule bottom half.
  3642. *
  3643. * trigger_fr_poll() function is used to kick
  3644. * the fr_poll routine.
  3645. */
  3646. static void fr_poll(struct net_device *dev)
  3647. {
  3648. fr_channel_t* chan;
  3649. sdla_t *card;
  3650. u8 check_gateway=0;
  3651. if (!dev || (chan = dev->priv) == NULL)
  3652. return;
  3653. card = chan->card;
  3654. /* (Re)Configuraiton is in progress, stop what you are
  3655. * doing and get out */
  3656. if (test_bit(PERI_CRIT,&card->wandev.critical)){
  3657. return;
  3658. }
  3659. switch (chan->common.state){
  3660. case WAN_DISCONNECTED:
  3661. if (test_bit(DYN_OPT_ON,&chan->interface_down) &&
  3662. !test_bit(DEV_DOWN, &chan->interface_down) &&
  3663. dev->flags&IFF_UP){
  3664. printk(KERN_INFO "%s: Interface %s is Down.\n",
  3665. card->devname,dev->name);
  3666. change_dev_flags(dev,dev->flags&~IFF_UP);
  3667. set_bit(DEV_DOWN, &chan->interface_down);
  3668. chan->route_flag = NO_ROUTE;
  3669. }else{
  3670. if (chan->inarp != INARP_NONE)
  3671. process_route(dev);
  3672. }
  3673. break;
  3674. case WAN_CONNECTED:
  3675. if (test_bit(DYN_OPT_ON,&chan->interface_down) &&
  3676. test_bit(DEV_DOWN, &chan->interface_down) &&
  3677. !(dev->flags&IFF_UP)){
  3678. printk(KERN_INFO "%s: Interface %s is Up.\n",
  3679. card->devname,dev->name);
  3680. change_dev_flags(dev,dev->flags|IFF_UP);
  3681. clear_bit(DEV_DOWN, &chan->interface_down);
  3682. check_gateway=1;
  3683. }
  3684. if (chan->inarp != INARP_NONE){
  3685. process_route(dev);
  3686. check_gateway=1;
  3687. }
  3688. if (chan->gateway && check_gateway)
  3689. add_gateway(card,dev);
  3690. break;
  3691. }
  3692. return;
  3693. }
  3694. /*==============================================================
  3695. * check_tx_status
  3696. *
  3697. * Rationale:
  3698. * We cannot transmit from an interrupt while
  3699. * the if_send is transmitting data. Therefore,
  3700. * we must check whether the tx buffers are
  3701. * begin used, before we transmit from an
  3702. * interrupt.
  3703. *
  3704. * Description:
  3705. * Checks whether it's safe to use the transmit
  3706. * buffers.
  3707. *
  3708. * Usage:
  3709. * ARP and UDP handling routines use this function
  3710. * because, they need to transmit data during
  3711. * an interrupt.
  3712. */
  3713. static int check_tx_status(sdla_t *card, struct net_device *dev)
  3714. {
  3715. if (card->hw.type == SDLA_S514){
  3716. if (test_bit(SEND_CRIT, (void*)&card->wandev.critical) ||
  3717. test_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical)) {
  3718. return 1;
  3719. }
  3720. }
  3721. if (netif_queue_stopped(dev) || (card->u.f.tx_interrupts_pending))
  3722. return 1;
  3723. return 0;
  3724. }
  3725. /*===============================================================
  3726. * move_dev_to_next
  3727. *
  3728. * Description:
  3729. * Move the dev pointer to the next location in the
  3730. * link list. Check if we are at the end of the
  3731. * list, if so start from the begining.
  3732. *
  3733. * Usage:
  3734. * Timer interrupt uses this function to efficiently
  3735. * step through the devices that need to send ARP data.
  3736. *
  3737. */
  3738. struct net_device *move_dev_to_next(sdla_t *card, struct net_device *dev)
  3739. {
  3740. if (card->wandev.new_if_cnt != 1){
  3741. if (!*((struct net_device **)dev->priv))
  3742. return card->wandev.dev;
  3743. else
  3744. return *((struct net_device **)dev->priv);
  3745. }
  3746. return dev;
  3747. }
  3748. /*==============================================================
  3749. * trigger_config_fr
  3750. *
  3751. * Rationale:
  3752. * All commands must be performed inside of a
  3753. * interrupt.
  3754. *
  3755. * Description:
  3756. * Kick the config_fr() routine throught the
  3757. * timer interrupt.
  3758. */
  3759. static void trigger_config_fr (sdla_t *card)
  3760. {
  3761. fr508_flags_t* flags = card->flags;
  3762. card->u.f.timer_int_enabled |= TMR_INT_ENABLED_CONFIG;
  3763. flags->imask |= FR_INTR_TIMER;
  3764. }
  3765. /*==============================================================
  3766. * config_fr
  3767. *
  3768. * Rationale:
  3769. * All commands must be performed inside of a
  3770. * interrupt.
  3771. &
  3772. * Description:
  3773. * Configure a DLCI. This function is executed
  3774. * by a timer_interrupt. The if_open() function
  3775. * triggers it.
  3776. *
  3777. * Usage:
  3778. * new_if() collects all data necessary to
  3779. * configure the DLCI. It sets the chan->dlci_ready
  3780. * bit. When the if_open() function is executed
  3781. * it checks this bit, and if its set it triggers
  3782. * the timer interrupt to execute the config_fr()
  3783. * function.
  3784. */
  3785. static void config_fr (sdla_t *card)
  3786. {
  3787. struct net_device *dev;
  3788. fr_channel_t *chan;
  3789. for (dev = card->wandev.dev; dev;
  3790. dev = *((struct net_device **)dev->priv)) {
  3791. if ((chan=dev->priv) == NULL)
  3792. continue;
  3793. if (!test_bit(0,&chan->config_dlci))
  3794. continue;
  3795. clear_bit(0,&chan->config_dlci);
  3796. /* If signalling is set to NO, then setup
  3797. * DLCI addresses right away. Don't have to wait for
  3798. * link to connect.
  3799. */
  3800. if (card->wandev.signalling == WANOPT_NO){
  3801. printk(KERN_INFO "%s: Signalling set to NO: Mapping DLCI's\n",
  3802. card->wandev.name);
  3803. if (fr_init_dlci(card,chan)){
  3804. printk(KERN_INFO "%s: ERROR: Failed to configure DLCI %i !\n",
  3805. card->devname, chan->dlci);
  3806. return;
  3807. }
  3808. }
  3809. if (card->wandev.station == WANOPT_CPE) {
  3810. update_chan_state(dev);
  3811. /* CPE: issue full status enquiry */
  3812. fr_issue_isf(card, FR_ISF_FSE);
  3813. } else {
  3814. /* FR switch: activate DLCI(s) */
  3815. /* For Switch emulation we have to ADD and ACTIVATE
  3816. * the DLCI(s) that were configured with the SET_DLCI_
  3817. * CONFIGURATION command. Add and Activate will fail if
  3818. * DLCI specified is not included in the list.
  3819. *
  3820. * Also If_open is called once for each interface. But
  3821. * it does not get in here for all the interface. So
  3822. * we have to pass the entire list of DLCI(s) to add
  3823. * activate routines.
  3824. */
  3825. if (!check_dlci_config (card, chan)){
  3826. fr_add_dlci(card, chan->dlci);
  3827. fr_activate_dlci(card, chan->dlci);
  3828. }
  3829. }
  3830. card->u.f.dlci_to_dev_map[chan->dlci] = dev;
  3831. }
  3832. return;
  3833. }
  3834. /*==============================================================
  3835. * config_fr
  3836. *
  3837. * Rationale:
  3838. * All commands must be executed during an interrupt.
  3839. *
  3840. * Description:
  3841. * Trigger uncofig_fr() function through
  3842. * the timer interrupt.
  3843. *
  3844. */
  3845. static void trigger_unconfig_fr(struct net_device *dev)
  3846. {
  3847. fr_channel_t *chan = dev->priv;
  3848. volatile sdla_t *card = chan->card;
  3849. unsigned long timeout;
  3850. fr508_flags_t* flags = card->flags;
  3851. int reset_critical=0;
  3852. if (test_bit(PERI_CRIT,(void*)&card->wandev.critical)){
  3853. clear_bit(PERI_CRIT,(void*)&card->wandev.critical);
  3854. reset_critical=1;
  3855. }
  3856. /* run unconfig_dlci() function
  3857. * throught the timer interrupt */
  3858. set_bit(0,(void*)&chan->unconfig_dlci);
  3859. card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UNCONFIG;
  3860. flags->imask |= FR_INTR_TIMER;
  3861. /* Wait for the command to complete */
  3862. timeout = jiffies;
  3863. for(;;) {
  3864. if(!(card->u.f.timer_int_enabled & TMR_INT_ENABLED_UNCONFIG))
  3865. break;
  3866. if (time_after(jiffies, timeout + 1 * HZ)){
  3867. card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UNCONFIG;
  3868. printk(KERN_INFO "%s: Failed to delete DLCI %i\n",
  3869. card->devname,chan->dlci);
  3870. break;
  3871. }
  3872. }
  3873. if (reset_critical){
  3874. set_bit(PERI_CRIT,(void*)&card->wandev.critical);
  3875. }
  3876. }
  3877. /*==============================================================
  3878. * unconfig_fr
  3879. *
  3880. * Rationale:
  3881. * All commands must be executed during an interrupt.
  3882. *
  3883. * Description:
  3884. * Remove the dlci from firmware.
  3885. * This funciton is used in NODE shutdown.
  3886. */
  3887. static void unconfig_fr (sdla_t *card)
  3888. {
  3889. struct net_device *dev;
  3890. fr_channel_t *chan;
  3891. for (dev = card->wandev.dev; dev;
  3892. dev = *((struct net_device **)dev->priv)){
  3893. if ((chan=dev->priv) == NULL)
  3894. continue;
  3895. if (!test_bit(0,&chan->unconfig_dlci))
  3896. continue;
  3897. clear_bit(0,&chan->unconfig_dlci);
  3898. if (card->wandev.station == WANOPT_NODE){
  3899. printk(KERN_INFO "%s: Unconfiguring DLCI %i\n",
  3900. card->devname,chan->dlci);
  3901. fr_delete_dlci(card,chan->dlci);
  3902. }
  3903. card->u.f.dlci_to_dev_map[chan->dlci] = NULL;
  3904. }
  3905. }
  3906. static int setup_fr_header(struct sk_buff *skb, struct net_device* dev,
  3907. char op_mode)
  3908. {
  3909. fr_channel_t *chan=dev->priv;
  3910. if (op_mode == WANPIPE) {
  3911. chan->fr_header[0]=Q922_UI;
  3912. switch (htons(skb->protocol)){
  3913. case ETH_P_IP:
  3914. chan->fr_header[1]=NLPID_IP;
  3915. break;
  3916. default:
  3917. return -EINVAL;
  3918. }
  3919. return 2;
  3920. }
  3921. /* If we are in bridging mode, we must apply
  3922. * an Ethernet header
  3923. */
  3924. if (op_mode == BRIDGE || op_mode == BRIDGE_NODE) {
  3925. /* Encapsulate the packet as a bridged Ethernet frame. */
  3926. #ifdef DEBUG
  3927. printk(KERN_INFO "%s: encapsulating skb for frame relay\n",
  3928. dev->name);
  3929. #endif
  3930. chan->fr_header[0] = 0x03;
  3931. chan->fr_header[1] = 0x00;
  3932. chan->fr_header[2] = 0x80;
  3933. chan->fr_header[3] = 0x00;
  3934. chan->fr_header[4] = 0x80;
  3935. chan->fr_header[5] = 0xC2;
  3936. chan->fr_header[6] = 0x00;
  3937. chan->fr_header[7] = 0x07;
  3938. /* Yuck. */
  3939. skb->protocol = ETH_P_802_3;
  3940. return 8;
  3941. }
  3942. return 0;
  3943. }
  3944. static int check_dlci_config (sdla_t *card, fr_channel_t *chan)
  3945. {
  3946. fr_mbox_t* mbox = card->mbox;
  3947. int err=0;
  3948. fr_conf_t *conf=NULL;
  3949. unsigned short dlci_num = chan->dlci;
  3950. int dlci_offset=0;
  3951. struct net_device *dev = NULL;
  3952. mbox->cmd.command = FR_READ_CONFIG;
  3953. mbox->cmd.length = 0;
  3954. mbox->cmd.dlci = dlci_num;
  3955. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  3956. if (err == CMD_OK){
  3957. return 0;
  3958. }
  3959. for (dev = card->wandev.dev; dev;
  3960. dev=*((struct net_device **)dev->priv))
  3961. set_chan_state(dev,WAN_DISCONNECTED);
  3962. printk(KERN_INFO "DLCI %i Not configured, configuring\n",dlci_num);
  3963. mbox->cmd.command = FR_COMM_DISABLE;
  3964. mbox->cmd.length = 0;
  3965. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  3966. if (err != CMD_OK){
  3967. fr_event(card, err, mbox);
  3968. return 2;
  3969. }
  3970. printk(KERN_INFO "Disabled Communications \n");
  3971. mbox->cmd.command = FR_READ_CONFIG;
  3972. mbox->cmd.length = 0;
  3973. mbox->cmd.dlci = 0;
  3974. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  3975. if (err != CMD_OK){
  3976. fr_event(card, err, mbox);
  3977. return 2;
  3978. }
  3979. conf = (fr_conf_t *)mbox->data;
  3980. dlci_offset=0;
  3981. for (dev = card->wandev.dev; dev;
  3982. dev = *((struct net_device **)dev->priv)) {
  3983. fr_channel_t *chan_tmp = dev->priv;
  3984. conf->dlci[dlci_offset] = chan_tmp->dlci;
  3985. dlci_offset++;
  3986. }
  3987. printk(KERN_INFO "Got Fr configuration Buffer Length is %x Dlci %i Dlci Off %i\n",
  3988. mbox->cmd.length,
  3989. mbox->cmd.length > 0x20 ? conf->dlci[0] : -1,
  3990. dlci_offset );
  3991. mbox->cmd.length = 0x20 + dlci_offset*2;
  3992. mbox->cmd.command = FR_SET_CONFIG;
  3993. mbox->cmd.dlci = 0;
  3994. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  3995. if (err != CMD_OK){
  3996. fr_event(card, err, mbox);
  3997. return 2;
  3998. }
  3999. initialize_rx_tx_buffers (card);
  4000. printk(KERN_INFO "Configuraiton Succeded for new DLCI %i\n",dlci_num);
  4001. if (fr_comm_enable (card)){
  4002. return 2;
  4003. }
  4004. printk(KERN_INFO "Enabling Communications \n");
  4005. for (dev = card->wandev.dev; dev;
  4006. dev = *((struct net_device **)dev->priv)) {
  4007. fr_channel_t *chan_tmp = dev->priv;
  4008. fr_init_dlci(card,chan_tmp);
  4009. fr_add_dlci(card, chan_tmp->dlci);
  4010. fr_activate_dlci(card, chan_tmp->dlci);
  4011. }
  4012. printk(KERN_INFO "END OF CONFIGURAITON %i\n",dlci_num);
  4013. return 1;
  4014. }
  4015. static void initialize_rx_tx_buffers (sdla_t *card)
  4016. {
  4017. fr_buf_info_t* buf_info;
  4018. if (card->hw.type == SDLA_S514) {
  4019. buf_info = (void*)(card->hw.dpmbase + FR_MB_VECTOR +
  4020. FR508_RXBC_OFFS);
  4021. card->rxmb = (void*)(buf_info->rse_next + card->hw.dpmbase);
  4022. card->u.f.rxmb_base =
  4023. (void*)(buf_info->rse_base + card->hw.dpmbase);
  4024. card->u.f.rxmb_last =
  4025. (void*)(buf_info->rse_base +
  4026. (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) +
  4027. card->hw.dpmbase);
  4028. }else{
  4029. buf_info = (void*)(card->hw.dpmbase + FR508_RXBC_OFFS);
  4030. card->rxmb = (void*)(buf_info->rse_next -
  4031. FR_MB_VECTOR + card->hw.dpmbase);
  4032. card->u.f.rxmb_base =
  4033. (void*)(buf_info->rse_base -
  4034. FR_MB_VECTOR + card->hw.dpmbase);
  4035. card->u.f.rxmb_last =
  4036. (void*)(buf_info->rse_base +
  4037. (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) -
  4038. FR_MB_VECTOR + card->hw.dpmbase);
  4039. }
  4040. card->u.f.rx_base = buf_info->buf_base;
  4041. card->u.f.rx_top = buf_info->buf_top;
  4042. card->u.f.tx_interrupts_pending = 0;
  4043. return;
  4044. }
  4045. MODULE_LICENSE("GPL");
  4046. /****** End *****************************************************************/