pc300_drv.c 110 KB

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