wanpipe_multppp.c 67 KB

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