pc300_drv.c 111 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706
  1. #define USE_PCI_CLOCK
  2. static char rcsid[] =
  3. "Revision: 3.4.5 Date: 2002/03/07 ";
  4. /*
  5. * pc300.c Cyclades-PC300(tm) Driver.
  6. *
  7. * Author: Ivan Passos <ivan@cyclades.com>
  8. * Maintainer: PC300 Maintainer <pc300@cyclades.com>
  9. *
  10. * Copyright: (c) 1999-2003 Cyclades Corp.
  11. *
  12. * This program is free software; you can redistribute it and/or
  13. * modify it under the terms of the GNU General Public License
  14. * as published by the Free Software Foundation; either version
  15. * 2 of the License, or (at your option) any later version.
  16. *
  17. * Using tabstop = 4.
  18. *
  19. * $Log: pc300_drv.c,v $
  20. * Revision 3.23 2002/03/20 13:58:40 henrique
  21. * Fixed ortographic mistakes
  22. *
  23. * Revision 3.22 2002/03/13 16:56:56 henrique
  24. * Take out the debug messages
  25. *
  26. * Revision 3.21 2002/03/07 14:17:09 henrique
  27. * License data fixed
  28. *
  29. * Revision 3.20 2002/01/17 17:58:52 ivan
  30. * Support for PC300-TE/M (PMC).
  31. *
  32. * Revision 3.19 2002/01/03 17:08:47 daniela
  33. * Enables DMA reception when the SCA-II disables it improperly.
  34. *
  35. * Revision 3.18 2001/12/03 18:47:50 daniela
  36. * Esthetic changes.
  37. *
  38. * Revision 3.17 2001/10/19 16:50:13 henrique
  39. * Patch to kernel 2.4.12 and new generic hdlc.
  40. *
  41. * Revision 3.16 2001/10/16 15:12:31 regina
  42. * clear statistics
  43. *
  44. * Revision 3.11 to 3.15 2001/10/11 20:26:04 daniela
  45. * More DMA fixes for noisy lines.
  46. * Return the size of bad frames in dma_get_rx_frame_size, so that the Rx buffer
  47. * descriptors can be cleaned by dma_buf_read (called in cpc_net_rx).
  48. * Renamed dma_start routine to rx_dma_start. Improved Rx statistics.
  49. * Fixed BOF interrupt treatment. Created dma_start routine.
  50. * Changed min and max to cpc_min and cpc_max.
  51. *
  52. * Revision 3.10 2001/08/06 12:01:51 regina
  53. * Fixed problem in DSR_DE bit.
  54. *
  55. * Revision 3.9 2001/07/18 19:27:26 daniela
  56. * Added some history comments.
  57. *
  58. * Revision 3.8 2001/07/12 13:11:19 regina
  59. * bug fix - DCD-OFF in pc300 tty driver
  60. *
  61. * Revision 3.3 to 3.7 2001/07/06 15:00:20 daniela
  62. * Removing kernel 2.4.3 and previous support.
  63. * DMA transmission bug fix.
  64. * MTU check in cpc_net_rx fixed.
  65. * Boot messages reviewed.
  66. * New configuration parameters (line code, CRC calculation and clock).
  67. *
  68. * Revision 3.2 2001/06/22 13:13:02 regina
  69. * MLPPP implementation. Changed the header of message trace to include
  70. * the device name. New format : "hdlcX[R/T]: ".
  71. * Default configuration changed.
  72. *
  73. * Revision 3.1 2001/06/15 regina
  74. * in cpc_queue_xmit, netif_stop_queue is called if don't have free descriptor
  75. * upping major version number
  76. *
  77. * Revision 1.1.1.1 2001/06/13 20:25:04 daniela
  78. * PC300 initial CVS version (3.4.0-pre1)
  79. *
  80. * Revision 3.0.1.2 2001/06/08 daniela
  81. * Did some changes in the DMA programming implementation to avoid the
  82. * occurrence of a SCA-II bug when CDA is accessed during a DMA transfer.
  83. *
  84. * Revision 3.0.1.1 2001/05/02 daniela
  85. * Added kernel 2.4.3 support.
  86. *
  87. * Revision 3.0.1.0 2001/03/13 daniela, henrique
  88. * Added Frame Relay Support.
  89. * Driver now uses HDLC generic driver to provide protocol support.
  90. *
  91. * Revision 3.0.0.8 2001/03/02 daniela
  92. * Fixed ram size detection.
  93. * Changed SIOCGPC300CONF ioctl, to give hw information to pc300util.
  94. *
  95. * Revision 3.0.0.7 2001/02/23 daniela
  96. * netif_stop_queue called before the SCA-II transmition commands in
  97. * cpc_queue_xmit, and with interrupts disabled to avoid race conditions with
  98. * transmition interrupts.
  99. * Fixed falc_check_status for Unframed E1.
  100. *
  101. * Revision 3.0.0.6 2000/12/13 daniela
  102. * Implemented pc300util support: trace, statistics, status and loopback
  103. * tests for the PC300 TE boards.
  104. *
  105. * Revision 3.0.0.5 2000/12/12 ivan
  106. * Added support for Unframed E1.
  107. * Implemented monitor mode.
  108. * Fixed DCD sensitivity on the second channel.
  109. * Driver now complies with new PCI kernel architecture.
  110. *
  111. * Revision 3.0.0.4 2000/09/28 ivan
  112. * Implemented DCD sensitivity.
  113. * Moved hardware-specific open to the end of cpc_open, to avoid race
  114. * conditions with early reception interrupts.
  115. * Included code for [request|release]_mem_region().
  116. * Changed location of pc300.h .
  117. * Minor code revision (contrib. of Jeff Garzik).
  118. *
  119. * Revision 3.0.0.3 2000/07/03 ivan
  120. * Previous bugfix for the framing errors with external clock made X21
  121. * boards stop working. This version fixes it.
  122. *
  123. * Revision 3.0.0.2 2000/06/23 ivan
  124. * Revisited cpc_queue_xmit to prevent race conditions on Tx DMA buffer
  125. * handling when Tx timeouts occur.
  126. * Revisited Rx statistics.
  127. * Fixed a bug in the SCA-II programming that would cause framing errors
  128. * when external clock was configured.
  129. *
  130. * Revision 3.0.0.1 2000/05/26 ivan
  131. * Added logic in the SCA interrupt handler so that no board can monopolize
  132. * the driver.
  133. * Request PLX I/O region, although driver doesn't use it, to avoid
  134. * problems with other drivers accessing it.
  135. *
  136. * Revision 3.0.0.0 2000/05/15 ivan
  137. * Did some changes in the DMA programming implementation to avoid the
  138. * occurrence of a SCA-II bug in the second channel.
  139. * Implemented workaround for PLX9050 bug that would cause a system lockup
  140. * in certain systems, depending on the MMIO addresses allocated to the
  141. * board.
  142. * Fixed the FALC chip programming to avoid synchronization problems in the
  143. * second channel (TE only).
  144. * Implemented a cleaner and faster Tx DMA descriptor cleanup procedure in
  145. * cpc_queue_xmit().
  146. * Changed the built-in driver implementation so that the driver can use the
  147. * general 'hdlcN' naming convention instead of proprietary device names.
  148. * Driver load messages are now device-centric, instead of board-centric.
  149. * Dynamic allocation of net_device structures.
  150. * Code is now compliant with the new module interface (module_[init|exit]).
  151. * Make use of the PCI helper functions to access PCI resources.
  152. *
  153. * Revision 2.0.0.0 2000/04/15 ivan
  154. * Added support for the PC300/TE boards (T1/FT1/E1/FE1).
  155. *
  156. * Revision 1.1.0.0 2000/02/28 ivan
  157. * Major changes in the driver architecture.
  158. * Softnet compliancy implemented.
  159. * Driver now reports physical instead of virtual memory addresses.
  160. * Added cpc_change_mtu function.
  161. *
  162. * Revision 1.0.0.0 1999/12/16 ivan
  163. * First official release.
  164. * Support for 1- and 2-channel boards (which use distinct PCI Device ID's).
  165. * Support for monolythic installation (i.e., drv built into the kernel).
  166. * X.25 additional checking when lapb_[dis]connect_request returns an error.
  167. * SCA programming now covers X.21 as well.
  168. *
  169. * Revision 0.3.1.0 1999/11/18 ivan
  170. * Made X.25 support configuration-dependent (as it depends on external
  171. * modules to work).
  172. * Changed X.25-specific function names to comply with adopted convention.
  173. * Fixed typos in X.25 functions that would cause compile errors (Daniela).
  174. * Fixed bug in ch_config that would disable interrupts on a previously
  175. * enabled channel if the other channel on the same board was enabled later.
  176. *
  177. * Revision 0.3.0.0 1999/11/16 daniela
  178. * X.25 support.
  179. *
  180. * Revision 0.2.3.0 1999/11/15 ivan
  181. * Function cpc_ch_status now provides more detailed information.
  182. * Added support for X.21 clock configuration.
  183. * Changed TNR1 setting in order to prevent Tx FIFO overaccesses by the SCA.
  184. * Now using PCI clock instead of internal oscillator clock for the SCA.
  185. *
  186. * Revision 0.2.2.0 1999/11/10 ivan
  187. * Changed the *_dma_buf_check functions so that they would print only
  188. * the useful info instead of the whole buffer descriptor bank.
  189. * Fixed bug in cpc_queue_xmit that would eventually crash the system
  190. * in case of a packet drop.
  191. * Implemented TX underrun handling.
  192. * Improved SCA fine tuning to boost up its performance.
  193. *
  194. * Revision 0.2.1.0 1999/11/03 ivan
  195. * Added functions *dma_buf_pt_init to allow independent initialization
  196. * of the next-descr. and DMA buffer pointers on the DMA descriptors.
  197. * Kernel buffer release and tbusy clearing is now done in the interrupt
  198. * handler.
  199. * Fixed bug in cpc_open that would cause an interface reopen to fail.
  200. * Added a protocol-specific code section in cpc_net_rx.
  201. * Removed printk level defs (they might be added back after the beta phase).
  202. *
  203. * Revision 0.2.0.0 1999/10/28 ivan
  204. * Revisited the code so that new protocols can be easily added / supported.
  205. *
  206. * Revision 0.1.0.1 1999/10/20 ivan
  207. * Mostly "esthetic" changes.
  208. *
  209. * Revision 0.1.0.0 1999/10/11 ivan
  210. * Initial version.
  211. *
  212. */
  213. #include <linux/module.h>
  214. #include <linux/kernel.h>
  215. #include <linux/mm.h>
  216. #include <linux/ioport.h>
  217. #include <linux/pci.h>
  218. #include <linux/errno.h>
  219. #include <linux/string.h>
  220. #include <linux/init.h>
  221. #include <linux/delay.h>
  222. #include <linux/net.h>
  223. #include <linux/skbuff.h>
  224. #include <linux/if_arp.h>
  225. #include <linux/netdevice.h>
  226. #include <linux/spinlock.h>
  227. #include <linux/if.h>
  228. #include <net/syncppp.h>
  229. #include <net/arp.h>
  230. #include <asm/io.h>
  231. #include <asm/uaccess.h>
  232. #include "pc300.h"
  233. #define CPC_LOCK(card,flags) \
  234. do { \
  235. spin_lock_irqsave(&card->card_lock, flags); \
  236. } while (0)
  237. #define CPC_UNLOCK(card,flags) \
  238. do { \
  239. spin_unlock_irqrestore(&card->card_lock, flags); \
  240. } while (0)
  241. #undef PC300_DEBUG_PCI
  242. #undef PC300_DEBUG_INTR
  243. #undef PC300_DEBUG_TX
  244. #undef PC300_DEBUG_RX
  245. #undef PC300_DEBUG_OTHER
  246. static struct pci_device_id cpc_pci_dev_id[] __devinitdata = {
  247. /* PC300/RSV or PC300/X21, 2 chan */
  248. {0x120e, 0x300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x300},
  249. /* PC300/RSV or PC300/X21, 1 chan */
  250. {0x120e, 0x301, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x301},
  251. /* PC300/TE, 2 chan */
  252. {0x120e, 0x310, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x310},
  253. /* PC300/TE, 1 chan */
  254. {0x120e, 0x311, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x311},
  255. /* PC300/TE-M, 2 chan */
  256. {0x120e, 0x320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x320},
  257. /* PC300/TE-M, 1 chan */
  258. {0x120e, 0x321, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x321},
  259. /* End of table */
  260. {0,},
  261. };
  262. MODULE_DEVICE_TABLE(pci, cpc_pci_dev_id);
  263. #ifndef cpc_min
  264. #define cpc_min(a,b) (((a)<(b))?(a):(b))
  265. #endif
  266. #ifndef cpc_max
  267. #define cpc_max(a,b) (((a)>(b))?(a):(b))
  268. #endif
  269. /* prototypes */
  270. static void tx_dma_buf_pt_init(pc300_t *, int);
  271. static void tx_dma_buf_init(pc300_t *, int);
  272. static void rx_dma_buf_pt_init(pc300_t *, int);
  273. static void rx_dma_buf_init(pc300_t *, int);
  274. static void tx_dma_buf_check(pc300_t *, int);
  275. static void rx_dma_buf_check(pc300_t *, int);
  276. static irqreturn_t cpc_intr(int, void *);
  277. static struct net_device_stats *cpc_get_stats(struct net_device *);
  278. static int clock_rate_calc(uclong, uclong, int *);
  279. static uclong detect_ram(pc300_t *);
  280. static void plx_init(pc300_t *);
  281. static void cpc_trace(struct net_device *, struct sk_buff *, char);
  282. static int cpc_attach(struct net_device *, unsigned short, unsigned short);
  283. static int cpc_close(struct net_device *dev);
  284. #ifdef CONFIG_PC300_MLPPP
  285. void cpc_tty_init(pc300dev_t * dev);
  286. void cpc_tty_unregister_service(pc300dev_t * pc300dev);
  287. void cpc_tty_receive(pc300dev_t * pc300dev);
  288. void cpc_tty_trigger_poll(pc300dev_t * pc300dev);
  289. void cpc_tty_reset_var(void);
  290. #endif
  291. /************************/
  292. /*** DMA Routines ***/
  293. /************************/
  294. static void tx_dma_buf_pt_init(pc300_t * card, int ch)
  295. {
  296. int i;
  297. int ch_factor = ch * N_DMA_TX_BUF;
  298. volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
  299. + DMA_TX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
  300. for (i = 0; i < N_DMA_TX_BUF; i++, ptdescr++) {
  301. cpc_writel(&ptdescr->next, (uclong) (DMA_TX_BD_BASE +
  302. (ch_factor + ((i + 1) & (N_DMA_TX_BUF - 1))) * sizeof(pcsca_bd_t)));
  303. cpc_writel(&ptdescr->ptbuf,
  304. (uclong) (DMA_TX_BASE + (ch_factor + i) * BD_DEF_LEN));
  305. }
  306. }
  307. static void tx_dma_buf_init(pc300_t * card, int ch)
  308. {
  309. int i;
  310. int ch_factor = ch * N_DMA_TX_BUF;
  311. volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
  312. + DMA_TX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
  313. for (i = 0; i < N_DMA_TX_BUF; i++, ptdescr++) {
  314. memset_io(ptdescr, 0, sizeof(pcsca_bd_t));
  315. cpc_writew(&ptdescr->len, 0);
  316. cpc_writeb(&ptdescr->status, DST_OSB);
  317. }
  318. tx_dma_buf_pt_init(card, ch);
  319. }
  320. static void rx_dma_buf_pt_init(pc300_t * card, int ch)
  321. {
  322. int i;
  323. int ch_factor = ch * N_DMA_RX_BUF;
  324. volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
  325. + DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
  326. for (i = 0; i < N_DMA_RX_BUF; i++, ptdescr++) {
  327. cpc_writel(&ptdescr->next, (uclong) (DMA_RX_BD_BASE +
  328. (ch_factor + ((i + 1) & (N_DMA_RX_BUF - 1))) * sizeof(pcsca_bd_t)));
  329. cpc_writel(&ptdescr->ptbuf,
  330. (uclong) (DMA_RX_BASE + (ch_factor + i) * BD_DEF_LEN));
  331. }
  332. }
  333. static void rx_dma_buf_init(pc300_t * card, int ch)
  334. {
  335. int i;
  336. int ch_factor = ch * N_DMA_RX_BUF;
  337. volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
  338. + DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
  339. for (i = 0; i < N_DMA_RX_BUF; i++, ptdescr++) {
  340. memset_io(ptdescr, 0, sizeof(pcsca_bd_t));
  341. cpc_writew(&ptdescr->len, 0);
  342. cpc_writeb(&ptdescr->status, 0);
  343. }
  344. rx_dma_buf_pt_init(card, ch);
  345. }
  346. static void tx_dma_buf_check(pc300_t * card, int ch)
  347. {
  348. volatile pcsca_bd_t __iomem *ptdescr;
  349. int i;
  350. ucshort first_bd = card->chan[ch].tx_first_bd;
  351. ucshort next_bd = card->chan[ch].tx_next_bd;
  352. printk("#CH%d: f_bd = %d(0x%08zx), n_bd = %d(0x%08zx)\n", ch,
  353. first_bd, TX_BD_ADDR(ch, first_bd),
  354. next_bd, TX_BD_ADDR(ch, next_bd));
  355. for (i = first_bd,
  356. ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, first_bd));
  357. i != ((next_bd + 1) & (N_DMA_TX_BUF - 1));
  358. i = (i + 1) & (N_DMA_TX_BUF - 1),
  359. ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, i))) {
  360. printk("\n CH%d TX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d",
  361. ch, i, cpc_readl(&ptdescr->next),
  362. cpc_readl(&ptdescr->ptbuf),
  363. cpc_readb(&ptdescr->status), cpc_readw(&ptdescr->len));
  364. }
  365. printk("\n");
  366. }
  367. #ifdef PC300_DEBUG_OTHER
  368. /* Show all TX buffer descriptors */
  369. static void tx1_dma_buf_check(pc300_t * card, int ch)
  370. {
  371. volatile pcsca_bd_t __iomem *ptdescr;
  372. int i;
  373. ucshort first_bd = card->chan[ch].tx_first_bd;
  374. ucshort next_bd = card->chan[ch].tx_next_bd;
  375. uclong scabase = card->hw.scabase;
  376. printk ("\nnfree_tx_bd = %d \n", card->chan[ch].nfree_tx_bd);
  377. printk("#CH%d: f_bd = %d(0x%08x), n_bd = %d(0x%08x)\n", ch,
  378. first_bd, TX_BD_ADDR(ch, first_bd),
  379. next_bd, TX_BD_ADDR(ch, next_bd));
  380. printk("TX_CDA=0x%08x, TX_EDA=0x%08x\n",
  381. cpc_readl(scabase + DTX_REG(CDAL, ch)),
  382. cpc_readl(scabase + DTX_REG(EDAL, ch)));
  383. for (i = 0; i < N_DMA_TX_BUF; i++) {
  384. ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, i));
  385. printk("\n CH%d TX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d",
  386. ch, i, cpc_readl(&ptdescr->next),
  387. cpc_readl(&ptdescr->ptbuf),
  388. cpc_readb(&ptdescr->status), cpc_readw(&ptdescr->len));
  389. }
  390. printk("\n");
  391. }
  392. #endif
  393. static void rx_dma_buf_check(pc300_t * card, int ch)
  394. {
  395. volatile pcsca_bd_t __iomem *ptdescr;
  396. int i;
  397. ucshort first_bd = card->chan[ch].rx_first_bd;
  398. ucshort last_bd = card->chan[ch].rx_last_bd;
  399. int ch_factor;
  400. ch_factor = ch * N_DMA_RX_BUF;
  401. printk("#CH%d: f_bd = %d, l_bd = %d\n", ch, first_bd, last_bd);
  402. for (i = 0, ptdescr = (card->hw.rambase +
  403. DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
  404. i < N_DMA_RX_BUF; i++, ptdescr++) {
  405. if (cpc_readb(&ptdescr->status) & DST_OSB)
  406. printk ("\n CH%d RX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d",
  407. ch, i, cpc_readl(&ptdescr->next),
  408. cpc_readl(&ptdescr->ptbuf),
  409. cpc_readb(&ptdescr->status),
  410. cpc_readw(&ptdescr->len));
  411. }
  412. printk("\n");
  413. }
  414. static int dma_get_rx_frame_size(pc300_t * card, int ch)
  415. {
  416. volatile pcsca_bd_t __iomem *ptdescr;
  417. ucshort first_bd = card->chan[ch].rx_first_bd;
  418. int rcvd = 0;
  419. volatile ucchar status;
  420. ptdescr = (card->hw.rambase + RX_BD_ADDR(ch, first_bd));
  421. while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) {
  422. rcvd += cpc_readw(&ptdescr->len);
  423. first_bd = (first_bd + 1) & (N_DMA_RX_BUF - 1);
  424. if ((status & DST_EOM) || (first_bd == card->chan[ch].rx_last_bd)) {
  425. /* Return the size of a good frame or incomplete bad frame
  426. * (dma_buf_read will clean the buffer descriptors in this case). */
  427. return (rcvd);
  428. }
  429. ptdescr = (card->hw.rambase + cpc_readl(&ptdescr->next));
  430. }
  431. return (-1);
  432. }
  433. /*
  434. * dma_buf_write: writes a frame to the Tx DMA buffers
  435. * NOTE: this function writes one frame at a time.
  436. */
  437. static int dma_buf_write(pc300_t * card, int ch, ucchar * ptdata, int len)
  438. {
  439. int i, nchar;
  440. volatile pcsca_bd_t __iomem *ptdescr;
  441. int tosend = len;
  442. ucchar nbuf = ((len - 1) / BD_DEF_LEN) + 1;
  443. if (nbuf >= card->chan[ch].nfree_tx_bd) {
  444. return -ENOMEM;
  445. }
  446. for (i = 0; i < nbuf; i++) {
  447. ptdescr = (card->hw.rambase +
  448. TX_BD_ADDR(ch, card->chan[ch].tx_next_bd));
  449. nchar = cpc_min(BD_DEF_LEN, tosend);
  450. if (cpc_readb(&ptdescr->status) & DST_OSB) {
  451. memcpy_toio((card->hw.rambase + cpc_readl(&ptdescr->ptbuf)),
  452. &ptdata[len - tosend], nchar);
  453. cpc_writew(&ptdescr->len, nchar);
  454. card->chan[ch].nfree_tx_bd--;
  455. if ((i + 1) == nbuf) {
  456. /* This must be the last BD to be used */
  457. cpc_writeb(&ptdescr->status, DST_EOM);
  458. } else {
  459. cpc_writeb(&ptdescr->status, 0);
  460. }
  461. } else {
  462. return -ENOMEM;
  463. }
  464. tosend -= nchar;
  465. card->chan[ch].tx_next_bd =
  466. (card->chan[ch].tx_next_bd + 1) & (N_DMA_TX_BUF - 1);
  467. }
  468. /* If it gets to here, it means we have sent the whole frame */
  469. return 0;
  470. }
  471. /*
  472. * dma_buf_read: reads a frame from the Rx DMA buffers
  473. * NOTE: this function reads one frame at a time.
  474. */
  475. static int dma_buf_read(pc300_t * card, int ch, struct sk_buff *skb)
  476. {
  477. int nchar;
  478. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  479. volatile pcsca_bd_t __iomem *ptdescr;
  480. int rcvd = 0;
  481. volatile ucchar status;
  482. ptdescr = (card->hw.rambase +
  483. RX_BD_ADDR(ch, chan->rx_first_bd));
  484. while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) {
  485. nchar = cpc_readw(&ptdescr->len);
  486. if ((status & (DST_OVR | DST_CRC | DST_RBIT | DST_SHRT | DST_ABT))
  487. || (nchar > BD_DEF_LEN)) {
  488. if (nchar > BD_DEF_LEN)
  489. status |= DST_RBIT;
  490. rcvd = -status;
  491. /* Discard remaining descriptors used by the bad frame */
  492. while (chan->rx_first_bd != chan->rx_last_bd) {
  493. cpc_writeb(&ptdescr->status, 0);
  494. chan->rx_first_bd = (chan->rx_first_bd+1) & (N_DMA_RX_BUF-1);
  495. if (status & DST_EOM)
  496. break;
  497. ptdescr = (card->hw.rambase +
  498. cpc_readl(&ptdescr->next));
  499. status = cpc_readb(&ptdescr->status);
  500. }
  501. break;
  502. }
  503. if (nchar != 0) {
  504. if (skb) {
  505. memcpy_fromio(skb_put(skb, nchar),
  506. (card->hw.rambase+cpc_readl(&ptdescr->ptbuf)),nchar);
  507. }
  508. rcvd += nchar;
  509. }
  510. cpc_writeb(&ptdescr->status, 0);
  511. cpc_writeb(&ptdescr->len, 0);
  512. chan->rx_first_bd = (chan->rx_first_bd + 1) & (N_DMA_RX_BUF - 1);
  513. if (status & DST_EOM)
  514. break;
  515. ptdescr = (card->hw.rambase + cpc_readl(&ptdescr->next));
  516. }
  517. if (rcvd != 0) {
  518. /* Update pointer */
  519. chan->rx_last_bd = (chan->rx_first_bd - 1) & (N_DMA_RX_BUF - 1);
  520. /* Update EDA */
  521. cpc_writel(card->hw.scabase + DRX_REG(EDAL, ch),
  522. RX_BD_ADDR(ch, chan->rx_last_bd));
  523. }
  524. return (rcvd);
  525. }
  526. static void tx_dma_stop(pc300_t * card, int ch)
  527. {
  528. void __iomem *scabase = card->hw.scabase;
  529. ucchar drr_ena_bit = 1 << (5 + 2 * ch);
  530. ucchar drr_rst_bit = 1 << (1 + 2 * ch);
  531. /* Disable DMA */
  532. cpc_writeb(scabase + DRR, drr_ena_bit);
  533. cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit);
  534. }
  535. static void rx_dma_stop(pc300_t * card, int ch)
  536. {
  537. void __iomem *scabase = card->hw.scabase;
  538. ucchar drr_ena_bit = 1 << (4 + 2 * ch);
  539. ucchar drr_rst_bit = 1 << (2 * ch);
  540. /* Disable DMA */
  541. cpc_writeb(scabase + DRR, drr_ena_bit);
  542. cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit);
  543. }
  544. static void rx_dma_start(pc300_t * card, int ch)
  545. {
  546. void __iomem *scabase = card->hw.scabase;
  547. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  548. /* Start DMA */
  549. cpc_writel(scabase + DRX_REG(CDAL, ch),
  550. RX_BD_ADDR(ch, chan->rx_first_bd));
  551. if (cpc_readl(scabase + DRX_REG(CDAL,ch)) !=
  552. RX_BD_ADDR(ch, chan->rx_first_bd)) {
  553. cpc_writel(scabase + DRX_REG(CDAL, ch),
  554. RX_BD_ADDR(ch, chan->rx_first_bd));
  555. }
  556. cpc_writel(scabase + DRX_REG(EDAL, ch),
  557. RX_BD_ADDR(ch, chan->rx_last_bd));
  558. cpc_writew(scabase + DRX_REG(BFLL, ch), BD_DEF_LEN);
  559. cpc_writeb(scabase + DSR_RX(ch), DSR_DE);
  560. if (!(cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
  561. cpc_writeb(scabase + DSR_RX(ch), DSR_DE);
  562. }
  563. }
  564. /*************************/
  565. /*** FALC Routines ***/
  566. /*************************/
  567. static void falc_issue_cmd(pc300_t * card, int ch, ucchar cmd)
  568. {
  569. void __iomem *falcbase = card->hw.falcbase;
  570. unsigned long i = 0;
  571. while (cpc_readb(falcbase + F_REG(SIS, ch)) & SIS_CEC) {
  572. if (i++ >= PC300_FALC_MAXLOOP) {
  573. printk("%s: FALC command locked(cmd=0x%x).\n",
  574. card->chan[ch].d.name, cmd);
  575. break;
  576. }
  577. }
  578. cpc_writeb(falcbase + F_REG(CMDR, ch), cmd);
  579. }
  580. static void falc_intr_enable(pc300_t * card, int ch)
  581. {
  582. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  583. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  584. falc_t *pfalc = (falc_t *) & chan->falc;
  585. void __iomem *falcbase = card->hw.falcbase;
  586. /* Interrupt pins are open-drain */
  587. cpc_writeb(falcbase + F_REG(IPC, ch),
  588. cpc_readb(falcbase + F_REG(IPC, ch)) & ~IPC_IC0);
  589. /* Conters updated each second */
  590. cpc_writeb(falcbase + F_REG(FMR1, ch),
  591. cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_ECM);
  592. /* Enable SEC and ES interrupts */
  593. cpc_writeb(falcbase + F_REG(IMR3, ch),
  594. cpc_readb(falcbase + F_REG(IMR3, ch)) & ~(IMR3_SEC | IMR3_ES));
  595. if (conf->fr_mode == PC300_FR_UNFRAMED) {
  596. cpc_writeb(falcbase + F_REG(IMR4, ch),
  597. cpc_readb(falcbase + F_REG(IMR4, ch)) & ~(IMR4_LOS));
  598. } else {
  599. cpc_writeb(falcbase + F_REG(IMR4, ch),
  600. cpc_readb(falcbase + F_REG(IMR4, ch)) &
  601. ~(IMR4_LFA | IMR4_AIS | IMR4_LOS | IMR4_SLIP));
  602. }
  603. if (conf->media == IF_IFACE_T1) {
  604. cpc_writeb(falcbase + F_REG(IMR3, ch),
  605. cpc_readb(falcbase + F_REG(IMR3, ch)) & ~IMR3_LLBSC);
  606. } else {
  607. cpc_writeb(falcbase + F_REG(IPC, ch),
  608. cpc_readb(falcbase + F_REG(IPC, ch)) | IPC_SCI);
  609. if (conf->fr_mode == PC300_FR_UNFRAMED) {
  610. cpc_writeb(falcbase + F_REG(IMR2, ch),
  611. cpc_readb(falcbase + F_REG(IMR2, ch)) & ~(IMR2_LOS));
  612. } else {
  613. cpc_writeb(falcbase + F_REG(IMR2, ch),
  614. cpc_readb(falcbase + F_REG(IMR2, ch)) &
  615. ~(IMR2_FAR | IMR2_LFA | IMR2_AIS | IMR2_LOS));
  616. if (pfalc->multiframe_mode) {
  617. cpc_writeb(falcbase + F_REG(IMR2, ch),
  618. cpc_readb(falcbase + F_REG(IMR2, ch)) &
  619. ~(IMR2_T400MS | IMR2_MFAR));
  620. } else {
  621. cpc_writeb(falcbase + F_REG(IMR2, ch),
  622. cpc_readb(falcbase + F_REG(IMR2, ch)) |
  623. IMR2_T400MS | IMR2_MFAR);
  624. }
  625. }
  626. }
  627. }
  628. static void falc_open_timeslot(pc300_t * card, int ch, int timeslot)
  629. {
  630. void __iomem *falcbase = card->hw.falcbase;
  631. ucchar tshf = card->chan[ch].falc.offset;
  632. cpc_writeb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch),
  633. cpc_readb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch)) &
  634. ~(0x80 >> ((timeslot - tshf) & 0x07)));
  635. cpc_writeb(falcbase + F_REG((TTR1 + timeslot / 8), ch),
  636. cpc_readb(falcbase + F_REG((TTR1 + timeslot / 8), ch)) |
  637. (0x80 >> (timeslot & 0x07)));
  638. cpc_writeb(falcbase + F_REG((RTR1 + timeslot / 8), ch),
  639. cpc_readb(falcbase + F_REG((RTR1 + timeslot / 8), ch)) |
  640. (0x80 >> (timeslot & 0x07)));
  641. }
  642. static void falc_close_timeslot(pc300_t * card, int ch, int timeslot)
  643. {
  644. void __iomem *falcbase = card->hw.falcbase;
  645. ucchar tshf = card->chan[ch].falc.offset;
  646. cpc_writeb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch),
  647. cpc_readb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch)) |
  648. (0x80 >> ((timeslot - tshf) & 0x07)));
  649. cpc_writeb(falcbase + F_REG((TTR1 + timeslot / 8), ch),
  650. cpc_readb(falcbase + F_REG((TTR1 + timeslot / 8), ch)) &
  651. ~(0x80 >> (timeslot & 0x07)));
  652. cpc_writeb(falcbase + F_REG((RTR1 + timeslot / 8), ch),
  653. cpc_readb(falcbase + F_REG((RTR1 + timeslot / 8), ch)) &
  654. ~(0x80 >> (timeslot & 0x07)));
  655. }
  656. static void falc_close_all_timeslots(pc300_t * card, int ch)
  657. {
  658. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  659. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  660. void __iomem *falcbase = card->hw.falcbase;
  661. cpc_writeb(falcbase + F_REG(ICB1, ch), 0xff);
  662. cpc_writeb(falcbase + F_REG(TTR1, ch), 0);
  663. cpc_writeb(falcbase + F_REG(RTR1, ch), 0);
  664. cpc_writeb(falcbase + F_REG(ICB2, ch), 0xff);
  665. cpc_writeb(falcbase + F_REG(TTR2, ch), 0);
  666. cpc_writeb(falcbase + F_REG(RTR2, ch), 0);
  667. cpc_writeb(falcbase + F_REG(ICB3, ch), 0xff);
  668. cpc_writeb(falcbase + F_REG(TTR3, ch), 0);
  669. cpc_writeb(falcbase + F_REG(RTR3, ch), 0);
  670. if (conf->media == IF_IFACE_E1) {
  671. cpc_writeb(falcbase + F_REG(ICB4, ch), 0xff);
  672. cpc_writeb(falcbase + F_REG(TTR4, ch), 0);
  673. cpc_writeb(falcbase + F_REG(RTR4, ch), 0);
  674. }
  675. }
  676. static void falc_open_all_timeslots(pc300_t * card, int ch)
  677. {
  678. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  679. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  680. void __iomem *falcbase = card->hw.falcbase;
  681. cpc_writeb(falcbase + F_REG(ICB1, ch), 0);
  682. if (conf->fr_mode == PC300_FR_UNFRAMED) {
  683. cpc_writeb(falcbase + F_REG(TTR1, ch), 0xff);
  684. cpc_writeb(falcbase + F_REG(RTR1, ch), 0xff);
  685. } else {
  686. /* Timeslot 0 is never enabled */
  687. cpc_writeb(falcbase + F_REG(TTR1, ch), 0x7f);
  688. cpc_writeb(falcbase + F_REG(RTR1, ch), 0x7f);
  689. }
  690. cpc_writeb(falcbase + F_REG(ICB2, ch), 0);
  691. cpc_writeb(falcbase + F_REG(TTR2, ch), 0xff);
  692. cpc_writeb(falcbase + F_REG(RTR2, ch), 0xff);
  693. cpc_writeb(falcbase + F_REG(ICB3, ch), 0);
  694. cpc_writeb(falcbase + F_REG(TTR3, ch), 0xff);
  695. cpc_writeb(falcbase + F_REG(RTR3, ch), 0xff);
  696. if (conf->media == IF_IFACE_E1) {
  697. cpc_writeb(falcbase + F_REG(ICB4, ch), 0);
  698. cpc_writeb(falcbase + F_REG(TTR4, ch), 0xff);
  699. cpc_writeb(falcbase + F_REG(RTR4, ch), 0xff);
  700. } else {
  701. cpc_writeb(falcbase + F_REG(ICB4, ch), 0xff);
  702. cpc_writeb(falcbase + F_REG(TTR4, ch), 0x80);
  703. cpc_writeb(falcbase + F_REG(RTR4, ch), 0x80);
  704. }
  705. }
  706. static void falc_init_timeslot(pc300_t * card, int ch)
  707. {
  708. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  709. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  710. falc_t *pfalc = (falc_t *) & chan->falc;
  711. int tslot;
  712. for (tslot = 0; tslot < pfalc->num_channels; tslot++) {
  713. if (conf->tslot_bitmap & (1 << tslot)) {
  714. // Channel enabled
  715. falc_open_timeslot(card, ch, tslot + 1);
  716. } else {
  717. // Channel disabled
  718. falc_close_timeslot(card, ch, tslot + 1);
  719. }
  720. }
  721. }
  722. static void falc_enable_comm(pc300_t * card, int ch)
  723. {
  724. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  725. falc_t *pfalc = (falc_t *) & chan->falc;
  726. if (pfalc->full_bandwidth) {
  727. falc_open_all_timeslots(card, ch);
  728. } else {
  729. falc_init_timeslot(card, ch);
  730. }
  731. // CTS/DCD ON
  732. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
  733. cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) &
  734. ~((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch)));
  735. }
  736. static void falc_disable_comm(pc300_t * card, int ch)
  737. {
  738. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  739. falc_t *pfalc = (falc_t *) & chan->falc;
  740. if (pfalc->loop_active != 2) {
  741. falc_close_all_timeslots(card, ch);
  742. }
  743. // CTS/DCD OFF
  744. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
  745. cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
  746. ((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch)));
  747. }
  748. static void falc_init_t1(pc300_t * card, int ch)
  749. {
  750. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  751. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  752. falc_t *pfalc = (falc_t *) & chan->falc;
  753. void __iomem *falcbase = card->hw.falcbase;
  754. ucchar dja = (ch ? (LIM2_DJA2 | LIM2_DJA1) : 0);
  755. /* Switch to T1 mode (PCM 24) */
  756. cpc_writeb(falcbase + F_REG(FMR1, ch), FMR1_PMOD);
  757. /* Wait 20 us for setup */
  758. udelay(20);
  759. /* Transmit Buffer Size (1 frame) */
  760. cpc_writeb(falcbase + F_REG(SIC1, ch), SIC1_XBS0);
  761. /* Clock mode */
  762. if (conf->phys_settings.clock_type == CLOCK_INT) { /* Master mode */
  763. cpc_writeb(falcbase + F_REG(LIM0, ch),
  764. cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_MAS);
  765. } else { /* Slave mode */
  766. cpc_writeb(falcbase + F_REG(LIM0, ch),
  767. cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_MAS);
  768. cpc_writeb(falcbase + F_REG(LOOP, ch),
  769. cpc_readb(falcbase + F_REG(LOOP, ch)) & ~LOOP_RTM);
  770. }
  771. cpc_writeb(falcbase + F_REG(IPC, ch), IPC_SCI);
  772. cpc_writeb(falcbase + F_REG(FMR0, ch),
  773. cpc_readb(falcbase + F_REG(FMR0, ch)) &
  774. ~(FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1));
  775. switch (conf->lcode) {
  776. case PC300_LC_AMI:
  777. cpc_writeb(falcbase + F_REG(FMR0, ch),
  778. cpc_readb(falcbase + F_REG(FMR0, ch)) |
  779. FMR0_XC1 | FMR0_RC1);
  780. /* Clear Channel register to ON for all channels */
  781. cpc_writeb(falcbase + F_REG(CCB1, ch), 0xff);
  782. cpc_writeb(falcbase + F_REG(CCB2, ch), 0xff);
  783. cpc_writeb(falcbase + F_REG(CCB3, ch), 0xff);
  784. break;
  785. case PC300_LC_B8ZS:
  786. cpc_writeb(falcbase + F_REG(FMR0, ch),
  787. cpc_readb(falcbase + F_REG(FMR0, ch)) |
  788. FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1);
  789. break;
  790. case PC300_LC_NRZ:
  791. cpc_writeb(falcbase + F_REG(FMR0, ch),
  792. cpc_readb(falcbase + F_REG(FMR0, ch)) | 0x00);
  793. break;
  794. }
  795. cpc_writeb(falcbase + F_REG(LIM0, ch),
  796. cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_ELOS);
  797. cpc_writeb(falcbase + F_REG(LIM0, ch),
  798. cpc_readb(falcbase + F_REG(LIM0, ch)) & ~(LIM0_SCL1 | LIM0_SCL0));
  799. /* Set interface mode to 2 MBPS */
  800. cpc_writeb(falcbase + F_REG(FMR1, ch),
  801. cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_IMOD);
  802. switch (conf->fr_mode) {
  803. case PC300_FR_ESF:
  804. pfalc->multiframe_mode = 0;
  805. cpc_writeb(falcbase + F_REG(FMR4, ch),
  806. cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_FM1);
  807. cpc_writeb(falcbase + F_REG(FMR1, ch),
  808. cpc_readb(falcbase + F_REG(FMR1, ch)) |
  809. FMR1_CRC | FMR1_EDL);
  810. cpc_writeb(falcbase + F_REG(XDL1, ch), 0);
  811. cpc_writeb(falcbase + F_REG(XDL2, ch), 0);
  812. cpc_writeb(falcbase + F_REG(XDL3, ch), 0);
  813. cpc_writeb(falcbase + F_REG(FMR0, ch),
  814. cpc_readb(falcbase + F_REG(FMR0, ch)) & ~FMR0_SRAF);
  815. cpc_writeb(falcbase + F_REG(FMR2, ch),
  816. cpc_readb(falcbase + F_REG(FMR2,ch)) | FMR2_MCSP | FMR2_SSP);
  817. break;
  818. case PC300_FR_D4:
  819. pfalc->multiframe_mode = 1;
  820. cpc_writeb(falcbase + F_REG(FMR4, ch),
  821. cpc_readb(falcbase + F_REG(FMR4, ch)) &
  822. ~(FMR4_FM1 | FMR4_FM0));
  823. cpc_writeb(falcbase + F_REG(FMR0, ch),
  824. cpc_readb(falcbase + F_REG(FMR0, ch)) | FMR0_SRAF);
  825. cpc_writeb(falcbase + F_REG(FMR2, ch),
  826. cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_SSP);
  827. break;
  828. }
  829. /* Enable Automatic Resynchronization */
  830. cpc_writeb(falcbase + F_REG(FMR4, ch),
  831. cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_AUTO);
  832. /* Transmit Automatic Remote Alarm */
  833. cpc_writeb(falcbase + F_REG(FMR2, ch),
  834. cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA);
  835. /* Channel translation mode 1 : one to one */
  836. cpc_writeb(falcbase + F_REG(FMR1, ch),
  837. cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_CTM);
  838. /* No signaling */
  839. cpc_writeb(falcbase + F_REG(FMR1, ch),
  840. cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_SIGM);
  841. cpc_writeb(falcbase + F_REG(FMR5, ch),
  842. cpc_readb(falcbase + F_REG(FMR5, ch)) &
  843. ~(FMR5_EIBR | FMR5_SRS));
  844. cpc_writeb(falcbase + F_REG(CCR1, ch), 0);
  845. cpc_writeb(falcbase + F_REG(LIM1, ch),
  846. cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RIL0 | LIM1_RIL1);
  847. switch (conf->lbo) {
  848. /* Provides proper Line Build Out */
  849. case PC300_LBO_0_DB:
  850. cpc_writeb(falcbase + F_REG(LIM2, ch), (LIM2_LOS1 | dja));
  851. cpc_writeb(falcbase + F_REG(XPM0, ch), 0x5a);
  852. cpc_writeb(falcbase + F_REG(XPM1, ch), 0x8f);
  853. cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
  854. break;
  855. case PC300_LBO_7_5_DB:
  856. cpc_writeb(falcbase + F_REG(LIM2, ch), (0x40 | LIM2_LOS1 | dja));
  857. cpc_writeb(falcbase + F_REG(XPM0, ch), 0x11);
  858. cpc_writeb(falcbase + F_REG(XPM1, ch), 0x02);
  859. cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
  860. break;
  861. case PC300_LBO_15_DB:
  862. cpc_writeb(falcbase + F_REG(LIM2, ch), (0x80 | LIM2_LOS1 | dja));
  863. cpc_writeb(falcbase + F_REG(XPM0, ch), 0x8e);
  864. cpc_writeb(falcbase + F_REG(XPM1, ch), 0x01);
  865. cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
  866. break;
  867. case PC300_LBO_22_5_DB:
  868. cpc_writeb(falcbase + F_REG(LIM2, ch), (0xc0 | LIM2_LOS1 | dja));
  869. cpc_writeb(falcbase + F_REG(XPM0, ch), 0x09);
  870. cpc_writeb(falcbase + F_REG(XPM1, ch), 0x01);
  871. cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
  872. break;
  873. }
  874. /* Transmit Clock-Slot Offset */
  875. cpc_writeb(falcbase + F_REG(XC0, ch),
  876. cpc_readb(falcbase + F_REG(XC0, ch)) | 0x01);
  877. /* Transmit Time-slot Offset */
  878. cpc_writeb(falcbase + F_REG(XC1, ch), 0x3e);
  879. /* Receive Clock-Slot offset */
  880. cpc_writeb(falcbase + F_REG(RC0, ch), 0x05);
  881. /* Receive Time-slot offset */
  882. cpc_writeb(falcbase + F_REG(RC1, ch), 0x00);
  883. /* LOS Detection after 176 consecutive 0s */
  884. cpc_writeb(falcbase + F_REG(PCDR, ch), 0x0a);
  885. /* LOS Recovery after 22 ones in the time window of PCD */
  886. cpc_writeb(falcbase + F_REG(PCRR, ch), 0x15);
  887. cpc_writeb(falcbase + F_REG(IDLE, ch), 0x7f);
  888. if (conf->fr_mode == PC300_FR_ESF_JAPAN) {
  889. cpc_writeb(falcbase + F_REG(RC1, ch),
  890. cpc_readb(falcbase + F_REG(RC1, ch)) | 0x80);
  891. }
  892. falc_close_all_timeslots(card, ch);
  893. }
  894. static void falc_init_e1(pc300_t * card, int ch)
  895. {
  896. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  897. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  898. falc_t *pfalc = (falc_t *) & chan->falc;
  899. void __iomem *falcbase = card->hw.falcbase;
  900. ucchar dja = (ch ? (LIM2_DJA2 | LIM2_DJA1) : 0);
  901. /* Switch to E1 mode (PCM 30) */
  902. cpc_writeb(falcbase + F_REG(FMR1, ch),
  903. cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_PMOD);
  904. /* Clock mode */
  905. if (conf->phys_settings.clock_type == CLOCK_INT) { /* Master mode */
  906. cpc_writeb(falcbase + F_REG(LIM0, ch),
  907. cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_MAS);
  908. } else { /* Slave mode */
  909. cpc_writeb(falcbase + F_REG(LIM0, ch),
  910. cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_MAS);
  911. }
  912. cpc_writeb(falcbase + F_REG(LOOP, ch),
  913. cpc_readb(falcbase + F_REG(LOOP, ch)) & ~LOOP_SFM);
  914. cpc_writeb(falcbase + F_REG(IPC, ch), IPC_SCI);
  915. cpc_writeb(falcbase + F_REG(FMR0, ch),
  916. cpc_readb(falcbase + F_REG(FMR0, ch)) &
  917. ~(FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1));
  918. switch (conf->lcode) {
  919. case PC300_LC_AMI:
  920. cpc_writeb(falcbase + F_REG(FMR0, ch),
  921. cpc_readb(falcbase + F_REG(FMR0, ch)) |
  922. FMR0_XC1 | FMR0_RC1);
  923. break;
  924. case PC300_LC_HDB3:
  925. cpc_writeb(falcbase + F_REG(FMR0, ch),
  926. cpc_readb(falcbase + F_REG(FMR0, ch)) |
  927. FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1);
  928. break;
  929. case PC300_LC_NRZ:
  930. break;
  931. }
  932. cpc_writeb(falcbase + F_REG(LIM0, ch),
  933. cpc_readb(falcbase + F_REG(LIM0, ch)) & ~(LIM0_SCL1 | LIM0_SCL0));
  934. /* Set interface mode to 2 MBPS */
  935. cpc_writeb(falcbase + F_REG(FMR1, ch),
  936. cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_IMOD);
  937. cpc_writeb(falcbase + F_REG(XPM0, ch), 0x18);
  938. cpc_writeb(falcbase + F_REG(XPM1, ch), 0x03);
  939. cpc_writeb(falcbase + F_REG(XPM2, ch), 0x00);
  940. switch (conf->fr_mode) {
  941. case PC300_FR_MF_CRC4:
  942. pfalc->multiframe_mode = 1;
  943. cpc_writeb(falcbase + F_REG(FMR1, ch),
  944. cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_XFS);
  945. cpc_writeb(falcbase + F_REG(FMR2, ch),
  946. cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_RFS1);
  947. cpc_writeb(falcbase + F_REG(FMR2, ch),
  948. cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_RFS0);
  949. cpc_writeb(falcbase + F_REG(FMR3, ch),
  950. cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_EXTIW);
  951. /* MultiFrame Resynchronization */
  952. cpc_writeb(falcbase + F_REG(FMR1, ch),
  953. cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_MFCS);
  954. /* Automatic Loss of Multiframe > 914 CRC errors */
  955. cpc_writeb(falcbase + F_REG(FMR2, ch),
  956. cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_ALMF);
  957. /* S1 and SI1/SI2 spare Bits set to 1 */
  958. cpc_writeb(falcbase + F_REG(XSP, ch),
  959. cpc_readb(falcbase + F_REG(XSP, ch)) & ~XSP_AXS);
  960. cpc_writeb(falcbase + F_REG(XSP, ch),
  961. cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_EBP);
  962. cpc_writeb(falcbase + F_REG(XSP, ch),
  963. cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_XS13 | XSP_XS15);
  964. /* Automatic Force Resynchronization */
  965. cpc_writeb(falcbase + F_REG(FMR1, ch),
  966. cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_AFR);
  967. /* Transmit Automatic Remote Alarm */
  968. cpc_writeb(falcbase + F_REG(FMR2, ch),
  969. cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA);
  970. /* Transmit Spare Bits for National Use (Y, Sn, Sa) */
  971. cpc_writeb(falcbase + F_REG(XSW, ch),
  972. cpc_readb(falcbase + F_REG(XSW, ch)) |
  973. XSW_XY0 | XSW_XY1 | XSW_XY2 | XSW_XY3 | XSW_XY4);
  974. break;
  975. case PC300_FR_MF_NON_CRC4:
  976. case PC300_FR_D4:
  977. pfalc->multiframe_mode = 0;
  978. cpc_writeb(falcbase + F_REG(FMR1, ch),
  979. cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_XFS);
  980. cpc_writeb(falcbase + F_REG(FMR2, ch),
  981. cpc_readb(falcbase + F_REG(FMR2, ch)) &
  982. ~(FMR2_RFS1 | FMR2_RFS0));
  983. cpc_writeb(falcbase + F_REG(XSW, ch),
  984. cpc_readb(falcbase + F_REG(XSW, ch)) | XSW_XSIS);
  985. cpc_writeb(falcbase + F_REG(XSP, ch),
  986. cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_XSIF);
  987. /* Automatic Force Resynchronization */
  988. cpc_writeb(falcbase + F_REG(FMR1, ch),
  989. cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_AFR);
  990. /* Transmit Automatic Remote Alarm */
  991. cpc_writeb(falcbase + F_REG(FMR2, ch),
  992. cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA);
  993. /* Transmit Spare Bits for National Use (Y, Sn, Sa) */
  994. cpc_writeb(falcbase + F_REG(XSW, ch),
  995. cpc_readb(falcbase + F_REG(XSW, ch)) |
  996. XSW_XY0 | XSW_XY1 | XSW_XY2 | XSW_XY3 | XSW_XY4);
  997. break;
  998. case PC300_FR_UNFRAMED:
  999. pfalc->multiframe_mode = 0;
  1000. cpc_writeb(falcbase + F_REG(FMR1, ch),
  1001. cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_XFS);
  1002. cpc_writeb(falcbase + F_REG(FMR2, ch),
  1003. cpc_readb(falcbase + F_REG(FMR2, ch)) &
  1004. ~(FMR2_RFS1 | FMR2_RFS0));
  1005. cpc_writeb(falcbase + F_REG(XSP, ch),
  1006. cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_TT0);
  1007. cpc_writeb(falcbase + F_REG(XSW, ch),
  1008. cpc_readb(falcbase + F_REG(XSW, ch)) &
  1009. ~(XSW_XTM|XSW_XY0|XSW_XY1|XSW_XY2|XSW_XY3|XSW_XY4));
  1010. cpc_writeb(falcbase + F_REG(TSWM, ch), 0xff);
  1011. cpc_writeb(falcbase + F_REG(FMR2, ch),
  1012. cpc_readb(falcbase + F_REG(FMR2, ch)) |
  1013. (FMR2_RTM | FMR2_DAIS));
  1014. cpc_writeb(falcbase + F_REG(FMR2, ch),
  1015. cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_AXRA);
  1016. cpc_writeb(falcbase + F_REG(FMR1, ch),
  1017. cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_AFR);
  1018. pfalc->sync = 1;
  1019. cpc_writeb(falcbase + card->hw.cpld_reg2,
  1020. cpc_readb(falcbase + card->hw.cpld_reg2) |
  1021. (CPLD_REG2_FALC_LED2 << (2 * ch)));
  1022. break;
  1023. }
  1024. /* No signaling */
  1025. cpc_writeb(falcbase + F_REG(XSP, ch),
  1026. cpc_readb(falcbase + F_REG(XSP, ch)) & ~XSP_CASEN);
  1027. cpc_writeb(falcbase + F_REG(CCR1, ch), 0);
  1028. cpc_writeb(falcbase + F_REG(LIM1, ch),
  1029. cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RIL0 | LIM1_RIL1);
  1030. cpc_writeb(falcbase + F_REG(LIM2, ch), (LIM2_LOS1 | dja));
  1031. /* Transmit Clock-Slot Offset */
  1032. cpc_writeb(falcbase + F_REG(XC0, ch),
  1033. cpc_readb(falcbase + F_REG(XC0, ch)) | 0x01);
  1034. /* Transmit Time-slot Offset */
  1035. cpc_writeb(falcbase + F_REG(XC1, ch), 0x3e);
  1036. /* Receive Clock-Slot offset */
  1037. cpc_writeb(falcbase + F_REG(RC0, ch), 0x05);
  1038. /* Receive Time-slot offset */
  1039. cpc_writeb(falcbase + F_REG(RC1, ch), 0x00);
  1040. /* LOS Detection after 176 consecutive 0s */
  1041. cpc_writeb(falcbase + F_REG(PCDR, ch), 0x0a);
  1042. /* LOS Recovery after 22 ones in the time window of PCD */
  1043. cpc_writeb(falcbase + F_REG(PCRR, ch), 0x15);
  1044. cpc_writeb(falcbase + F_REG(IDLE, ch), 0x7f);
  1045. falc_close_all_timeslots(card, ch);
  1046. }
  1047. static void falc_init_hdlc(pc300_t * card, int ch)
  1048. {
  1049. void __iomem *falcbase = card->hw.falcbase;
  1050. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1051. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  1052. /* Enable transparent data transfer */
  1053. if (conf->fr_mode == PC300_FR_UNFRAMED) {
  1054. cpc_writeb(falcbase + F_REG(MODE, ch), 0);
  1055. } else {
  1056. cpc_writeb(falcbase + F_REG(MODE, ch),
  1057. cpc_readb(falcbase + F_REG(MODE, ch)) |
  1058. (MODE_HRAC | MODE_MDS2));
  1059. cpc_writeb(falcbase + F_REG(RAH2, ch), 0xff);
  1060. cpc_writeb(falcbase + F_REG(RAH1, ch), 0xff);
  1061. cpc_writeb(falcbase + F_REG(RAL2, ch), 0xff);
  1062. cpc_writeb(falcbase + F_REG(RAL1, ch), 0xff);
  1063. }
  1064. /* Tx/Rx reset */
  1065. falc_issue_cmd(card, ch, CMDR_RRES | CMDR_XRES | CMDR_SRES);
  1066. /* Enable interrupt sources */
  1067. falc_intr_enable(card, ch);
  1068. }
  1069. static void te_config(pc300_t * card, int ch)
  1070. {
  1071. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1072. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  1073. falc_t *pfalc = (falc_t *) & chan->falc;
  1074. void __iomem *falcbase = card->hw.falcbase;
  1075. ucchar dummy;
  1076. unsigned long flags;
  1077. memset(pfalc, 0, sizeof(falc_t));
  1078. switch (conf->media) {
  1079. case IF_IFACE_T1:
  1080. pfalc->num_channels = NUM_OF_T1_CHANNELS;
  1081. pfalc->offset = 1;
  1082. break;
  1083. case IF_IFACE_E1:
  1084. pfalc->num_channels = NUM_OF_E1_CHANNELS;
  1085. pfalc->offset = 0;
  1086. break;
  1087. }
  1088. if (conf->tslot_bitmap == 0xffffffffUL)
  1089. pfalc->full_bandwidth = 1;
  1090. else
  1091. pfalc->full_bandwidth = 0;
  1092. CPC_LOCK(card, flags);
  1093. /* Reset the FALC chip */
  1094. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
  1095. cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
  1096. (CPLD_REG1_FALC_RESET << (2 * ch)));
  1097. udelay(10000);
  1098. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
  1099. cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) &
  1100. ~(CPLD_REG1_FALC_RESET << (2 * ch)));
  1101. if (conf->media == IF_IFACE_T1) {
  1102. falc_init_t1(card, ch);
  1103. } else {
  1104. falc_init_e1(card, ch);
  1105. }
  1106. falc_init_hdlc(card, ch);
  1107. if (conf->rx_sens == PC300_RX_SENS_SH) {
  1108. cpc_writeb(falcbase + F_REG(LIM0, ch),
  1109. cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_EQON);
  1110. } else {
  1111. cpc_writeb(falcbase + F_REG(LIM0, ch),
  1112. cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_EQON);
  1113. }
  1114. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
  1115. cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) |
  1116. ((CPLD_REG2_FALC_TX_CLK | CPLD_REG2_FALC_RX_CLK) << (2 * ch)));
  1117. /* Clear all interrupt registers */
  1118. dummy = cpc_readb(falcbase + F_REG(FISR0, ch)) +
  1119. cpc_readb(falcbase + F_REG(FISR1, ch)) +
  1120. cpc_readb(falcbase + F_REG(FISR2, ch)) +
  1121. cpc_readb(falcbase + F_REG(FISR3, ch));
  1122. CPC_UNLOCK(card, flags);
  1123. }
  1124. static void falc_check_status(pc300_t * card, int ch, unsigned char frs0)
  1125. {
  1126. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1127. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  1128. falc_t *pfalc = (falc_t *) & chan->falc;
  1129. void __iomem *falcbase = card->hw.falcbase;
  1130. /* Verify LOS */
  1131. if (frs0 & FRS0_LOS) {
  1132. if (!pfalc->red_alarm) {
  1133. pfalc->red_alarm = 1;
  1134. pfalc->los++;
  1135. if (!pfalc->blue_alarm) {
  1136. // EVENT_FALC_ABNORMAL
  1137. if (conf->media == IF_IFACE_T1) {
  1138. /* Disable this interrupt as it may otherwise interfere
  1139. * with other working boards. */
  1140. cpc_writeb(falcbase + F_REG(IMR0, ch),
  1141. cpc_readb(falcbase + F_REG(IMR0, ch))
  1142. | IMR0_PDEN);
  1143. }
  1144. falc_disable_comm(card, ch);
  1145. // EVENT_FALC_ABNORMAL
  1146. }
  1147. }
  1148. } else {
  1149. if (pfalc->red_alarm) {
  1150. pfalc->red_alarm = 0;
  1151. pfalc->losr++;
  1152. }
  1153. }
  1154. if (conf->fr_mode != PC300_FR_UNFRAMED) {
  1155. /* Verify AIS alarm */
  1156. if (frs0 & FRS0_AIS) {
  1157. if (!pfalc->blue_alarm) {
  1158. pfalc->blue_alarm = 1;
  1159. pfalc->ais++;
  1160. // EVENT_AIS
  1161. if (conf->media == IF_IFACE_T1) {
  1162. /* Disable this interrupt as it may otherwise interfere with other working boards. */
  1163. cpc_writeb(falcbase + F_REG(IMR0, ch),
  1164. cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
  1165. }
  1166. falc_disable_comm(card, ch);
  1167. // EVENT_AIS
  1168. }
  1169. } else {
  1170. pfalc->blue_alarm = 0;
  1171. }
  1172. /* Verify LFA */
  1173. if (frs0 & FRS0_LFA) {
  1174. if (!pfalc->loss_fa) {
  1175. pfalc->loss_fa = 1;
  1176. pfalc->lfa++;
  1177. if (!pfalc->blue_alarm && !pfalc->red_alarm) {
  1178. // EVENT_FALC_ABNORMAL
  1179. if (conf->media == IF_IFACE_T1) {
  1180. /* Disable this interrupt as it may otherwise
  1181. * interfere with other working boards. */
  1182. cpc_writeb(falcbase + F_REG(IMR0, ch),
  1183. cpc_readb(falcbase + F_REG(IMR0, ch))
  1184. | IMR0_PDEN);
  1185. }
  1186. falc_disable_comm(card, ch);
  1187. // EVENT_FALC_ABNORMAL
  1188. }
  1189. }
  1190. } else {
  1191. if (pfalc->loss_fa) {
  1192. pfalc->loss_fa = 0;
  1193. pfalc->farec++;
  1194. }
  1195. }
  1196. /* Verify LMFA */
  1197. if (pfalc->multiframe_mode && (frs0 & FRS0_LMFA)) {
  1198. /* D4 or CRC4 frame mode */
  1199. if (!pfalc->loss_mfa) {
  1200. pfalc->loss_mfa = 1;
  1201. pfalc->lmfa++;
  1202. if (!pfalc->blue_alarm && !pfalc->red_alarm &&
  1203. !pfalc->loss_fa) {
  1204. // EVENT_FALC_ABNORMAL
  1205. if (conf->media == IF_IFACE_T1) {
  1206. /* Disable this interrupt as it may otherwise
  1207. * interfere with other working boards. */
  1208. cpc_writeb(falcbase + F_REG(IMR0, ch),
  1209. cpc_readb(falcbase + F_REG(IMR0, ch))
  1210. | IMR0_PDEN);
  1211. }
  1212. falc_disable_comm(card, ch);
  1213. // EVENT_FALC_ABNORMAL
  1214. }
  1215. }
  1216. } else {
  1217. pfalc->loss_mfa = 0;
  1218. }
  1219. /* Verify Remote Alarm */
  1220. if (frs0 & FRS0_RRA) {
  1221. if (!pfalc->yellow_alarm) {
  1222. pfalc->yellow_alarm = 1;
  1223. pfalc->rai++;
  1224. if (pfalc->sync) {
  1225. // EVENT_RAI
  1226. falc_disable_comm(card, ch);
  1227. // EVENT_RAI
  1228. }
  1229. }
  1230. } else {
  1231. pfalc->yellow_alarm = 0;
  1232. }
  1233. } /* if !PC300_UNFRAMED */
  1234. if (pfalc->red_alarm || pfalc->loss_fa ||
  1235. pfalc->loss_mfa || pfalc->blue_alarm) {
  1236. if (pfalc->sync) {
  1237. pfalc->sync = 0;
  1238. chan->d.line_off++;
  1239. cpc_writeb(falcbase + card->hw.cpld_reg2,
  1240. cpc_readb(falcbase + card->hw.cpld_reg2) &
  1241. ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
  1242. }
  1243. } else {
  1244. if (!pfalc->sync) {
  1245. pfalc->sync = 1;
  1246. chan->d.line_on++;
  1247. cpc_writeb(falcbase + card->hw.cpld_reg2,
  1248. cpc_readb(falcbase + card->hw.cpld_reg2) |
  1249. (CPLD_REG2_FALC_LED2 << (2 * ch)));
  1250. }
  1251. }
  1252. if (pfalc->sync && !pfalc->yellow_alarm) {
  1253. if (!pfalc->active) {
  1254. // EVENT_FALC_NORMAL
  1255. if (pfalc->loop_active) {
  1256. return;
  1257. }
  1258. if (conf->media == IF_IFACE_T1) {
  1259. cpc_writeb(falcbase + F_REG(IMR0, ch),
  1260. cpc_readb(falcbase + F_REG(IMR0, ch)) & ~IMR0_PDEN);
  1261. }
  1262. falc_enable_comm(card, ch);
  1263. // EVENT_FALC_NORMAL
  1264. pfalc->active = 1;
  1265. }
  1266. } else {
  1267. if (pfalc->active) {
  1268. pfalc->active = 0;
  1269. }
  1270. }
  1271. }
  1272. static void falc_update_stats(pc300_t * card, int ch)
  1273. {
  1274. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1275. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  1276. falc_t *pfalc = (falc_t *) & chan->falc;
  1277. void __iomem *falcbase = card->hw.falcbase;
  1278. ucshort counter;
  1279. counter = cpc_readb(falcbase + F_REG(FECL, ch));
  1280. counter |= cpc_readb(falcbase + F_REG(FECH, ch)) << 8;
  1281. pfalc->fec += counter;
  1282. counter = cpc_readb(falcbase + F_REG(CVCL, ch));
  1283. counter |= cpc_readb(falcbase + F_REG(CVCH, ch)) << 8;
  1284. pfalc->cvc += counter;
  1285. counter = cpc_readb(falcbase + F_REG(CECL, ch));
  1286. counter |= cpc_readb(falcbase + F_REG(CECH, ch)) << 8;
  1287. pfalc->cec += counter;
  1288. counter = cpc_readb(falcbase + F_REG(EBCL, ch));
  1289. counter |= cpc_readb(falcbase + F_REG(EBCH, ch)) << 8;
  1290. pfalc->ebc += counter;
  1291. if (cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) {
  1292. mdelay(10);
  1293. counter = cpc_readb(falcbase + F_REG(BECL, ch));
  1294. counter |= cpc_readb(falcbase + F_REG(BECH, ch)) << 8;
  1295. pfalc->bec += counter;
  1296. if (((conf->media == IF_IFACE_T1) &&
  1297. (cpc_readb(falcbase + F_REG(FRS1, ch)) & FRS1_LLBAD) &&
  1298. (!(cpc_readb(falcbase + F_REG(FRS1, ch)) & FRS1_PDEN)))
  1299. ||
  1300. ((conf->media == IF_IFACE_E1) &&
  1301. (cpc_readb(falcbase + F_REG(RSP, ch)) & RSP_LLBAD))) {
  1302. pfalc->prbs = 2;
  1303. } else {
  1304. pfalc->prbs = 1;
  1305. }
  1306. }
  1307. }
  1308. /*----------------------------------------------------------------------------
  1309. * falc_remote_loop
  1310. *----------------------------------------------------------------------------
  1311. * Description: In the remote loopback mode the clock and data recovered
  1312. * from the line inputs RL1/2 or RDIP/RDIN are routed back
  1313. * to the line outputs XL1/2 or XDOP/XDON via the analog
  1314. * transmitter. As in normal mode they are processsed by
  1315. * the synchronizer and then sent to the system interface.
  1316. *----------------------------------------------------------------------------
  1317. */
  1318. static void falc_remote_loop(pc300_t * card, int ch, int loop_on)
  1319. {
  1320. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1321. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  1322. falc_t *pfalc = (falc_t *) & chan->falc;
  1323. void __iomem *falcbase = card->hw.falcbase;
  1324. if (loop_on) {
  1325. // EVENT_FALC_ABNORMAL
  1326. if (conf->media == IF_IFACE_T1) {
  1327. /* Disable this interrupt as it may otherwise interfere with
  1328. * other working boards. */
  1329. cpc_writeb(falcbase + F_REG(IMR0, ch),
  1330. cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
  1331. }
  1332. falc_disable_comm(card, ch);
  1333. // EVENT_FALC_ABNORMAL
  1334. cpc_writeb(falcbase + F_REG(LIM1, ch),
  1335. cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RL);
  1336. pfalc->loop_active = 1;
  1337. } else {
  1338. cpc_writeb(falcbase + F_REG(LIM1, ch),
  1339. cpc_readb(falcbase + F_REG(LIM1, ch)) & ~LIM1_RL);
  1340. pfalc->sync = 0;
  1341. cpc_writeb(falcbase + card->hw.cpld_reg2,
  1342. cpc_readb(falcbase + card->hw.cpld_reg2) &
  1343. ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
  1344. pfalc->active = 0;
  1345. falc_issue_cmd(card, ch, CMDR_XRES);
  1346. pfalc->loop_active = 0;
  1347. }
  1348. }
  1349. /*----------------------------------------------------------------------------
  1350. * falc_local_loop
  1351. *----------------------------------------------------------------------------
  1352. * Description: The local loopback mode disconnects the receive lines
  1353. * RL1/RL2 resp. RDIP/RDIN from the receiver. Instead of the
  1354. * signals coming from the line the data provided by system
  1355. * interface are routed through the analog receiver back to
  1356. * the system interface. The unipolar bit stream will be
  1357. * undisturbed transmitted on the line. Receiver and transmitter
  1358. * coding must be identical.
  1359. *----------------------------------------------------------------------------
  1360. */
  1361. static void falc_local_loop(pc300_t * card, int ch, int loop_on)
  1362. {
  1363. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1364. falc_t *pfalc = (falc_t *) & chan->falc;
  1365. void __iomem *falcbase = card->hw.falcbase;
  1366. if (loop_on) {
  1367. cpc_writeb(falcbase + F_REG(LIM0, ch),
  1368. cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_LL);
  1369. pfalc->loop_active = 1;
  1370. } else {
  1371. cpc_writeb(falcbase + F_REG(LIM0, ch),
  1372. cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_LL);
  1373. pfalc->loop_active = 0;
  1374. }
  1375. }
  1376. /*----------------------------------------------------------------------------
  1377. * falc_payload_loop
  1378. *----------------------------------------------------------------------------
  1379. * Description: This routine allows to enable/disable payload loopback.
  1380. * When the payload loop is activated, the received 192 bits
  1381. * of payload data will be looped back to the transmit
  1382. * direction. The framing bits, CRC6 and DL bits are not
  1383. * looped. They are originated by the FALC-LH transmitter.
  1384. *----------------------------------------------------------------------------
  1385. */
  1386. static void falc_payload_loop(pc300_t * card, int ch, int loop_on)
  1387. {
  1388. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1389. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  1390. falc_t *pfalc = (falc_t *) & chan->falc;
  1391. void __iomem *falcbase = card->hw.falcbase;
  1392. if (loop_on) {
  1393. // EVENT_FALC_ABNORMAL
  1394. if (conf->media == IF_IFACE_T1) {
  1395. /* Disable this interrupt as it may otherwise interfere with
  1396. * other working boards. */
  1397. cpc_writeb(falcbase + F_REG(IMR0, ch),
  1398. cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
  1399. }
  1400. falc_disable_comm(card, ch);
  1401. // EVENT_FALC_ABNORMAL
  1402. cpc_writeb(falcbase + F_REG(FMR2, ch),
  1403. cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_PLB);
  1404. if (conf->media == IF_IFACE_T1) {
  1405. cpc_writeb(falcbase + F_REG(FMR4, ch),
  1406. cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_TM);
  1407. } else {
  1408. cpc_writeb(falcbase + F_REG(FMR5, ch),
  1409. cpc_readb(falcbase + F_REG(FMR5, ch)) | XSP_TT0);
  1410. }
  1411. falc_open_all_timeslots(card, ch);
  1412. pfalc->loop_active = 2;
  1413. } else {
  1414. cpc_writeb(falcbase + F_REG(FMR2, ch),
  1415. cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_PLB);
  1416. if (conf->media == IF_IFACE_T1) {
  1417. cpc_writeb(falcbase + F_REG(FMR4, ch),
  1418. cpc_readb(falcbase + F_REG(FMR4, ch)) & ~FMR4_TM);
  1419. } else {
  1420. cpc_writeb(falcbase + F_REG(FMR5, ch),
  1421. cpc_readb(falcbase + F_REG(FMR5, ch)) & ~XSP_TT0);
  1422. }
  1423. pfalc->sync = 0;
  1424. cpc_writeb(falcbase + card->hw.cpld_reg2,
  1425. cpc_readb(falcbase + card->hw.cpld_reg2) &
  1426. ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
  1427. pfalc->active = 0;
  1428. falc_issue_cmd(card, ch, CMDR_XRES);
  1429. pfalc->loop_active = 0;
  1430. }
  1431. }
  1432. /*----------------------------------------------------------------------------
  1433. * turn_off_xlu
  1434. *----------------------------------------------------------------------------
  1435. * Description: Turns XLU bit off in the proper register
  1436. *----------------------------------------------------------------------------
  1437. */
  1438. static void turn_off_xlu(pc300_t * card, int ch)
  1439. {
  1440. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1441. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  1442. void __iomem *falcbase = card->hw.falcbase;
  1443. if (conf->media == IF_IFACE_T1) {
  1444. cpc_writeb(falcbase + F_REG(FMR5, ch),
  1445. cpc_readb(falcbase + F_REG(FMR5, ch)) & ~FMR5_XLU);
  1446. } else {
  1447. cpc_writeb(falcbase + F_REG(FMR3, ch),
  1448. cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_XLU);
  1449. }
  1450. }
  1451. /*----------------------------------------------------------------------------
  1452. * turn_off_xld
  1453. *----------------------------------------------------------------------------
  1454. * Description: Turns XLD bit off in the proper register
  1455. *----------------------------------------------------------------------------
  1456. */
  1457. static void turn_off_xld(pc300_t * card, int ch)
  1458. {
  1459. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1460. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  1461. void __iomem *falcbase = card->hw.falcbase;
  1462. if (conf->media == IF_IFACE_T1) {
  1463. cpc_writeb(falcbase + F_REG(FMR5, ch),
  1464. cpc_readb(falcbase + F_REG(FMR5, ch)) & ~FMR5_XLD);
  1465. } else {
  1466. cpc_writeb(falcbase + F_REG(FMR3, ch),
  1467. cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_XLD);
  1468. }
  1469. }
  1470. /*----------------------------------------------------------------------------
  1471. * falc_generate_loop_up_code
  1472. *----------------------------------------------------------------------------
  1473. * Description: This routine writes the proper FALC chip register in order
  1474. * to generate a LOOP activation code over a T1/E1 line.
  1475. *----------------------------------------------------------------------------
  1476. */
  1477. static void falc_generate_loop_up_code(pc300_t * card, int ch)
  1478. {
  1479. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1480. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  1481. falc_t *pfalc = (falc_t *) & chan->falc;
  1482. void __iomem *falcbase = card->hw.falcbase;
  1483. if (conf->media == IF_IFACE_T1) {
  1484. cpc_writeb(falcbase + F_REG(FMR5, ch),
  1485. cpc_readb(falcbase + F_REG(FMR5, ch)) | FMR5_XLU);
  1486. } else {
  1487. cpc_writeb(falcbase + F_REG(FMR3, ch),
  1488. cpc_readb(falcbase + F_REG(FMR3, ch)) | FMR3_XLU);
  1489. }
  1490. // EVENT_FALC_ABNORMAL
  1491. if (conf->media == IF_IFACE_T1) {
  1492. /* Disable this interrupt as it may otherwise interfere with
  1493. * other working boards. */
  1494. cpc_writeb(falcbase + F_REG(IMR0, ch),
  1495. cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
  1496. }
  1497. falc_disable_comm(card, ch);
  1498. // EVENT_FALC_ABNORMAL
  1499. pfalc->loop_gen = 1;
  1500. }
  1501. /*----------------------------------------------------------------------------
  1502. * falc_generate_loop_down_code
  1503. *----------------------------------------------------------------------------
  1504. * Description: This routine writes the proper FALC chip register in order
  1505. * to generate a LOOP deactivation code over a T1/E1 line.
  1506. *----------------------------------------------------------------------------
  1507. */
  1508. static void falc_generate_loop_down_code(pc300_t * card, int ch)
  1509. {
  1510. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1511. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  1512. falc_t *pfalc = (falc_t *) & chan->falc;
  1513. void __iomem *falcbase = card->hw.falcbase;
  1514. if (conf->media == IF_IFACE_T1) {
  1515. cpc_writeb(falcbase + F_REG(FMR5, ch),
  1516. cpc_readb(falcbase + F_REG(FMR5, ch)) | FMR5_XLD);
  1517. } else {
  1518. cpc_writeb(falcbase + F_REG(FMR3, ch),
  1519. cpc_readb(falcbase + F_REG(FMR3, ch)) | FMR3_XLD);
  1520. }
  1521. pfalc->sync = 0;
  1522. cpc_writeb(falcbase + card->hw.cpld_reg2,
  1523. cpc_readb(falcbase + card->hw.cpld_reg2) &
  1524. ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
  1525. pfalc->active = 0;
  1526. //? falc_issue_cmd(card, ch, CMDR_XRES);
  1527. pfalc->loop_gen = 0;
  1528. }
  1529. /*----------------------------------------------------------------------------
  1530. * falc_pattern_test
  1531. *----------------------------------------------------------------------------
  1532. * Description: This routine generates a pattern code and checks
  1533. * it on the reception side.
  1534. *----------------------------------------------------------------------------
  1535. */
  1536. static void falc_pattern_test(pc300_t * card, int ch, unsigned int activate)
  1537. {
  1538. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1539. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  1540. falc_t *pfalc = (falc_t *) & chan->falc;
  1541. void __iomem *falcbase = card->hw.falcbase;
  1542. if (activate) {
  1543. pfalc->prbs = 1;
  1544. pfalc->bec = 0;
  1545. if (conf->media == IF_IFACE_T1) {
  1546. /* Disable local loop activation/deactivation detect */
  1547. cpc_writeb(falcbase + F_REG(IMR3, ch),
  1548. cpc_readb(falcbase + F_REG(IMR3, ch)) | IMR3_LLBSC);
  1549. } else {
  1550. /* Disable local loop activation/deactivation detect */
  1551. cpc_writeb(falcbase + F_REG(IMR1, ch),
  1552. cpc_readb(falcbase + F_REG(IMR1, ch)) | IMR1_LLBSC);
  1553. }
  1554. /* Activates generation and monitoring of PRBS
  1555. * (Pseudo Random Bit Sequence) */
  1556. cpc_writeb(falcbase + F_REG(LCR1, ch),
  1557. cpc_readb(falcbase + F_REG(LCR1, ch)) | LCR1_EPRM | LCR1_XPRBS);
  1558. } else {
  1559. pfalc->prbs = 0;
  1560. /* Deactivates generation and monitoring of PRBS
  1561. * (Pseudo Random Bit Sequence) */
  1562. cpc_writeb(falcbase + F_REG(LCR1, ch),
  1563. cpc_readb(falcbase+F_REG(LCR1,ch)) & ~(LCR1_EPRM | LCR1_XPRBS));
  1564. if (conf->media == IF_IFACE_T1) {
  1565. /* Enable local loop activation/deactivation detect */
  1566. cpc_writeb(falcbase + F_REG(IMR3, ch),
  1567. cpc_readb(falcbase + F_REG(IMR3, ch)) & ~IMR3_LLBSC);
  1568. } else {
  1569. /* Enable local loop activation/deactivation detect */
  1570. cpc_writeb(falcbase + F_REG(IMR1, ch),
  1571. cpc_readb(falcbase + F_REG(IMR1, ch)) & ~IMR1_LLBSC);
  1572. }
  1573. }
  1574. }
  1575. /*----------------------------------------------------------------------------
  1576. * falc_pattern_test_error
  1577. *----------------------------------------------------------------------------
  1578. * Description: This routine returns the bit error counter value
  1579. *----------------------------------------------------------------------------
  1580. */
  1581. static ucshort falc_pattern_test_error(pc300_t * card, int ch)
  1582. {
  1583. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1584. falc_t *pfalc = (falc_t *) & chan->falc;
  1585. return (pfalc->bec);
  1586. }
  1587. /**********************************/
  1588. /*** Net Interface Routines ***/
  1589. /**********************************/
  1590. static void
  1591. cpc_trace(struct net_device *dev, struct sk_buff *skb_main, char rx_tx)
  1592. {
  1593. struct sk_buff *skb;
  1594. if ((skb = dev_alloc_skb(10 + skb_main->len)) == NULL) {
  1595. printk("%s: out of memory\n", dev->name);
  1596. return;
  1597. }
  1598. skb_put(skb, 10 + skb_main->len);
  1599. skb->dev = dev;
  1600. skb->protocol = htons(ETH_P_CUST);
  1601. skb_reset_mac_header(skb);
  1602. skb->pkt_type = PACKET_HOST;
  1603. skb->len = 10 + skb_main->len;
  1604. skb_copy_to_linear_data(skb, dev->name, 5);
  1605. skb->data[5] = '[';
  1606. skb->data[6] = rx_tx;
  1607. skb->data[7] = ']';
  1608. skb->data[8] = ':';
  1609. skb->data[9] = ' ';
  1610. skb_copy_from_linear_data(skb_main, &skb->data[10], skb_main->len);
  1611. netif_rx(skb);
  1612. }
  1613. static void cpc_tx_timeout(struct net_device *dev)
  1614. {
  1615. pc300dev_t *d = (pc300dev_t *) dev->priv;
  1616. pc300ch_t *chan = (pc300ch_t *) d->chan;
  1617. pc300_t *card = (pc300_t *) chan->card;
  1618. struct net_device_stats *stats = hdlc_stats(dev);
  1619. int ch = chan->channel;
  1620. unsigned long flags;
  1621. ucchar ilar;
  1622. stats->tx_errors++;
  1623. stats->tx_aborted_errors++;
  1624. CPC_LOCK(card, flags);
  1625. if ((ilar = cpc_readb(card->hw.scabase + ILAR)) != 0) {
  1626. printk("%s: ILAR=0x%x\n", dev->name, ilar);
  1627. cpc_writeb(card->hw.scabase + ILAR, ilar);
  1628. cpc_writeb(card->hw.scabase + DMER, 0x80);
  1629. }
  1630. if (card->hw.type == PC300_TE) {
  1631. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
  1632. cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) &
  1633. ~(CPLD_REG2_FALC_LED1 << (2 * ch)));
  1634. }
  1635. dev->trans_start = jiffies;
  1636. CPC_UNLOCK(card, flags);
  1637. netif_wake_queue(dev);
  1638. }
  1639. static int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev)
  1640. {
  1641. pc300dev_t *d = (pc300dev_t *) dev->priv;
  1642. pc300ch_t *chan = (pc300ch_t *) d->chan;
  1643. pc300_t *card = (pc300_t *) chan->card;
  1644. struct net_device_stats *stats = hdlc_stats(dev);
  1645. int ch = chan->channel;
  1646. unsigned long flags;
  1647. #ifdef PC300_DEBUG_TX
  1648. int i;
  1649. #endif
  1650. if (chan->conf.monitor) {
  1651. /* In monitor mode no Tx is done: ignore packet */
  1652. dev_kfree_skb(skb);
  1653. return 0;
  1654. } else if (!netif_carrier_ok(dev)) {
  1655. /* DCD must be OFF: drop packet */
  1656. dev_kfree_skb(skb);
  1657. stats->tx_errors++;
  1658. stats->tx_carrier_errors++;
  1659. return 0;
  1660. } else if (cpc_readb(card->hw.scabase + M_REG(ST3, ch)) & ST3_DCD) {
  1661. printk("%s: DCD is OFF. Going administrative down.\n", dev->name);
  1662. stats->tx_errors++;
  1663. stats->tx_carrier_errors++;
  1664. dev_kfree_skb(skb);
  1665. netif_carrier_off(dev);
  1666. CPC_LOCK(card, flags);
  1667. cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_BUF_CLR);
  1668. if (card->hw.type == PC300_TE) {
  1669. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
  1670. cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) &
  1671. ~(CPLD_REG2_FALC_LED1 << (2 * ch)));
  1672. }
  1673. CPC_UNLOCK(card, flags);
  1674. netif_wake_queue(dev);
  1675. return 0;
  1676. }
  1677. /* Write buffer to DMA buffers */
  1678. if (dma_buf_write(card, ch, (ucchar *) skb->data, skb->len) != 0) {
  1679. // printk("%s: write error. Dropping TX packet.\n", dev->name);
  1680. netif_stop_queue(dev);
  1681. dev_kfree_skb(skb);
  1682. stats->tx_errors++;
  1683. stats->tx_dropped++;
  1684. return 0;
  1685. }
  1686. #ifdef PC300_DEBUG_TX
  1687. printk("%s T:", dev->name);
  1688. for (i = 0; i < skb->len; i++)
  1689. printk(" %02x", *(skb->data + i));
  1690. printk("\n");
  1691. #endif
  1692. if (d->trace_on) {
  1693. cpc_trace(dev, skb, 'T');
  1694. }
  1695. dev->trans_start = jiffies;
  1696. /* Start transmission */
  1697. CPC_LOCK(card, flags);
  1698. /* verify if it has more than one free descriptor */
  1699. if (card->chan[ch].nfree_tx_bd <= 1) {
  1700. /* don't have so stop the queue */
  1701. netif_stop_queue(dev);
  1702. }
  1703. cpc_writel(card->hw.scabase + DTX_REG(EDAL, ch),
  1704. TX_BD_ADDR(ch, chan->tx_next_bd));
  1705. cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_ENA);
  1706. cpc_writeb(card->hw.scabase + DSR_TX(ch), DSR_DE);
  1707. if (card->hw.type == PC300_TE) {
  1708. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
  1709. cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) |
  1710. (CPLD_REG2_FALC_LED1 << (2 * ch)));
  1711. }
  1712. CPC_UNLOCK(card, flags);
  1713. dev_kfree_skb(skb);
  1714. return 0;
  1715. }
  1716. static void cpc_net_rx(struct net_device *dev)
  1717. {
  1718. pc300dev_t *d = (pc300dev_t *) dev->priv;
  1719. pc300ch_t *chan = (pc300ch_t *) d->chan;
  1720. pc300_t *card = (pc300_t *) chan->card;
  1721. struct net_device_stats *stats = hdlc_stats(dev);
  1722. int ch = chan->channel;
  1723. #ifdef PC300_DEBUG_RX
  1724. int i;
  1725. #endif
  1726. int rxb;
  1727. struct sk_buff *skb;
  1728. while (1) {
  1729. if ((rxb = dma_get_rx_frame_size(card, ch)) == -1)
  1730. return;
  1731. if (!netif_carrier_ok(dev)) {
  1732. /* DCD must be OFF: drop packet */
  1733. printk("%s : DCD is OFF - drop %d rx bytes\n", dev->name, rxb);
  1734. skb = NULL;
  1735. } else {
  1736. if (rxb > (dev->mtu + 40)) { /* add headers */
  1737. printk("%s : MTU exceeded %d\n", dev->name, rxb);
  1738. skb = NULL;
  1739. } else {
  1740. skb = dev_alloc_skb(rxb);
  1741. if (skb == NULL) {
  1742. printk("%s: Memory squeeze!!\n", dev->name);
  1743. return;
  1744. }
  1745. skb->dev = dev;
  1746. }
  1747. }
  1748. if (((rxb = dma_buf_read(card, ch, skb)) <= 0) || (skb == NULL)) {
  1749. #ifdef PC300_DEBUG_RX
  1750. printk("%s: rxb = %x\n", dev->name, rxb);
  1751. #endif
  1752. if ((skb == NULL) && (rxb > 0)) {
  1753. /* rxb > dev->mtu */
  1754. stats->rx_errors++;
  1755. stats->rx_length_errors++;
  1756. continue;
  1757. }
  1758. if (rxb < 0) { /* Invalid frame */
  1759. rxb = -rxb;
  1760. if (rxb & DST_OVR) {
  1761. stats->rx_errors++;
  1762. stats->rx_fifo_errors++;
  1763. }
  1764. if (rxb & DST_CRC) {
  1765. stats->rx_errors++;
  1766. stats->rx_crc_errors++;
  1767. }
  1768. if (rxb & (DST_RBIT | DST_SHRT | DST_ABT)) {
  1769. stats->rx_errors++;
  1770. stats->rx_frame_errors++;
  1771. }
  1772. }
  1773. if (skb) {
  1774. dev_kfree_skb_irq(skb);
  1775. }
  1776. continue;
  1777. }
  1778. stats->rx_bytes += rxb;
  1779. #ifdef PC300_DEBUG_RX
  1780. printk("%s R:", dev->name);
  1781. for (i = 0; i < skb->len; i++)
  1782. printk(" %02x", *(skb->data + i));
  1783. printk("\n");
  1784. #endif
  1785. if (d->trace_on) {
  1786. cpc_trace(dev, skb, 'R');
  1787. }
  1788. stats->rx_packets++;
  1789. skb->protocol = hdlc_type_trans(skb, dev);
  1790. netif_rx(skb);
  1791. }
  1792. }
  1793. /************************************/
  1794. /*** PC300 Interrupt Routines ***/
  1795. /************************************/
  1796. static void sca_tx_intr(pc300dev_t *dev)
  1797. {
  1798. pc300ch_t *chan = (pc300ch_t *)dev->chan;
  1799. pc300_t *card = (pc300_t *)chan->card;
  1800. int ch = chan->channel;
  1801. volatile pcsca_bd_t __iomem * ptdescr;
  1802. struct net_device_stats *stats = hdlc_stats(dev->dev);
  1803. /* Clean up descriptors from previous transmission */
  1804. ptdescr = (card->hw.rambase +
  1805. TX_BD_ADDR(ch,chan->tx_first_bd));
  1806. while ((cpc_readl(card->hw.scabase + DTX_REG(CDAL,ch)) !=
  1807. TX_BD_ADDR(ch,chan->tx_first_bd)) &&
  1808. (cpc_readb(&ptdescr->status) & DST_OSB)) {
  1809. stats->tx_packets++;
  1810. stats->tx_bytes += cpc_readw(&ptdescr->len);
  1811. cpc_writeb(&ptdescr->status, DST_OSB);
  1812. cpc_writew(&ptdescr->len, 0);
  1813. chan->nfree_tx_bd++;
  1814. chan->tx_first_bd = (chan->tx_first_bd + 1) & (N_DMA_TX_BUF - 1);
  1815. ptdescr = (card->hw.rambase + TX_BD_ADDR(ch,chan->tx_first_bd));
  1816. }
  1817. #ifdef CONFIG_PC300_MLPPP
  1818. if (chan->conf.proto == PC300_PROTO_MLPPP) {
  1819. cpc_tty_trigger_poll(dev);
  1820. } else {
  1821. #endif
  1822. /* Tell the upper layer we are ready to transmit more packets */
  1823. netif_wake_queue(dev->dev);
  1824. #ifdef CONFIG_PC300_MLPPP
  1825. }
  1826. #endif
  1827. }
  1828. static void sca_intr(pc300_t * card)
  1829. {
  1830. void __iomem *scabase = card->hw.scabase;
  1831. volatile uclong status;
  1832. int ch;
  1833. int intr_count = 0;
  1834. unsigned char dsr_rx;
  1835. while ((status = cpc_readl(scabase + ISR0)) != 0) {
  1836. for (ch = 0; ch < card->hw.nchan; ch++) {
  1837. pc300ch_t *chan = &card->chan[ch];
  1838. pc300dev_t *d = &chan->d;
  1839. struct net_device *dev = d->dev;
  1840. spin_lock(&card->card_lock);
  1841. /**** Reception ****/
  1842. if (status & IR0_DRX((IR0_DMIA | IR0_DMIB), ch)) {
  1843. ucchar drx_stat = cpc_readb(scabase + DSR_RX(ch));
  1844. /* Clear RX interrupts */
  1845. cpc_writeb(scabase + DSR_RX(ch), drx_stat | DSR_DWE);
  1846. #ifdef PC300_DEBUG_INTR
  1847. printk ("sca_intr: RX intr chan[%d] (st=0x%08lx, dsr=0x%02x)\n",
  1848. ch, status, drx_stat);
  1849. #endif
  1850. if (status & IR0_DRX(IR0_DMIA, ch)) {
  1851. if (drx_stat & DSR_BOF) {
  1852. #ifdef CONFIG_PC300_MLPPP
  1853. if (chan->conf.proto == PC300_PROTO_MLPPP) {
  1854. /* verify if driver is TTY */
  1855. if ((cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
  1856. rx_dma_stop(card, ch);
  1857. }
  1858. cpc_tty_receive(d);
  1859. rx_dma_start(card, ch);
  1860. } else
  1861. #endif
  1862. {
  1863. if ((cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
  1864. rx_dma_stop(card, ch);
  1865. }
  1866. cpc_net_rx(dev);
  1867. /* Discard invalid frames */
  1868. hdlc_stats(dev)->rx_errors++;
  1869. hdlc_stats(dev)->rx_over_errors++;
  1870. chan->rx_first_bd = 0;
  1871. chan->rx_last_bd = N_DMA_RX_BUF - 1;
  1872. rx_dma_start(card, ch);
  1873. }
  1874. }
  1875. }
  1876. if (status & IR0_DRX(IR0_DMIB, ch)) {
  1877. if (drx_stat & DSR_EOM) {
  1878. if (card->hw.type == PC300_TE) {
  1879. cpc_writeb(card->hw.falcbase +
  1880. card->hw.cpld_reg2,
  1881. cpc_readb (card->hw.falcbase +
  1882. card->hw.cpld_reg2) |
  1883. (CPLD_REG2_FALC_LED1 << (2 * ch)));
  1884. }
  1885. #ifdef CONFIG_PC300_MLPPP
  1886. if (chan->conf.proto == PC300_PROTO_MLPPP) {
  1887. /* verify if driver is TTY */
  1888. cpc_tty_receive(d);
  1889. } else {
  1890. cpc_net_rx(dev);
  1891. }
  1892. #else
  1893. cpc_net_rx(dev);
  1894. #endif
  1895. if (card->hw.type == PC300_TE) {
  1896. cpc_writeb(card->hw.falcbase +
  1897. card->hw.cpld_reg2,
  1898. cpc_readb (card->hw.falcbase +
  1899. card->hw.cpld_reg2) &
  1900. ~ (CPLD_REG2_FALC_LED1 << (2 * ch)));
  1901. }
  1902. }
  1903. }
  1904. if (!(dsr_rx = cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
  1905. #ifdef PC300_DEBUG_INTR
  1906. printk("%s: RX intr chan[%d] (st=0x%08lx, dsr=0x%02x, dsr2=0x%02x)\n",
  1907. dev->name, ch, status, drx_stat, dsr_rx);
  1908. #endif
  1909. cpc_writeb(scabase + DSR_RX(ch), (dsr_rx | DSR_DE) & 0xfe);
  1910. }
  1911. }
  1912. /**** Transmission ****/
  1913. if (status & IR0_DTX((IR0_EFT | IR0_DMIA | IR0_DMIB), ch)) {
  1914. ucchar dtx_stat = cpc_readb(scabase + DSR_TX(ch));
  1915. /* Clear TX interrupts */
  1916. cpc_writeb(scabase + DSR_TX(ch), dtx_stat | DSR_DWE);
  1917. #ifdef PC300_DEBUG_INTR
  1918. printk ("sca_intr: TX intr chan[%d] (st=0x%08lx, dsr=0x%02x)\n",
  1919. ch, status, dtx_stat);
  1920. #endif
  1921. if (status & IR0_DTX(IR0_EFT, ch)) {
  1922. if (dtx_stat & DSR_UDRF) {
  1923. if (cpc_readb (scabase + M_REG(TBN, ch)) != 0) {
  1924. cpc_writeb(scabase + M_REG(CMD,ch), CMD_TX_BUF_CLR);
  1925. }
  1926. if (card->hw.type == PC300_TE) {
  1927. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
  1928. cpc_readb (card->hw.falcbase +
  1929. card->hw.cpld_reg2) &
  1930. ~ (CPLD_REG2_FALC_LED1 << (2 * ch)));
  1931. }
  1932. hdlc_stats(dev)->tx_errors++;
  1933. hdlc_stats(dev)->tx_fifo_errors++;
  1934. sca_tx_intr(d);
  1935. }
  1936. }
  1937. if (status & IR0_DTX(IR0_DMIA, ch)) {
  1938. if (dtx_stat & DSR_BOF) {
  1939. }
  1940. }
  1941. if (status & IR0_DTX(IR0_DMIB, ch)) {
  1942. if (dtx_stat & DSR_EOM) {
  1943. if (card->hw.type == PC300_TE) {
  1944. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
  1945. cpc_readb (card->hw.falcbase +
  1946. card->hw.cpld_reg2) &
  1947. ~ (CPLD_REG2_FALC_LED1 << (2 * ch)));
  1948. }
  1949. sca_tx_intr(d);
  1950. }
  1951. }
  1952. }
  1953. /**** MSCI ****/
  1954. if (status & IR0_M(IR0_RXINTA, ch)) {
  1955. ucchar st1 = cpc_readb(scabase + M_REG(ST1, ch));
  1956. /* Clear MSCI interrupts */
  1957. cpc_writeb(scabase + M_REG(ST1, ch), st1);
  1958. #ifdef PC300_DEBUG_INTR
  1959. printk("sca_intr: MSCI intr chan[%d] (st=0x%08lx, st1=0x%02x)\n",
  1960. ch, status, st1);
  1961. #endif
  1962. if (st1 & ST1_CDCD) { /* DCD changed */
  1963. if (cpc_readb(scabase + M_REG(ST3, ch)) & ST3_DCD) {
  1964. printk ("%s: DCD is OFF. Going administrative down.\n",
  1965. dev->name);
  1966. #ifdef CONFIG_PC300_MLPPP
  1967. if (chan->conf.proto != PC300_PROTO_MLPPP) {
  1968. netif_carrier_off(dev);
  1969. }
  1970. #else
  1971. netif_carrier_off(dev);
  1972. #endif
  1973. card->chan[ch].d.line_off++;
  1974. } else { /* DCD = 1 */
  1975. printk ("%s: DCD is ON. Going administrative up.\n",
  1976. dev->name);
  1977. #ifdef CONFIG_PC300_MLPPP
  1978. if (chan->conf.proto != PC300_PROTO_MLPPP)
  1979. /* verify if driver is not TTY */
  1980. #endif
  1981. netif_carrier_on(dev);
  1982. card->chan[ch].d.line_on++;
  1983. }
  1984. }
  1985. }
  1986. spin_unlock(&card->card_lock);
  1987. }
  1988. if (++intr_count == 10)
  1989. /* Too much work at this board. Force exit */
  1990. break;
  1991. }
  1992. }
  1993. static void falc_t1_loop_detection(pc300_t * card, int ch, ucchar frs1)
  1994. {
  1995. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  1996. falc_t *pfalc = (falc_t *) & chan->falc;
  1997. void __iomem *falcbase = card->hw.falcbase;
  1998. if (((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_XPRBS) == 0) &&
  1999. !pfalc->loop_gen) {
  2000. if (frs1 & FRS1_LLBDD) {
  2001. // A Line Loop Back Deactivation signal detected
  2002. if (pfalc->loop_active) {
  2003. falc_remote_loop(card, ch, 0);
  2004. }
  2005. } else {
  2006. if ((frs1 & FRS1_LLBAD) &&
  2007. ((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) == 0)) {
  2008. // A Line Loop Back Activation signal detected
  2009. if (!pfalc->loop_active) {
  2010. falc_remote_loop(card, ch, 1);
  2011. }
  2012. }
  2013. }
  2014. }
  2015. }
  2016. static void falc_e1_loop_detection(pc300_t * card, int ch, ucchar rsp)
  2017. {
  2018. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  2019. falc_t *pfalc = (falc_t *) & chan->falc;
  2020. void __iomem *falcbase = card->hw.falcbase;
  2021. if (((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_XPRBS) == 0) &&
  2022. !pfalc->loop_gen) {
  2023. if (rsp & RSP_LLBDD) {
  2024. // A Line Loop Back Deactivation signal detected
  2025. if (pfalc->loop_active) {
  2026. falc_remote_loop(card, ch, 0);
  2027. }
  2028. } else {
  2029. if ((rsp & RSP_LLBAD) &&
  2030. ((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) == 0)) {
  2031. // A Line Loop Back Activation signal detected
  2032. if (!pfalc->loop_active) {
  2033. falc_remote_loop(card, ch, 1);
  2034. }
  2035. }
  2036. }
  2037. }
  2038. }
  2039. static void falc_t1_intr(pc300_t * card, int ch)
  2040. {
  2041. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  2042. falc_t *pfalc = (falc_t *) & chan->falc;
  2043. void __iomem *falcbase = card->hw.falcbase;
  2044. ucchar isr0, isr3, gis;
  2045. ucchar dummy;
  2046. while ((gis = cpc_readb(falcbase + F_REG(GIS, ch))) != 0) {
  2047. if (gis & GIS_ISR0) {
  2048. isr0 = cpc_readb(falcbase + F_REG(FISR0, ch));
  2049. if (isr0 & FISR0_PDEN) {
  2050. /* Read the bit to clear the situation */
  2051. if (cpc_readb(falcbase + F_REG(FRS1, ch)) &
  2052. FRS1_PDEN) {
  2053. pfalc->pden++;
  2054. }
  2055. }
  2056. }
  2057. if (gis & GIS_ISR1) {
  2058. dummy = cpc_readb(falcbase + F_REG(FISR1, ch));
  2059. }
  2060. if (gis & GIS_ISR2) {
  2061. dummy = cpc_readb(falcbase + F_REG(FISR2, ch));
  2062. }
  2063. if (gis & GIS_ISR3) {
  2064. isr3 = cpc_readb(falcbase + F_REG(FISR3, ch));
  2065. if (isr3 & FISR3_SEC) {
  2066. pfalc->sec++;
  2067. falc_update_stats(card, ch);
  2068. falc_check_status(card, ch,
  2069. cpc_readb(falcbase + F_REG(FRS0, ch)));
  2070. }
  2071. if (isr3 & FISR3_ES) {
  2072. pfalc->es++;
  2073. }
  2074. if (isr3 & FISR3_LLBSC) {
  2075. falc_t1_loop_detection(card, ch,
  2076. cpc_readb(falcbase + F_REG(FRS1, ch)));
  2077. }
  2078. }
  2079. }
  2080. }
  2081. static void falc_e1_intr(pc300_t * card, int ch)
  2082. {
  2083. pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
  2084. falc_t *pfalc = (falc_t *) & chan->falc;
  2085. void __iomem *falcbase = card->hw.falcbase;
  2086. ucchar isr1, isr2, isr3, gis, rsp;
  2087. ucchar dummy;
  2088. while ((gis = cpc_readb(falcbase + F_REG(GIS, ch))) != 0) {
  2089. rsp = cpc_readb(falcbase + F_REG(RSP, ch));
  2090. if (gis & GIS_ISR0) {
  2091. dummy = cpc_readb(falcbase + F_REG(FISR0, ch));
  2092. }
  2093. if (gis & GIS_ISR1) {
  2094. isr1 = cpc_readb(falcbase + F_REG(FISR1, ch));
  2095. if (isr1 & FISR1_XMB) {
  2096. if ((pfalc->xmb_cause & 2)
  2097. && pfalc->multiframe_mode) {
  2098. if (cpc_readb (falcbase + F_REG(FRS0, ch)) &
  2099. (FRS0_LOS | FRS0_AIS | FRS0_LFA)) {
  2100. cpc_writeb(falcbase + F_REG(XSP, ch),
  2101. cpc_readb(falcbase + F_REG(XSP, ch))
  2102. & ~XSP_AXS);
  2103. } else {
  2104. cpc_writeb(falcbase + F_REG(XSP, ch),
  2105. cpc_readb(falcbase + F_REG(XSP, ch))
  2106. | XSP_AXS);
  2107. }
  2108. }
  2109. pfalc->xmb_cause = 0;
  2110. cpc_writeb(falcbase + F_REG(IMR1, ch),
  2111. cpc_readb(falcbase + F_REG(IMR1, ch)) | IMR1_XMB);
  2112. }
  2113. if (isr1 & FISR1_LLBSC) {
  2114. falc_e1_loop_detection(card, ch, rsp);
  2115. }
  2116. }
  2117. if (gis & GIS_ISR2) {
  2118. isr2 = cpc_readb(falcbase + F_REG(FISR2, ch));
  2119. if (isr2 & FISR2_T400MS) {
  2120. cpc_writeb(falcbase + F_REG(XSW, ch),
  2121. cpc_readb(falcbase + F_REG(XSW, ch)) | XSW_XRA);
  2122. }
  2123. if (isr2 & FISR2_MFAR) {
  2124. cpc_writeb(falcbase + F_REG(XSW, ch),
  2125. cpc_readb(falcbase + F_REG(XSW, ch)) & ~XSW_XRA);
  2126. }
  2127. if (isr2 & (FISR2_FAR | FISR2_LFA | FISR2_AIS | FISR2_LOS)) {
  2128. pfalc->xmb_cause |= 2;
  2129. cpc_writeb(falcbase + F_REG(IMR1, ch),
  2130. cpc_readb(falcbase + F_REG(IMR1, ch)) & ~IMR1_XMB);
  2131. }
  2132. }
  2133. if (gis & GIS_ISR3) {
  2134. isr3 = cpc_readb(falcbase + F_REG(FISR3, ch));
  2135. if (isr3 & FISR3_SEC) {
  2136. pfalc->sec++;
  2137. falc_update_stats(card, ch);
  2138. falc_check_status(card, ch,
  2139. cpc_readb(falcbase + F_REG(FRS0, ch)));
  2140. }
  2141. if (isr3 & FISR3_ES) {
  2142. pfalc->es++;
  2143. }
  2144. }
  2145. }
  2146. }
  2147. static void falc_intr(pc300_t * card)
  2148. {
  2149. int ch;
  2150. for (ch = 0; ch < card->hw.nchan; ch++) {
  2151. pc300ch_t *chan = &card->chan[ch];
  2152. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  2153. if (conf->media == IF_IFACE_T1) {
  2154. falc_t1_intr(card, ch);
  2155. } else {
  2156. falc_e1_intr(card, ch);
  2157. }
  2158. }
  2159. }
  2160. static irqreturn_t cpc_intr(int irq, void *dev_id)
  2161. {
  2162. pc300_t *card;
  2163. volatile ucchar plx_status;
  2164. if ((card = (pc300_t *) dev_id) == 0) {
  2165. #ifdef PC300_DEBUG_INTR
  2166. printk("cpc_intr: spurious intr %d\n", irq);
  2167. #endif
  2168. return IRQ_NONE; /* spurious intr */
  2169. }
  2170. if (card->hw.rambase == 0) {
  2171. #ifdef PC300_DEBUG_INTR
  2172. printk("cpc_intr: spurious intr2 %d\n", irq);
  2173. #endif
  2174. return IRQ_NONE; /* spurious intr */
  2175. }
  2176. switch (card->hw.type) {
  2177. case PC300_RSV:
  2178. case PC300_X21:
  2179. sca_intr(card);
  2180. break;
  2181. case PC300_TE:
  2182. while ( (plx_status = (cpc_readb(card->hw.plxbase + card->hw.intctl_reg) &
  2183. (PLX_9050_LINT1_STATUS | PLX_9050_LINT2_STATUS))) != 0) {
  2184. if (plx_status & PLX_9050_LINT1_STATUS) { /* SCA Interrupt */
  2185. sca_intr(card);
  2186. }
  2187. if (plx_status & PLX_9050_LINT2_STATUS) { /* FALC Interrupt */
  2188. falc_intr(card);
  2189. }
  2190. }
  2191. break;
  2192. }
  2193. return IRQ_HANDLED;
  2194. }
  2195. static void cpc_sca_status(pc300_t * card, int ch)
  2196. {
  2197. ucchar ilar;
  2198. void __iomem *scabase = card->hw.scabase;
  2199. unsigned long flags;
  2200. tx_dma_buf_check(card, ch);
  2201. rx_dma_buf_check(card, ch);
  2202. ilar = cpc_readb(scabase + ILAR);
  2203. printk ("ILAR=0x%02x, WCRL=0x%02x, PCR=0x%02x, BTCR=0x%02x, BOLR=0x%02x\n",
  2204. ilar, cpc_readb(scabase + WCRL), cpc_readb(scabase + PCR),
  2205. cpc_readb(scabase + BTCR), cpc_readb(scabase + BOLR));
  2206. printk("TX_CDA=0x%08x, TX_EDA=0x%08x\n",
  2207. cpc_readl(scabase + DTX_REG(CDAL, ch)),
  2208. cpc_readl(scabase + DTX_REG(EDAL, ch)));
  2209. printk("RX_CDA=0x%08x, RX_EDA=0x%08x, BFL=0x%04x\n",
  2210. cpc_readl(scabase + DRX_REG(CDAL, ch)),
  2211. cpc_readl(scabase + DRX_REG(EDAL, ch)),
  2212. cpc_readw(scabase + DRX_REG(BFLL, ch)));
  2213. printk("DMER=0x%02x, DSR_TX=0x%02x, DSR_RX=0x%02x\n",
  2214. cpc_readb(scabase + DMER), cpc_readb(scabase + DSR_TX(ch)),
  2215. cpc_readb(scabase + DSR_RX(ch)));
  2216. printk("DMR_TX=0x%02x, DMR_RX=0x%02x, DIR_TX=0x%02x, DIR_RX=0x%02x\n",
  2217. cpc_readb(scabase + DMR_TX(ch)), cpc_readb(scabase + DMR_RX(ch)),
  2218. cpc_readb(scabase + DIR_TX(ch)),
  2219. cpc_readb(scabase + DIR_RX(ch)));
  2220. printk("DCR_TX=0x%02x, DCR_RX=0x%02x, FCT_TX=0x%02x, FCT_RX=0x%02x\n",
  2221. cpc_readb(scabase + DCR_TX(ch)), cpc_readb(scabase + DCR_RX(ch)),
  2222. cpc_readb(scabase + FCT_TX(ch)),
  2223. cpc_readb(scabase + FCT_RX(ch)));
  2224. printk("MD0=0x%02x, MD1=0x%02x, MD2=0x%02x, MD3=0x%02x, IDL=0x%02x\n",
  2225. cpc_readb(scabase + M_REG(MD0, ch)),
  2226. cpc_readb(scabase + M_REG(MD1, ch)),
  2227. cpc_readb(scabase + M_REG(MD2, ch)),
  2228. cpc_readb(scabase + M_REG(MD3, ch)),
  2229. cpc_readb(scabase + M_REG(IDL, ch)));
  2230. printk("CMD=0x%02x, SA0=0x%02x, SA1=0x%02x, TFN=0x%02x, CTL=0x%02x\n",
  2231. cpc_readb(scabase + M_REG(CMD, ch)),
  2232. cpc_readb(scabase + M_REG(SA0, ch)),
  2233. cpc_readb(scabase + M_REG(SA1, ch)),
  2234. cpc_readb(scabase + M_REG(TFN, ch)),
  2235. cpc_readb(scabase + M_REG(CTL, ch)));
  2236. printk("ST0=0x%02x, ST1=0x%02x, ST2=0x%02x, ST3=0x%02x, ST4=0x%02x\n",
  2237. cpc_readb(scabase + M_REG(ST0, ch)),
  2238. cpc_readb(scabase + M_REG(ST1, ch)),
  2239. cpc_readb(scabase + M_REG(ST2, ch)),
  2240. cpc_readb(scabase + M_REG(ST3, ch)),
  2241. cpc_readb(scabase + M_REG(ST4, ch)));
  2242. printk ("CST0=0x%02x, CST1=0x%02x, CST2=0x%02x, CST3=0x%02x, FST=0x%02x\n",
  2243. cpc_readb(scabase + M_REG(CST0, ch)),
  2244. cpc_readb(scabase + M_REG(CST1, ch)),
  2245. cpc_readb(scabase + M_REG(CST2, ch)),
  2246. cpc_readb(scabase + M_REG(CST3, ch)),
  2247. cpc_readb(scabase + M_REG(FST, ch)));
  2248. printk("TRC0=0x%02x, TRC1=0x%02x, RRC=0x%02x, TBN=0x%02x, RBN=0x%02x\n",
  2249. cpc_readb(scabase + M_REG(TRC0, ch)),
  2250. cpc_readb(scabase + M_REG(TRC1, ch)),
  2251. cpc_readb(scabase + M_REG(RRC, ch)),
  2252. cpc_readb(scabase + M_REG(TBN, ch)),
  2253. cpc_readb(scabase + M_REG(RBN, ch)));
  2254. printk("TFS=0x%02x, TNR0=0x%02x, TNR1=0x%02x, RNR=0x%02x\n",
  2255. cpc_readb(scabase + M_REG(TFS, ch)),
  2256. cpc_readb(scabase + M_REG(TNR0, ch)),
  2257. cpc_readb(scabase + M_REG(TNR1, ch)),
  2258. cpc_readb(scabase + M_REG(RNR, ch)));
  2259. printk("TCR=0x%02x, RCR=0x%02x, TNR1=0x%02x, RNR=0x%02x\n",
  2260. cpc_readb(scabase + M_REG(TCR, ch)),
  2261. cpc_readb(scabase + M_REG(RCR, ch)),
  2262. cpc_readb(scabase + M_REG(TNR1, ch)),
  2263. cpc_readb(scabase + M_REG(RNR, ch)));
  2264. printk("TXS=0x%02x, RXS=0x%02x, EXS=0x%02x, TMCT=0x%02x, TMCR=0x%02x\n",
  2265. cpc_readb(scabase + M_REG(TXS, ch)),
  2266. cpc_readb(scabase + M_REG(RXS, ch)),
  2267. cpc_readb(scabase + M_REG(EXS, ch)),
  2268. cpc_readb(scabase + M_REG(TMCT, ch)),
  2269. cpc_readb(scabase + M_REG(TMCR, ch)));
  2270. printk("IE0=0x%02x, IE1=0x%02x, IE2=0x%02x, IE4=0x%02x, FIE=0x%02x\n",
  2271. cpc_readb(scabase + M_REG(IE0, ch)),
  2272. cpc_readb(scabase + M_REG(IE1, ch)),
  2273. cpc_readb(scabase + M_REG(IE2, ch)),
  2274. cpc_readb(scabase + M_REG(IE4, ch)),
  2275. cpc_readb(scabase + M_REG(FIE, ch)));
  2276. printk("IER0=0x%08x\n", cpc_readl(scabase + IER0));
  2277. if (ilar != 0) {
  2278. CPC_LOCK(card, flags);
  2279. cpc_writeb(scabase + ILAR, ilar);
  2280. cpc_writeb(scabase + DMER, 0x80);
  2281. CPC_UNLOCK(card, flags);
  2282. }
  2283. }
  2284. static void cpc_falc_status(pc300_t * card, int ch)
  2285. {
  2286. pc300ch_t *chan = &card->chan[ch];
  2287. falc_t *pfalc = (falc_t *) & chan->falc;
  2288. unsigned long flags;
  2289. CPC_LOCK(card, flags);
  2290. printk("CH%d: %s %s %d channels\n",
  2291. ch, (pfalc->sync ? "SYNC" : ""), (pfalc->active ? "ACTIVE" : ""),
  2292. pfalc->num_channels);
  2293. printk(" pden=%d, los=%d, losr=%d, lfa=%d, farec=%d\n",
  2294. pfalc->pden, pfalc->los, pfalc->losr, pfalc->lfa, pfalc->farec);
  2295. printk(" lmfa=%d, ais=%d, sec=%d, es=%d, rai=%d\n",
  2296. pfalc->lmfa, pfalc->ais, pfalc->sec, pfalc->es, pfalc->rai);
  2297. printk(" bec=%d, fec=%d, cvc=%d, cec=%d, ebc=%d\n",
  2298. pfalc->bec, pfalc->fec, pfalc->cvc, pfalc->cec, pfalc->ebc);
  2299. printk("\n");
  2300. printk(" STATUS: %s %s %s %s %s %s\n",
  2301. (pfalc->red_alarm ? "RED" : ""),
  2302. (pfalc->blue_alarm ? "BLU" : ""),
  2303. (pfalc->yellow_alarm ? "YEL" : ""),
  2304. (pfalc->loss_fa ? "LFA" : ""),
  2305. (pfalc->loss_mfa ? "LMF" : ""), (pfalc->prbs ? "PRB" : ""));
  2306. CPC_UNLOCK(card, flags);
  2307. }
  2308. static int cpc_change_mtu(struct net_device *dev, int new_mtu)
  2309. {
  2310. if ((new_mtu < 128) || (new_mtu > PC300_DEF_MTU))
  2311. return -EINVAL;
  2312. dev->mtu = new_mtu;
  2313. return 0;
  2314. }
  2315. static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
  2316. {
  2317. pc300dev_t *d = (pc300dev_t *) dev->priv;
  2318. pc300ch_t *chan = (pc300ch_t *) d->chan;
  2319. pc300_t *card = (pc300_t *) chan->card;
  2320. pc300conf_t conf_aux;
  2321. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  2322. int ch = chan->channel;
  2323. void __user *arg = ifr->ifr_data;
  2324. struct if_settings *settings = &ifr->ifr_settings;
  2325. void __iomem *scabase = card->hw.scabase;
  2326. if (!capable(CAP_NET_ADMIN))
  2327. return -EPERM;
  2328. switch (cmd) {
  2329. case SIOCGPC300CONF:
  2330. #ifdef CONFIG_PC300_MLPPP
  2331. if (conf->proto != PC300_PROTO_MLPPP) {
  2332. conf->proto = /* FIXME hdlc->proto.id */ 0;
  2333. }
  2334. #else
  2335. conf->proto = /* FIXME hdlc->proto.id */ 0;
  2336. #endif
  2337. memcpy(&conf_aux.conf, conf, sizeof(pc300chconf_t));
  2338. memcpy(&conf_aux.hw, &card->hw, sizeof(pc300hw_t));
  2339. if (!arg ||
  2340. copy_to_user(arg, &conf_aux, sizeof(pc300conf_t)))
  2341. return -EINVAL;
  2342. return 0;
  2343. case SIOCSPC300CONF:
  2344. if (!capable(CAP_NET_ADMIN))
  2345. return -EPERM;
  2346. if (!arg ||
  2347. copy_from_user(&conf_aux.conf, arg, sizeof(pc300chconf_t)))
  2348. return -EINVAL;
  2349. if (card->hw.cpld_id < 0x02 &&
  2350. conf_aux.conf.fr_mode == PC300_FR_UNFRAMED) {
  2351. /* CPLD_ID < 0x02 doesn't support Unframed E1 */
  2352. return -EINVAL;
  2353. }
  2354. #ifdef CONFIG_PC300_MLPPP
  2355. if (conf_aux.conf.proto == PC300_PROTO_MLPPP) {
  2356. if (conf->proto != PC300_PROTO_MLPPP) {
  2357. memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t));
  2358. cpc_tty_init(d); /* init TTY driver */
  2359. }
  2360. } else {
  2361. if (conf_aux.conf.proto == 0xffff) {
  2362. if (conf->proto == PC300_PROTO_MLPPP){
  2363. /* ifdown interface */
  2364. cpc_close(dev);
  2365. }
  2366. } else {
  2367. memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t));
  2368. /* FIXME hdlc->proto.id = conf->proto; */
  2369. }
  2370. }
  2371. #else
  2372. memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t));
  2373. /* FIXME hdlc->proto.id = conf->proto; */
  2374. #endif
  2375. return 0;
  2376. case SIOCGPC300STATUS:
  2377. cpc_sca_status(card, ch);
  2378. return 0;
  2379. case SIOCGPC300FALCSTATUS:
  2380. cpc_falc_status(card, ch);
  2381. return 0;
  2382. case SIOCGPC300UTILSTATS:
  2383. {
  2384. if (!arg) { /* clear statistics */
  2385. memset(hdlc_stats(dev), 0, sizeof(struct net_device_stats));
  2386. if (card->hw.type == PC300_TE) {
  2387. memset(&chan->falc, 0, sizeof(falc_t));
  2388. }
  2389. } else {
  2390. pc300stats_t pc300stats;
  2391. memset(&pc300stats, 0, sizeof(pc300stats_t));
  2392. pc300stats.hw_type = card->hw.type;
  2393. pc300stats.line_on = card->chan[ch].d.line_on;
  2394. pc300stats.line_off = card->chan[ch].d.line_off;
  2395. memcpy(&pc300stats.gen_stats, hdlc_stats(dev),
  2396. sizeof(struct net_device_stats));
  2397. if (card->hw.type == PC300_TE)
  2398. memcpy(&pc300stats.te_stats,&chan->falc,sizeof(falc_t));
  2399. if (copy_to_user(arg, &pc300stats, sizeof(pc300stats_t)))
  2400. return -EFAULT;
  2401. }
  2402. return 0;
  2403. }
  2404. case SIOCGPC300UTILSTATUS:
  2405. {
  2406. struct pc300status pc300status;
  2407. pc300status.hw_type = card->hw.type;
  2408. if (card->hw.type == PC300_TE) {
  2409. pc300status.te_status.sync = chan->falc.sync;
  2410. pc300status.te_status.red_alarm = chan->falc.red_alarm;
  2411. pc300status.te_status.blue_alarm = chan->falc.blue_alarm;
  2412. pc300status.te_status.loss_fa = chan->falc.loss_fa;
  2413. pc300status.te_status.yellow_alarm =chan->falc.yellow_alarm;
  2414. pc300status.te_status.loss_mfa = chan->falc.loss_mfa;
  2415. pc300status.te_status.prbs = chan->falc.prbs;
  2416. } else {
  2417. pc300status.gen_status.dcd =
  2418. !(cpc_readb (scabase + M_REG(ST3, ch)) & ST3_DCD);
  2419. pc300status.gen_status.cts =
  2420. !(cpc_readb (scabase + M_REG(ST3, ch)) & ST3_CTS);
  2421. pc300status.gen_status.rts =
  2422. !(cpc_readb (scabase + M_REG(CTL, ch)) & CTL_RTS);
  2423. pc300status.gen_status.dtr =
  2424. !(cpc_readb (scabase + M_REG(CTL, ch)) & CTL_DTR);
  2425. /* There is no DSR in HD64572 */
  2426. }
  2427. if (!arg
  2428. || copy_to_user(arg, &pc300status, sizeof(pc300status_t)))
  2429. return -EINVAL;
  2430. return 0;
  2431. }
  2432. case SIOCSPC300TRACE:
  2433. /* Sets/resets a trace_flag for the respective device */
  2434. if (!arg || copy_from_user(&d->trace_on, arg,sizeof(unsigned char)))
  2435. return -EINVAL;
  2436. return 0;
  2437. case SIOCSPC300LOOPBACK:
  2438. {
  2439. struct pc300loopback pc300loop;
  2440. /* TE boards only */
  2441. if (card->hw.type != PC300_TE)
  2442. return -EINVAL;
  2443. if (!arg ||
  2444. copy_from_user(&pc300loop, arg, sizeof(pc300loopback_t)))
  2445. return -EINVAL;
  2446. switch (pc300loop.loop_type) {
  2447. case PC300LOCLOOP: /* Turn the local loop on/off */
  2448. falc_local_loop(card, ch, pc300loop.loop_on);
  2449. return 0;
  2450. case PC300REMLOOP: /* Turn the remote loop on/off */
  2451. falc_remote_loop(card, ch, pc300loop.loop_on);
  2452. return 0;
  2453. case PC300PAYLOADLOOP: /* Turn the payload loop on/off */
  2454. falc_payload_loop(card, ch, pc300loop.loop_on);
  2455. return 0;
  2456. case PC300GENLOOPUP: /* Generate loop UP */
  2457. if (pc300loop.loop_on) {
  2458. falc_generate_loop_up_code (card, ch);
  2459. } else {
  2460. turn_off_xlu(card, ch);
  2461. }
  2462. return 0;
  2463. case PC300GENLOOPDOWN: /* Generate loop DOWN */
  2464. if (pc300loop.loop_on) {
  2465. falc_generate_loop_down_code (card, ch);
  2466. } else {
  2467. turn_off_xld(card, ch);
  2468. }
  2469. return 0;
  2470. default:
  2471. return -EINVAL;
  2472. }
  2473. }
  2474. case SIOCSPC300PATTERNTEST:
  2475. /* Turn the pattern test on/off and show the errors counter */
  2476. {
  2477. struct pc300patterntst pc300patrntst;
  2478. /* TE boards only */
  2479. if (card->hw.type != PC300_TE)
  2480. return -EINVAL;
  2481. if (card->hw.cpld_id < 0x02) {
  2482. /* CPLD_ID < 0x02 doesn't support pattern test */
  2483. return -EINVAL;
  2484. }
  2485. if (!arg ||
  2486. copy_from_user(&pc300patrntst,arg,sizeof(pc300patterntst_t)))
  2487. return -EINVAL;
  2488. if (pc300patrntst.patrntst_on == 2) {
  2489. if (chan->falc.prbs == 0) {
  2490. falc_pattern_test(card, ch, 1);
  2491. }
  2492. pc300patrntst.num_errors =
  2493. falc_pattern_test_error(card, ch);
  2494. if (!arg
  2495. || copy_to_user(arg, &pc300patrntst,
  2496. sizeof (pc300patterntst_t)))
  2497. return -EINVAL;
  2498. } else {
  2499. falc_pattern_test(card, ch, pc300patrntst.patrntst_on);
  2500. }
  2501. return 0;
  2502. }
  2503. case SIOCWANDEV:
  2504. switch (ifr->ifr_settings.type) {
  2505. case IF_GET_IFACE:
  2506. {
  2507. const size_t size = sizeof(sync_serial_settings);
  2508. ifr->ifr_settings.type = conf->media;
  2509. if (ifr->ifr_settings.size < size) {
  2510. /* data size wanted */
  2511. ifr->ifr_settings.size = size;
  2512. return -ENOBUFS;
  2513. }
  2514. if (copy_to_user(settings->ifs_ifsu.sync,
  2515. &conf->phys_settings, size)) {
  2516. return -EFAULT;
  2517. }
  2518. return 0;
  2519. }
  2520. case IF_IFACE_V35:
  2521. case IF_IFACE_V24:
  2522. case IF_IFACE_X21:
  2523. {
  2524. const size_t size = sizeof(sync_serial_settings);
  2525. if (!capable(CAP_NET_ADMIN)) {
  2526. return -EPERM;
  2527. }
  2528. /* incorrect data len? */
  2529. if (ifr->ifr_settings.size != size) {
  2530. return -ENOBUFS;
  2531. }
  2532. if (copy_from_user(&conf->phys_settings,
  2533. settings->ifs_ifsu.sync, size)) {
  2534. return -EFAULT;
  2535. }
  2536. if (conf->phys_settings.loopback) {
  2537. cpc_writeb(card->hw.scabase + M_REG(MD2, ch),
  2538. cpc_readb(card->hw.scabase + M_REG(MD2, ch)) |
  2539. MD2_LOOP_MIR);
  2540. }
  2541. conf->media = ifr->ifr_settings.type;
  2542. return 0;
  2543. }
  2544. case IF_IFACE_T1:
  2545. case IF_IFACE_E1:
  2546. {
  2547. const size_t te_size = sizeof(te1_settings);
  2548. const size_t size = sizeof(sync_serial_settings);
  2549. if (!capable(CAP_NET_ADMIN)) {
  2550. return -EPERM;
  2551. }
  2552. /* incorrect data len? */
  2553. if (ifr->ifr_settings.size != te_size) {
  2554. return -ENOBUFS;
  2555. }
  2556. if (copy_from_user(&conf->phys_settings,
  2557. settings->ifs_ifsu.te1, size)) {
  2558. return -EFAULT;
  2559. }/* Ignoring HDLC slot_map for a while */
  2560. if (conf->phys_settings.loopback) {
  2561. cpc_writeb(card->hw.scabase + M_REG(MD2, ch),
  2562. cpc_readb(card->hw.scabase + M_REG(MD2, ch)) |
  2563. MD2_LOOP_MIR);
  2564. }
  2565. conf->media = ifr->ifr_settings.type;
  2566. return 0;
  2567. }
  2568. default:
  2569. return hdlc_ioctl(dev, ifr, cmd);
  2570. }
  2571. default:
  2572. return hdlc_ioctl(dev, ifr, cmd);
  2573. }
  2574. }
  2575. static struct net_device_stats *cpc_get_stats(struct net_device *dev)
  2576. {
  2577. return hdlc_stats(dev);
  2578. }
  2579. static int clock_rate_calc(uclong rate, uclong clock, int *br_io)
  2580. {
  2581. int br, tc;
  2582. int br_pwr, error;
  2583. *br_io = 0;
  2584. if (rate == 0)
  2585. return (0);
  2586. for (br = 0, br_pwr = 1; br <= 9; br++, br_pwr <<= 1) {
  2587. if ((tc = clock / br_pwr / rate) <= 0xff) {
  2588. *br_io = br;
  2589. break;
  2590. }
  2591. }
  2592. if (tc <= 0xff) {
  2593. error = ((rate - (clock / br_pwr / rate)) / rate) * 1000;
  2594. /* Errors bigger than +/- 1% won't be tolerated */
  2595. if (error < -10 || error > 10)
  2596. return (-1);
  2597. else
  2598. return (tc);
  2599. } else {
  2600. return (-1);
  2601. }
  2602. }
  2603. static int ch_config(pc300dev_t * d)
  2604. {
  2605. pc300ch_t *chan = (pc300ch_t *) d->chan;
  2606. pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
  2607. pc300_t *card = (pc300_t *) chan->card;
  2608. void __iomem *scabase = card->hw.scabase;
  2609. void __iomem *plxbase = card->hw.plxbase;
  2610. int ch = chan->channel;
  2611. uclong clkrate = chan->conf.phys_settings.clock_rate;
  2612. uclong clktype = chan->conf.phys_settings.clock_type;
  2613. ucshort encoding = chan->conf.proto_settings.encoding;
  2614. ucshort parity = chan->conf.proto_settings.parity;
  2615. ucchar md0, md2;
  2616. /* Reset the channel */
  2617. cpc_writeb(scabase + M_REG(CMD, ch), CMD_CH_RST);
  2618. /* Configure the SCA registers */
  2619. switch (parity) {
  2620. case PARITY_NONE:
  2621. md0 = MD0_BIT_SYNC;
  2622. break;
  2623. case PARITY_CRC16_PR0:
  2624. md0 = MD0_CRC16_0|MD0_CRCC0|MD0_BIT_SYNC;
  2625. break;
  2626. case PARITY_CRC16_PR1:
  2627. md0 = MD0_CRC16_1|MD0_CRCC0|MD0_BIT_SYNC;
  2628. break;
  2629. case PARITY_CRC32_PR1_CCITT:
  2630. md0 = MD0_CRC32|MD0_CRCC0|MD0_BIT_SYNC;
  2631. break;
  2632. case PARITY_CRC16_PR1_CCITT:
  2633. default:
  2634. md0 = MD0_CRC_CCITT|MD0_CRCC0|MD0_BIT_SYNC;
  2635. break;
  2636. }
  2637. switch (encoding) {
  2638. case ENCODING_NRZI:
  2639. md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_NRZI;
  2640. break;
  2641. case ENCODING_FM_MARK: /* FM1 */
  2642. md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_FM1;
  2643. break;
  2644. case ENCODING_FM_SPACE: /* FM0 */
  2645. md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_FM0;
  2646. break;
  2647. case ENCODING_MANCHESTER: /* It's not working... */
  2648. md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_MANCH;
  2649. break;
  2650. case ENCODING_NRZ:
  2651. default:
  2652. md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_NRZ;
  2653. break;
  2654. }
  2655. cpc_writeb(scabase + M_REG(MD0, ch), md0);
  2656. cpc_writeb(scabase + M_REG(MD1, ch), 0);
  2657. cpc_writeb(scabase + M_REG(MD2, ch), md2);
  2658. cpc_writeb(scabase + M_REG(IDL, ch), 0x7e);
  2659. cpc_writeb(scabase + M_REG(CTL, ch), CTL_URSKP | CTL_IDLC);
  2660. /* Configure HW media */
  2661. switch (card->hw.type) {
  2662. case PC300_RSV:
  2663. if (conf->media == IF_IFACE_V35) {
  2664. cpc_writel((plxbase + card->hw.gpioc_reg),
  2665. cpc_readl(plxbase + card->hw.gpioc_reg) | PC300_CHMEDIA_MASK(ch));
  2666. } else {
  2667. cpc_writel((plxbase + card->hw.gpioc_reg),
  2668. cpc_readl(plxbase + card->hw.gpioc_reg) & ~PC300_CHMEDIA_MASK(ch));
  2669. }
  2670. break;
  2671. case PC300_X21:
  2672. break;
  2673. case PC300_TE:
  2674. te_config(card, ch);
  2675. break;
  2676. }
  2677. switch (card->hw.type) {
  2678. case PC300_RSV:
  2679. case PC300_X21:
  2680. if (clktype == CLOCK_INT || clktype == CLOCK_TXINT) {
  2681. int tmc, br;
  2682. /* Calculate the clkrate parameters */
  2683. tmc = clock_rate_calc(clkrate, card->hw.clock, &br);
  2684. if (tmc < 0)
  2685. return -EIO;
  2686. cpc_writeb(scabase + M_REG(TMCT, ch), tmc);
  2687. cpc_writeb(scabase + M_REG(TXS, ch),
  2688. (TXS_DTRXC | TXS_IBRG | br));
  2689. if (clktype == CLOCK_INT) {
  2690. cpc_writeb(scabase + M_REG(TMCR, ch), tmc);
  2691. cpc_writeb(scabase + M_REG(RXS, ch),
  2692. (RXS_IBRG | br));
  2693. } else {
  2694. cpc_writeb(scabase + M_REG(TMCR, ch), 1);
  2695. cpc_writeb(scabase + M_REG(RXS, ch), 0);
  2696. }
  2697. if (card->hw.type == PC300_X21) {
  2698. cpc_writeb(scabase + M_REG(GPO, ch), 1);
  2699. cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1 | EXS_RES1);
  2700. } else {
  2701. cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1);
  2702. }
  2703. } else {
  2704. cpc_writeb(scabase + M_REG(TMCT, ch), 1);
  2705. if (clktype == CLOCK_EXT) {
  2706. cpc_writeb(scabase + M_REG(TXS, ch),
  2707. TXS_DTRXC);
  2708. } else {
  2709. cpc_writeb(scabase + M_REG(TXS, ch),
  2710. TXS_DTRXC|TXS_RCLK);
  2711. }
  2712. cpc_writeb(scabase + M_REG(TMCR, ch), 1);
  2713. cpc_writeb(scabase + M_REG(RXS, ch), 0);
  2714. if (card->hw.type == PC300_X21) {
  2715. cpc_writeb(scabase + M_REG(GPO, ch), 0);
  2716. cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1 | EXS_RES1);
  2717. } else {
  2718. cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1);
  2719. }
  2720. }
  2721. break;
  2722. case PC300_TE:
  2723. /* SCA always receives clock from the FALC chip */
  2724. cpc_writeb(scabase + M_REG(TMCT, ch), 1);
  2725. cpc_writeb(scabase + M_REG(TXS, ch), 0);
  2726. cpc_writeb(scabase + M_REG(TMCR, ch), 1);
  2727. cpc_writeb(scabase + M_REG(RXS, ch), 0);
  2728. cpc_writeb(scabase + M_REG(EXS, ch), 0);
  2729. break;
  2730. }
  2731. /* Enable Interrupts */
  2732. cpc_writel(scabase + IER0,
  2733. cpc_readl(scabase + IER0) |
  2734. IR0_M(IR0_RXINTA, ch) |
  2735. IR0_DRX(IR0_EFT | IR0_DMIA | IR0_DMIB, ch) |
  2736. IR0_DTX(IR0_EFT | IR0_DMIA | IR0_DMIB, ch));
  2737. cpc_writeb(scabase + M_REG(IE0, ch),
  2738. cpc_readl(scabase + M_REG(IE0, ch)) | IE0_RXINTA);
  2739. cpc_writeb(scabase + M_REG(IE1, ch),
  2740. cpc_readl(scabase + M_REG(IE1, ch)) | IE1_CDCD);
  2741. return 0;
  2742. }
  2743. static int rx_config(pc300dev_t * d)
  2744. {
  2745. pc300ch_t *chan = (pc300ch_t *) d->chan;
  2746. pc300_t *card = (pc300_t *) chan->card;
  2747. void __iomem *scabase = card->hw.scabase;
  2748. int ch = chan->channel;
  2749. cpc_writeb(scabase + DSR_RX(ch), 0);
  2750. /* General RX settings */
  2751. cpc_writeb(scabase + M_REG(RRC, ch), 0);
  2752. cpc_writeb(scabase + M_REG(RNR, ch), 16);
  2753. /* Enable reception */
  2754. cpc_writeb(scabase + M_REG(CMD, ch), CMD_RX_CRC_INIT);
  2755. cpc_writeb(scabase + M_REG(CMD, ch), CMD_RX_ENA);
  2756. /* Initialize DMA stuff */
  2757. chan->rx_first_bd = 0;
  2758. chan->rx_last_bd = N_DMA_RX_BUF - 1;
  2759. rx_dma_buf_init(card, ch);
  2760. cpc_writeb(scabase + DCR_RX(ch), DCR_FCT_CLR);
  2761. cpc_writeb(scabase + DMR_RX(ch), (DMR_TMOD | DMR_NF));
  2762. cpc_writeb(scabase + DIR_RX(ch), (DIR_EOM | DIR_BOF));
  2763. /* Start DMA */
  2764. rx_dma_start(card, ch);
  2765. return 0;
  2766. }
  2767. static int tx_config(pc300dev_t * d)
  2768. {
  2769. pc300ch_t *chan = (pc300ch_t *) d->chan;
  2770. pc300_t *card = (pc300_t *) chan->card;
  2771. void __iomem *scabase = card->hw.scabase;
  2772. int ch = chan->channel;
  2773. cpc_writeb(scabase + DSR_TX(ch), 0);
  2774. /* General TX settings */
  2775. cpc_writeb(scabase + M_REG(TRC0, ch), 0);
  2776. cpc_writeb(scabase + M_REG(TFS, ch), 32);
  2777. cpc_writeb(scabase + M_REG(TNR0, ch), 20);
  2778. cpc_writeb(scabase + M_REG(TNR1, ch), 48);
  2779. cpc_writeb(scabase + M_REG(TCR, ch), 8);
  2780. /* Enable transmission */
  2781. cpc_writeb(scabase + M_REG(CMD, ch), CMD_TX_CRC_INIT);
  2782. /* Initialize DMA stuff */
  2783. chan->tx_first_bd = 0;
  2784. chan->tx_next_bd = 0;
  2785. tx_dma_buf_init(card, ch);
  2786. cpc_writeb(scabase + DCR_TX(ch), DCR_FCT_CLR);
  2787. cpc_writeb(scabase + DMR_TX(ch), (DMR_TMOD | DMR_NF));
  2788. cpc_writeb(scabase + DIR_TX(ch), (DIR_EOM | DIR_BOF | DIR_UDRF));
  2789. cpc_writel(scabase + DTX_REG(CDAL, ch), TX_BD_ADDR(ch, chan->tx_first_bd));
  2790. cpc_writel(scabase + DTX_REG(EDAL, ch), TX_BD_ADDR(ch, chan->tx_next_bd));
  2791. return 0;
  2792. }
  2793. static int cpc_attach(struct net_device *dev, unsigned short encoding,
  2794. unsigned short parity)
  2795. {
  2796. pc300dev_t *d = (pc300dev_t *)dev->priv;
  2797. pc300ch_t *chan = (pc300ch_t *)d->chan;
  2798. pc300_t *card = (pc300_t *)chan->card;
  2799. pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
  2800. if (card->hw.type == PC300_TE) {
  2801. if (encoding != ENCODING_NRZ && encoding != ENCODING_NRZI) {
  2802. return -EINVAL;
  2803. }
  2804. } else {
  2805. if (encoding != ENCODING_NRZ && encoding != ENCODING_NRZI &&
  2806. encoding != ENCODING_FM_MARK && encoding != ENCODING_FM_SPACE) {
  2807. /* Driver doesn't support ENCODING_MANCHESTER yet */
  2808. return -EINVAL;
  2809. }
  2810. }
  2811. if (parity != PARITY_NONE && parity != PARITY_CRC16_PR0 &&
  2812. parity != PARITY_CRC16_PR1 && parity != PARITY_CRC32_PR1_CCITT &&
  2813. parity != PARITY_CRC16_PR1_CCITT) {
  2814. return -EINVAL;
  2815. }
  2816. conf->proto_settings.encoding = encoding;
  2817. conf->proto_settings.parity = parity;
  2818. return 0;
  2819. }
  2820. static int cpc_opench(pc300dev_t * d)
  2821. {
  2822. pc300ch_t *chan = (pc300ch_t *) d->chan;
  2823. pc300_t *card = (pc300_t *) chan->card;
  2824. int ch = chan->channel, rc;
  2825. void __iomem *scabase = card->hw.scabase;
  2826. rc = ch_config(d);
  2827. if (rc)
  2828. return rc;
  2829. rx_config(d);
  2830. tx_config(d);
  2831. /* Assert RTS and DTR */
  2832. cpc_writeb(scabase + M_REG(CTL, ch),
  2833. cpc_readb(scabase + M_REG(CTL, ch)) & ~(CTL_RTS | CTL_DTR));
  2834. return 0;
  2835. }
  2836. static void cpc_closech(pc300dev_t * d)
  2837. {
  2838. pc300ch_t *chan = (pc300ch_t *) d->chan;
  2839. pc300_t *card = (pc300_t *) chan->card;
  2840. falc_t *pfalc = (falc_t *) & chan->falc;
  2841. int ch = chan->channel;
  2842. cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_CH_RST);
  2843. rx_dma_stop(card, ch);
  2844. tx_dma_stop(card, ch);
  2845. if (card->hw.type == PC300_TE) {
  2846. memset(pfalc, 0, sizeof(falc_t));
  2847. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
  2848. cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) &
  2849. ~((CPLD_REG2_FALC_TX_CLK | CPLD_REG2_FALC_RX_CLK |
  2850. CPLD_REG2_FALC_LED2) << (2 * ch)));
  2851. /* Reset the FALC chip */
  2852. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
  2853. cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
  2854. (CPLD_REG1_FALC_RESET << (2 * ch)));
  2855. udelay(10000);
  2856. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
  2857. cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) &
  2858. ~(CPLD_REG1_FALC_RESET << (2 * ch)));
  2859. }
  2860. }
  2861. int cpc_open(struct net_device *dev)
  2862. {
  2863. pc300dev_t *d = (pc300dev_t *) dev->priv;
  2864. struct ifreq ifr;
  2865. int result;
  2866. #ifdef PC300_DEBUG_OTHER
  2867. printk("pc300: cpc_open");
  2868. #endif
  2869. #ifdef FIXME
  2870. if (hdlc->proto.id == IF_PROTO_PPP) {
  2871. d->if_ptr = &hdlc->state.ppp.pppdev;
  2872. }
  2873. #endif
  2874. result = hdlc_open(dev);
  2875. if (/* FIXME hdlc->proto.id == IF_PROTO_PPP*/ 0) {
  2876. dev->priv = d;
  2877. }
  2878. if (result) {
  2879. return result;
  2880. }
  2881. sprintf(ifr.ifr_name, "%s", dev->name);
  2882. result = cpc_opench(d);
  2883. if (result)
  2884. goto err_out;
  2885. netif_start_queue(dev);
  2886. return 0;
  2887. err_out:
  2888. hdlc_close(dev);
  2889. return result;
  2890. }
  2891. static int cpc_close(struct net_device *dev)
  2892. {
  2893. pc300dev_t *d = (pc300dev_t *) dev->priv;
  2894. pc300ch_t *chan = (pc300ch_t *) d->chan;
  2895. pc300_t *card = (pc300_t *) chan->card;
  2896. unsigned long flags;
  2897. #ifdef PC300_DEBUG_OTHER
  2898. printk("pc300: cpc_close");
  2899. #endif
  2900. netif_stop_queue(dev);
  2901. CPC_LOCK(card, flags);
  2902. cpc_closech(d);
  2903. CPC_UNLOCK(card, flags);
  2904. hdlc_close(dev);
  2905. if (/* FIXME hdlc->proto.id == IF_PROTO_PPP*/ 0) {
  2906. d->if_ptr = NULL;
  2907. }
  2908. #ifdef CONFIG_PC300_MLPPP
  2909. if (chan->conf.proto == PC300_PROTO_MLPPP) {
  2910. cpc_tty_unregister_service(d);
  2911. chan->conf.proto = 0xffff;
  2912. }
  2913. #endif
  2914. return 0;
  2915. }
  2916. static uclong detect_ram(pc300_t * card)
  2917. {
  2918. uclong i;
  2919. ucchar data;
  2920. void __iomem *rambase = card->hw.rambase;
  2921. card->hw.ramsize = PC300_RAMSIZE;
  2922. /* Let's find out how much RAM is present on this board */
  2923. for (i = 0; i < card->hw.ramsize; i++) {
  2924. data = (ucchar) (i & 0xff);
  2925. cpc_writeb(rambase + i, data);
  2926. if (cpc_readb(rambase + i) != data) {
  2927. break;
  2928. }
  2929. }
  2930. return (i);
  2931. }
  2932. static void plx_init(pc300_t * card)
  2933. {
  2934. struct RUNTIME_9050 __iomem *plx_ctl = card->hw.plxbase;
  2935. /* Reset PLX */
  2936. cpc_writel(&plx_ctl->init_ctrl,
  2937. cpc_readl(&plx_ctl->init_ctrl) | 0x40000000);
  2938. udelay(10000L);
  2939. cpc_writel(&plx_ctl->init_ctrl,
  2940. cpc_readl(&plx_ctl->init_ctrl) & ~0x40000000);
  2941. /* Reload Config. Registers from EEPROM */
  2942. cpc_writel(&plx_ctl->init_ctrl,
  2943. cpc_readl(&plx_ctl->init_ctrl) | 0x20000000);
  2944. udelay(10000L);
  2945. cpc_writel(&plx_ctl->init_ctrl,
  2946. cpc_readl(&plx_ctl->init_ctrl) & ~0x20000000);
  2947. }
  2948. static inline void show_version(void)
  2949. {
  2950. char *rcsvers, *rcsdate, *tmp;
  2951. rcsvers = strchr(rcsid, ' ');
  2952. rcsvers++;
  2953. tmp = strchr(rcsvers, ' ');
  2954. *tmp++ = '\0';
  2955. rcsdate = strchr(tmp, ' ');
  2956. rcsdate++;
  2957. tmp = strrchr(rcsdate, ' ');
  2958. *tmp = '\0';
  2959. printk(KERN_INFO "Cyclades-PC300 driver %s %s (built %s %s)\n",
  2960. rcsvers, rcsdate, __DATE__, __TIME__);
  2961. } /* show_version */
  2962. static void cpc_init_card(pc300_t * card)
  2963. {
  2964. int i, devcount = 0;
  2965. static int board_nbr = 1;
  2966. /* Enable interrupts on the PCI bridge */
  2967. plx_init(card);
  2968. cpc_writew(card->hw.plxbase + card->hw.intctl_reg,
  2969. cpc_readw(card->hw.plxbase + card->hw.intctl_reg) | 0x0040);
  2970. #ifdef USE_PCI_CLOCK
  2971. /* Set board clock to PCI clock */
  2972. cpc_writel(card->hw.plxbase + card->hw.gpioc_reg,
  2973. cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) | 0x00000004UL);
  2974. card->hw.clock = PC300_PCI_CLOCK;
  2975. #else
  2976. /* Set board clock to internal oscillator clock */
  2977. cpc_writel(card->hw.plxbase + card->hw.gpioc_reg,
  2978. cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) & ~0x00000004UL);
  2979. card->hw.clock = PC300_OSC_CLOCK;
  2980. #endif
  2981. /* Detect actual on-board RAM size */
  2982. card->hw.ramsize = detect_ram(card);
  2983. /* Set Global SCA-II registers */
  2984. cpc_writeb(card->hw.scabase + PCR, PCR_PR2);
  2985. cpc_writeb(card->hw.scabase + BTCR, 0x10);
  2986. cpc_writeb(card->hw.scabase + WCRL, 0);
  2987. cpc_writeb(card->hw.scabase + DMER, 0x80);
  2988. if (card->hw.type == PC300_TE) {
  2989. ucchar reg1;
  2990. /* Check CPLD version */
  2991. reg1 = cpc_readb(card->hw.falcbase + CPLD_REG1);
  2992. cpc_writeb(card->hw.falcbase + CPLD_REG1, (reg1 + 0x5a));
  2993. if (cpc_readb(card->hw.falcbase + CPLD_REG1) == reg1) {
  2994. /* New CPLD */
  2995. card->hw.cpld_id = cpc_readb(card->hw.falcbase + CPLD_ID_REG);
  2996. card->hw.cpld_reg1 = CPLD_V2_REG1;
  2997. card->hw.cpld_reg2 = CPLD_V2_REG2;
  2998. } else {
  2999. /* old CPLD */
  3000. card->hw.cpld_id = 0;
  3001. card->hw.cpld_reg1 = CPLD_REG1;
  3002. card->hw.cpld_reg2 = CPLD_REG2;
  3003. cpc_writeb(card->hw.falcbase + CPLD_REG1, reg1);
  3004. }
  3005. /* Enable the board's global clock */
  3006. cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
  3007. cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
  3008. CPLD_REG1_GLOBAL_CLK);
  3009. }
  3010. for (i = 0; i < card->hw.nchan; i++) {
  3011. pc300ch_t *chan = &card->chan[i];
  3012. pc300dev_t *d = &chan->d;
  3013. hdlc_device *hdlc;
  3014. struct net_device *dev;
  3015. chan->card = card;
  3016. chan->channel = i;
  3017. chan->conf.phys_settings.clock_rate = 0;
  3018. chan->conf.phys_settings.clock_type = CLOCK_EXT;
  3019. chan->conf.proto_settings.encoding = ENCODING_NRZ;
  3020. chan->conf.proto_settings.parity = PARITY_CRC16_PR1_CCITT;
  3021. switch (card->hw.type) {
  3022. case PC300_TE:
  3023. chan->conf.media = IF_IFACE_T1;
  3024. chan->conf.lcode = PC300_LC_B8ZS;
  3025. chan->conf.fr_mode = PC300_FR_ESF;
  3026. chan->conf.lbo = PC300_LBO_0_DB;
  3027. chan->conf.rx_sens = PC300_RX_SENS_SH;
  3028. chan->conf.tslot_bitmap = 0xffffffffUL;
  3029. break;
  3030. case PC300_X21:
  3031. chan->conf.media = IF_IFACE_X21;
  3032. break;
  3033. case PC300_RSV:
  3034. default:
  3035. chan->conf.media = IF_IFACE_V35;
  3036. break;
  3037. }
  3038. chan->conf.proto = IF_PROTO_PPP;
  3039. chan->tx_first_bd = 0;
  3040. chan->tx_next_bd = 0;
  3041. chan->rx_first_bd = 0;
  3042. chan->rx_last_bd = N_DMA_RX_BUF - 1;
  3043. chan->nfree_tx_bd = N_DMA_TX_BUF;
  3044. d->chan = chan;
  3045. d->tx_skb = NULL;
  3046. d->trace_on = 0;
  3047. d->line_on = 0;
  3048. d->line_off = 0;
  3049. dev = alloc_hdlcdev(NULL);
  3050. if (dev == NULL)
  3051. continue;
  3052. hdlc = dev_to_hdlc(dev);
  3053. hdlc->xmit = cpc_queue_xmit;
  3054. hdlc->attach = cpc_attach;
  3055. d->dev = dev;
  3056. dev->mem_start = card->hw.ramphys;
  3057. dev->mem_end = card->hw.ramphys + card->hw.ramsize - 1;
  3058. dev->irq = card->hw.irq;
  3059. dev->init = NULL;
  3060. dev->tx_queue_len = PC300_TX_QUEUE_LEN;
  3061. dev->mtu = PC300_DEF_MTU;
  3062. dev->open = cpc_open;
  3063. dev->stop = cpc_close;
  3064. dev->tx_timeout = cpc_tx_timeout;
  3065. dev->watchdog_timeo = PC300_TX_TIMEOUT;
  3066. dev->get_stats = cpc_get_stats;
  3067. dev->set_multicast_list = NULL;
  3068. dev->set_mac_address = NULL;
  3069. dev->change_mtu = cpc_change_mtu;
  3070. dev->do_ioctl = cpc_ioctl;
  3071. if (register_hdlc_device(dev) == 0) {
  3072. dev->priv = d; /* We need 'priv', hdlc doesn't */
  3073. printk("%s: Cyclades-PC300/", dev->name);
  3074. switch (card->hw.type) {
  3075. case PC300_TE:
  3076. if (card->hw.bus == PC300_PMC) {
  3077. printk("TE-M");
  3078. } else {
  3079. printk("TE ");
  3080. }
  3081. break;
  3082. case PC300_X21:
  3083. printk("X21 ");
  3084. break;
  3085. case PC300_RSV:
  3086. default:
  3087. printk("RSV ");
  3088. break;
  3089. }
  3090. printk (" #%d, %dKB of RAM at 0x%08x, IRQ%d, channel %d.\n",
  3091. board_nbr, card->hw.ramsize / 1024,
  3092. card->hw.ramphys, card->hw.irq, i + 1);
  3093. devcount++;
  3094. } else {
  3095. printk ("Dev%d on card(0x%08x): unable to allocate i/f name.\n",
  3096. i + 1, card->hw.ramphys);
  3097. free_netdev(dev);
  3098. continue;
  3099. }
  3100. }
  3101. spin_lock_init(&card->card_lock);
  3102. board_nbr++;
  3103. }
  3104. static int __devinit
  3105. cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
  3106. {
  3107. static int first_time = 1;
  3108. int err, eeprom_outdated = 0;
  3109. ucshort device_id;
  3110. pc300_t *card;
  3111. if (first_time) {
  3112. first_time = 0;
  3113. show_version();
  3114. #ifdef CONFIG_PC300_MLPPP
  3115. cpc_tty_reset_var();
  3116. #endif
  3117. }
  3118. if ((err = pci_enable_device(pdev)) < 0)
  3119. return err;
  3120. card = kzalloc(sizeof(pc300_t), GFP_KERNEL);
  3121. if (card == NULL) {
  3122. printk("PC300 found at RAM 0x%016llx, "
  3123. "but could not allocate card structure.\n",
  3124. (unsigned long long)pci_resource_start(pdev, 3));
  3125. err = -ENOMEM;
  3126. goto err_disable_dev;
  3127. }
  3128. err = -ENODEV;
  3129. /* read PCI configuration area */
  3130. device_id = ent->device;
  3131. card->hw.irq = pdev->irq;
  3132. card->hw.iophys = pci_resource_start(pdev, 1);
  3133. card->hw.iosize = pci_resource_len(pdev, 1);
  3134. card->hw.scaphys = pci_resource_start(pdev, 2);
  3135. card->hw.scasize = pci_resource_len(pdev, 2);
  3136. card->hw.ramphys = pci_resource_start(pdev, 3);
  3137. card->hw.alloc_ramsize = pci_resource_len(pdev, 3);
  3138. card->hw.falcphys = pci_resource_start(pdev, 4);
  3139. card->hw.falcsize = pci_resource_len(pdev, 4);
  3140. card->hw.plxphys = pci_resource_start(pdev, 5);
  3141. card->hw.plxsize = pci_resource_len(pdev, 5);
  3142. switch (device_id) {
  3143. case PCI_DEVICE_ID_PC300_RX_1:
  3144. case PCI_DEVICE_ID_PC300_TE_1:
  3145. case PCI_DEVICE_ID_PC300_TE_M_1:
  3146. card->hw.nchan = 1;
  3147. break;
  3148. case PCI_DEVICE_ID_PC300_RX_2:
  3149. case PCI_DEVICE_ID_PC300_TE_2:
  3150. case PCI_DEVICE_ID_PC300_TE_M_2:
  3151. default:
  3152. card->hw.nchan = PC300_MAXCHAN;
  3153. break;
  3154. }
  3155. #ifdef PC300_DEBUG_PCI
  3156. printk("cpc (bus=0x0%x,pci_id=0x%x,", pdev->bus->number, pdev->devfn);
  3157. printk("rev_id=%d) IRQ%d\n", pdev->revision, card->hw.irq);
  3158. printk("cpc:found ramaddr=0x%08lx plxaddr=0x%08lx "
  3159. "ctladdr=0x%08lx falcaddr=0x%08lx\n",
  3160. card->hw.ramphys, card->hw.plxphys, card->hw.scaphys,
  3161. card->hw.falcphys);
  3162. #endif
  3163. /* Although we don't use this I/O region, we should
  3164. * request it from the kernel anyway, to avoid problems
  3165. * with other drivers accessing it. */
  3166. if (!request_region(card->hw.iophys, card->hw.iosize, "PLX Registers")) {
  3167. /* In case we can't allocate it, warn user */
  3168. printk("WARNING: couldn't allocate I/O region for PC300 board "
  3169. "at 0x%08x!\n", card->hw.ramphys);
  3170. }
  3171. if (card->hw.plxphys) {
  3172. pci_write_config_dword(pdev, PCI_BASE_ADDRESS_0, card->hw.plxphys);
  3173. } else {
  3174. eeprom_outdated = 1;
  3175. card->hw.plxphys = pci_resource_start(pdev, 0);
  3176. card->hw.plxsize = pci_resource_len(pdev, 0);
  3177. }
  3178. if (!request_mem_region(card->hw.plxphys, card->hw.plxsize,
  3179. "PLX Registers")) {
  3180. printk("PC300 found at RAM 0x%08x, "
  3181. "but could not allocate PLX mem region.\n",
  3182. card->hw.ramphys);
  3183. goto err_release_io;
  3184. }
  3185. if (!request_mem_region(card->hw.ramphys, card->hw.alloc_ramsize,
  3186. "On-board RAM")) {
  3187. printk("PC300 found at RAM 0x%08x, "
  3188. "but could not allocate RAM mem region.\n",
  3189. card->hw.ramphys);
  3190. goto err_release_plx;
  3191. }
  3192. if (!request_mem_region(card->hw.scaphys, card->hw.scasize,
  3193. "SCA-II Registers")) {
  3194. printk("PC300 found at RAM 0x%08x, "
  3195. "but could not allocate SCA mem region.\n",
  3196. card->hw.ramphys);
  3197. goto err_release_ram;
  3198. }
  3199. card->hw.plxbase = ioremap(card->hw.plxphys, card->hw.plxsize);
  3200. card->hw.rambase = ioremap(card->hw.ramphys, card->hw.alloc_ramsize);
  3201. card->hw.scabase = ioremap(card->hw.scaphys, card->hw.scasize);
  3202. switch (device_id) {
  3203. case PCI_DEVICE_ID_PC300_TE_1:
  3204. case PCI_DEVICE_ID_PC300_TE_2:
  3205. case PCI_DEVICE_ID_PC300_TE_M_1:
  3206. case PCI_DEVICE_ID_PC300_TE_M_2:
  3207. request_mem_region(card->hw.falcphys, card->hw.falcsize,
  3208. "FALC Registers");
  3209. card->hw.falcbase = ioremap(card->hw.falcphys, card->hw.falcsize);
  3210. break;
  3211. case PCI_DEVICE_ID_PC300_RX_1:
  3212. case PCI_DEVICE_ID_PC300_RX_2:
  3213. default:
  3214. card->hw.falcbase = NULL;
  3215. break;
  3216. }
  3217. #ifdef PC300_DEBUG_PCI
  3218. printk("cpc: relocate ramaddr=0x%08lx plxaddr=0x%08lx "
  3219. "ctladdr=0x%08lx falcaddr=0x%08lx\n",
  3220. card->hw.rambase, card->hw.plxbase, card->hw.scabase,
  3221. card->hw.falcbase);
  3222. #endif
  3223. /* Set PCI drv pointer to the card structure */
  3224. pci_set_drvdata(pdev, card);
  3225. /* Set board type */
  3226. switch (device_id) {
  3227. case PCI_DEVICE_ID_PC300_TE_1:
  3228. case PCI_DEVICE_ID_PC300_TE_2:
  3229. case PCI_DEVICE_ID_PC300_TE_M_1:
  3230. case PCI_DEVICE_ID_PC300_TE_M_2:
  3231. card->hw.type = PC300_TE;
  3232. if ((device_id == PCI_DEVICE_ID_PC300_TE_M_1) ||
  3233. (device_id == PCI_DEVICE_ID_PC300_TE_M_2)) {
  3234. card->hw.bus = PC300_PMC;
  3235. /* Set PLX register offsets */
  3236. card->hw.gpioc_reg = 0x54;
  3237. card->hw.intctl_reg = 0x4c;
  3238. } else {
  3239. card->hw.bus = PC300_PCI;
  3240. /* Set PLX register offsets */
  3241. card->hw.gpioc_reg = 0x50;
  3242. card->hw.intctl_reg = 0x4c;
  3243. }
  3244. break;
  3245. case PCI_DEVICE_ID_PC300_RX_1:
  3246. case PCI_DEVICE_ID_PC300_RX_2:
  3247. default:
  3248. card->hw.bus = PC300_PCI;
  3249. /* Set PLX register offsets */
  3250. card->hw.gpioc_reg = 0x50;
  3251. card->hw.intctl_reg = 0x4c;
  3252. if ((cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) & PC300_CTYPE_MASK)) {
  3253. card->hw.type = PC300_X21;
  3254. } else {
  3255. card->hw.type = PC300_RSV;
  3256. }
  3257. break;
  3258. }
  3259. /* Allocate IRQ */
  3260. if (request_irq(card->hw.irq, cpc_intr, IRQF_SHARED, "Cyclades-PC300", card)) {
  3261. printk ("PC300 found at RAM 0x%08x, but could not allocate IRQ%d.\n",
  3262. card->hw.ramphys, card->hw.irq);
  3263. goto err_io_unmap;
  3264. }
  3265. cpc_init_card(card);
  3266. if (eeprom_outdated)
  3267. printk("WARNING: PC300 with outdated EEPROM.\n");
  3268. return 0;
  3269. err_io_unmap:
  3270. iounmap(card->hw.plxbase);
  3271. iounmap(card->hw.scabase);
  3272. iounmap(card->hw.rambase);
  3273. if (card->hw.type == PC300_TE) {
  3274. iounmap(card->hw.falcbase);
  3275. release_mem_region(card->hw.falcphys, card->hw.falcsize);
  3276. }
  3277. release_mem_region(card->hw.scaphys, card->hw.scasize);
  3278. err_release_ram:
  3279. release_mem_region(card->hw.ramphys, card->hw.alloc_ramsize);
  3280. err_release_plx:
  3281. release_mem_region(card->hw.plxphys, card->hw.plxsize);
  3282. err_release_io:
  3283. release_region(card->hw.iophys, card->hw.iosize);
  3284. kfree(card);
  3285. err_disable_dev:
  3286. pci_disable_device(pdev);
  3287. return err;
  3288. }
  3289. static void __devexit cpc_remove_one(struct pci_dev *pdev)
  3290. {
  3291. pc300_t *card = pci_get_drvdata(pdev);
  3292. if (card->hw.rambase != 0) {
  3293. int i;
  3294. /* Disable interrupts on the PCI bridge */
  3295. cpc_writew(card->hw.plxbase + card->hw.intctl_reg,
  3296. cpc_readw(card->hw.plxbase + card->hw.intctl_reg) & ~(0x0040));
  3297. for (i = 0; i < card->hw.nchan; i++) {
  3298. unregister_hdlc_device(card->chan[i].d.dev);
  3299. }
  3300. iounmap(card->hw.plxbase);
  3301. iounmap(card->hw.scabase);
  3302. iounmap(card->hw.rambase);
  3303. release_mem_region(card->hw.plxphys, card->hw.plxsize);
  3304. release_mem_region(card->hw.ramphys, card->hw.alloc_ramsize);
  3305. release_mem_region(card->hw.scaphys, card->hw.scasize);
  3306. release_region(card->hw.iophys, card->hw.iosize);
  3307. if (card->hw.type == PC300_TE) {
  3308. iounmap(card->hw.falcbase);
  3309. release_mem_region(card->hw.falcphys, card->hw.falcsize);
  3310. }
  3311. for (i = 0; i < card->hw.nchan; i++)
  3312. if (card->chan[i].d.dev)
  3313. free_netdev(card->chan[i].d.dev);
  3314. if (card->hw.irq)
  3315. free_irq(card->hw.irq, card);
  3316. kfree(card);
  3317. pci_disable_device(pdev);
  3318. }
  3319. }
  3320. static struct pci_driver cpc_driver = {
  3321. .name = "pc300",
  3322. .id_table = cpc_pci_dev_id,
  3323. .probe = cpc_init_one,
  3324. .remove = __devexit_p(cpc_remove_one),
  3325. };
  3326. static int __init cpc_init(void)
  3327. {
  3328. return pci_register_driver(&cpc_driver);
  3329. }
  3330. static void __exit cpc_cleanup_module(void)
  3331. {
  3332. pci_unregister_driver(&cpc_driver);
  3333. }
  3334. module_init(cpc_init);
  3335. module_exit(cpc_cleanup_module);
  3336. MODULE_DESCRIPTION("Cyclades-PC300 cards driver");
  3337. MODULE_AUTHOR( "Author: Ivan Passos <ivan@cyclades.com>\r\n"
  3338. "Maintainer: PC300 Maintainer <pc300@cyclades.com");
  3339. MODULE_LICENSE("GPL");