wanpipe_multppp.c 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358
  1. /*****************************************************************************
  2. * wanpipe_multppp.c Multi-Port PPP driver module.
  3. *
  4. * Authors: Nenad Corbic <ncorbic@sangoma.com>
  5. *
  6. * Copyright: (c) 1995-2001 Sangoma Technologies Inc.
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License
  10. * as published by the Free Software Foundation; either version
  11. * 2 of the License, or (at your option) any later version.
  12. * ============================================================================
  13. * Dec 15 2000 Updated for 2.4.X kernel
  14. * Nov 15 2000 Fixed the SyncPPP support for kernels 2.2.16 and higher.
  15. * The pppstruct has changed.
  16. * Jul 13 2000 Using the kernel Syncppp module on top of RAW Wanpipe CHDLC
  17. * module.
  18. *****************************************************************************/
  19. #include <linux/module.h>
  20. #include <linux/kernel.h> /* printk(), and other useful stuff */
  21. #include <linux/stddef.h> /* offsetof(), etc. */
  22. #include <linux/errno.h> /* return codes */
  23. #include <linux/string.h> /* inline memset(), etc. */
  24. #include <linux/slab.h> /* kmalloc(), kfree() */
  25. #include <linux/wanrouter.h> /* WAN router definitions */
  26. #include <linux/wanpipe.h> /* WANPIPE common user API definitions */
  27. #include <linux/if_arp.h> /* ARPHRD_* defines */
  28. #include <linux/jiffies.h> /* time_after() macro */
  29. #include <linux/in.h> /* sockaddr_in */
  30. #include <linux/inet.h>
  31. #include <linux/if.h>
  32. #include <asm/byteorder.h> /* htons(), etc. */
  33. #include <linux/sdlapci.h>
  34. #include <asm/io.h>
  35. #include <linux/sdla_chdlc.h> /* CHDLC firmware API definitions */
  36. #include <linux/sdla_asy.h> /* CHDLC (async) API definitions */
  37. #include <linux/if_wanpipe_common.h> /* Socket Driver common area */
  38. #include <linux/if_wanpipe.h>
  39. #include <linux/inetdevice.h>
  40. #include <asm/uaccess.h>
  41. #include <net/syncppp.h>
  42. /****** Defines & Macros ****************************************************/
  43. #ifdef _DEBUG_
  44. #define STATIC
  45. #else
  46. #define STATIC static
  47. #endif
  48. /* reasons for enabling the timer interrupt on the adapter */
  49. #define TMR_INT_ENABLED_UDP 0x01
  50. #define TMR_INT_ENABLED_UPDATE 0x02
  51. #define TMR_INT_ENABLED_CONFIG 0x04
  52. #define CHDLC_DFLT_DATA_LEN 1500 /* default MTU */
  53. #define CHDLC_HDR_LEN 1
  54. #define IFF_POINTTOPOINT 0x10
  55. #define CHDLC_API 0x01
  56. #define PORT(x) (x == 0 ? "PRIMARY" : "SECONDARY" )
  57. #define MAX_BH_BUFF 10
  58. #define CRC_LENGTH 2
  59. #define PPP_HEADER_LEN 4
  60. /******Data Structures*****************************************************/
  61. /* This structure is placed in the private data area of the device structure.
  62. * The card structure used to occupy the private area but now the following
  63. * structure will incorporate the card structure along with CHDLC specific data
  64. */
  65. typedef struct chdlc_private_area
  66. {
  67. void *if_ptr; /* General Pointer used by SPPP */
  68. wanpipe_common_t common;
  69. sdla_t *card;
  70. int TracingEnabled; /* For enabling Tracing */
  71. unsigned long curr_trace_addr; /* Used for Tracing */
  72. unsigned long start_trace_addr;
  73. unsigned long end_trace_addr;
  74. unsigned long base_addr_trace_buffer;
  75. unsigned long end_addr_trace_buffer;
  76. unsigned short number_trace_elements;
  77. unsigned available_buffer_space;
  78. unsigned long router_start_time;
  79. unsigned char route_status;
  80. unsigned char route_removed;
  81. unsigned long tick_counter; /* For 5s timeout counter */
  82. unsigned long router_up_time;
  83. u32 IP_address; /* IP addressing */
  84. u32 IP_netmask;
  85. unsigned char mc; /* Mulitcast support on/off */
  86. unsigned short udp_pkt_lgth; /* udp packet processing */
  87. char udp_pkt_src;
  88. char udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT];
  89. unsigned short timer_int_enabled;
  90. char update_comms_stats; /* updating comms stats */
  91. //FIXME: add driver stats as per frame relay!
  92. } chdlc_private_area_t;
  93. /* Route Status options */
  94. #define NO_ROUTE 0x00
  95. #define ADD_ROUTE 0x01
  96. #define ROUTE_ADDED 0x02
  97. #define REMOVE_ROUTE 0x03
  98. /* variable for keeping track of enabling/disabling FT1 monitor status */
  99. static int rCount = 0;
  100. /* variable for tracking how many interfaces to open for WANPIPE on the
  101. two ports */
  102. extern void disable_irq(unsigned int);
  103. extern void enable_irq(unsigned int);
  104. /****** Function Prototypes *************************************************/
  105. /* WAN link driver entry points. These are called by the WAN router module. */
  106. static int update(struct wan_device* wandev);
  107. static int new_if(struct wan_device* wandev, struct net_device* dev,
  108. wanif_conf_t* conf);
  109. static int del_if(struct wan_device* wandev, struct net_device* dev);
  110. /* Network device interface */
  111. static int if_init(struct net_device* dev);
  112. static int if_open(struct net_device* dev);
  113. static int if_close(struct net_device* dev);
  114. static int if_send(struct sk_buff* skb, struct net_device* dev);
  115. static struct net_device_stats* if_stats(struct net_device* dev);
  116. static void if_tx_timeout(struct net_device *dev);
  117. /* CHDLC Firmware interface functions */
  118. static int chdlc_configure (sdla_t* card, void* data);
  119. static int chdlc_comm_enable (sdla_t* card);
  120. static int chdlc_comm_disable (sdla_t* card);
  121. static int chdlc_read_version (sdla_t* card, char* str);
  122. static int chdlc_set_intr_mode (sdla_t* card, unsigned mode);
  123. static int chdlc_send (sdla_t* card, void* data, unsigned len);
  124. static int chdlc_read_comm_err_stats (sdla_t* card);
  125. static int chdlc_read_op_stats (sdla_t* card);
  126. static int config_chdlc (sdla_t *card);
  127. /* Miscellaneous CHDLC Functions */
  128. static int set_chdlc_config (sdla_t* card);
  129. static void init_chdlc_tx_rx_buff(sdla_t* card, struct net_device *dev);
  130. static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb);
  131. static int process_chdlc_exception(sdla_t *card);
  132. static int process_global_exception(sdla_t *card);
  133. static int update_comms_stats(sdla_t* card,
  134. chdlc_private_area_t* chdlc_priv_area);
  135. static void port_set_state (sdla_t *card, int);
  136. /* Interrupt handlers */
  137. static void wsppp_isr (sdla_t* card);
  138. static void rx_intr (sdla_t* card);
  139. static void timer_intr(sdla_t *);
  140. /* Miscellaneous functions */
  141. static int reply_udp( unsigned char *data, unsigned int mbox_len );
  142. static int intr_test( sdla_t* card);
  143. static int udp_pkt_type( struct sk_buff *skb , sdla_t* card);
  144. static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card,
  145. struct sk_buff *skb, struct net_device* dev,
  146. chdlc_private_area_t* chdlc_priv_area);
  147. static int process_udp_mgmt_pkt(sdla_t* card, struct net_device* dev,
  148. chdlc_private_area_t* chdlc_priv_area);
  149. static unsigned short calc_checksum (char *, int);
  150. static void s508_lock (sdla_t *card, unsigned long *smp_flags);
  151. static void s508_unlock (sdla_t *card, unsigned long *smp_flags);
  152. static void send_ppp_term_request(struct net_device *dev);
  153. static int Intr_test_counter;
  154. /****** Public Functions ****************************************************/
  155. /*============================================================================
  156. * Cisco HDLC protocol initialization routine.
  157. *
  158. * This routine is called by the main WANPIPE module during setup. At this
  159. * point adapter is completely initialized and firmware is running.
  160. * o read firmware version (to make sure it's alive)
  161. * o configure adapter
  162. * o initialize protocol-specific fields of the adapter data space.
  163. *
  164. * Return: 0 o.k.
  165. * < 0 failure.
  166. */
  167. int wsppp_init (sdla_t* card, wandev_conf_t* conf)
  168. {
  169. unsigned char port_num;
  170. int err;
  171. unsigned long max_permitted_baud = 0;
  172. SHARED_MEMORY_INFO_STRUCT *flags;
  173. union
  174. {
  175. char str[80];
  176. } u;
  177. volatile CHDLC_MAILBOX_STRUCT* mb;
  178. CHDLC_MAILBOX_STRUCT* mb1;
  179. unsigned long timeout;
  180. /* Verify configuration ID */
  181. if (conf->config_id != WANCONFIG_MPPP) {
  182. printk(KERN_INFO "%s: invalid configuration ID %u!\n",
  183. card->devname, conf->config_id);
  184. return -EINVAL;
  185. }
  186. /* Find out which Port to use */
  187. if ((conf->comm_port == WANOPT_PRI) || (conf->comm_port == WANOPT_SEC)){
  188. if (card->next){
  189. if (conf->comm_port != card->next->u.c.comm_port){
  190. card->u.c.comm_port = conf->comm_port;
  191. }else{
  192. printk(KERN_ERR "%s: ERROR - %s port used!\n",
  193. card->wandev.name, PORT(conf->comm_port));
  194. return -EINVAL;
  195. }
  196. }else{
  197. card->u.c.comm_port = conf->comm_port;
  198. }
  199. }else{
  200. printk(KERN_ERR "%s: ERROR - Invalid Port Selected!\n",
  201. card->wandev.name);
  202. return -EINVAL;
  203. }
  204. /* Initialize protocol-specific fields */
  205. if(card->hw.type != SDLA_S514){
  206. if (card->u.c.comm_port == WANOPT_PRI){
  207. card->mbox = (void *) card->hw.dpmbase;
  208. }else{
  209. card->mbox = (void *) card->hw.dpmbase +
  210. SEC_BASE_ADDR_MB_STRUCT - PRI_BASE_ADDR_MB_STRUCT;
  211. }
  212. }else{
  213. /* for a S514 adapter, set a pointer to the actual mailbox in the */
  214. /* allocated virtual memory area */
  215. if (card->u.c.comm_port == WANOPT_PRI){
  216. card->mbox = (void *) card->hw.dpmbase + PRI_BASE_ADDR_MB_STRUCT;
  217. }else{
  218. card->mbox = (void *) card->hw.dpmbase + SEC_BASE_ADDR_MB_STRUCT;
  219. }
  220. }
  221. mb = mb1 = card->mbox;
  222. if (!card->configured){
  223. /* The board will place an 'I' in the return code to indicate that it is
  224. ready to accept commands. We expect this to be completed in less
  225. than 1 second. */
  226. timeout = jiffies + 1 * HZ;
  227. while (mb->return_code != 'I') /* Wait 1s for board to initialize */
  228. if (time_after(jiffies, timeout)) break;
  229. if (mb->return_code != 'I') {
  230. printk(KERN_INFO
  231. "%s: Initialization not completed by adapter\n",
  232. card->devname);
  233. printk(KERN_INFO "Please contact Sangoma representative.\n");
  234. return -EIO;
  235. }
  236. }
  237. /* Read firmware version. Note that when adapter initializes, it
  238. * clears the mailbox, so it may appear that the first command was
  239. * executed successfully when in fact it was merely erased. To work
  240. * around this, we execute the first command twice.
  241. */
  242. if (chdlc_read_version(card, u.str))
  243. return -EIO;
  244. printk(KERN_INFO "%s: Running Raw CHDLC firmware v%s\n"
  245. "%s: for Multi-Port PPP protocol.\n",
  246. card->devname,u.str,card->devname);
  247. card->isr = &wsppp_isr;
  248. card->poll = NULL;
  249. card->exec = NULL;
  250. card->wandev.update = &update;
  251. card->wandev.new_if = &new_if;
  252. card->wandev.del_if = &del_if;
  253. card->wandev.udp_port = conf->udp_port;
  254. card->wandev.new_if_cnt = 0;
  255. /* reset the number of times the 'update()' proc has been called */
  256. card->u.c.update_call_count = 0;
  257. card->wandev.ttl = conf->ttl;
  258. card->wandev.interface = conf->interface;
  259. if ((card->u.c.comm_port == WANOPT_SEC && conf->interface == WANOPT_V35)&&
  260. card->hw.type != SDLA_S514){
  261. printk(KERN_INFO "%s: ERROR - V35 Interface not supported on S508 %s port \n",
  262. card->devname, PORT(card->u.c.comm_port));
  263. return -EIO;
  264. }
  265. card->wandev.clocking = conf->clocking;
  266. port_num = card->u.c.comm_port;
  267. /* Setup Port Bps */
  268. if(card->wandev.clocking) {
  269. if((port_num == WANOPT_PRI) || card->u.c.receive_only) {
  270. /* For Primary Port 0 */
  271. max_permitted_baud =
  272. (card->hw.type == SDLA_S514) ?
  273. PRI_MAX_BAUD_RATE_S514 :
  274. PRI_MAX_BAUD_RATE_S508;
  275. }
  276. else if(port_num == WANOPT_SEC) {
  277. /* For Secondary Port 1 */
  278. max_permitted_baud =
  279. (card->hw.type == SDLA_S514) ?
  280. SEC_MAX_BAUD_RATE_S514 :
  281. SEC_MAX_BAUD_RATE_S508;
  282. }
  283. if(conf->bps > max_permitted_baud) {
  284. conf->bps = max_permitted_baud;
  285. printk(KERN_INFO "%s: Baud too high!\n",
  286. card->wandev.name);
  287. printk(KERN_INFO "%s: Baud rate set to %lu bps\n",
  288. card->wandev.name, max_permitted_baud);
  289. }
  290. card->wandev.bps = conf->bps;
  291. }else{
  292. card->wandev.bps = 0;
  293. }
  294. /* Setup the Port MTU */
  295. if((port_num == WANOPT_PRI) || card->u.c.receive_only) {
  296. /* For Primary Port 0 */
  297. card->wandev.mtu =
  298. (conf->mtu >= MIN_LGTH_CHDLC_DATA_CFG) ?
  299. min_t(unsigned int, conf->mtu, PRI_MAX_NO_DATA_BYTES_IN_FRAME) :
  300. CHDLC_DFLT_DATA_LEN;
  301. } else if(port_num == WANOPT_SEC) {
  302. /* For Secondary Port 1 */
  303. card->wandev.mtu =
  304. (conf->mtu >= MIN_LGTH_CHDLC_DATA_CFG) ?
  305. min_t(unsigned int, conf->mtu, SEC_MAX_NO_DATA_BYTES_IN_FRAME) :
  306. CHDLC_DFLT_DATA_LEN;
  307. }
  308. /* Add on a PPP Header */
  309. card->wandev.mtu += PPP_HEADER_LEN;
  310. /* Set up the interrupt status area */
  311. /* Read the CHDLC Configuration and obtain:
  312. * Ptr to shared memory infor struct
  313. * Use this pointer to calculate the value of card->u.c.flags !
  314. */
  315. mb1->buffer_length = 0;
  316. mb1->command = READ_CHDLC_CONFIGURATION;
  317. err = sdla_exec(mb1) ? mb1->return_code : CMD_TIMEOUT;
  318. if(err != COMMAND_OK) {
  319. clear_bit(1, (void*)&card->wandev.critical);
  320. if(card->hw.type != SDLA_S514)
  321. enable_irq(card->hw.irq);
  322. chdlc_error(card, err, mb1);
  323. return -EIO;
  324. }
  325. if(card->hw.type == SDLA_S514){
  326. card->u.c.flags = (void *)(card->hw.dpmbase +
  327. (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)->
  328. ptr_shared_mem_info_struct));
  329. }else{
  330. card->u.c.flags = (void *)(card->hw.dpmbase +
  331. (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)->
  332. ptr_shared_mem_info_struct % SDLA_WINDOWSIZE));
  333. }
  334. flags = card->u.c.flags;
  335. /* This is for the ports link state */
  336. card->wandev.state = WAN_DUALPORT;
  337. card->u.c.state = WAN_DISCONNECTED;
  338. if (!card->wandev.piggyback){
  339. err = intr_test(card);
  340. if(err || (Intr_test_counter < MAX_INTR_TEST_COUNTER)) {
  341. printk(KERN_ERR "%s: Interrupt test failed (%i)\n",
  342. card->devname, Intr_test_counter);
  343. printk(KERN_ERR "%s: Please choose another interrupt\n",
  344. card->devname);
  345. return -EIO;
  346. }
  347. printk(KERN_INFO "%s: Interrupt test passed (%i)\n",
  348. card->devname, Intr_test_counter);
  349. }
  350. if (chdlc_set_intr_mode(card, APP_INT_ON_TIMER)){
  351. printk (KERN_INFO "%s: Failed to set interrupt triggers!\n",
  352. card->devname);
  353. return -EIO;
  354. }
  355. /* Mask the Timer interrupt */
  356. flags->interrupt_info_struct.interrupt_permission &=
  357. ~APP_INT_ON_TIMER;
  358. printk(KERN_INFO "\n");
  359. return 0;
  360. }
  361. /******* WAN Device Driver Entry Points *************************************/
  362. /*============================================================================
  363. * Update device status & statistics
  364. * This procedure is called when updating the PROC file system and returns
  365. * various communications statistics. These statistics are accumulated from 3
  366. * different locations:
  367. * 1) The 'if_stats' recorded for the device.
  368. * 2) Communication error statistics on the adapter.
  369. * 3) CHDLC operational statistics on the adapter.
  370. * The board level statistics are read during a timer interrupt. Note that we
  371. * read the error and operational statistics during consecitive timer ticks so
  372. * as to minimize the time that we are inside the interrupt handler.
  373. *
  374. */
  375. static int update(struct wan_device* wandev)
  376. {
  377. sdla_t* card = wandev->private;
  378. struct net_device* dev;
  379. volatile chdlc_private_area_t* chdlc_priv_area;
  380. SHARED_MEMORY_INFO_STRUCT *flags;
  381. unsigned long timeout;
  382. /* sanity checks */
  383. if((wandev == NULL) || (wandev->private == NULL))
  384. return -EFAULT;
  385. if(wandev->state == WAN_UNCONFIGURED)
  386. return -ENODEV;
  387. /* more sanity checks */
  388. if(!card->u.c.flags)
  389. return -ENODEV;
  390. if((dev=card->wandev.dev) == NULL)
  391. return -ENODEV;
  392. if((chdlc_priv_area=dev->priv) == NULL)
  393. return -ENODEV;
  394. flags = card->u.c.flags;
  395. if(chdlc_priv_area->update_comms_stats){
  396. return -EAGAIN;
  397. }
  398. /* we will need 2 timer interrupts to complete the */
  399. /* reading of the statistics */
  400. chdlc_priv_area->update_comms_stats = 2;
  401. flags->interrupt_info_struct.interrupt_permission |= APP_INT_ON_TIMER;
  402. chdlc_priv_area->timer_int_enabled = TMR_INT_ENABLED_UPDATE;
  403. /* wait a maximum of 1 second for the statistics to be updated */
  404. timeout = jiffies + 1 * HZ;
  405. for(;;) {
  406. if(chdlc_priv_area->update_comms_stats == 0)
  407. break;
  408. if (time_after(jiffies, timeout)){
  409. chdlc_priv_area->update_comms_stats = 0;
  410. chdlc_priv_area->timer_int_enabled &=
  411. ~TMR_INT_ENABLED_UPDATE;
  412. return -EAGAIN;
  413. }
  414. }
  415. return 0;
  416. }
  417. /*============================================================================
  418. * Create new logical channel.
  419. * This routine is called by the router when ROUTER_IFNEW IOCTL is being
  420. * handled.
  421. * o parse media- and hardware-specific configuration
  422. * o make sure that a new channel can be created
  423. * o allocate resources, if necessary
  424. * o prepare network device structure for registaration.
  425. *
  426. * Return: 0 o.k.
  427. * < 0 failure (channel will not be created)
  428. */
  429. static int new_if(struct wan_device* wandev, struct net_device* pdev,
  430. wanif_conf_t* conf)
  431. {
  432. struct ppp_device *pppdev = (struct ppp_device *)pdev;
  433. struct net_device *dev = NULL;
  434. struct sppp *sp;
  435. sdla_t* card = wandev->private;
  436. chdlc_private_area_t* chdlc_priv_area;
  437. if ((conf->name[0] == '\0') || (strlen(conf->name) > WAN_IFNAME_SZ)) {
  438. printk(KERN_INFO "%s: invalid interface name!\n",
  439. card->devname);
  440. return -EINVAL;
  441. }
  442. /* allocate and initialize private data */
  443. chdlc_priv_area = kmalloc(sizeof(chdlc_private_area_t), GFP_KERNEL);
  444. if(chdlc_priv_area == NULL)
  445. return -ENOMEM;
  446. memset(chdlc_priv_area, 0, sizeof(chdlc_private_area_t));
  447. chdlc_priv_area->card = card;
  448. /* initialize data */
  449. strcpy(card->u.c.if_name, conf->name);
  450. if(card->wandev.new_if_cnt > 0) {
  451. kfree(chdlc_priv_area);
  452. return -EEXIST;
  453. }
  454. card->wandev.new_if_cnt++;
  455. chdlc_priv_area->TracingEnabled = 0;
  456. //We don't need this any more
  457. chdlc_priv_area->route_status = NO_ROUTE;
  458. chdlc_priv_area->route_removed = 0;
  459. printk(KERN_INFO "%s: Firmware running in HDLC STREAMING Mode\n",
  460. wandev->name);
  461. /* Setup wanpipe as a router (WANPIPE) or as an API */
  462. if( strcmp(conf->usedby, "WANPIPE") == 0) {
  463. printk(KERN_INFO "%s: Driver running in WANPIPE mode!\n",
  464. wandev->name);
  465. card->u.c.usedby = WANPIPE;
  466. } else {
  467. printk(KERN_INFO
  468. "%s: API Mode is not supported for SyncPPP!\n",
  469. wandev->name);
  470. kfree(chdlc_priv_area);
  471. return -EINVAL;
  472. }
  473. /* Get Multicast Information */
  474. chdlc_priv_area->mc = conf->mc;
  475. chdlc_priv_area->if_ptr = pppdev;
  476. /* prepare network device data space for registration */
  477. strcpy(dev->name,card->u.c.if_name);
  478. /* Attach PPP protocol layer to pppdev
  479. * The sppp_attach() will initilize the dev structure
  480. * and setup ppp layer protocols.
  481. * All we have to do is to bind in:
  482. * if_open(), if_close(), if_send() and get_stats() functions.
  483. */
  484. sppp_attach(pppdev);
  485. dev = pppdev->dev;
  486. sp = &pppdev->sppp;
  487. /* Enable PPP Debugging */
  488. // FIXME Fix this up somehow
  489. //sp->pp_flags |= PP_DEBUG;
  490. sp->pp_flags &= ~PP_CISCO;
  491. dev->init = &if_init;
  492. dev->priv = chdlc_priv_area;
  493. return 0;
  494. }
  495. /*============================================================================
  496. * Delete logical channel.
  497. */
  498. static int del_if(struct wan_device* wandev, struct net_device* dev)
  499. {
  500. chdlc_private_area_t *chdlc_priv_area = dev->priv;
  501. sdla_t *card = chdlc_priv_area->card;
  502. unsigned long smp_lock;
  503. /* Detach the PPP layer */
  504. printk(KERN_INFO "%s: Detaching SyncPPP Module from %s\n",
  505. wandev->name,dev->name);
  506. lock_adapter_irq(&wandev->lock,&smp_lock);
  507. sppp_detach(dev);
  508. chdlc_priv_area->if_ptr=NULL;
  509. chdlc_set_intr_mode(card, 0);
  510. if (card->u.c.comm_enabled)
  511. chdlc_comm_disable(card);
  512. unlock_adapter_irq(&wandev->lock,&smp_lock);
  513. port_set_state(card, WAN_DISCONNECTED);
  514. return 0;
  515. }
  516. /****** Network Device Interface ********************************************/
  517. /*============================================================================
  518. * Initialize Linux network interface.
  519. *
  520. * This routine is called only once for each interface, during Linux network
  521. * interface registration. Returning anything but zero will fail interface
  522. * registration.
  523. */
  524. static int if_init(struct net_device* dev)
  525. {
  526. chdlc_private_area_t* chdlc_priv_area = dev->priv;
  527. sdla_t* card = chdlc_priv_area->card;
  528. struct wan_device* wandev = &card->wandev;
  529. /* NOTE: Most of the dev initialization was
  530. * done in sppp_attach(), called by new_if()
  531. * function. All we have to do here is
  532. * to link four major routines below.
  533. */
  534. /* Initialize device driver entry points */
  535. dev->open = &if_open;
  536. dev->stop = &if_close;
  537. dev->hard_start_xmit = &if_send;
  538. dev->get_stats = &if_stats;
  539. dev->tx_timeout = &if_tx_timeout;
  540. dev->watchdog_timeo = TX_TIMEOUT;
  541. /* Initialize hardware parameters */
  542. dev->irq = wandev->irq;
  543. dev->dma = wandev->dma;
  544. dev->base_addr = wandev->ioport;
  545. dev->mem_start = wandev->maddr;
  546. dev->mem_end = wandev->maddr + wandev->msize - 1;
  547. /* Set transmit buffer queue length
  548. * If we over fill this queue the packets will
  549. * be droped by the kernel.
  550. * sppp_attach() sets this to 10, but
  551. * 100 will give us more room at low speeds.
  552. */
  553. dev->tx_queue_len = 100;
  554. return 0;
  555. }
  556. /*============================================================================
  557. * Handle transmit timeout event from netif watchdog
  558. */
  559. static void if_tx_timeout(struct net_device *dev)
  560. {
  561. chdlc_private_area_t* chan = dev->priv;
  562. sdla_t *card = chan->card;
  563. /* If our device stays busy for at least 5 seconds then we will
  564. * kick start the device by making dev->tbusy = 0. We expect
  565. * that our device never stays busy more than 5 seconds. So this
  566. * is only used as a last resort.
  567. */
  568. ++card->wandev.stats.collisions;
  569. printk (KERN_INFO "%s: Transmit timed out on %s\n", card->devname,dev->name);
  570. netif_wake_queue (dev);
  571. }
  572. /*============================================================================
  573. * Open network interface.
  574. * o enable communications and interrupts.
  575. * o prevent module from unloading by incrementing use count
  576. *
  577. * Return 0 if O.k. or errno.
  578. */
  579. static int if_open(struct net_device* dev)
  580. {
  581. chdlc_private_area_t* chdlc_priv_area = dev->priv;
  582. sdla_t* card = chdlc_priv_area->card;
  583. struct timeval tv;
  584. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  585. /* Only one open per interface is allowed */
  586. if (netif_running(dev))
  587. return -EBUSY;
  588. /* Start PPP Layer */
  589. if (sppp_open(dev)){
  590. return -EIO;
  591. }
  592. do_gettimeofday(&tv);
  593. chdlc_priv_area->router_start_time = tv.tv_sec;
  594. netif_start_queue(dev);
  595. wanpipe_open(card);
  596. chdlc_priv_area->timer_int_enabled |= TMR_INT_ENABLED_CONFIG;
  597. flags->interrupt_info_struct.interrupt_permission |= APP_INT_ON_TIMER;
  598. return 0;
  599. }
  600. /*============================================================================
  601. * Close network interface.
  602. * o if this is the last close, then disable communications and interrupts.
  603. * o reset flags.
  604. */
  605. static int if_close(struct net_device* dev)
  606. {
  607. chdlc_private_area_t* chdlc_priv_area = dev->priv;
  608. sdla_t* card = chdlc_priv_area->card;
  609. /* Stop the PPP Layer */
  610. sppp_close(dev);
  611. netif_stop_queue(dev);
  612. wanpipe_close(card);
  613. return 0;
  614. }
  615. /*============================================================================
  616. * Send a packet on a network interface.
  617. * o set tbusy flag (marks start of the transmission) to block a timer-based
  618. * transmit from overlapping.
  619. * o check link state. If link is not up, then drop the packet.
  620. * o execute adapter send command.
  621. * o free socket buffer
  622. *
  623. * Return: 0 complete (socket buffer must be freed)
  624. * non-0 packet may be re-transmitted (tbusy must be set)
  625. *
  626. * Notes:
  627. * 1. This routine is called either by the protocol stack or by the "net
  628. * bottom half" (with interrupts enabled).
  629. * 2. Setting tbusy flag will inhibit further transmit requests from the
  630. * protocol stack and can be used for flow control with protocol layer.
  631. */
  632. static int if_send(struct sk_buff* skb, struct net_device* dev)
  633. {
  634. chdlc_private_area_t *chdlc_priv_area = dev->priv;
  635. sdla_t *card = chdlc_priv_area->card;
  636. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  637. INTERRUPT_INFORMATION_STRUCT *chdlc_int = &flags->interrupt_info_struct;
  638. int udp_type = 0;
  639. unsigned long smp_flags;
  640. int err=0;
  641. netif_stop_queue(dev);
  642. if (skb == NULL){
  643. /* If we get here, some higher layer thinks we've missed an
  644. * tx-done interrupt.
  645. */
  646. printk(KERN_INFO "%s: Received NULL skb buffer! interface %s got kicked!\n",
  647. card->devname, dev->name);
  648. netif_wake_queue(dev);
  649. return 0;
  650. }
  651. if (ntohs(skb->protocol) != htons(PVC_PROT)){
  652. /* check the udp packet type */
  653. udp_type = udp_pkt_type(skb, card);
  654. if (udp_type == UDP_CPIPE_TYPE){
  655. if(store_udp_mgmt_pkt(UDP_PKT_FRM_STACK, card, skb, dev,
  656. chdlc_priv_area)){
  657. chdlc_int->interrupt_permission |=
  658. APP_INT_ON_TIMER;
  659. }
  660. netif_start_queue(dev);
  661. return 0;
  662. }
  663. }
  664. /* Lock the 508 Card: SMP is supported */
  665. if(card->hw.type != SDLA_S514){
  666. s508_lock(card,&smp_flags);
  667. }
  668. if (test_and_set_bit(SEND_CRIT, (void*)&card->wandev.critical)){
  669. printk(KERN_INFO "%s: Critical in if_send: %lx\n",
  670. card->wandev.name,card->wandev.critical);
  671. ++card->wandev.stats.tx_dropped;
  672. netif_start_queue(dev);
  673. goto if_send_crit_exit;
  674. }
  675. if (card->wandev.state != WAN_CONNECTED){
  676. ++card->wandev.stats.tx_dropped;
  677. netif_start_queue(dev);
  678. goto if_send_crit_exit;
  679. }
  680. if (chdlc_send(card, skb->data, skb->len)){
  681. netif_stop_queue(dev);
  682. }else{
  683. ++card->wandev.stats.tx_packets;
  684. card->wandev.stats.tx_bytes += skb->len;
  685. dev->trans_start = jiffies;
  686. netif_start_queue(dev);
  687. }
  688. if_send_crit_exit:
  689. if (!(err=netif_queue_stopped(dev))){
  690. dev_kfree_skb_any(skb);
  691. }else{
  692. chdlc_priv_area->tick_counter = jiffies;
  693. chdlc_int->interrupt_permission |= APP_INT_ON_TX_FRAME;
  694. }
  695. clear_bit(SEND_CRIT, (void*)&card->wandev.critical);
  696. if(card->hw.type != SDLA_S514){
  697. s508_unlock(card,&smp_flags);
  698. }
  699. return err;
  700. }
  701. /*============================================================================
  702. * Reply to UDP Management system.
  703. * Return length of reply.
  704. */
  705. static int reply_udp( unsigned char *data, unsigned int mbox_len )
  706. {
  707. unsigned short len, udp_length, temp, ip_length;
  708. unsigned long ip_temp;
  709. int even_bound = 0;
  710. chdlc_udp_pkt_t *c_udp_pkt = (chdlc_udp_pkt_t *)data;
  711. /* Set length of packet */
  712. len = sizeof(ip_pkt_t)+
  713. sizeof(udp_pkt_t)+
  714. sizeof(wp_mgmt_t)+
  715. sizeof(cblock_t)+
  716. sizeof(trace_info_t)+
  717. mbox_len;
  718. /* fill in UDP reply */
  719. c_udp_pkt->wp_mgmt.request_reply = UDPMGMT_REPLY;
  720. /* fill in UDP length */
  721. udp_length = sizeof(udp_pkt_t)+
  722. sizeof(wp_mgmt_t)+
  723. sizeof(cblock_t)+
  724. sizeof(trace_info_t)+
  725. mbox_len;
  726. /* put it on an even boundary */
  727. if ( udp_length & 0x0001 ) {
  728. udp_length += 1;
  729. len += 1;
  730. even_bound = 1;
  731. }
  732. temp = (udp_length<<8)|(udp_length>>8);
  733. c_udp_pkt->udp_pkt.udp_length = temp;
  734. /* swap UDP ports */
  735. temp = c_udp_pkt->udp_pkt.udp_src_port;
  736. c_udp_pkt->udp_pkt.udp_src_port =
  737. c_udp_pkt->udp_pkt.udp_dst_port;
  738. c_udp_pkt->udp_pkt.udp_dst_port = temp;
  739. /* add UDP pseudo header */
  740. temp = 0x1100;
  741. *((unsigned short *)(c_udp_pkt->data+mbox_len+even_bound)) = temp;
  742. temp = (udp_length<<8)|(udp_length>>8);
  743. *((unsigned short *)(c_udp_pkt->data+mbox_len+even_bound+2)) = temp;
  744. /* calculate UDP checksum */
  745. c_udp_pkt->udp_pkt.udp_checksum = 0;
  746. c_udp_pkt->udp_pkt.udp_checksum = calc_checksum(&data[UDP_OFFSET],udp_length+UDP_OFFSET);
  747. /* fill in IP length */
  748. ip_length = len;
  749. temp = (ip_length<<8)|(ip_length>>8);
  750. c_udp_pkt->ip_pkt.total_length = temp;
  751. /* swap IP addresses */
  752. ip_temp = c_udp_pkt->ip_pkt.ip_src_address;
  753. c_udp_pkt->ip_pkt.ip_src_address = c_udp_pkt->ip_pkt.ip_dst_address;
  754. c_udp_pkt->ip_pkt.ip_dst_address = ip_temp;
  755. /* fill in IP checksum */
  756. c_udp_pkt->ip_pkt.hdr_checksum = 0;
  757. c_udp_pkt->ip_pkt.hdr_checksum = calc_checksum(data,sizeof(ip_pkt_t));
  758. return len;
  759. } /* reply_udp */
  760. unsigned short calc_checksum (char *data, int len)
  761. {
  762. unsigned short temp;
  763. unsigned long sum=0;
  764. int i;
  765. for( i = 0; i <len; i+=2 ) {
  766. memcpy(&temp,&data[i],2);
  767. sum += (unsigned long)temp;
  768. }
  769. while (sum >> 16 ) {
  770. sum = (sum & 0xffffUL) + (sum >> 16);
  771. }
  772. temp = (unsigned short)sum;
  773. temp = ~temp;
  774. if( temp == 0 )
  775. temp = 0xffff;
  776. return temp;
  777. }
  778. /*============================================================================
  779. * Get ethernet-style interface statistics.
  780. * Return a pointer to struct enet_statistics.
  781. */
  782. static struct net_device_stats* if_stats(struct net_device* dev)
  783. {
  784. sdla_t *my_card;
  785. chdlc_private_area_t* chdlc_priv_area;
  786. /* Shutdown bug fix. In del_if() we kill
  787. * dev->priv pointer. This function, gets
  788. * called after del_if(), thus check
  789. * if pointer has been deleted */
  790. if ((chdlc_priv_area=dev->priv) == NULL)
  791. return NULL;
  792. my_card = chdlc_priv_area->card;
  793. return &my_card->wandev.stats;
  794. }
  795. /****** Cisco HDLC Firmware Interface Functions *******************************/
  796. /*============================================================================
  797. * Read firmware code version.
  798. * Put code version as ASCII string in str.
  799. */
  800. static int chdlc_read_version (sdla_t* card, char* str)
  801. {
  802. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  803. int len;
  804. char err;
  805. mb->buffer_length = 0;
  806. mb->command = READ_CHDLC_CODE_VERSION;
  807. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  808. if(err != COMMAND_OK) {
  809. chdlc_error(card,err,mb);
  810. }
  811. else if (str) { /* is not null */
  812. len = mb->buffer_length;
  813. memcpy(str, mb->data, len);
  814. str[len] = '\0';
  815. }
  816. return (err);
  817. }
  818. /*-----------------------------------------------------------------------------
  819. * Configure CHDLC firmware.
  820. */
  821. static int chdlc_configure (sdla_t* card, void* data)
  822. {
  823. int err;
  824. CHDLC_MAILBOX_STRUCT *mailbox = card->mbox;
  825. int data_length = sizeof(CHDLC_CONFIGURATION_STRUCT);
  826. mailbox->buffer_length = data_length;
  827. memcpy(mailbox->data, data, data_length);
  828. mailbox->command = SET_CHDLC_CONFIGURATION;
  829. err = sdla_exec(mailbox) ? mailbox->return_code : CMD_TIMEOUT;
  830. if (err != COMMAND_OK) chdlc_error (card, err, mailbox);
  831. return err;
  832. }
  833. /*============================================================================
  834. * Set interrupt mode -- HDLC Version.
  835. */
  836. static int chdlc_set_intr_mode (sdla_t* card, unsigned mode)
  837. {
  838. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  839. CHDLC_INT_TRIGGERS_STRUCT* int_data =
  840. (CHDLC_INT_TRIGGERS_STRUCT *)mb->data;
  841. int err;
  842. int_data->CHDLC_interrupt_triggers = mode;
  843. int_data->IRQ = card->hw.irq;
  844. int_data->interrupt_timer = 1;
  845. mb->buffer_length = sizeof(CHDLC_INT_TRIGGERS_STRUCT);
  846. mb->command = SET_CHDLC_INTERRUPT_TRIGGERS;
  847. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  848. if (err != COMMAND_OK)
  849. chdlc_error (card, err, mb);
  850. return err;
  851. }
  852. /*============================================================================
  853. * Enable communications.
  854. */
  855. static int chdlc_comm_enable (sdla_t* card)
  856. {
  857. int err;
  858. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  859. mb->buffer_length = 0;
  860. mb->command = ENABLE_CHDLC_COMMUNICATIONS;
  861. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  862. if (err != COMMAND_OK)
  863. chdlc_error(card, err, mb);
  864. else
  865. card->u.c.comm_enabled=1;
  866. return err;
  867. }
  868. /*============================================================================
  869. * Disable communications and Drop the Modem lines (DCD and RTS).
  870. */
  871. static int chdlc_comm_disable (sdla_t* card)
  872. {
  873. int err;
  874. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  875. mb->buffer_length = 0;
  876. mb->command = DISABLE_CHDLC_COMMUNICATIONS;
  877. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  878. if (err != COMMAND_OK)
  879. chdlc_error(card,err,mb);
  880. return err;
  881. }
  882. /*============================================================================
  883. * Read communication error statistics.
  884. */
  885. static int chdlc_read_comm_err_stats (sdla_t* card)
  886. {
  887. int err;
  888. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  889. mb->buffer_length = 0;
  890. mb->command = READ_COMMS_ERROR_STATS;
  891. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  892. if (err != COMMAND_OK)
  893. chdlc_error(card,err,mb);
  894. return err;
  895. }
  896. /*============================================================================
  897. * Read CHDLC operational statistics.
  898. */
  899. static int chdlc_read_op_stats (sdla_t* card)
  900. {
  901. int err;
  902. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  903. mb->buffer_length = 0;
  904. mb->command = READ_CHDLC_OPERATIONAL_STATS;
  905. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  906. if (err != COMMAND_OK)
  907. chdlc_error(card,err,mb);
  908. return err;
  909. }
  910. /*============================================================================
  911. * Update communications error and general packet statistics.
  912. */
  913. static int update_comms_stats(sdla_t* card,
  914. chdlc_private_area_t* chdlc_priv_area)
  915. {
  916. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  917. COMMS_ERROR_STATS_STRUCT* err_stats;
  918. CHDLC_OPERATIONAL_STATS_STRUCT *op_stats;
  919. /* on the first timer interrupt, read the comms error statistics */
  920. if(chdlc_priv_area->update_comms_stats == 2) {
  921. if(chdlc_read_comm_err_stats(card))
  922. return 1;
  923. err_stats = (COMMS_ERROR_STATS_STRUCT *)mb->data;
  924. card->wandev.stats.rx_over_errors =
  925. err_stats->Rx_overrun_err_count;
  926. card->wandev.stats.rx_crc_errors =
  927. err_stats->CRC_err_count;
  928. card->wandev.stats.rx_frame_errors =
  929. err_stats->Rx_abort_count;
  930. card->wandev.stats.rx_fifo_errors =
  931. err_stats->Rx_dis_pri_bfrs_full_count;
  932. card->wandev.stats.rx_missed_errors =
  933. card->wandev.stats.rx_fifo_errors;
  934. card->wandev.stats.tx_aborted_errors =
  935. err_stats->sec_Tx_abort_count;
  936. }
  937. /* on the second timer interrupt, read the operational statistics */
  938. else {
  939. if(chdlc_read_op_stats(card))
  940. return 1;
  941. op_stats = (CHDLC_OPERATIONAL_STATS_STRUCT *)mb->data;
  942. card->wandev.stats.rx_length_errors =
  943. (op_stats->Rx_Data_discard_short_count +
  944. op_stats->Rx_Data_discard_long_count);
  945. }
  946. return 0;
  947. }
  948. /*============================================================================
  949. * Send packet.
  950. * Return: 0 - o.k.
  951. * 1 - no transmit buffers available
  952. */
  953. static int chdlc_send (sdla_t* card, void* data, unsigned len)
  954. {
  955. CHDLC_DATA_TX_STATUS_EL_STRUCT *txbuf = card->u.c.txbuf;
  956. if (txbuf->opp_flag)
  957. return 1;
  958. sdla_poke(&card->hw, txbuf->ptr_data_bfr, data, len);
  959. txbuf->frame_length = len;
  960. txbuf->opp_flag = 1; /* start transmission */
  961. /* Update transmit buffer control fields */
  962. card->u.c.txbuf = ++txbuf;
  963. if ((void*)txbuf > card->u.c.txbuf_last)
  964. card->u.c.txbuf = card->u.c.txbuf_base;
  965. return 0;
  966. }
  967. /****** Firmware Error Handler **********************************************/
  968. /*============================================================================
  969. * Firmware error handler.
  970. * This routine is called whenever firmware command returns non-zero
  971. * return code.
  972. *
  973. * Return zero if previous command has to be cancelled.
  974. */
  975. static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb)
  976. {
  977. unsigned cmd = mb->command;
  978. switch (err) {
  979. case CMD_TIMEOUT:
  980. printk(KERN_ERR "%s: command 0x%02X timed out!\n",
  981. card->devname, cmd);
  982. break;
  983. case S514_BOTH_PORTS_SAME_CLK_MODE:
  984. if(cmd == SET_CHDLC_CONFIGURATION) {
  985. printk(KERN_INFO
  986. "%s: Configure both ports for the same clock source\n",
  987. card->devname);
  988. break;
  989. }
  990. default:
  991. printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!\n",
  992. card->devname, cmd, err);
  993. }
  994. return 0;
  995. }
  996. /****** Interrupt Handlers **************************************************/
  997. /*============================================================================
  998. * Cisco HDLC interrupt service routine.
  999. */
  1000. STATIC void wsppp_isr (sdla_t* card)
  1001. {
  1002. struct net_device* dev;
  1003. SHARED_MEMORY_INFO_STRUCT* flags = NULL;
  1004. int i;
  1005. sdla_t *my_card;
  1006. /* Check for which port the interrupt has been generated
  1007. * Since Secondary Port is piggybacking on the Primary
  1008. * the check must be done here.
  1009. */
  1010. flags = card->u.c.flags;
  1011. if (!flags->interrupt_info_struct.interrupt_type){
  1012. /* Check for a second port (piggybacking) */
  1013. if((my_card = card->next)){
  1014. flags = my_card->u.c.flags;
  1015. if (flags->interrupt_info_struct.interrupt_type){
  1016. card = my_card;
  1017. card->isr(card);
  1018. return;
  1019. }
  1020. }
  1021. }
  1022. dev = card->wandev.dev;
  1023. card->in_isr = 1;
  1024. flags = card->u.c.flags;
  1025. /* If we get an interrupt with no network device, stop the interrupts
  1026. * and issue an error */
  1027. if ((!dev || !dev->priv) && flags->interrupt_info_struct.interrupt_type !=
  1028. COMMAND_COMPLETE_APP_INT_PEND){
  1029. goto isr_done;
  1030. }
  1031. /* if critical due to peripheral operations
  1032. * ie. update() or getstats() then reset the interrupt and
  1033. * wait for the board to retrigger.
  1034. */
  1035. if(test_bit(PERI_CRIT, (void*)&card->wandev.critical)) {
  1036. flags->interrupt_info_struct.
  1037. interrupt_type = 0;
  1038. goto isr_done;
  1039. }
  1040. /* On a 508 Card, if critical due to if_send
  1041. * Major Error !!!
  1042. */
  1043. if(card->hw.type != SDLA_S514) {
  1044. if(test_bit(0, (void*)&card->wandev.critical)) {
  1045. printk(KERN_INFO "%s: Critical while in ISR: %lx\n",
  1046. card->devname, card->wandev.critical);
  1047. goto isr_done;
  1048. }
  1049. }
  1050. switch(flags->interrupt_info_struct.interrupt_type) {
  1051. case RX_APP_INT_PEND: /* 0x01: receive interrupt */
  1052. rx_intr(card);
  1053. break;
  1054. case TX_APP_INT_PEND: /* 0x02: transmit interrupt */
  1055. flags->interrupt_info_struct.interrupt_permission &=
  1056. ~APP_INT_ON_TX_FRAME;
  1057. netif_wake_queue(dev);
  1058. break;
  1059. case COMMAND_COMPLETE_APP_INT_PEND:/* 0x04: cmd cplt */
  1060. ++ Intr_test_counter;
  1061. break;
  1062. case CHDLC_EXCEP_COND_APP_INT_PEND: /* 0x20 */
  1063. process_chdlc_exception(card);
  1064. break;
  1065. case GLOBAL_EXCEP_COND_APP_INT_PEND:
  1066. process_global_exception(card);
  1067. break;
  1068. case TIMER_APP_INT_PEND:
  1069. timer_intr(card);
  1070. break;
  1071. default:
  1072. printk(KERN_INFO "%s: spurious interrupt 0x%02X!\n",
  1073. card->devname,
  1074. flags->interrupt_info_struct.interrupt_type);
  1075. printk(KERN_INFO "Code name: ");
  1076. for(i = 0; i < 4; i ++)
  1077. printk(KERN_INFO "%c",
  1078. flags->global_info_struct.codename[i]);
  1079. printk(KERN_INFO "\nCode version: ");
  1080. for(i = 0; i < 4; i ++)
  1081. printk(KERN_INFO "%c",
  1082. flags->global_info_struct.codeversion[i]);
  1083. printk(KERN_INFO "\n");
  1084. break;
  1085. }
  1086. isr_done:
  1087. card->in_isr = 0;
  1088. flags->interrupt_info_struct.interrupt_type = 0;
  1089. }
  1090. /*============================================================================
  1091. * Receive interrupt handler.
  1092. */
  1093. static void rx_intr (sdla_t* card)
  1094. {
  1095. struct net_device *dev;
  1096. chdlc_private_area_t *chdlc_priv_area;
  1097. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  1098. CHDLC_DATA_RX_STATUS_EL_STRUCT *rxbuf = card->u.c.rxmb;
  1099. struct sk_buff *skb;
  1100. unsigned len;
  1101. unsigned addr = rxbuf->ptr_data_bfr;
  1102. void *buf;
  1103. int i,udp_type;
  1104. if (rxbuf->opp_flag != 0x01) {
  1105. printk(KERN_INFO
  1106. "%s: corrupted Rx buffer @ 0x%X, flag = 0x%02X!\n",
  1107. card->devname, (unsigned)rxbuf, rxbuf->opp_flag);
  1108. printk(KERN_INFO "Code name: ");
  1109. for(i = 0; i < 4; i ++)
  1110. printk(KERN_INFO "%c",
  1111. flags->global_info_struct.codename[i]);
  1112. printk(KERN_INFO "\nCode version: ");
  1113. for(i = 0; i < 4; i ++)
  1114. printk(KERN_INFO "%c",
  1115. flags->global_info_struct.codeversion[i]);
  1116. printk(KERN_INFO "\n");
  1117. /* Bug Fix: Mar 6 2000
  1118. * If we get a corrupted mailbox, it measn that driver
  1119. * is out of sync with the firmware. There is no recovery.
  1120. * If we don't turn off all interrupts for this card
  1121. * the machine will crash.
  1122. */
  1123. printk(KERN_INFO "%s: Critical router failure ...!!!\n", card->devname);
  1124. printk(KERN_INFO "Please contact Sangoma Technologies !\n");
  1125. chdlc_set_intr_mode(card,0);
  1126. return;
  1127. }
  1128. dev = card->wandev.dev;
  1129. if (!dev){
  1130. goto rx_exit;
  1131. }
  1132. if (!netif_running(dev)){
  1133. goto rx_exit;
  1134. }
  1135. chdlc_priv_area = dev->priv;
  1136. if (rxbuf->error_flag){
  1137. goto rx_exit;
  1138. }
  1139. /* Take off two CRC bytes */
  1140. if (rxbuf->frame_length < 7 || rxbuf->frame_length > 1506 ){
  1141. goto rx_exit;
  1142. }
  1143. len = rxbuf->frame_length - CRC_LENGTH;
  1144. /* Allocate socket buffer */
  1145. skb = dev_alloc_skb(len);
  1146. if (skb == NULL) {
  1147. if (net_ratelimit()){
  1148. printk(KERN_INFO "%s: no socket buffers available!\n",
  1149. card->devname);
  1150. }
  1151. ++card->wandev.stats.rx_dropped;
  1152. goto rx_exit;
  1153. }
  1154. /* Copy data to the socket buffer */
  1155. if((addr + len) > card->u.c.rx_top + 1) {
  1156. unsigned tmp = card->u.c.rx_top - addr + 1;
  1157. buf = skb_put(skb, tmp);
  1158. sdla_peek(&card->hw, addr, buf, tmp);
  1159. addr = card->u.c.rx_base;
  1160. len -= tmp;
  1161. }
  1162. buf = skb_put(skb, len);
  1163. sdla_peek(&card->hw, addr, buf, len);
  1164. skb->protocol = htons(ETH_P_WAN_PPP);
  1165. card->wandev.stats.rx_packets ++;
  1166. card->wandev.stats.rx_bytes += skb->len;
  1167. udp_type = udp_pkt_type( skb, card );
  1168. if(udp_type == UDP_CPIPE_TYPE) {
  1169. if(store_udp_mgmt_pkt(UDP_PKT_FRM_NETWORK,
  1170. card, skb, dev, chdlc_priv_area)) {
  1171. flags->interrupt_info_struct.
  1172. interrupt_permission |=
  1173. APP_INT_ON_TIMER;
  1174. }
  1175. }else{
  1176. /* Pass it up the protocol stack */
  1177. skb->dev = dev;
  1178. skb->mac.raw = skb->data;
  1179. netif_rx(skb);
  1180. dev->last_rx = jiffies;
  1181. }
  1182. rx_exit:
  1183. /* Release buffer element and calculate a pointer to the next one */
  1184. rxbuf->opp_flag = 0x00;
  1185. card->u.c.rxmb = ++ rxbuf;
  1186. if((void*)rxbuf > card->u.c.rxbuf_last){
  1187. card->u.c.rxmb = card->u.c.rxbuf_base;
  1188. }
  1189. }
  1190. /*============================================================================
  1191. * Timer interrupt handler.
  1192. * The timer interrupt is used for two purposes:
  1193. * 1) Processing udp calls from 'cpipemon'.
  1194. * 2) Reading board-level statistics for updating the proc file system.
  1195. */
  1196. void timer_intr(sdla_t *card)
  1197. {
  1198. struct net_device* dev;
  1199. chdlc_private_area_t* chdlc_priv_area = NULL;
  1200. SHARED_MEMORY_INFO_STRUCT* flags = NULL;
  1201. dev = card->wandev.dev;
  1202. chdlc_priv_area = dev->priv;
  1203. if (chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_CONFIG) {
  1204. if (!config_chdlc(card)){
  1205. chdlc_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_CONFIG;
  1206. }
  1207. }
  1208. /* process a udp call if pending */
  1209. if(chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_UDP) {
  1210. process_udp_mgmt_pkt(card, dev,
  1211. chdlc_priv_area);
  1212. chdlc_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_UDP;
  1213. }
  1214. /* read the communications statistics if required */
  1215. if(chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_UPDATE) {
  1216. update_comms_stats(card, chdlc_priv_area);
  1217. if(!(-- chdlc_priv_area->update_comms_stats)) {
  1218. chdlc_priv_area->timer_int_enabled &=
  1219. ~TMR_INT_ENABLED_UPDATE;
  1220. }
  1221. }
  1222. /* only disable the timer interrupt if there are no udp or statistic */
  1223. /* updates pending */
  1224. if(!chdlc_priv_area->timer_int_enabled) {
  1225. flags = card->u.c.flags;
  1226. flags->interrupt_info_struct.interrupt_permission &=
  1227. ~APP_INT_ON_TIMER;
  1228. }
  1229. }
  1230. /*------------------------------------------------------------------------------
  1231. Miscellaneous Functions
  1232. - set_chdlc_config() used to set configuration options on the board
  1233. ------------------------------------------------------------------------------*/
  1234. static int set_chdlc_config(sdla_t* card)
  1235. {
  1236. CHDLC_CONFIGURATION_STRUCT cfg;
  1237. memset(&cfg, 0, sizeof(CHDLC_CONFIGURATION_STRUCT));
  1238. if(card->wandev.clocking)
  1239. cfg.baud_rate = card->wandev.bps;
  1240. cfg.line_config_options = (card->wandev.interface == WANOPT_RS232) ?
  1241. INTERFACE_LEVEL_RS232 : INTERFACE_LEVEL_V35;
  1242. cfg.modem_config_options = 0;
  1243. //API OPTIONS
  1244. cfg.CHDLC_API_options = DISCARD_RX_ERROR_FRAMES;
  1245. cfg.modem_status_timer = 100;
  1246. cfg.CHDLC_protocol_options = HDLC_STREAMING_MODE;
  1247. cfg.percent_data_buffer_for_Tx = 50;
  1248. cfg.CHDLC_statistics_options = (CHDLC_TX_DATA_BYTE_COUNT_STAT |
  1249. CHDLC_RX_DATA_BYTE_COUNT_STAT);
  1250. cfg.max_CHDLC_data_field_length = card->wandev.mtu;
  1251. cfg.transmit_keepalive_timer = 0;
  1252. cfg.receive_keepalive_timer = 0;
  1253. cfg.keepalive_error_tolerance = 0;
  1254. cfg.SLARP_request_timer = 0;
  1255. cfg.IP_address = 0;
  1256. cfg.IP_netmask = 0;
  1257. return chdlc_configure(card, &cfg);
  1258. }
  1259. /*============================================================================
  1260. * Process global exception condition
  1261. */
  1262. static int process_global_exception(sdla_t *card)
  1263. {
  1264. CHDLC_MAILBOX_STRUCT* mbox = card->mbox;
  1265. int err;
  1266. mbox->buffer_length = 0;
  1267. mbox->command = READ_GLOBAL_EXCEPTION_CONDITION;
  1268. err = sdla_exec(mbox) ? mbox->return_code : CMD_TIMEOUT;
  1269. if(err != CMD_TIMEOUT ){
  1270. switch(mbox->return_code) {
  1271. case EXCEP_MODEM_STATUS_CHANGE:
  1272. printk(KERN_INFO "%s: Modem status change\n",
  1273. card->devname);
  1274. switch(mbox->data[0] & (DCD_HIGH | CTS_HIGH)) {
  1275. case (DCD_HIGH):
  1276. printk(KERN_INFO "%s: DCD high, CTS low\n",card->devname);
  1277. break;
  1278. case (CTS_HIGH):
  1279. printk(KERN_INFO "%s: DCD low, CTS high\n",card->devname);
  1280. break;
  1281. case ((DCD_HIGH | CTS_HIGH)):
  1282. printk(KERN_INFO "%s: DCD high, CTS high\n",card->devname);
  1283. break;
  1284. default:
  1285. printk(KERN_INFO "%s: DCD low, CTS low\n",card->devname);
  1286. break;
  1287. }
  1288. if (!(mbox->data[0] & DCD_HIGH) || !(mbox->data[0] & DCD_HIGH)){
  1289. //printk(KERN_INFO "Sending TERM Request Manually !\n");
  1290. send_ppp_term_request(card->wandev.dev);
  1291. }
  1292. break;
  1293. case EXCEP_TRC_DISABLED:
  1294. printk(KERN_INFO "%s: Line trace disabled\n",
  1295. card->devname);
  1296. break;
  1297. case EXCEP_IRQ_TIMEOUT:
  1298. printk(KERN_INFO "%s: IRQ timeout occurred\n",
  1299. card->devname);
  1300. break;
  1301. default:
  1302. printk(KERN_INFO "%s: Global exception %x\n",
  1303. card->devname, mbox->return_code);
  1304. break;
  1305. }
  1306. }
  1307. return 0;
  1308. }
  1309. /*============================================================================
  1310. * Process chdlc exception condition
  1311. */
  1312. static int process_chdlc_exception(sdla_t *card)
  1313. {
  1314. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1315. int err;
  1316. mb->buffer_length = 0;
  1317. mb->command = READ_CHDLC_EXCEPTION_CONDITION;
  1318. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1319. if(err != CMD_TIMEOUT) {
  1320. switch (err) {
  1321. case EXCEP_LINK_ACTIVE:
  1322. port_set_state(card, WAN_CONNECTED);
  1323. break;
  1324. case EXCEP_LINK_INACTIVE_MODEM:
  1325. port_set_state(card, WAN_DISCONNECTED);
  1326. break;
  1327. case EXCEP_LOOPBACK_CONDITION:
  1328. printk(KERN_INFO "%s: Loopback Condition Detected.\n",
  1329. card->devname);
  1330. break;
  1331. case NO_CHDLC_EXCEP_COND_TO_REPORT:
  1332. printk(KERN_INFO "%s: No exceptions reported.\n",
  1333. card->devname);
  1334. break;
  1335. default:
  1336. printk(KERN_INFO "%s: Exception Condition %x!\n",
  1337. card->devname,err);
  1338. break;
  1339. }
  1340. }
  1341. return 0;
  1342. }
  1343. /*=============================================================================
  1344. * Store a UDP management packet for later processing.
  1345. */
  1346. static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card,
  1347. struct sk_buff *skb, struct net_device* dev,
  1348. chdlc_private_area_t* chdlc_priv_area )
  1349. {
  1350. int udp_pkt_stored = 0;
  1351. if(!chdlc_priv_area->udp_pkt_lgth &&
  1352. (skb->len <= MAX_LGTH_UDP_MGNT_PKT)) {
  1353. chdlc_priv_area->udp_pkt_lgth = skb->len;
  1354. chdlc_priv_area->udp_pkt_src = udp_pkt_src;
  1355. memcpy(chdlc_priv_area->udp_pkt_data, skb->data, skb->len);
  1356. chdlc_priv_area->timer_int_enabled = TMR_INT_ENABLED_UDP;
  1357. udp_pkt_stored = 1;
  1358. }
  1359. if(udp_pkt_src == UDP_PKT_FRM_STACK)
  1360. dev_kfree_skb_any(skb);
  1361. else
  1362. dev_kfree_skb_any(skb);
  1363. return(udp_pkt_stored);
  1364. }
  1365. /*=============================================================================
  1366. * Process UDP management packet.
  1367. */
  1368. static int process_udp_mgmt_pkt(sdla_t* card, struct net_device* dev,
  1369. chdlc_private_area_t* chdlc_priv_area )
  1370. {
  1371. unsigned char *buf;
  1372. unsigned int frames, len;
  1373. struct sk_buff *new_skb;
  1374. unsigned short buffer_length, real_len;
  1375. unsigned long data_ptr;
  1376. unsigned data_length;
  1377. int udp_mgmt_req_valid = 1;
  1378. CHDLC_MAILBOX_STRUCT *mb = card->mbox;
  1379. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  1380. chdlc_udp_pkt_t *chdlc_udp_pkt;
  1381. struct timeval tv;
  1382. int err;
  1383. char ut_char;
  1384. chdlc_udp_pkt = (chdlc_udp_pkt_t *) chdlc_priv_area->udp_pkt_data;
  1385. if(chdlc_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK) {
  1386. switch(chdlc_udp_pkt->cblock.command) {
  1387. case READ_GLOBAL_STATISTICS:
  1388. case READ_MODEM_STATUS:
  1389. case READ_CHDLC_LINK_STATUS:
  1390. case CPIPE_ROUTER_UP_TIME:
  1391. case READ_COMMS_ERROR_STATS:
  1392. case READ_CHDLC_OPERATIONAL_STATS:
  1393. /* These two commands are executed for
  1394. * each request */
  1395. case READ_CHDLC_CONFIGURATION:
  1396. case READ_CHDLC_CODE_VERSION:
  1397. udp_mgmt_req_valid = 1;
  1398. break;
  1399. default:
  1400. udp_mgmt_req_valid = 0;
  1401. break;
  1402. }
  1403. }
  1404. if(!udp_mgmt_req_valid) {
  1405. /* set length to 0 */
  1406. chdlc_udp_pkt->cblock.buffer_length = 0;
  1407. /* set return code */
  1408. chdlc_udp_pkt->cblock.return_code = 0xCD;
  1409. if (net_ratelimit()){
  1410. printk(KERN_INFO
  1411. "%s: Warning, Illegal UDP command attempted from network: %x\n",
  1412. card->devname,chdlc_udp_pkt->cblock.command);
  1413. }
  1414. } else {
  1415. unsigned long trace_status_cfg_addr = 0;
  1416. TRACE_STATUS_EL_CFG_STRUCT trace_cfg_struct;
  1417. TRACE_STATUS_ELEMENT_STRUCT trace_element_struct;
  1418. switch(chdlc_udp_pkt->cblock.command) {
  1419. case CPIPE_ENABLE_TRACING:
  1420. if (!chdlc_priv_area->TracingEnabled) {
  1421. /* OPERATE_DATALINE_MONITOR */
  1422. mb->buffer_length = sizeof(LINE_TRACE_CONFIG_STRUCT);
  1423. mb->command = SET_TRACE_CONFIGURATION;
  1424. ((LINE_TRACE_CONFIG_STRUCT *)mb->data)->
  1425. trace_config = TRACE_ACTIVE;
  1426. /* Trace delay mode is not used because it slows
  1427. down transfer and results in a standoff situation
  1428. when there is a lot of data */
  1429. /* Configure the Trace based on user inputs */
  1430. ((LINE_TRACE_CONFIG_STRUCT *)mb->data)->trace_config |=
  1431. chdlc_udp_pkt->data[0];
  1432. ((LINE_TRACE_CONFIG_STRUCT *)mb->data)->
  1433. trace_deactivation_timer = 4000;
  1434. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1435. if (err != COMMAND_OK) {
  1436. chdlc_error(card,err,mb);
  1437. card->TracingEnabled = 0;
  1438. chdlc_udp_pkt->cblock.return_code = err;
  1439. mb->buffer_length = 0;
  1440. break;
  1441. }
  1442. /* Get the base address of the trace element list */
  1443. mb->buffer_length = 0;
  1444. mb->command = READ_TRACE_CONFIGURATION;
  1445. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1446. if (err != COMMAND_OK) {
  1447. chdlc_error(card,err,mb);
  1448. chdlc_priv_area->TracingEnabled = 0;
  1449. chdlc_udp_pkt->cblock.return_code = err;
  1450. mb->buffer_length = 0;
  1451. break;
  1452. }
  1453. trace_status_cfg_addr =((LINE_TRACE_CONFIG_STRUCT *)
  1454. mb->data) -> ptr_trace_stat_el_cfg_struct;
  1455. sdla_peek(&card->hw, trace_status_cfg_addr,
  1456. &trace_cfg_struct, sizeof(trace_cfg_struct));
  1457. chdlc_priv_area->start_trace_addr = trace_cfg_struct.
  1458. base_addr_trace_status_elements;
  1459. chdlc_priv_area->number_trace_elements =
  1460. trace_cfg_struct.number_trace_status_elements;
  1461. chdlc_priv_area->end_trace_addr = (unsigned long)
  1462. ((TRACE_STATUS_ELEMENT_STRUCT *)
  1463. chdlc_priv_area->start_trace_addr +
  1464. (chdlc_priv_area->number_trace_elements - 1));
  1465. chdlc_priv_area->base_addr_trace_buffer =
  1466. trace_cfg_struct.base_addr_trace_buffer;
  1467. chdlc_priv_area->end_addr_trace_buffer =
  1468. trace_cfg_struct.end_addr_trace_buffer;
  1469. chdlc_priv_area->curr_trace_addr =
  1470. trace_cfg_struct.next_trace_element_to_use;
  1471. chdlc_priv_area->available_buffer_space = 2000 -
  1472. sizeof(ip_pkt_t) -
  1473. sizeof(udp_pkt_t) -
  1474. sizeof(wp_mgmt_t) -
  1475. sizeof(cblock_t) -
  1476. sizeof(trace_info_t);
  1477. }
  1478. chdlc_udp_pkt->cblock.return_code = COMMAND_OK;
  1479. mb->buffer_length = 0;
  1480. chdlc_priv_area->TracingEnabled = 1;
  1481. break;
  1482. case CPIPE_DISABLE_TRACING:
  1483. if (chdlc_priv_area->TracingEnabled) {
  1484. /* OPERATE_DATALINE_MONITOR */
  1485. mb->buffer_length = sizeof(LINE_TRACE_CONFIG_STRUCT);
  1486. mb->command = SET_TRACE_CONFIGURATION;
  1487. ((LINE_TRACE_CONFIG_STRUCT *)mb->data)->
  1488. trace_config = TRACE_INACTIVE;
  1489. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1490. }
  1491. chdlc_priv_area->TracingEnabled = 0;
  1492. chdlc_udp_pkt->cblock.return_code = COMMAND_OK;
  1493. mb->buffer_length = 0;
  1494. break;
  1495. case CPIPE_GET_TRACE_INFO:
  1496. if (!chdlc_priv_area->TracingEnabled) {
  1497. chdlc_udp_pkt->cblock.return_code = 1;
  1498. mb->buffer_length = 0;
  1499. break;
  1500. }
  1501. chdlc_udp_pkt->trace_info.ismoredata = 0x00;
  1502. buffer_length = 0; /* offset of packet already occupied */
  1503. for (frames=0; frames < chdlc_priv_area->number_trace_elements; frames++){
  1504. trace_pkt_t *trace_pkt = (trace_pkt_t *)
  1505. &chdlc_udp_pkt->data[buffer_length];
  1506. sdla_peek(&card->hw, chdlc_priv_area->curr_trace_addr,
  1507. (unsigned char *)&trace_element_struct,
  1508. sizeof(TRACE_STATUS_ELEMENT_STRUCT));
  1509. if (trace_element_struct.opp_flag == 0x00) {
  1510. break;
  1511. }
  1512. /* get pointer to real data */
  1513. data_ptr = trace_element_struct.ptr_data_bfr;
  1514. /* See if there is actual data on the trace buffer */
  1515. if (data_ptr){
  1516. data_length = trace_element_struct.trace_length;
  1517. }else{
  1518. data_length = 0;
  1519. chdlc_udp_pkt->trace_info.ismoredata = 0x01;
  1520. }
  1521. if( (chdlc_priv_area->available_buffer_space - buffer_length)
  1522. < ( sizeof(trace_pkt_t) + data_length) ) {
  1523. /* indicate there are more frames on board & exit */
  1524. chdlc_udp_pkt->trace_info.ismoredata = 0x01;
  1525. break;
  1526. }
  1527. trace_pkt->status = trace_element_struct.trace_type;
  1528. trace_pkt->time_stamp =
  1529. trace_element_struct.trace_time_stamp;
  1530. trace_pkt->real_length =
  1531. trace_element_struct.trace_length;
  1532. /* see if we can fit the frame into the user buffer */
  1533. real_len = trace_pkt->real_length;
  1534. if (data_ptr == 0) {
  1535. trace_pkt->data_avail = 0x00;
  1536. } else {
  1537. unsigned tmp = 0;
  1538. /* get the data from circular buffer
  1539. must check for end of buffer */
  1540. trace_pkt->data_avail = 0x01;
  1541. if ((data_ptr + real_len) >
  1542. chdlc_priv_area->end_addr_trace_buffer + 1){
  1543. tmp = chdlc_priv_area->end_addr_trace_buffer - data_ptr + 1;
  1544. sdla_peek(&card->hw, data_ptr,
  1545. trace_pkt->data,tmp);
  1546. data_ptr = chdlc_priv_area->base_addr_trace_buffer;
  1547. }
  1548. sdla_peek(&card->hw, data_ptr,
  1549. &trace_pkt->data[tmp], real_len - tmp);
  1550. }
  1551. /* zero the opp flag to show we got the frame */
  1552. ut_char = 0x00;
  1553. sdla_poke(&card->hw, chdlc_priv_area->curr_trace_addr, &ut_char, 1);
  1554. /* now move onto the next frame */
  1555. chdlc_priv_area->curr_trace_addr += sizeof(TRACE_STATUS_ELEMENT_STRUCT);
  1556. /* check if we went over the last address */
  1557. if ( chdlc_priv_area->curr_trace_addr > chdlc_priv_area->end_trace_addr ) {
  1558. chdlc_priv_area->curr_trace_addr = chdlc_priv_area->start_trace_addr;
  1559. }
  1560. if(trace_pkt->data_avail == 0x01) {
  1561. buffer_length += real_len - 1;
  1562. }
  1563. /* for the header */
  1564. buffer_length += sizeof(trace_pkt_t);
  1565. } /* For Loop */
  1566. if (frames == chdlc_priv_area->number_trace_elements){
  1567. chdlc_udp_pkt->trace_info.ismoredata = 0x01;
  1568. }
  1569. chdlc_udp_pkt->trace_info.num_frames = frames;
  1570. mb->buffer_length = buffer_length;
  1571. chdlc_udp_pkt->cblock.buffer_length = buffer_length;
  1572. chdlc_udp_pkt->cblock.return_code = COMMAND_OK;
  1573. break;
  1574. case CPIPE_FT1_READ_STATUS:
  1575. ((unsigned char *)chdlc_udp_pkt->data )[0] =
  1576. flags->FT1_info_struct.parallel_port_A_input;
  1577. ((unsigned char *)chdlc_udp_pkt->data )[1] =
  1578. flags->FT1_info_struct.parallel_port_B_input;
  1579. chdlc_udp_pkt->cblock.return_code = COMMAND_OK;
  1580. mb->buffer_length = 2;
  1581. break;
  1582. case CPIPE_ROUTER_UP_TIME:
  1583. do_gettimeofday( &tv );
  1584. chdlc_priv_area->router_up_time = tv.tv_sec -
  1585. chdlc_priv_area->router_start_time;
  1586. *(unsigned long *)&chdlc_udp_pkt->data =
  1587. chdlc_priv_area->router_up_time;
  1588. mb->buffer_length = sizeof(unsigned long);
  1589. break;
  1590. case FT1_MONITOR_STATUS_CTRL:
  1591. /* Enable FT1 MONITOR STATUS */
  1592. if ((chdlc_udp_pkt->data[0] & ENABLE_READ_FT1_STATUS) ||
  1593. (chdlc_udp_pkt->data[0] & ENABLE_READ_FT1_OP_STATS)) {
  1594. if( rCount++ != 0 ) {
  1595. chdlc_udp_pkt->cblock.
  1596. return_code = COMMAND_OK;
  1597. mb->buffer_length = 1;
  1598. break;
  1599. }
  1600. }
  1601. /* Disable FT1 MONITOR STATUS */
  1602. if( chdlc_udp_pkt->data[0] == 0) {
  1603. if( --rCount != 0) {
  1604. chdlc_udp_pkt->cblock.
  1605. return_code = COMMAND_OK;
  1606. mb->buffer_length = 1;
  1607. break;
  1608. }
  1609. }
  1610. default:
  1611. /* it's a board command */
  1612. mb->command = chdlc_udp_pkt->cblock.command;
  1613. mb->buffer_length = chdlc_udp_pkt->cblock.buffer_length;
  1614. if (mb->buffer_length) {
  1615. memcpy(&mb->data, (unsigned char *) chdlc_udp_pkt->
  1616. data, mb->buffer_length);
  1617. }
  1618. /* run the command on the board */
  1619. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1620. if (err != COMMAND_OK) {
  1621. break;
  1622. }
  1623. /* copy the result back to our buffer */
  1624. memcpy(&chdlc_udp_pkt->cblock, mb, sizeof(cblock_t));
  1625. if (mb->buffer_length) {
  1626. memcpy(&chdlc_udp_pkt->data, &mb->data,
  1627. mb->buffer_length);
  1628. }
  1629. } /* end of switch */
  1630. } /* end of else */
  1631. /* Fill UDP TTL */
  1632. chdlc_udp_pkt->ip_pkt.ttl = card->wandev.ttl;
  1633. len = reply_udp(chdlc_priv_area->udp_pkt_data, mb->buffer_length);
  1634. if(chdlc_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK) {
  1635. if(!chdlc_send(card, chdlc_priv_area->udp_pkt_data, len)) {
  1636. ++ card->wandev.stats.tx_packets;
  1637. card->wandev.stats.tx_bytes += len;
  1638. }
  1639. } else {
  1640. /* Pass it up the stack
  1641. Allocate socket buffer */
  1642. if ((new_skb = dev_alloc_skb(len)) != NULL) {
  1643. /* copy data into new_skb */
  1644. buf = skb_put(new_skb, len);
  1645. memcpy(buf, chdlc_priv_area->udp_pkt_data, len);
  1646. /* Decapsulate pkt and pass it up the protocol stack */
  1647. new_skb->protocol = htons(ETH_P_IP);
  1648. new_skb->dev = dev;
  1649. new_skb->mac.raw = new_skb->data;
  1650. netif_rx(new_skb);
  1651. dev->last_rx = jiffies;
  1652. } else {
  1653. printk(KERN_INFO "%s: no socket buffers available!\n",
  1654. card->devname);
  1655. }
  1656. }
  1657. chdlc_priv_area->udp_pkt_lgth = 0;
  1658. return 0;
  1659. }
  1660. /*============================================================================
  1661. * Initialize Receive and Transmit Buffers.
  1662. */
  1663. static void init_chdlc_tx_rx_buff(sdla_t* card, struct net_device *dev)
  1664. {
  1665. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1666. CHDLC_TX_STATUS_EL_CFG_STRUCT *tx_config;
  1667. CHDLC_RX_STATUS_EL_CFG_STRUCT *rx_config;
  1668. char err;
  1669. mb->buffer_length = 0;
  1670. mb->command = READ_CHDLC_CONFIGURATION;
  1671. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1672. if(err != COMMAND_OK) {
  1673. chdlc_error(card,err,mb);
  1674. return;
  1675. }
  1676. if(card->hw.type == SDLA_S514) {
  1677. tx_config = (CHDLC_TX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase +
  1678. (((CHDLC_CONFIGURATION_STRUCT *)mb->data)->
  1679. ptr_CHDLC_Tx_stat_el_cfg_struct));
  1680. rx_config = (CHDLC_RX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase +
  1681. (((CHDLC_CONFIGURATION_STRUCT *)mb->data)->
  1682. ptr_CHDLC_Rx_stat_el_cfg_struct));
  1683. /* Setup Head and Tails for buffers */
  1684. card->u.c.txbuf_base = (void *)(card->hw.dpmbase +
  1685. tx_config->base_addr_Tx_status_elements);
  1686. card->u.c.txbuf_last =
  1687. (CHDLC_DATA_TX_STATUS_EL_STRUCT *)
  1688. card->u.c.txbuf_base +
  1689. (tx_config->number_Tx_status_elements - 1);
  1690. card->u.c.rxbuf_base = (void *)(card->hw.dpmbase +
  1691. rx_config->base_addr_Rx_status_elements);
  1692. card->u.c.rxbuf_last =
  1693. (CHDLC_DATA_RX_STATUS_EL_STRUCT *)
  1694. card->u.c.rxbuf_base +
  1695. (rx_config->number_Rx_status_elements - 1);
  1696. /* Set up next pointer to be used */
  1697. card->u.c.txbuf = (void *)(card->hw.dpmbase +
  1698. tx_config->next_Tx_status_element_to_use);
  1699. card->u.c.rxmb = (void *)(card->hw.dpmbase +
  1700. rx_config->next_Rx_status_element_to_use);
  1701. }
  1702. else {
  1703. tx_config = (CHDLC_TX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase +
  1704. (((CHDLC_CONFIGURATION_STRUCT *)mb->data)->
  1705. ptr_CHDLC_Tx_stat_el_cfg_struct % SDLA_WINDOWSIZE));
  1706. rx_config = (CHDLC_RX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase +
  1707. (((CHDLC_CONFIGURATION_STRUCT *)mb->data)->
  1708. ptr_CHDLC_Rx_stat_el_cfg_struct % SDLA_WINDOWSIZE));
  1709. /* Setup Head and Tails for buffers */
  1710. card->u.c.txbuf_base = (void *)(card->hw.dpmbase +
  1711. (tx_config->base_addr_Tx_status_elements % SDLA_WINDOWSIZE));
  1712. card->u.c.txbuf_last =
  1713. (CHDLC_DATA_TX_STATUS_EL_STRUCT *)card->u.c.txbuf_base
  1714. + (tx_config->number_Tx_status_elements - 1);
  1715. card->u.c.rxbuf_base = (void *)(card->hw.dpmbase +
  1716. (rx_config->base_addr_Rx_status_elements % SDLA_WINDOWSIZE));
  1717. card->u.c.rxbuf_last =
  1718. (CHDLC_DATA_RX_STATUS_EL_STRUCT *)card->u.c.rxbuf_base
  1719. + (rx_config->number_Rx_status_elements - 1);
  1720. /* Set up next pointer to be used */
  1721. card->u.c.txbuf = (void *)(card->hw.dpmbase +
  1722. (tx_config->next_Tx_status_element_to_use % SDLA_WINDOWSIZE));
  1723. card->u.c.rxmb = (void *)(card->hw.dpmbase +
  1724. (rx_config->next_Rx_status_element_to_use % SDLA_WINDOWSIZE));
  1725. }
  1726. /* Setup Actual Buffer Start and end addresses */
  1727. card->u.c.rx_base = rx_config->base_addr_Rx_buffer;
  1728. card->u.c.rx_top = rx_config->end_addr_Rx_buffer;
  1729. }
  1730. /*=============================================================================
  1731. * Perform Interrupt Test by running READ_CHDLC_CODE_VERSION command MAX_INTR
  1732. * _TEST_COUNTER times.
  1733. */
  1734. static int intr_test( sdla_t* card)
  1735. {
  1736. CHDLC_MAILBOX_STRUCT* mb = card->mbox;
  1737. int err,i;
  1738. Intr_test_counter = 0;
  1739. /* The critical flag is unset because during initialization (if_open)
  1740. * we want the interrupts to be enabled so that when the wpc_isr is
  1741. * called it does not exit due to critical flag set.
  1742. */
  1743. err = chdlc_set_intr_mode(card, APP_INT_ON_COMMAND_COMPLETE);
  1744. if (err == CMD_OK) {
  1745. for (i = 0; i < MAX_INTR_TEST_COUNTER; i ++) {
  1746. mb->buffer_length = 0;
  1747. mb->command = READ_CHDLC_CODE_VERSION;
  1748. err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT;
  1749. }
  1750. }
  1751. else {
  1752. return err;
  1753. }
  1754. err = chdlc_set_intr_mode(card, 0);
  1755. if (err != CMD_OK)
  1756. return err;
  1757. return 0;
  1758. }
  1759. /*==============================================================================
  1760. * Determine what type of UDP call it is. CPIPEAB ?
  1761. */
  1762. static int udp_pkt_type(struct sk_buff *skb, sdla_t* card)
  1763. {
  1764. chdlc_udp_pkt_t *chdlc_udp_pkt = (chdlc_udp_pkt_t *)skb->data;
  1765. if (!strncmp(chdlc_udp_pkt->wp_mgmt.signature,UDPMGMT_SIGNATURE,8) &&
  1766. (chdlc_udp_pkt->udp_pkt.udp_dst_port == ntohs(card->wandev.udp_port)) &&
  1767. (chdlc_udp_pkt->ip_pkt.protocol == UDPMGMT_UDP_PROTOCOL) &&
  1768. (chdlc_udp_pkt->wp_mgmt.request_reply == UDPMGMT_REQUEST)) {
  1769. return UDP_CPIPE_TYPE;
  1770. }
  1771. else return UDP_INVALID_TYPE;
  1772. }
  1773. /*============================================================================
  1774. * Set PORT state.
  1775. */
  1776. static void port_set_state (sdla_t *card, int state)
  1777. {
  1778. struct net_device *dev = card->wandev.dev;
  1779. chdlc_private_area_t *chdlc_priv_area = dev->priv;
  1780. if (card->u.c.state != state)
  1781. {
  1782. switch (state)
  1783. {
  1784. case WAN_CONNECTED:
  1785. printk (KERN_INFO "%s: HDLC link connected!\n",
  1786. card->devname);
  1787. break;
  1788. case WAN_CONNECTING:
  1789. printk (KERN_INFO "%s: HDLC link connecting...\n",
  1790. card->devname);
  1791. break;
  1792. case WAN_DISCONNECTED:
  1793. printk (KERN_INFO "%s: HDLC link disconnected!\n",
  1794. card->devname);
  1795. break;
  1796. }
  1797. card->wandev.state = card->u.c.state = state;
  1798. chdlc_priv_area->common.state = state;
  1799. }
  1800. }
  1801. void s508_lock (sdla_t *card, unsigned long *smp_flags)
  1802. {
  1803. spin_lock_irqsave(&card->wandev.lock, *smp_flags);
  1804. if (card->next){
  1805. /* It is ok to use spin_lock here, since we
  1806. * already turned off interrupts */
  1807. spin_lock(&card->next->wandev.lock);
  1808. }
  1809. }
  1810. void s508_unlock (sdla_t *card, unsigned long *smp_flags)
  1811. {
  1812. if (card->next){
  1813. spin_unlock(&card->next->wandev.lock);
  1814. }
  1815. spin_unlock_irqrestore(&card->wandev.lock, *smp_flags);
  1816. }
  1817. /*===========================================================================
  1818. * config_chdlc
  1819. *
  1820. * Configure the chdlc protocol and enable communications.
  1821. *
  1822. * The if_open() function binds this function to the poll routine.
  1823. * Therefore, this function will run every time the chdlc interface
  1824. * is brought up. We cannot run this function from the if_open
  1825. * because if_open does not have access to the remote IP address.
  1826. *
  1827. * If the communications are not enabled, proceed to configure
  1828. * the card and enable communications.
  1829. *
  1830. * If the communications are enabled, it means that the interface
  1831. * was shutdown by ether the user or driver. In this case, we
  1832. * have to check that the IP addresses have not changed. If
  1833. * the IP addresses have changed, we have to reconfigure the firmware
  1834. * and update the changed IP addresses. Otherwise, just exit.
  1835. *
  1836. */
  1837. static int config_chdlc (sdla_t *card)
  1838. {
  1839. struct net_device *dev = card->wandev.dev;
  1840. SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags;
  1841. if (card->u.c.comm_enabled){
  1842. chdlc_comm_disable(card);
  1843. port_set_state(card, WAN_DISCONNECTED);
  1844. }
  1845. if (set_chdlc_config(card)) {
  1846. printk(KERN_INFO "%s: CHDLC Configuration Failed!\n",
  1847. card->devname);
  1848. return 0;
  1849. }
  1850. init_chdlc_tx_rx_buff(card, dev);
  1851. /* Set interrupt mode and mask */
  1852. if (chdlc_set_intr_mode(card, APP_INT_ON_RX_FRAME |
  1853. APP_INT_ON_GLOBAL_EXCEP_COND |
  1854. APP_INT_ON_TX_FRAME |
  1855. APP_INT_ON_CHDLC_EXCEP_COND | APP_INT_ON_TIMER)){
  1856. printk (KERN_INFO "%s: Failed to set interrupt triggers!\n",
  1857. card->devname);
  1858. return 0;
  1859. }
  1860. /* Mask the Transmit and Timer interrupt */
  1861. flags->interrupt_info_struct.interrupt_permission &=
  1862. ~(APP_INT_ON_TX_FRAME | APP_INT_ON_TIMER);
  1863. if (chdlc_comm_enable(card) != 0) {
  1864. printk(KERN_INFO "%s: Failed to enable chdlc communications!\n",
  1865. card->devname);
  1866. flags->interrupt_info_struct.interrupt_permission = 0;
  1867. card->u.c.comm_enabled=0;
  1868. chdlc_set_intr_mode(card,0);
  1869. return 0;
  1870. }
  1871. /* Initialize Rx/Tx buffer control fields */
  1872. port_set_state(card, WAN_CONNECTING);
  1873. return 0;
  1874. }
  1875. static void send_ppp_term_request(struct net_device *dev)
  1876. {
  1877. struct sk_buff *new_skb;
  1878. unsigned char *buf;
  1879. if ((new_skb = dev_alloc_skb(8)) != NULL) {
  1880. /* copy data into new_skb */
  1881. buf = skb_put(new_skb, 8);
  1882. sprintf(buf,"%c%c%c%c%c%c%c%c", 0xFF,0x03,0xC0,0x21,0x05,0x98,0x00,0x07);
  1883. /* Decapsulate pkt and pass it up the protocol stack */
  1884. new_skb->protocol = htons(ETH_P_WAN_PPP);
  1885. new_skb->dev = dev;
  1886. new_skb->mac.raw = new_skb->data;
  1887. netif_rx(new_skb);
  1888. dev->last_rx = jiffies;
  1889. }
  1890. }
  1891. MODULE_LICENSE("GPL");
  1892. /****** End ****************************************************************/