sdla_fr.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:148k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. return 0;
  2. }
  3. /* Set the WNodeID to our network address */
  4. sendpacket[43] = (unsigned char)(network_number >> 24);
  5. sendpacket[44] = (unsigned char)((network_number & 0x00FF0000) >> 16);
  6. sendpacket[45] = (unsigned char)((network_number & 0x0000FF00) >> 8);
  7. sendpacket[46] = (unsigned char)(network_number & 0x000000FF);
  8. return 1;
  9. }
  10. /* If we get here, its an IPX-data packet so it'll get passed up the 
  11.  * stack.
  12.  * switch the network numbers 
  13.  */
  14. switch_net_numbers(sendpacket, network_number ,1);
  15. return 0;
  16. }
  17. /*============================================================================
  18.  * process_route
  19.  * 
  20.  * Rationale:
  21.  * If the interface goes down, or we receive an ARP request,
  22.  *      we have to change the network interface ip addresses.
  23.  *  This cannot be done within the interrupt.
  24.  *
  25.  * Description:
  26.  *
  27.  *  This routine is called as a polling routine to dynamically 
  28.  * add/delete routes negotiated by inverse ARP.  It is in this 
  29.  *     "task" because we don't want routes to be added while in 
  30.  *      interrupt context.
  31.  *
  32.  * Usage:
  33.  * This function is called by fr_poll() polling funtion.
  34.  */
  35. static void process_route (netdevice_t *dev)
  36. {
  37. fr_channel_t *chan = dev->priv;
  38. sdla_t *card = chan->card;
  39. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  40. struct ifreq if_info;
  41. struct sockaddr_in *if_data;
  42. mm_segment_t fs = get_fs();
  43. u32 ip_tmp;
  44. int err;
  45. switch(chan->route_flag){
  46. case ADD_ROUTE:
  47. /* Set remote addresses */
  48. memset(&if_info, 0, sizeof(if_info));
  49. strcpy(if_info.ifr_name, dev->name);
  50. set_fs(get_ds());     /* get user space block */ 
  51. if_data = (struct sockaddr_in *)&if_info.ifr_dstaddr;
  52. if_data->sin_addr.s_addr = chan->ip_remote;
  53. if_data->sin_family = AF_INET;
  54. err = devinet_ioctl( SIOCSIFDSTADDR, &if_info );
  55. set_fs(fs);           /* restore old block */
  56. if (err) {
  57. printk(KERN_INFO 
  58. "%s: Route Add failed.  Error: %dn", 
  59. card->devname,err);
  60. printk(KERN_INFO "%s: Address: %sn",
  61. chan->name, in_ntoa(chan->ip_remote));
  62. }else {
  63. printk(KERN_INFO "%s: Route Added Successfully: %sn",
  64. card->devname,in_ntoa(chan->ip_remote));
  65. chan->route_flag = ROUTE_ADDED;
  66. }
  67. break;
  68. case REMOVE_ROUTE:
  69. /* Set remote addresses */
  70. memset(&if_info, 0, sizeof(if_info));
  71. strcpy(if_info.ifr_name, dev->name);
  72. ip_tmp = get_ip_address(dev,WAN_POINTOPOINT_IP);
  73. set_fs(get_ds());     /* get user space block */ 
  74. if_data = (struct sockaddr_in *)&if_info.ifr_dstaddr;
  75. if_data->sin_addr.s_addr = 0;
  76. if_data->sin_family = AF_INET;
  77. err = devinet_ioctl( SIOCSIFDSTADDR, &if_info );
  78. set_fs(fs);    
  79. if (err) {
  80. printk(KERN_INFO 
  81. "%s: Deleting of route failed.  Error: %dn", 
  82. card->devname,err);
  83. printk(KERN_INFO "%s: Address: %sn",
  84. dev->name,in_ntoa(chan->ip_remote) );
  85. } else {
  86. printk(KERN_INFO "%s: Route Removed Sucessfuly: %sn", 
  87. card->devname,in_ntoa(ip_tmp));
  88. chan->route_flag = NO_ROUTE;
  89. }
  90. break;
  91. } /* Case Statement */
  92. #else
  93.         /* Dynamic Route adding/removing */
  94. struct rtentry route;
  95.         int err = 0;
  96.         unsigned long fs = get_fs();
  97. memset(&route, 0, sizeof(route));
  98. route.rt_dev   = dev->name;
  99. route.rt_flags = 0;
  100. ((struct sockaddr_in *) &(route.rt_dst)) ->
  101. sin_addr.s_addr=dev->pa_dstaddr;
  102. ((struct sockaddr_in *) &(route.rt_dst)) ->
  103. sin_family = AF_INET;
  104. ((struct sockaddr_in *) &(route.rt_genmask)) ->
  105. sin_addr.s_addr = 0xFFFFFFFF;
  106. ((struct sockaddr_in *) &(route.rt_genmask)) ->
  107. sin_family = AF_INET;
  108. switch(chan->route_flag) {
  109. case ADD_ROUTE:
  110. set_fs(get_ds());     /* get user space block */
  111. err = ip_rt_new(&route);
  112. set_fs(fs);           /* restore old block */
  113. if (err) {
  114. printk(KERN_INFO "%s: Adding of route failed.  Error: %dn", 
  115. card->devname,err);
  116. printk(KERN_INFO "%s: Address: %sn",
  117. chan->name, in_ntoa(dev->pa_dstaddr) );
  118. }
  119. else {
  120. chan->route_flag = ROUTE_ADDED;
  121. }
  122. break;
  123. case REMOVE_ROUTE:
  124. set_fs(get_ds());     /* get user space block */
  125. err = ip_rt_kill(&route);
  126. set_fs(fs);           /* restore old block */
  127. if (err) {
  128.      printk(KERN_INFO "%s: Deleting of route failed.  Error: %dn", 
  129. card->devname,err);
  130.      printk(KERN_INFO "%s: Address: %sn",
  131. dev->name,in_ntoa(dev->pa_dstaddr) );
  132. } else {
  133.      printk(KERN_INFO "%s: Removed route.n",
  134. ((fr_channel_t*)dev->priv)->name);
  135.      chan->route_flag = NO_ROUTE;
  136. }
  137. break;
  138. }
  139. #endif
  140. }
  141. /****** Frame Relay Firmware-Specific Functions *****************************/
  142. /*============================================================================
  143.  * Read firmware code version.
  144.  * o fill string str with firmware version info. 
  145.  */
  146. static int fr_read_version (sdla_t* card, char* str)
  147. {
  148. fr_mbox_t* mbox = card->mbox;
  149. int retry = MAX_CMD_RETRY;
  150. int err;
  151. do
  152. {
  153. mbox->cmd.command = FR_READ_CODE_VERSION;
  154. mbox->cmd.length = 0;
  155. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  156. } while (err && retry-- && fr_event(card, err, mbox));
  157. if (!err && str) {
  158. int len = mbox->cmd.length;
  159. memcpy(str, mbox->data, len);
  160.         str[len] = '';
  161. }
  162. return err;
  163. }
  164. /*============================================================================
  165.  * Set global configuration.
  166.  */
  167. static int fr_configure (sdla_t* card, fr_conf_t *conf)
  168. {
  169. fr_mbox_t* mbox = card->mbox;
  170. int retry = MAX_CMD_RETRY;
  171. int dlci_num = card->u.f.dlci_num;
  172. int err, i;
  173. do
  174. {
  175. memcpy(mbox->data, conf, sizeof(fr_conf_t));
  176. if (dlci_num) for (i = 0; i < dlci_num; ++i)
  177. ((fr_conf_t*)mbox->data)->dlci[i] = 
  178. card->u.f.node_dlci[i]; 
  179. mbox->cmd.command = FR_SET_CONFIG;
  180. mbox->cmd.length =
  181. sizeof(fr_conf_t) + dlci_num * sizeof(short);
  182. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  183. } while (err && retry-- && fr_event(card, err, mbox));
  184. /*NC Oct 12 2000 */
  185. if (err != CMD_OK){
  186. printk(KERN_ERR "%s: Frame Relay Configuration Failed: rc=0x%xn",
  187. card->devname,err);
  188. }
  189. return err;
  190. }
  191. /*============================================================================
  192.  * Set DLCI configuration.
  193.  */
  194. static int fr_dlci_configure (sdla_t* card, fr_dlc_conf_t *conf, unsigned dlci)
  195. {
  196. fr_mbox_t* mbox = card->mbox;
  197. int retry = MAX_CMD_RETRY;
  198. int err;
  199. do
  200. {
  201. memcpy(mbox->data, conf, sizeof(fr_dlc_conf_t));
  202. mbox->cmd.dlci = (unsigned short) dlci; 
  203. mbox->cmd.command = FR_SET_CONFIG;
  204. mbox->cmd.length = sizeof(fr_dlc_conf_t);
  205. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  206. } while (err && retry--);
  207. return err;
  208. }
  209. /*============================================================================
  210.  * Set interrupt mode.
  211.  */
  212. static int fr_set_intr_mode (sdla_t* card, unsigned mode, unsigned mtu,
  213. unsigned short timeout)
  214. {
  215. fr_mbox_t* mbox = card->mbox;
  216. fr508_intr_ctl_t* ictl = (void*)mbox->data;
  217. int retry = MAX_CMD_RETRY;
  218. int err;
  219. do
  220. {
  221. memset(ictl, 0, sizeof(fr508_intr_ctl_t));
  222. ictl->mode   = mode;
  223. ictl->tx_len = mtu;
  224. ictl->irq    = card->hw.irq;
  225. /* indicate timeout on timer */
  226. if (mode & 0x20) ictl->timeout = timeout; 
  227. mbox->cmd.length = sizeof(fr508_intr_ctl_t);
  228. mbox->cmd.command = FR_SET_INTR_MODE;
  229. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  230. } while (err && retry-- && fr_event(card, err, mbox));
  231. return err;
  232. }
  233. /*============================================================================
  234.  * Enable communications.
  235.  */
  236. static int fr_comm_enable (sdla_t* card)
  237. {
  238. fr_mbox_t* mbox = card->mbox;
  239. int retry = MAX_CMD_RETRY;
  240. int err;
  241. do
  242. {
  243. mbox->cmd.command = FR_COMM_ENABLE;
  244. mbox->cmd.length = 0;
  245. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  246. } while (err && retry-- && fr_event(card, err, mbox));
  247. return err;
  248. }
  249. /*============================================================================
  250.  * fr_comm_disable 
  251.  *
  252.  * Warning: This functin is called by the shutdown() procedure. It is void
  253.  *          since dev->priv are has already been deallocated and no
  254.  *          error checking is possible using fr_event() function.
  255.  */
  256. static void fr_comm_disable (sdla_t* card)
  257. {
  258. fr_mbox_t* mbox = card->mbox;
  259. int retry = MAX_CMD_RETRY;
  260. int err;
  261. do {
  262. mbox->cmd.command = FR_SET_MODEM_STATUS;
  263. mbox->cmd.length = 1;
  264. mbox->data[0] = 0;
  265. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  266. } while (err && retry--);
  267. retry = MAX_CMD_RETRY;
  268. do
  269. {
  270. mbox->cmd.command = FR_COMM_DISABLE;
  271. mbox->cmd.length = 0;
  272. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  273. } while (err && retry--);
  274. return;
  275. }
  276. /*============================================================================
  277.  * Get communications error statistics. 
  278.  */
  279. static int fr_get_err_stats (sdla_t* card)
  280. {
  281. fr_mbox_t* mbox = card->mbox;
  282. int retry = MAX_CMD_RETRY;
  283. int err;
  284. do
  285. {
  286. mbox->cmd.command = FR_READ_ERROR_STATS;
  287. mbox->cmd.length = 0;
  288. mbox->cmd.dlci = 0;
  289. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  290. } while (err && retry-- && fr_event(card, err, mbox));
  291. if (!err) {
  292. fr_comm_stat_t* stats = (void*)mbox->data;
  293. card->wandev.stats.rx_over_errors    = stats->rx_overruns;
  294. card->wandev.stats.rx_crc_errors     = stats->rx_bad_crc;
  295. card->wandev.stats.rx_missed_errors  = stats->rx_aborts;
  296. card->wandev.stats.rx_length_errors  = stats->rx_too_long;
  297. card->wandev.stats.tx_aborted_errors = stats->tx_aborts;
  298. }
  299. return err;
  300. }
  301. /*============================================================================
  302.  * Get statistics. 
  303.  */
  304. static int fr_get_stats (sdla_t* card)
  305. {
  306. fr_mbox_t* mbox = card->mbox;
  307. int retry = MAX_CMD_RETRY;
  308. int err;
  309. do
  310. {
  311. mbox->cmd.command = FR_READ_STATISTICS;
  312. mbox->cmd.length = 0;
  313. mbox->cmd.dlci = 0;
  314. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  315. } while (err && retry-- && fr_event(card, err, mbox));
  316. if (!err) {
  317. fr_link_stat_t* stats = (void*)mbox->data;
  318. card->wandev.stats.rx_frame_errors = stats->rx_bad_format;
  319. card->wandev.stats.rx_dropped =
  320. stats->rx_dropped + stats->rx_dropped2;
  321. }
  322. return err;
  323. }
  324. /*============================================================================
  325.  * Add DLCI(s) (Access Node only!).
  326.  * This routine will perform the ADD_DLCIs command for the specified DLCI.
  327.  */
  328. static int fr_add_dlci (sdla_t* card, int dlci)
  329. {
  330. fr_mbox_t* mbox = card->mbox;
  331. int retry = MAX_CMD_RETRY;
  332. int err;
  333. do
  334. {
  335. unsigned short* dlci_list = (void*)mbox->data;
  336. mbox->cmd.length  = sizeof(short);
  337. dlci_list[0] = dlci;
  338. mbox->cmd.command = FR_ADD_DLCI;
  339. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  340. } while (err && retry-- && fr_event(card, err, mbox));
  341. return err;
  342. }
  343. /*============================================================================
  344.  * Activate DLCI(s) (Access Node only!). 
  345.  * This routine will perform the ACTIVATE_DLCIs command with a DLCI number. 
  346.  */
  347. static int fr_activate_dlci (sdla_t* card, int dlci)
  348. {
  349. fr_mbox_t* mbox = card->mbox;
  350. int retry = MAX_CMD_RETRY;
  351. int err;
  352. do
  353. {
  354. unsigned short* dlci_list = (void*)mbox->data;
  355. mbox->cmd.length  = sizeof(short);
  356. dlci_list[0] = dlci;
  357. mbox->cmd.command = FR_ACTIVATE_DLCI;
  358. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  359. } while (err && retry-- && fr_event(card, err, mbox));
  360. return err;
  361. }
  362. /*============================================================================
  363.  * Delete DLCI(s) (Access Node only!). 
  364.  * This routine will perform the DELETE_DLCIs command with a DLCI number. 
  365.  */
  366. static int fr_delete_dlci (sdla_t* card, int dlci)
  367. {
  368. fr_mbox_t* mbox = card->mbox;
  369. int retry = MAX_CMD_RETRY;
  370. int err;
  371. do
  372. {
  373. unsigned short* dlci_list = (void*)mbox->data;
  374. mbox->cmd.length  = sizeof(short);
  375. dlci_list[0] = dlci;
  376. mbox->cmd.command = FR_DELETE_DLCI;
  377. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  378. } while (err && retry-- && fr_event(card, err, mbox));
  379. return err;
  380. }
  381. /*============================================================================
  382.  * Issue in-channel signalling frame. 
  383.  */
  384. static int fr_issue_isf (sdla_t* card, int isf)
  385. {
  386. fr_mbox_t* mbox = card->mbox;
  387. int retry = MAX_CMD_RETRY;
  388. int err;
  389. do
  390. {
  391. mbox->data[0] = isf;
  392. mbox->cmd.length  = 1;
  393. mbox->cmd.command = FR_ISSUE_IS_FRAME;
  394. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  395. } while (err && retry-- && fr_event(card, err, mbox));
  396. return err;
  397. }
  398. static unsigned int fr_send_hdr (sdla_t*card, int dlci, unsigned int offset)
  399. {
  400. netdevice_t *dev = find_channel(card,dlci);
  401. fr_channel_t *chan;
  402. if (!dev || !(chan=dev->priv))
  403. return offset;
  404. if (chan->fr_header_len){
  405. sdla_poke(&card->hw, offset, chan->fr_header, chan->fr_header_len);
  406. }
  407. return offset+chan->fr_header_len;
  408. }
  409. /*============================================================================
  410.  * Send a frame on a selected DLCI.  
  411.  */
  412. static int fr_send_data_header (sdla_t* card, int dlci, unsigned char attr, int len,
  413. void *buf, unsigned char hdr_len)
  414. {
  415. fr_mbox_t* mbox = card->mbox + 0x800;
  416. int retry = MAX_CMD_RETRY;
  417. int err;
  418. do
  419. {
  420. mbox->cmd.dlci    = dlci;
  421. mbox->cmd.attr    = attr;
  422. mbox->cmd.length  = len+hdr_len;
  423. mbox->cmd.command = FR_WRITE;
  424. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  425. } while (err && retry-- && fr_event(card, err, mbox));
  426. if (!err) {
  427. fr_tx_buf_ctl_t* frbuf;
  428.  
  429.                 if(card->hw.type == SDLA_S514)
  430. frbuf = (void*)(*(unsigned long*)mbox->data +
  431.                          card->hw.dpmbase);
  432. else
  433. frbuf = (void*)(*(unsigned long*)mbox->data -
  434.                          FR_MB_VECTOR + card->hw.dpmbase);
  435. sdla_poke(&card->hw, fr_send_hdr(card,dlci,frbuf->offset), buf, len);
  436. frbuf->flag = 0x01;
  437. }
  438. return err;
  439. }
  440. static int fr_send (sdla_t* card, int dlci, unsigned char attr, int len,
  441. void *buf)
  442. {
  443. fr_mbox_t* mbox = card->mbox + 0x800;
  444. int retry = MAX_CMD_RETRY;
  445. int err;
  446. do
  447. {
  448. mbox->cmd.dlci    = dlci;
  449. mbox->cmd.attr    = attr;
  450. mbox->cmd.length  = len;
  451. mbox->cmd.command = FR_WRITE;
  452. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  453. } while (err && retry-- && fr_event(card, err, mbox));
  454. if (!err) {
  455. fr_tx_buf_ctl_t* frbuf;
  456.  
  457.                 if(card->hw.type == SDLA_S514)
  458. frbuf = (void*)(*(unsigned long*)mbox->data +
  459.                          card->hw.dpmbase);
  460. else
  461. frbuf = (void*)(*(unsigned long*)mbox->data -
  462.                          FR_MB_VECTOR + card->hw.dpmbase);
  463. sdla_poke(&card->hw, frbuf->offset, buf, len);
  464. frbuf->flag = 0x01;
  465. }
  466. return err;
  467. }
  468. /****** Firmware Asynchronous Event Handlers ********************************/
  469. /*============================================================================
  470.  * Main asyncronous event/error handler.
  471.  * This routine is called whenever firmware command returns non-zero
  472.  * return code.
  473.  *
  474.  * Return zero if previous command has to be cancelled.
  475.  */
  476. static int fr_event (sdla_t *card, int event, fr_mbox_t* mbox)
  477. {
  478. fr508_flags_t* flags = card->flags;
  479. char *ptr = &flags->iflag;
  480. int i;
  481. switch (event) {
  482. case FRRES_MODEM_FAILURE:
  483. return fr_modem_failure(card, mbox);
  484. case FRRES_CHANNEL_DOWN:
  485. {
  486. netdevice_t *dev;
  487. /* Remove all routes from associated DLCI's */
  488. for (dev = card->wandev.dev; dev; dev = *((netdevice_t **)dev->priv)) {
  489. fr_channel_t *chan = dev->priv;
  490. if (chan->route_flag == ROUTE_ADDED) {
  491. chan->route_flag = REMOVE_ROUTE;
  492. }
  493. if (chan->inarp == INARP_CONFIGURED) {
  494. chan->inarp = INARP_REQUEST;
  495. }
  496. /* If the link becomes disconnected then,
  497.                                  * all channels will be disconnected
  498.                                  * as well.
  499.                                  */
  500. set_chan_state(dev,WAN_DISCONNECTED);
  501. }
  502. wanpipe_set_state(card, WAN_DISCONNECTED);
  503. return 1;
  504. }
  505. case FRRES_CHANNEL_UP:
  506. {
  507. netdevice_t *dev;
  508. /* FIXME: Only startup devices that are on the list */
  509. for (dev = card->wandev.dev; dev; dev = *((netdevice_t **)dev->priv)) {
  510. set_chan_state(dev,WAN_CONNECTED);
  511. }
  512. wanpipe_set_state(card, WAN_CONNECTED);
  513. return 1;
  514. }
  515. case FRRES_DLCI_CHANGE:
  516. return fr_dlci_change(card, mbox);
  517. case FRRES_DLCI_MISMATCH:
  518. printk(KERN_INFO "%s: DLCI list mismatch!n", 
  519. card->devname);
  520. return 1;
  521. case CMD_TIMEOUT:
  522. printk(KERN_ERR "%s: command 0x%02X timed out!n",
  523. card->devname, mbox->cmd.command);
  524. printk(KERN_INFO "%s: ID Bytes = ",card->devname);
  525.        for(i = 0; i < 8; i ++)
  526. printk(KERN_INFO "0x%02X ", *(ptr + 0x18 + i));
  527.       printk(KERN_INFO "n");
  528.             
  529. break;
  530. case FRRES_DLCI_INACTIVE:
  531. break;
  532.  
  533. case FRRES_CIR_OVERFLOW:
  534. break;
  535. case FRRES_BUFFER_OVERFLOW:
  536. break; 
  537. default:
  538. printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!n"
  539. , card->devname, mbox->cmd.command, event);
  540. }
  541. return 0;
  542. }
  543. /*============================================================================
  544.  * Handle modem error.
  545.  *
  546.  * Return zero if previous command has to be cancelled.
  547.  */
  548. static int fr_modem_failure (sdla_t *card, fr_mbox_t* mbox)
  549. {
  550. printk(KERN_INFO "%s: physical link down! (modem error 0x%02X)n",
  551. card->devname, mbox->data[0]);
  552. switch (mbox->cmd.command){
  553. case FR_WRITE:
  554. case FR_READ:
  555. return 0;
  556. }
  557. return 1;
  558. }
  559. /*============================================================================
  560.  * Handle DLCI status change.
  561.  *
  562.  * Return zero if previous command has to be cancelled.
  563.  */
  564. static int fr_dlci_change (sdla_t *card, fr_mbox_t* mbox)
  565. {
  566. dlci_status_t* status = (void*)mbox->data;
  567. int cnt = mbox->cmd.length / sizeof(dlci_status_t);
  568. fr_channel_t *chan;
  569. netdevice_t* dev2;
  570. for (; cnt; --cnt, ++status) {
  571. unsigned short dlci= status->dlci;
  572. netdevice_t* dev = find_channel(card, dlci);
  573. if (dev == NULL){
  574. printk(KERN_INFO 
  575. "%s: CPE contains unconfigured DLCI= %dn", 
  576. card->devname, dlci); 
  577.                       printk(KERN_INFO
  578.                                 "%s: unconfigured DLCI %d reported by networkn"
  579.                                 , card->devname, dlci);
  580.  
  581. }else{
  582. if (status->state == FR_LINK_INOPER) {
  583. printk(KERN_INFO
  584. "%s: DLCI %u is inactive!n",
  585. card->devname, dlci);
  586. if (dev && is_dev_running(dev))
  587. set_chan_state(dev, WAN_DISCONNECTED);
  588. }
  589. if (status->state & FR_DLCI_DELETED) {
  590. printk(KERN_INFO
  591. "%s: DLCI %u has been deleted!n",
  592. card->devname, dlci);
  593. if (dev && is_dev_running(dev)){
  594. fr_channel_t *chan = dev->priv;
  595. if (chan->route_flag == ROUTE_ADDED) {
  596. chan->route_flag = REMOVE_ROUTE;
  597. /* The state change will trigger
  598.                                                  * the fr polling routine */
  599. }
  600. if (chan->inarp == INARP_CONFIGURED) {
  601. chan->inarp = INARP_REQUEST;
  602. }
  603. set_chan_state(dev, WAN_DISCONNECTED);
  604. }
  605. } else if (status->state & FR_DLCI_ACTIVE) {
  606. chan = dev->priv;
  607. /* This flag is used for configuring specific 
  608.    DLCI(s) when they become active.
  609.   */ 
  610. chan->dlci_configured = DLCI_CONFIG_PENDING;
  611. set_chan_state(dev, WAN_CONNECTED);
  612. }
  613. }
  614. }
  615. for (dev2 =card->wandev.dev; dev2; dev2 = *((netdevice_t **)dev2->priv)){
  616. chan = dev2->priv;
  617. if (chan->dlci_configured == DLCI_CONFIG_PENDING) {
  618. if (fr_init_dlci(card, chan)){
  619. return 1;
  620. }
  621. }
  622. }
  623. return 1;
  624. }
  625. static int fr_init_dlci (sdla_t *card, fr_channel_t *chan)
  626. {
  627. fr_dlc_conf_t cfg;
  628. memset(&cfg, 0, sizeof(cfg));
  629. if ( chan->cir_status == CIR_DISABLED) {
  630. cfg.cir_fwd = cfg.cir_bwd  = 16;
  631. cfg.bc_fwd = cfg.bc_bwd = 16;
  632. cfg.conf_flags = 0x0001;
  633. }else if (chan->cir_status == CIR_ENABLED) {
  634. cfg.cir_fwd = cfg.cir_bwd = chan->cir;
  635. cfg.bc_fwd  = cfg.bc_bwd  = chan->bc;
  636. cfg.be_fwd  = cfg.be_bwd  = chan->be;
  637. cfg.conf_flags = 0x0000;
  638. }
  639. if (fr_dlci_configure( card, &cfg , chan->dlci)){
  640. printk(KERN_INFO 
  641. "%s: DLCI Configure failed for %dn",
  642. card->devname, chan->dlci);
  643. return 1;
  644. }
  645. chan->dlci_configured = DLCI_CONFIGURED;
  646. /* Read the interface byte mapping into the channel 
  647.  * structure.
  648.  */
  649. read_DLCI_IB_mapping( card, chan );
  650. return 0;
  651. }
  652. /******* Miscellaneous ******************************************************/
  653. /*============================================================================
  654.  * Update channel state. 
  655.  */
  656. static int update_chan_state (netdevice_t* dev)
  657. {
  658. fr_channel_t* chan = dev->priv;
  659. sdla_t* card = chan->card;
  660. fr_mbox_t* mbox = card->mbox;
  661. int retry = MAX_CMD_RETRY;
  662. int err;
  663. do
  664. {
  665. mbox->cmd.command = FR_LIST_ACTIVE_DLCI;
  666. mbox->cmd.length = 0;
  667. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  668. } while (err && retry-- && fr_event(card, err, mbox));
  669. if (!err) {
  670. unsigned short* list = (void*)mbox->data;
  671. int cnt = mbox->cmd.length / sizeof(short);
  672. err=1;
  673. for (; cnt; --cnt, ++list) {
  674. if (*list == chan->dlci) {
  675.   set_chan_state(dev, WAN_CONNECTED);
  676. /* May 23 2000. NC
  677.  * When a dlci is added or restarted,
  678.                                  * the dlci_int_interface pointer must
  679.  * be reinitialized.  */
  680. if (!chan->dlci_int_interface){
  681. err=fr_init_dlci (card,chan);
  682. }
  683. break;
  684. }
  685. }
  686. }
  687. return err;
  688. }
  689. /*============================================================================
  690.  * Set channel state.
  691.  */
  692. static void set_chan_state (netdevice_t* dev, int state)
  693. {
  694. fr_channel_t* chan = dev->priv;
  695. sdla_t* card = chan->card;
  696. if (chan->common.state != state) {
  697. switch (state) {
  698. case WAN_CONNECTED:
  699. printk(KERN_INFO
  700. "%s: Interface %s: DLCI %d connectedn",
  701. card->devname, dev->name, chan->dlci);
  702. /* If the interface was previoulsy down,
  703.                                  * bring it up, since the channel is active */
  704. trigger_fr_poll (dev);
  705. trigger_fr_arp  (dev);
  706. break;
  707. case WAN_CONNECTING:
  708. printk(KERN_INFO 
  709.       "%s: Interface %s: DLCI %d connectingn",
  710. card->devname, dev->name, chan->dlci);
  711. break;
  712. case WAN_DISCONNECTED:
  713. printk (KERN_INFO 
  714.     "%s: Interface %s: DLCI %d disconnected!n",
  715. card->devname, dev->name, chan->dlci);
  716. /* If the interface is up, bring it down,
  717.                                  * since the channel is now disconnected */
  718. trigger_fr_poll (dev);
  719. break;
  720. }
  721. chan->common.state = state;
  722. }
  723. chan->state_tick = jiffies;
  724. }
  725. /*============================================================================
  726.  * Find network device by its channel number.
  727.  *
  728.  * We need this critical flag because we change
  729.  * the dlci_to_dev_map outside the interrupt.
  730.  *
  731.  * NOTE: del_if() functions updates this array, it uses
  732.  *       the spin locks to avoid corruption.
  733.  */
  734. static netdevice_t* find_channel (sdla_t* card, unsigned dlci)
  735. {
  736. if(dlci > HIGHEST_VALID_DLCI)
  737. return NULL;
  738. return(card->u.f.dlci_to_dev_map[dlci]);
  739. }
  740. /*============================================================================
  741.  * Check to see if a frame can be sent. If no transmit buffers available,
  742.  * enable transmit interrupts.
  743.  *
  744.  * Return: 1 - Tx buffer(s) available
  745.  * 0 - no buffers available
  746.  */
  747. static int is_tx_ready (sdla_t* card, fr_channel_t* chan)
  748. {
  749. unsigned char sb;
  750.         if(card->hw.type == SDLA_S514)
  751. return 1;
  752. sb = inb(card->hw.port);
  753. if (sb & 0x02) 
  754. return 1;
  755. return 0;
  756. }
  757. /*============================================================================
  758.  * Convert decimal string to unsigned integer.
  759.  * If len != 0 then only 'len' characters of the string are converted.
  760.  */
  761. static unsigned int dec_to_uint (unsigned char* str, int len)
  762. {
  763. unsigned val;
  764. if (!len) 
  765. len = strlen(str);
  766. for (val = 0; len && is_digit(*str); ++str, --len)
  767. val = (val * 10) + (*str - (unsigned)'0');
  768. return val;
  769. }
  770. /*=============================================================================
  771.  * Store a UDP management packet for later processing.
  772.  */
  773. static int store_udp_mgmt_pkt(int udp_type, char udp_pkt_src, sdla_t* card,
  774.                                 struct sk_buff *skb, int dlci)
  775. {
  776.         int udp_pkt_stored = 0;
  777. netdevice_t *dev=find_channel(card,dlci);
  778. fr_channel_t *chan;
  779. if (!dev || !(chan=dev->priv))
  780. return 1;
  781.         if(!card->u.f.udp_pkt_lgth && (skb->len <= MAX_LGTH_UDP_MGNT_PKT)){
  782.                 card->u.f.udp_pkt_lgth = skb->len + chan->fr_header_len;
  783.                 card->u.f.udp_type = udp_type;
  784.                 card->u.f.udp_pkt_src = udp_pkt_src;
  785.                 card->u.f.udp_dlci = dlci;
  786.                 memcpy(card->u.f.udp_pkt_data, skb->data, skb->len);
  787.                 card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UDP;
  788.                 udp_pkt_stored = 1;
  789.         }else{
  790.                 printk(KERN_INFO "ERROR: UDP packet not stored for DLCI %dn", 
  791. dlci);
  792. }
  793.         if(udp_pkt_src == UDP_PKT_FRM_STACK){
  794.                 wan_dev_kfree_skb(skb, FREE_WRITE);
  795. }else{
  796.                 wan_dev_kfree_skb(skb, FREE_READ);
  797. }
  798.         return(udp_pkt_stored);
  799. }
  800. /*==============================================================================
  801.  * Process UDP call of type FPIPE8ND
  802.  */
  803. static int process_udp_mgmt_pkt(sdla_t* card)
  804. {
  805. int c_retry = MAX_CMD_RETRY;
  806. unsigned char *buf;
  807. unsigned char frames;
  808. unsigned int len;
  809. unsigned short buffer_length;
  810. struct sk_buff *new_skb;
  811. fr_mbox_t* mbox = card->mbox;
  812. int err;
  813. struct timeval tv;
  814. int udp_mgmt_req_valid = 1;
  815.         netdevice_t* dev;
  816.         fr_channel_t* chan;
  817.         fr_udp_pkt_t *fr_udp_pkt;
  818. unsigned short num_trc_els;
  819. fr_trc_el_t* ptr_trc_el;
  820. fr_trc_el_t trc_el;
  821. fpipemon_trc_t* fpipemon_trc;
  822. char udp_pkt_src = card->u.f.udp_pkt_src; 
  823. int dlci = card->u.f.udp_dlci;
  824. /* Find network interface for this packet */
  825. dev = find_channel(card, dlci);
  826. if (!dev){
  827. card->u.f.udp_pkt_lgth = 0;
  828. return 1;
  829. }
  830.         if ((chan = dev->priv) == NULL){
  831. card->u.f.udp_pkt_lgth = 0;
  832. return 1;
  833. }
  834. /* If the UDP packet is from the network, we are going to have to 
  835.    transmit a response. Before doing so, we must check to see that
  836.    we are not currently transmitting a frame (in 'if_send()') and
  837.    that we are not already in a 'delayed transmit' state.
  838. */
  839. if(udp_pkt_src == UDP_PKT_FRM_NETWORK) {
  840. if (check_tx_status(card,dev)){
  841. card->u.f.udp_pkt_lgth = 0;
  842. return 1;
  843. }
  844.         }
  845.         fr_udp_pkt = (fr_udp_pkt_t *)card->u.f.udp_pkt_data;
  846. if(udp_pkt_src == UDP_PKT_FRM_NETWORK) {
  847. switch(fr_udp_pkt->cblock.command) {
  848. case FR_READ_MODEM_STATUS:
  849. case FR_READ_STATUS:
  850. case FPIPE_ROUTER_UP_TIME:
  851. case FR_READ_ERROR_STATS:
  852. case FPIPE_DRIVER_STAT_GEN:
  853. case FR_READ_STATISTICS:
  854. case FR_READ_ADD_DLC_STATS:
  855. case FR_READ_CONFIG:
  856. case FR_READ_CODE_VERSION:
  857. udp_mgmt_req_valid = 1;
  858. break;
  859. default:
  860. udp_mgmt_req_valid = 0;
  861. break;
  862. }
  863. }
  864. if(!udp_mgmt_req_valid) {
  865. /* set length to 0 */
  866. fr_udp_pkt->cblock.length = 0;
  867. /* set return code */
  868. fr_udp_pkt->cblock.result = 0xCD; 
  869. chan->drvstats_gen.UDP_PIPE_mgmt_direction_err ++;
  870. if (net_ratelimit()){
  871. printk(KERN_INFO 
  872. "%s: Warning, Illegal UDP command attempted from network: %xn",
  873. card->devname,fr_udp_pkt->cblock.command);
  874. }
  875. } else {   
  876.            
  877. switch(fr_udp_pkt->cblock.command) {
  878. case FPIPE_ENABLE_TRACING:
  879. if(!card->TracingEnabled) {
  880. do {
  881.                         mbox->cmd.command = FR_SET_TRACE_CONFIG;
  882.                         mbox->cmd.length = 1;
  883.                       mbox->cmd.dlci = 0x00;
  884.                     mbox->data[0] = fr_udp_pkt->data[0] | 
  885. RESET_TRC;
  886.                      err = sdla_exec(mbox) ? 
  887.       mbox->cmd.result : CMD_TIMEOUT;
  888.                         } while (err && c_retry-- && fr_event(card, err,
  889.  mbox));
  890.                          if(err) {
  891. card->TracingEnabled = 0;
  892. /* set the return code */
  893. fr_udp_pkt->cblock.result =
  894.    mbox->cmd.result;
  895. mbox->cmd.length = 0;
  896. break;
  897. }
  898. sdla_peek(&card->hw, NO_TRC_ELEMENTS_OFF,
  899. &num_trc_els, 2);
  900. sdla_peek(&card->hw, BASE_TRC_ELEMENTS_OFF,
  901. &card->u.f.trc_el_base, 4);
  902. card->u.f.curr_trc_el = card->u.f.trc_el_base;
  903.               card->u.f.trc_el_last = card->u.f.curr_trc_el +
  904. ((num_trc_els - 1) * 
  905. sizeof(fr_trc_el_t));
  906.    
  907. /* Calculate the maximum trace data area in */
  908. /* the UDP packet */
  909. card->u.f.trc_bfr_space=(MAX_LGTH_UDP_MGNT_PKT -
  910. //sizeof(fr_encap_hdr_t) -
  911. sizeof(ip_pkt_t) -
  912. sizeof(udp_pkt_t) -
  913. sizeof(wp_mgmt_t) -
  914. sizeof(cblock_t));
  915. /* set return code */
  916. fr_udp_pkt->cblock.result = 0;
  917. } else {
  918.                          /* set return code to line trace already 
  919.    enabled */
  920. fr_udp_pkt->cblock.result = 1;
  921.                      }
  922. mbox->cmd.length = 0;
  923. card->TracingEnabled = 1;
  924. break;
  925.                 case FPIPE_DISABLE_TRACING:
  926. if(card->TracingEnabled) {
  927. do {
  928. mbox->cmd.command = FR_SET_TRACE_CONFIG;
  929. mbox->cmd.length = 1;
  930. mbox->cmd.dlci = 0x00;
  931. mbox->data[0] = ~ACTIVATE_TRC;
  932. err = sdla_exec(mbox) ? 
  933. mbox->cmd.result : CMD_TIMEOUT;
  934. } while (err && c_retry-- && fr_event(card, err, mbox));
  935.                      }
  936.                      /* set return code */
  937. fr_udp_pkt->cblock.result = 0;
  938. mbox->cmd.length = 0;
  939. card->TracingEnabled = 0;
  940. break;
  941.                 case FPIPE_GET_TRACE_INFO:
  942.         /* Line trace cannot be performed on the 502 */
  943.                         if(!card->TracingEnabled) {
  944.                                 /* set return code */
  945.                                 fr_udp_pkt->cblock.result = 1;
  946.                                 mbox->cmd.length = 0;
  947.                                 break;
  948.                         }
  949. (void *)ptr_trc_el = card->u.f.curr_trc_el;
  950.                         buffer_length = 0;
  951. fr_udp_pkt->data[0x00] = 0x00;
  952.                         for(frames = 0; frames < MAX_FRMS_TRACED; frames ++) {
  953.                                 sdla_peek(&card->hw, (unsigned long)ptr_trc_el,
  954.   (void *)&trc_el.flag,
  955.   sizeof(fr_trc_el_t));
  956.                                 if(trc_el.flag == 0x00) {
  957.                                         break;
  958. }
  959.                                 if((card->u.f.trc_bfr_space - buffer_length)
  960.                                         < sizeof(fpipemon_trc_hdr_t)) { 
  961.                                         fr_udp_pkt->data[0x00] |= MORE_TRC_DATA;
  962.                                         break;
  963.                                 }
  964. fpipemon_trc = 
  965. (fpipemon_trc_t *)&fr_udp_pkt->data[buffer_length]; 
  966. fpipemon_trc->fpipemon_trc_hdr.status =
  967. trc_el.attr;
  968.                              fpipemon_trc->fpipemon_trc_hdr.tmstamp =
  969. trc_el.tmstamp;
  970.                              fpipemon_trc->fpipemon_trc_hdr.length = 
  971. trc_el.length;
  972.                                 if(!trc_el.offset || !trc_el.length) {
  973.                                       fpipemon_trc->fpipemon_trc_hdr.data_passed = 0x00;
  974.   }else if((trc_el.length + sizeof(fpipemon_trc_hdr_t) + 1) >
  975. (card->u.f.trc_bfr_space - buffer_length)){
  976.                                         fpipemon_trc->fpipemon_trc_hdr.data_passed = 0x00;
  977.                                      fr_udp_pkt->data[0x00] |= MORE_TRC_DATA;
  978.  
  979.                                 }else {
  980.                                         fpipemon_trc->fpipemon_trc_hdr.data_passed = 0x01;
  981.                                         sdla_peek(&card->hw, trc_el.offset,
  982.                               fpipemon_trc->data,
  983.   trc_el.length);
  984. }
  985.                                 trc_el.flag = 0x00;
  986.                                 sdla_poke(&card->hw, (unsigned long)ptr_trc_el,
  987.   &trc_el.flag, 1);
  988.                                
  989. ptr_trc_el ++;
  990. if((void *)ptr_trc_el > card->u.f.trc_el_last)
  991. (void*)ptr_trc_el = card->u.f.trc_el_base;
  992. buffer_length += sizeof(fpipemon_trc_hdr_t);
  993.                                 if(fpipemon_trc->fpipemon_trc_hdr.data_passed) {
  994.                                 buffer_length += trc_el.length;
  995.                                 }
  996. if(fr_udp_pkt->data[0x00] & MORE_TRC_DATA) {
  997. break;
  998. }
  999.                         }
  1000.                       
  1001. if(frames == MAX_FRMS_TRACED) {
  1002.                          fr_udp_pkt->data[0x00] |= MORE_TRC_DATA;
  1003. }
  1004.              
  1005. card->u.f.curr_trc_el = (void *)ptr_trc_el;
  1006.                         /* set the total number of frames passed */
  1007. fr_udp_pkt->data[0x00] |=
  1008. ((frames << 1) & (MAX_FRMS_TRACED << 1));
  1009.                         /* set the data length and return code */
  1010. fr_udp_pkt->cblock.length = mbox->cmd.length = buffer_length;
  1011.                         fr_udp_pkt->cblock.result = 0;
  1012.                         break;
  1013.                 case FPIPE_FT1_READ_STATUS:
  1014. sdla_peek(&card->hw, 0xF020,
  1015. &fr_udp_pkt->data[0x00] , 2);
  1016. fr_udp_pkt->cblock.length = mbox->cmd.length = 2;
  1017. fr_udp_pkt->cblock.result = 0;
  1018. break;
  1019. case FPIPE_FLUSH_DRIVER_STATS:
  1020. init_chan_statistics(chan);
  1021. init_global_statistics(card);
  1022. mbox->cmd.length = 0;
  1023. break;
  1024. case FPIPE_ROUTER_UP_TIME:
  1025. do_gettimeofday(&tv);
  1026. chan->router_up_time = tv.tv_sec - 
  1027. chan->router_start_time;
  1028.                      *(unsigned long *)&fr_udp_pkt->data =
  1029.      chan->router_up_time;
  1030. mbox->cmd.length = fr_udp_pkt->cblock.length = 4;
  1031. fr_udp_pkt->cblock.result = 0;
  1032. break;
  1033. case FPIPE_DRIVER_STAT_IFSEND:
  1034. memcpy(fr_udp_pkt->data,
  1035. &chan->drvstats_if_send.if_send_entry,
  1036. sizeof(if_send_stat_t));
  1037. mbox->cmd.length = fr_udp_pkt->cblock.length =sizeof(if_send_stat_t);
  1038. fr_udp_pkt->cblock.result = 0;
  1039. break;
  1040. case FPIPE_DRIVER_STAT_INTR:
  1041. memcpy(fr_udp_pkt->data,
  1042.                                 &card->statistics.isr_entry,
  1043.                                 sizeof(global_stats_t));
  1044.                         memcpy(&fr_udp_pkt->data[sizeof(global_stats_t)],
  1045.                                 &chan->drvstats_rx_intr.rx_intr_no_socket,
  1046.                                 sizeof(rx_intr_stat_t));
  1047. mbox->cmd.length = fr_udp_pkt->cblock.length = 
  1048. sizeof(global_stats_t) +
  1049. sizeof(rx_intr_stat_t);
  1050. fr_udp_pkt->cblock.result = 0;
  1051. break;
  1052. case FPIPE_DRIVER_STAT_GEN:
  1053.                         memcpy(fr_udp_pkt->data,
  1054.                                 &chan->drvstats_gen.UDP_PIPE_mgmt_kmalloc_err,
  1055.                                 sizeof(pipe_mgmt_stat_t));
  1056.                         memcpy(&fr_udp_pkt->data[sizeof(pipe_mgmt_stat_t)],
  1057.                                &card->statistics, sizeof(global_stats_t));
  1058.                         mbox->cmd.length = fr_udp_pkt->cblock.length = sizeof(global_stats_t)+
  1059.                                                      sizeof(rx_intr_stat_t);
  1060. fr_udp_pkt->cblock.result = 0;
  1061.                         break;
  1062. case FR_FT1_STATUS_CTRL:
  1063. if(fr_udp_pkt->data[0] == 1) {
  1064. if(rCount++ != 0 ){
  1065. fr_udp_pkt->cblock.result = 0;
  1066. mbox->cmd.length = 1;
  1067. break;
  1068. }
  1069.            
  1070. /* Disable FT1 MONITOR STATUS */
  1071.                         if(fr_udp_pkt->data[0] == 0) {
  1072. if( --rCount != 0) {
  1073.                                         fr_udp_pkt->cblock.result = 0;
  1074. mbox->cmd.length = 1;
  1075. break;
  1076. }  
  1077. goto udp_mgmt_dflt;
  1078. default:
  1079. udp_mgmt_dflt:
  1080.   do {
  1081. memcpy(&mbox->cmd,
  1082. &fr_udp_pkt->cblock.command,
  1083. sizeof(fr_cmd_t));
  1084. if(mbox->cmd.length) {
  1085. memcpy(&mbox->data,
  1086. (char *)fr_udp_pkt->data,
  1087. mbox->cmd.length);
  1088. }
  1089.  
  1090. err = sdla_exec(mbox) ? mbox->cmd.result : 
  1091. CMD_TIMEOUT;
  1092. } while (err && c_retry-- && fr_event(card, err, mbox));
  1093. if(!err)
  1094. chan->drvstats_gen.
  1095. UDP_PIPE_mgmt_adptr_cmnd_OK ++;
  1096. else
  1097.                                 chan->drvstats_gen.
  1098. UDP_PIPE_mgmt_adptr_cmnd_timeout ++;
  1099.                         /* copy the result back to our buffer */
  1100. memcpy(&fr_udp_pkt->cblock.command,
  1101. &mbox->cmd, sizeof(fr_cmd_t));
  1102.                         if(mbox->cmd.length) {
  1103.                                 memcpy(&fr_udp_pkt->data,
  1104. &mbox->data, mbox->cmd.length);
  1105. }
  1106.         }
  1107.    
  1108.         /* Fill UDP TTL */
  1109.         fr_udp_pkt->ip_pkt.ttl = card->wandev.ttl;
  1110.         len = reply_udp(card->u.f.udp_pkt_data, mbox->cmd.length);
  1111.         if(udp_pkt_src == UDP_PKT_FRM_NETWORK) {
  1112. chan->fr_header_len=2;
  1113. chan->fr_header[0]=Q922_UI;
  1114. chan->fr_header[1]=NLPID_IP;
  1115. err = fr_send_data_header(card, dlci, 0, len, 
  1116. card->u.f.udp_pkt_data,chan->fr_header_len);
  1117. if (err){ 
  1118. chan->drvstats_gen.UDP_PIPE_mgmt_adptr_send_passed ++;
  1119. }else{
  1120. chan->drvstats_gen.UDP_PIPE_mgmt_adptr_send_failed ++;
  1121. }
  1122. } else {
  1123. /* Allocate socket buffer */
  1124. if((new_skb = dev_alloc_skb(len)) != NULL) {
  1125. /* copy data into new_skb */
  1126. buf = skb_put(new_skb, len);
  1127. memcpy(buf, card->u.f.udp_pkt_data, len);
  1128.         
  1129. chan->drvstats_gen.
  1130. UDP_PIPE_mgmt_passed_to_stack ++;
  1131. new_skb->dev = dev;
  1132. new_skb->protocol = htons(ETH_P_IP);
  1133. new_skb->mac.raw = new_skb->data;
  1134. netif_rx(new_skb);
  1135.             
  1136. } else {
  1137. chan->drvstats_gen.UDP_PIPE_mgmt_no_socket ++;
  1138. printk(KERN_INFO 
  1139. "%s: UDP mgmt cmnd, no socket buffers available!n", 
  1140. card->devname);
  1141.              }
  1142.         }
  1143. card->u.f.udp_pkt_lgth = 0;
  1144. return 1;
  1145. }
  1146. /*==============================================================================
  1147.  * Send Inverse ARP Request
  1148.  */
  1149. int send_inarp_request(sdla_t *card, netdevice_t *dev)
  1150. {
  1151. int err=0;
  1152. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1153. arphdr_1490_t *ArpPacket;
  1154. arphdr_fr_t *arphdr;
  1155. fr_channel_t *chan = dev->priv;
  1156. struct in_device *in_dev;
  1157. in_dev = dev->ip_ptr;
  1158. if(in_dev != NULL ) {
  1159. ArpPacket = kmalloc(sizeof(arphdr_1490_t) + sizeof(arphdr_fr_t), GFP_ATOMIC);
  1160. /* SNAP Header indicating ARP */
  1161. ArpPacket->control = 0x03;
  1162. ArpPacket->pad = 0x00;
  1163. ArpPacket->NLPID = 0x80;
  1164. ArpPacket->OUI[0] = 0;
  1165. ArpPacket->OUI[1] = 0;
  1166. ArpPacket->OUI[2] = 0;
  1167. ArpPacket->PID = 0x0608;
  1168. arphdr = (arphdr_fr_t *)(ArpPacket + 1); // Go to ARP Packet
  1169. /* InARP request */
  1170. arphdr->ar_hrd = 0x0F00; /* Frame Relay HW type */
  1171. arphdr->ar_pro = 0x0008; /* IP Protocol        */
  1172. arphdr->ar_hln = 2; /* HW addr length      */
  1173. arphdr->ar_pln = 4; /* IP addr length      */
  1174. arphdr->ar_op = htons(0x08); /* InARP Request       */
  1175. arphdr->ar_sha = 0;  /* src HW DLCI - Doesn't matter */
  1176. if(in_dev->ifa_list != NULL)
  1177. arphdr->ar_sip = in_dev->ifa_list->ifa_local;  /* Local Address       */else
  1178. arphdr->ar_sip = 0;
  1179. arphdr->ar_tha = 0;  /* dst HW DLCI - Doesn't matter */
  1180. arphdr->ar_tip = 0; /* Remote Address -- what we want */
  1181. err = fr_send(card, chan->dlci, 0, sizeof(arphdr_1490_t) + sizeof(arphdr_fr_t),
  1182.     (void *)ArpPacket);
  1183. if (!err){
  1184. printk(KERN_INFO "n%s: Sending InARP request on DLCI %d.n", 
  1185. card->devname, chan->dlci);
  1186. clear_bit(ARP_CRIT,&card->wandev.critical);
  1187. }
  1188. kfree(ArpPacket);
  1189. }else{
  1190. printk(KERN_INFO "%s: INARP ERROR: %s doesn't have a local IP address!n",
  1191. card->devname,dev->name);
  1192. return 1;
  1193. }
  1194. #else
  1195.         arphdr_1490_t *ArpPacket;
  1196.         arphdr_fr_t *arphdr;
  1197.         fr_channel_t *chan = dev->priv;
  1198.         ArpPacket = kmalloc(sizeof(arphdr_1490_t) + sizeof(arphdr_fr_t), GFP_ATOMIC);
  1199.         /* SNAP Header indicating ARP */
  1200.         ArpPacket->control      = 0x03;
  1201.         ArpPacket->pad          = 0x00;
  1202.         ArpPacket->NLPID        = 0x80;
  1203.         ArpPacket->OUI[0]       = 0;
  1204.         ArpPacket->OUI[1]       = 0;
  1205.         ArpPacket->OUI[2]       = 0;
  1206.         ArpPacket->PID          = 0x0608;
  1207.         arphdr = (arphdr_fr_t *)(ArpPacket + 1); // Go to ARP Packet
  1208.        /* InARP request */
  1209.         arphdr->ar_hrd = 0x0F00;        /* Frame Relay HW type */
  1210.         arphdr->ar_pro = 0x0008;        /* IP Protocol         */
  1211.         arphdr->ar_hln = 2;             /* HW addr length      */
  1212.         arphdr->ar_pln = 4;             /* IP addr length      */
  1213.         arphdr->ar_op = htons(0x08);    /* InARP Request       */
  1214.         arphdr->ar_sha = 0;             /* src HW DLCI - Doesn't matter */
  1215.         arphdr->ar_sip = dev->pa_addr;  /* Local Address       */
  1216.         arphdr->ar_tha = 0;             /* dst HW DLCI - Doesn't matter */
  1217.         arphdr->ar_tip = 0;             /* Remote Address -- what we want */
  1218.         printk(KERN_INFO "%s: Sending InARP request on DLCI %d.n", card->devname, chan->dlci);
  1219.         err = fr_send(card, chan->dlci, 0,
  1220.                    sizeof(arphdr_1490_t) + sizeof(arphdr_fr_t),
  1221.                    (void *)ArpPacket);
  1222. if (!err){
  1223.           printk(KERN_INFO "n%s: Sending InARP request on DLCI %d.n",
  1224.                         card->devname, chan->dlci);
  1225.                 clear_bit(ARP_CRIT,&card->wandev.critical);
  1226.         }
  1227.         kfree(ArpPacket);
  1228. #endif
  1229. return 0;
  1230. }
  1231. /*==============================================================================
  1232.  * Check packet for ARP Type
  1233.  */
  1234. int is_arp(void *buf)
  1235. {
  1236. arphdr_1490_t *arphdr = (arphdr_1490_t *)buf;
  1237. if (arphdr->pad   == 0x00  &&
  1238.     arphdr->NLPID == 0x80  &&
  1239.     arphdr->PID   == 0x0608) 
  1240. return 1;
  1241. else return 0;
  1242. }
  1243. /*==============================================================================
  1244.  * Process ARP Packet Type
  1245.  */
  1246. int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, netdevice_t* dev)
  1247. {
  1248. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1249. arphdr_fr_t *arphdr = (arphdr_fr_t *)(ArpPacket + 1); /* Skip header */
  1250. fr_rx_buf_ctl_t* frbuf = card->rxmb;
  1251. struct in_device *in_dev;
  1252. fr_channel_t *chan = dev->priv;
  1253. #else
  1254.    arphdr_fr_t *arphdr = (arphdr_fr_t *)(ArpPacket + 1); /* Skip header */
  1255.         fr_rx_buf_ctl_t* frbuf = card->rxmb;
  1256. #endif
  1257. /* Before we transmit ARP packet, we must check 
  1258.  * to see that we are not currently transmitting a 
  1259.  * frame (in 'if_send()') and that we are not 
  1260.  * already in a 'delayed transmit' state. */
  1261. if (check_tx_status(card,dev)){
  1262. if (net_ratelimit()){ 
  1263. printk(KERN_INFO "%s: Disabling comminication to process ARPn",
  1264. card->devname);
  1265. }
  1266. set_bit(ARP_CRIT,&card->wandev.critical);
  1267. return 0;
  1268. }
  1269. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1270. in_dev = dev->ip_ptr;
  1271. /* Check that IP addresses exist for our network address */
  1272. if (in_dev == NULL || in_dev->ifa_list == NULL) 
  1273. return -1;
  1274. switch (ntohs(arphdr->ar_op)) {
  1275. case 0x08:  // Inverse ARP request  -- Send Reply, add route.
  1276. /* Check for valid Address */
  1277. printk(KERN_INFO "%s: Recvd PtP addr -InArp Req: %sn", 
  1278. card->devname, in_ntoa(arphdr->ar_sip));
  1279. /* Check that the network address is the same as ours, only
  1280.                  * if the netowrk mask is not 255.255.255.255. Otherwise
  1281.                  * this check would not make sense */
  1282. if (in_dev->ifa_list->ifa_mask != 0xFFFFFFFF && 
  1283.     (in_dev->ifa_list->ifa_mask & arphdr->ar_sip) != 
  1284.     (in_dev->ifa_list->ifa_mask & in_dev->ifa_list->ifa_local)){
  1285. printk(KERN_INFO 
  1286. "%s: Invalid PtP address. %s  InARP ignored.n", 
  1287. card->devname,in_ntoa(arphdr->ar_sip));
  1288. printk(KERN_INFO "%s: mask %sn", 
  1289. card->devname, in_ntoa(in_dev->ifa_list->ifa_mask));
  1290. printk(KERN_INFO "%s: local %sn", 
  1291. card->devname,in_ntoa(in_dev->ifa_list->ifa_local));
  1292. return -1;
  1293. }
  1294. if (in_dev->ifa_list->ifa_local == arphdr->ar_sip){
  1295. printk(KERN_INFO 
  1296. "%s: Local addr = PtP addr.  InARP ignored.n", 
  1297. card->devname);
  1298. return -1;
  1299. }
  1300. arphdr->ar_op = htons(0x09); /* InARP Reply */
  1301. /* Set addresses */
  1302. arphdr->ar_tip = arphdr->ar_sip;
  1303. arphdr->ar_sip = in_dev->ifa_list->ifa_local;
  1304. chan->ip_local = in_dev->ifa_list->ifa_local;
  1305. chan->ip_remote = arphdr->ar_sip;
  1306. fr_send(card, frbuf->dlci, 0, frbuf->length, (void *)ArpPacket);
  1307. if (test_bit(ARP_CRIT,&card->wandev.critical)){
  1308. if (net_ratelimit()){ 
  1309. printk(KERN_INFO "%s: ARP Processed Enabling Communication!n",
  1310. card->devname);
  1311. }
  1312. }
  1313. clear_bit(ARP_CRIT,&card->wandev.critical);
  1314. chan->ip_local = in_dev->ifa_list->ifa_local;
  1315. chan->ip_remote = arphdr->ar_sip;
  1316. /* Add Route Flag */
  1317. /* The route will be added in the polling routine so
  1318.    that it is not interrupt context. */
  1319. chan->route_flag = ADD_ROUTE;
  1320. trigger_fr_poll (dev);
  1321. break;
  1322. case 0x09:  // Inverse ARP reply
  1323. /* Check for valid Address */
  1324. printk(KERN_INFO "%s: Recvd PtP addr %s -InArp Replyn", 
  1325. card->devname, in_ntoa(arphdr->ar_sip));
  1326. /* Compare network addresses, only if network mask
  1327.                  * is not 255.255.255.255  It would not make sense
  1328.                  * to perform this test if the mask was all 1's */
  1329. if (in_dev->ifa_list->ifa_mask != 0xffffffff &&
  1330.     (in_dev->ifa_list->ifa_mask & arphdr->ar_sip) != 
  1331. (in_dev->ifa_list->ifa_mask & in_dev->ifa_list->ifa_local)) {
  1332. printk(KERN_INFO "%s: Invalid PtP address.  InARP ignored.n", 
  1333. card->devname);
  1334. return -1;
  1335. }
  1336. /* Make sure that the received IP address is not
  1337.                  * the same as our own local address */
  1338. if (in_dev->ifa_list->ifa_local == arphdr->ar_sip) {
  1339. printk(KERN_INFO "%s: Local addr = PtP addr.  InARP ignored.n", 
  1340. card->devname);
  1341. return -1;
  1342. }
  1343. chan->ip_local  = in_dev->ifa_list->ifa_local;
  1344. chan->ip_remote = arphdr->ar_sip;
  1345. /* Add Route Flag */
  1346. /* The route will be added in the polling routine so
  1347.    that it is not interrupt context. */
  1348. chan->route_flag = ADD_ROUTE;
  1349. chan->inarp = INARP_CONFIGURED;
  1350. trigger_fr_poll(dev);
  1351. break;
  1352. default:
  1353. break; // ARP's and RARP's -- Shouldn't happen.
  1354. }
  1355. return 0;
  1356. #else
  1357.         switch (ntohs(arphdr->ar_op)) {
  1358.                 case 0x08:  // Inverse ARP request  -- Send Reply, add route.
  1359.                         /* Check for valid Address */
  1360.                         printk(KERN_INFO "%s: Recvd PtP addr %s -InArp Reqn", 
  1361. ((fr_channel_t *)dev->priv)->name, in_ntoa(arphdr->ar_sip));
  1362. if (dev->pa_mask != 0xFFFFFFFF){
  1363.                         if ((dev->pa_mask & arphdr->ar_sip) != (dev->pa_mask & dev->pa_addr)) {
  1364.                                  printk(KERN_INFO "%s: Invalid PtP address.  InARP ignored.n", 
  1365. card->devname);
  1366.                                  return -1;
  1367.                          }
  1368. }
  1369.                         if (dev->pa_addr == arphdr->ar_sip) {
  1370.                                 printk(KERN_INFO "%s: Local addr = PtP addr.  InARP ignored.n", 
  1371. card->devname);
  1372.                                 return -1;
  1373.                         }
  1374.                         arphdr->ar_op = htons(0x09);    /* InARP Reply */
  1375.                         /* Set addresses */
  1376.                         arphdr->ar_tip = arphdr->ar_sip;
  1377.                         arphdr->ar_sip = dev->pa_addr;
  1378.                         fr_send(card, frbuf->dlci, 0, frbuf->length, (void *)ArpPacket);
  1379. clear_bit(ARP_CRIT,&card->wandev.critical);
  1380.                         /* Modify Point-to-Point Address */
  1381.                         dev->pa_dstaddr = arphdr->ar_tip;
  1382.                         /* Add Route Flag */
  1383.                         /* The route will be added in the polling routine so
  1384.                            that it is not interrupt context. */
  1385.                         ((fr_channel_t *) dev->priv)->route_flag = ADD_ROUTE;
  1386. trigger_fr_poll(dev);
  1387.                         break;
  1388.                 case 0x09:  // Inverse ARP reply
  1389.                         /* Check for valid Address */
  1390.                         printk(KERN_INFO "%s: Recvd PtP addr %s -InArp Replyn", 
  1391. ((fr_channel_t *)dev->priv)->name, in_ntoa(arphdr->ar_sip));
  1392.                         if ((dev->pa_mask & arphdr->ar_sip) != (dev->pa_mask & dev->pa_addr)) {
  1393.                                 printk(KERN_INFO "%s: Invalid PtP address.  InARP ignored.n", 
  1394. card->devname);
  1395.                                 return -1;
  1396.                         }
  1397.                         if (dev->pa_addr == arphdr->ar_sip) {
  1398.                                 printk(KERN_INFO "%s: Local addr = PtP addr.  InARP ignored.n", 
  1399. card->devname);
  1400.                                 return -1;
  1401.                         }
  1402.                         /* Modify Point-to-Point Address */
  1403.                         dev->pa_dstaddr = arphdr->ar_sip;
  1404.                         /* Add Route Flag */
  1405.                         /* The route will be added in the polling routine so
  1406.                            that it is not interrupt context. */
  1407.                         ((fr_channel_t *) dev->priv)->route_flag = ADD_ROUTE;
  1408.                         ((fr_channel_t *) dev->priv)->inarp = INARP_CONFIGURED;
  1409. trigger_fr_poll(dev);
  1410.                         break;
  1411.                 default:  // ARP's and RARP's -- Shouldn't happen.
  1412.         }
  1413.         return 0;
  1414. #endif
  1415. }
  1416. /*============================================================
  1417.  * trigger_fr_arp
  1418.  *
  1419.  * Description:
  1420.  *  Add an fr_arp() task into a arp
  1421.  *      timer handler for a specific dlci/interface.  
  1422.  *      This will kick the fr_arp() routine 
  1423.  *      within the specified time interval. 
  1424.  *
  1425.  * Usage:
  1426.  *  This timer is used to send ARP requests at
  1427.  *      certain time intervals. 
  1428.  *  Called by an interrupt to request an action
  1429.  *      at a later date.
  1430.  */
  1431. static void trigger_fr_arp (netdevice_t *dev)
  1432. {
  1433. fr_channel_t* chan = dev->priv;
  1434. del_timer(&chan->fr_arp_timer);
  1435. chan->fr_arp_timer.expires = jiffies + (chan->inarp_interval * HZ);
  1436. add_timer(&chan->fr_arp_timer);
  1437. return;
  1438. }
  1439. /*==============================================================================
  1440.  * ARP Request Action
  1441.  *
  1442.  * This funciton is called by timer interrupt to send an arp request
  1443.  *      to the remote end.
  1444.  */
  1445. static void fr_arp (unsigned long data)
  1446. {
  1447. netdevice_t *dev = (netdevice_t *)data;
  1448. fr_channel_t *chan = dev->priv;
  1449. volatile sdla_t *card = chan->card;
  1450. fr508_flags_t* flags = card->flags;
  1451. /* Send ARP packets for all devs' until
  1452.          * ARP state changes to CONFIGURED */
  1453. if (chan->inarp == INARP_REQUEST &&
  1454.     chan->common.state == WAN_CONNECTED && 
  1455.     card->wandev.state == WAN_CONNECTED){
  1456. set_bit(0,&chan->inarp_ready);
  1457. card->u.f.timer_int_enabled |= TMR_INT_ENABLED_ARP;
  1458. flags->imask |= FR_INTR_TIMER;
  1459. }
  1460.  
  1461. return;
  1462. }
  1463. /*==============================================================================
  1464.  * Perform the Interrupt Test by running the READ_CODE_VERSION command MAX_INTR_
  1465.  * TEST_COUNTER times.
  1466.  */
  1467. static int intr_test( sdla_t* card )
  1468. {
  1469. fr_mbox_t* mb = card->mbox;
  1470. int err,i;
  1471.         err = fr_set_intr_mode(card, FR_INTR_READY, card->wandev.mtu, 0 );
  1472. if (err == CMD_OK) {
  1473. for ( i = 0; i < MAX_INTR_TEST_COUNTER; i++ ) {
  1474.   /* Run command READ_CODE_VERSION */
  1475. mb->cmd.length  = 0;
  1476. mb->cmd.command = FR_READ_CODE_VERSION;
  1477. err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT;
  1478. if (err != CMD_OK) 
  1479. fr_event(card, err, mb);
  1480. }
  1481. } else {
  1482. return err;
  1483. }
  1484. err = fr_set_intr_mode( card, 0, card->wandev.mtu, 0 );
  1485. if( err != CMD_OK ) 
  1486. return err;
  1487. return 0;
  1488. }
  1489. /*==============================================================================
  1490.  * Determine what type of UDP call it is. FPIPE8ND ?
  1491.  */
  1492. static int udp_pkt_type( struct sk_buff *skb, sdla_t* card )
  1493. {
  1494. fr_udp_pkt_t *fr_udp_pkt = (fr_udp_pkt_t *)skb->data;
  1495. /* Quick HACK */
  1496.         if((fr_udp_pkt->ip_pkt.protocol == UDPMGMT_UDP_PROTOCOL) &&
  1497. (fr_udp_pkt->ip_pkt.ver_inet_hdr_length == 0x45) &&
  1498. (fr_udp_pkt->udp_pkt.udp_dst_port == 
  1499. ntohs(card->wandev.udp_port)) &&
  1500. (fr_udp_pkt->wp_mgmt.request_reply == 
  1501. UDPMGMT_REQUEST)) {
  1502.                         if(!strncmp(fr_udp_pkt->wp_mgmt.signature,
  1503.                                 UDPMGMT_FPIPE_SIGNATURE, 8)){
  1504.                                 return UDP_FPIPE_TYPE;
  1505. }
  1506. }
  1507.         return UDP_INVALID_TYPE;
  1508. }
  1509. /*==============================================================================
  1510.  * Initializes the Statistics values in the fr_channel structure.
  1511.  */
  1512. void init_chan_statistics( fr_channel_t* chan)
  1513. {
  1514.         memset(&chan->drvstats_if_send.if_send_entry, 0,
  1515. sizeof(if_send_stat_t));
  1516.         memset(&chan->drvstats_rx_intr.rx_intr_no_socket, 0,
  1517.                 sizeof(rx_intr_stat_t));
  1518.         memset(&chan->drvstats_gen.UDP_PIPE_mgmt_kmalloc_err, 0,
  1519.                 sizeof(pipe_mgmt_stat_t));
  1520. }
  1521. /*==============================================================================
  1522.  * Initializes the Statistics values in the Sdla_t structure.
  1523.  */
  1524. void init_global_statistics( sdla_t* card )
  1525. {
  1526. /* Intialize global statistics for a card */
  1527.         memset(&card->statistics.isr_entry, 0, sizeof(global_stats_t));
  1528. }
  1529. static void read_DLCI_IB_mapping( sdla_t* card, fr_channel_t* chan )
  1530. {
  1531. fr_mbox_t* mbox = card->mbox;
  1532. int retry = MAX_CMD_RETRY;
  1533. dlci_IB_mapping_t* result; 
  1534. int err, counter, found;
  1535. do {
  1536. mbox->cmd.command = FR_READ_DLCI_IB_MAPPING;
  1537. mbox->cmd.length = 0;
  1538. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  1539. } while (err && retry-- && fr_event(card, err, mbox));
  1540. if( mbox->cmd.result != 0){
  1541. printk(KERN_INFO "%s: Read DLCI IB Mapping failedn", 
  1542. chan->name);
  1543. }
  1544. counter = mbox->cmd.length / sizeof(dlci_IB_mapping_t);
  1545. result = (void *)mbox->data;
  1546. found = 0;
  1547. for (; counter; --counter, ++result) {
  1548. if ( result->dlci == chan->dlci ) {
  1549. chan->IB_addr = result->addr_value;
  1550. if(card->hw.type == SDLA_S514){
  1551.               chan->dlci_int_interface =
  1552. (void*)(card->hw.dpmbase +
  1553. chan->IB_addr);
  1554.         }else{ 
  1555. chan->dlci_int_interface = 
  1556. (void*)(card->hw.dpmbase + 
  1557. (chan->IB_addr & 0x00001FFF));
  1558. }
  1559. found = 1;
  1560. break;
  1561. }
  1562. if (!found)
  1563. printk( KERN_INFO "%s: DLCI %d not found by IB MAPPING cmdn", 
  1564. card->devname, chan->dlci);
  1565. }
  1566. void s508_s514_lock(sdla_t *card, unsigned long *smp_flags)
  1567. {
  1568. if (card->hw.type != SDLA_S514){
  1569. #if defined(__SMP__) || defined(LINUX_2_4)
  1570. spin_lock_irqsave(&card->wandev.lock, *smp_flags);
  1571. #else
  1572.            disable_irq(card->hw.irq);
  1573. #endif
  1574. }else{
  1575. #if defined(__SMP__) || defined(LINUX_2_4)
  1576. spin_lock(&card->u.f.if_send_lock);
  1577. #endif
  1578. }
  1579. return;
  1580. }
  1581. void s508_s514_unlock(sdla_t *card, unsigned long *smp_flags)
  1582. {
  1583. if (card->hw.type != SDLA_S514){
  1584. #if defined(__SMP__) || defined(LINUX_2_4)
  1585. spin_unlock_irqrestore (&card->wandev.lock, *smp_flags);
  1586. #else
  1587.            enable_irq(card->hw.irq);
  1588. #endif
  1589. }else{
  1590. #if defined(__SMP__) || defined(LINUX_2_4)
  1591. spin_unlock(&card->u.f.if_send_lock);
  1592. #endif
  1593. }
  1594. return;
  1595. }
  1596. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  1597. /*----------------------------------------------------------------------
  1598.                   RECEIVE INTERRUPT: BOTTOM HALF HANDLERS 
  1599.  ----------------------------------------------------------------------*/
  1600. /*========================================================
  1601.  * bh_enqueue
  1602.  *
  1603.  * Description:
  1604.  * Insert a received packed into a circular
  1605.  *      rx queue.  This packed will be picked up 
  1606.  *      by fr_bh() and sent up the stack to the
  1607.  *      user.
  1608.  *       
  1609.  * Usage: 
  1610.  * This function is called by rx interrupt,
  1611.  *      in API mode.
  1612.  *
  1613.  */
  1614. static int bh_enqueue (netdevice_t *dev, struct sk_buff *skb)
  1615. {
  1616. /* Check for full */
  1617. fr_channel_t* chan = dev->priv;
  1618. sdla_t *card = chan->card;
  1619. if (atomic_read(&chan->bh_buff_used) == MAX_BH_BUFF){
  1620. ++card->wandev.stats.rx_dropped;
  1621. wan_dev_kfree_skb(skb, FREE_READ);
  1622. return 1; 
  1623. }
  1624. ((bh_data_t *)&chan->bh_head[chan->bh_write])->skb = skb;
  1625. if (chan->bh_write == (MAX_BH_BUFF-1)){
  1626. chan->bh_write=0;
  1627. }else{
  1628. ++chan->bh_write;
  1629. }
  1630. atomic_inc(&chan->bh_buff_used);
  1631. return 0;
  1632. }
  1633. /*========================================================
  1634.  * trigger_fr_bh
  1635.  *
  1636.  * Description:
  1637.  *  Kick the fr_bh() handler
  1638.  *
  1639.  * Usage:
  1640.  * rx interrupt calls this function during
  1641.  *      the API mode. 
  1642.  */
  1643. static void trigger_fr_bh (fr_channel_t *chan)
  1644. {
  1645. if (!test_and_set_bit(0,&chan->tq_working)){
  1646. wanpipe_queue_tq(&chan->common.wanpipe_task);
  1647. wanpipe_mark_bh();
  1648. }
  1649. }
  1650. /*========================================================
  1651.  * fr_bh
  1652.  *
  1653.  * Description:
  1654.  * Frame relay receive BH handler. 
  1655.  * Dequeue data from the BH circular 
  1656.  * buffer and pass it up the API sock.
  1657.  *       
  1658.  * Rationale: 
  1659.  * This fuction is used to offload the 
  1660.  * rx_interrupt during API operation mode.  
  1661.  * The fr_bh() function executes for each 
  1662.  * dlci/interface.  
  1663.  * 
  1664.  *      Once receive interrupt copies data from the
  1665.  *      card into an skb buffer, the skb buffer
  1666.  *   is appended to a circular BH buffer.
  1667.  *   Then the interrupt kicks fr_bh() to finish the
  1668.  *      job at a later time (no within the interrupt).
  1669.  *       
  1670.  * Usage:
  1671.  *  Interrupts use this to defer a taks to 
  1672.  *      a polling routine.
  1673.  *
  1674.  */
  1675. static void fr_bh (netdevice_t * dev)
  1676. {
  1677. fr_channel_t* chan = dev->priv;
  1678. sdla_t *card = chan->card;
  1679. struct sk_buff *skb;
  1680. if (atomic_read(&chan->bh_buff_used) == 0){
  1681. clear_bit(0, &chan->tq_working);
  1682. return;
  1683. }
  1684. while (atomic_read(&chan->bh_buff_used)){
  1685. if (chan->common.sk == NULL || chan->common.func == NULL){
  1686. clear_bit(0, &chan->tq_working);
  1687. return;
  1688. }
  1689. skb  = ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb;
  1690. if (skb != NULL){
  1691. if (chan->common.sk == NULL || chan->common.func == NULL){
  1692. ++card->wandev.stats.rx_dropped;
  1693. ++chan->ifstats.rx_dropped;
  1694. wan_dev_kfree_skb(skb, FREE_READ);
  1695. fr_bh_cleanup(dev);
  1696. continue;
  1697. }
  1698. if (chan->common.func(skb,dev,chan->common.sk) != 0){
  1699. /* Sock full cannot send, queue us for
  1700.                                  * another try */
  1701. atomic_set(&chan->common.receive_block,1);
  1702. return;
  1703. }else{
  1704. fr_bh_cleanup(dev);
  1705. }
  1706. }else{
  1707. fr_bh_cleanup(dev);
  1708. }
  1709. }
  1710. clear_bit(0, &chan->tq_working);
  1711. return;
  1712. }
  1713. static int fr_bh_cleanup (netdevice_t *dev)
  1714. {
  1715. fr_channel_t* chan = dev->priv;
  1716. ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb = NULL;
  1717. if (chan->bh_read == (MAX_BH_BUFF-1)){
  1718. chan->bh_read=0;
  1719. }else{
  1720. ++chan->bh_read;
  1721. }
  1722. atomic_dec(&chan->bh_buff_used);
  1723. return 0;
  1724. }
  1725. #endif
  1726. /*----------------------------------------------------------------------
  1727.                POLL BH HANDLERS AND KICK ROUTINES 
  1728.  ----------------------------------------------------------------------*/
  1729. /*============================================================
  1730.  * trigger_fr_poll
  1731.  *
  1732.  * Description:
  1733.  *  Add a fr_poll() task into a tq_scheduler bh handler
  1734.  *      for a specific dlci/interface.  This will kick
  1735.  *      the fr_poll() routine at a later time. 
  1736.  *
  1737.  * Usage:
  1738.  *  Interrupts use this to defer a taks to 
  1739.  *      a polling routine.
  1740.  *
  1741.  */
  1742. static void trigger_fr_poll (netdevice_t *dev)
  1743. {
  1744. fr_channel_t* chan = dev->priv;
  1745. #ifdef LINUX_2_4
  1746. schedule_task(&chan->fr_poll_task);
  1747. #else
  1748. queue_task(&chan->fr_poll_task, &tq_scheduler);
  1749. #endif
  1750. return;
  1751. }
  1752. /*============================================================
  1753.  * fr_poll
  1754.  *
  1755.  * Rationale:
  1756.  *  We cannot manipulate the routing tables, or
  1757.  *      ip addresses withing the interrupt. Therefore
  1758.  *      we must perform such actons outside an interrupt 
  1759.  *      at a later time. 
  1760.  *
  1761.  * Description:
  1762.  * Frame relay polling routine, responsible for 
  1763.  *      shutting down interfaces upon disconnect
  1764.  *      and adding/removing routes. 
  1765.  *      
  1766.  * Usage:        
  1767.  *  This function is executed for each frame relay
  1768.  *  dlci/interface through a tq_schedule bottom half.
  1769.  *      
  1770.  *      trigger_fr_poll() function is used to kick
  1771.  *      the fr_poll routine.  
  1772.  */
  1773. static void fr_poll (netdevice_t *dev)
  1774. {
  1775. fr_channel_t* chan;
  1776. sdla_t *card;
  1777. u8 check_gateway=0;
  1778. if (!dev || (chan = dev->priv) == NULL)
  1779. return;
  1780. card = chan->card;
  1781. /* (Re)Configuraiton is in progress, stop what you are 
  1782.  * doing and get out */
  1783. if (test_bit(PERI_CRIT,&card->wandev.critical)){
  1784. return;
  1785. }
  1786. switch (chan->common.state){
  1787. case WAN_DISCONNECTED:
  1788. if (test_bit(DYN_OPT_ON,&chan->interface_down) &&
  1789.     !test_bit(DEV_DOWN, &chan->interface_down) &&
  1790.     dev->flags&IFF_UP){
  1791. printk(KERN_INFO "%s: Interface %s is Down.n", 
  1792. card->devname,dev->name);
  1793. change_dev_flags(dev,dev->flags&~IFF_UP);
  1794. set_bit(DEV_DOWN, &chan->interface_down);
  1795. chan->route_flag = NO_ROUTE;
  1796. }else{
  1797. if (chan->inarp != INARP_NONE)
  1798. process_route(dev);
  1799. }
  1800. break;
  1801. case WAN_CONNECTED:
  1802. if (test_bit(DYN_OPT_ON,&chan->interface_down) &&
  1803.     test_bit(DEV_DOWN, &chan->interface_down) &&
  1804.     !(dev->flags&IFF_UP)){
  1805. printk(KERN_INFO "%s: Interface %s is Up.n", 
  1806. card->devname,dev->name);
  1807. change_dev_flags(dev,dev->flags|IFF_UP);
  1808. clear_bit(DEV_DOWN, &chan->interface_down);
  1809. check_gateway=1;
  1810. }
  1811. if (chan->inarp != INARP_NONE){
  1812. process_route(dev);
  1813. check_gateway=1;
  1814. }
  1815. if (chan->gateway && check_gateway)
  1816. add_gateway(card,dev);
  1817. break;
  1818. }
  1819. return;
  1820. }
  1821. /*==============================================================
  1822.  * check_tx_status
  1823.  *
  1824.  * Rationale:
  1825.  * We cannot transmit from an interrupt while
  1826.  *      the if_send is transmitting data.  Therefore,
  1827.  *      we must check whether the tx buffers are
  1828.  *      begin used, before we transmit from an
  1829.  *      interrupt.
  1830.  * 
  1831.  * Description:
  1832.  * Checks whether it's safe to use the transmit 
  1833.  *      buffers. 
  1834.  *
  1835.  * Usage:
  1836.  *  ARP and UDP handling routines use this function
  1837.  *      because, they need to transmit data during
  1838.  *      an interrupt.
  1839.  */
  1840. static int check_tx_status(sdla_t *card, netdevice_t *dev)
  1841. {
  1842. if (card->hw.type == SDLA_S514){
  1843. if (test_bit(SEND_CRIT, (void*)&card->wandev.critical) ||
  1844. test_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical)) {
  1845. return 1;
  1846. }
  1847. }
  1848. if (is_queue_stopped(dev) || (card->u.f.tx_interrupts_pending))
  1849.       return 1; 
  1850. return 0;
  1851. }
  1852. /*===============================================================
  1853.  * move_dev_to_next
  1854.  *  
  1855.  * Description:
  1856.  * Move the dev pointer to the next location in the
  1857.  *      link list.  Check if we are at the end of the 
  1858.  *      list, if so start from the begining.
  1859.  *
  1860.  * Usage:
  1861.  *  Timer interrupt uses this function to efficiently
  1862.  *      step through the devices that need to send ARP data.
  1863.  *
  1864.  */
  1865. netdevice_t * move_dev_to_next (sdla_t *card, netdevice_t *dev)
  1866. {
  1867. if (card->wandev.new_if_cnt != 1){
  1868. if (*((netdevice_t **)dev->priv) == NULL){
  1869. return card->wandev.dev;
  1870. }else{
  1871. return *((netdevice_t **)dev->priv);
  1872. }
  1873. }
  1874. return dev;
  1875. }
  1876. /*==============================================================
  1877.  * trigger_config_fr
  1878.  *
  1879.  * Rationale:
  1880.  * All commands must be performed inside of a  
  1881.  *      interrupt.   
  1882.  *
  1883.  * Description:
  1884.  * Kick the config_fr() routine throught the
  1885.  *      timer interrupt.
  1886.  */
  1887. static void trigger_config_fr (sdla_t *card)
  1888. {
  1889. fr508_flags_t* flags = card->flags;
  1890. card->u.f.timer_int_enabled |= TMR_INT_ENABLED_CONFIG;
  1891. flags->imask |= FR_INTR_TIMER;
  1892. }
  1893. /*==============================================================
  1894.  * config_fr
  1895.  *
  1896.  * Rationale:
  1897.  *  All commands must be performed inside of a  
  1898.  *      interrupt.  
  1899.  &
  1900.  * Description:
  1901.  *  Configure a DLCI. This function is executed
  1902.  *      by a timer_interrupt.  The if_open() function
  1903.  *      triggers it.
  1904.  *
  1905.  * Usage:
  1906.  * new_if() collects all data necessary to
  1907.  *      configure the DLCI. It sets the chan->dlci_ready 
  1908.  *      bit.  When the if_open() function is executed
  1909.  *      it checks this bit, and if its set it triggers
  1910.  *      the timer interrupt to execute the config_fr()
  1911.  *      function.
  1912.  */
  1913. static void config_fr (sdla_t *card)
  1914. {
  1915. netdevice_t *dev;
  1916. fr_channel_t *chan;
  1917. for (dev=card->wandev.dev; dev; dev=*((netdevice_t **)dev->priv)){
  1918. if ((chan=dev->priv) == NULL)
  1919. continue;
  1920. if (!test_bit(0,&chan->config_dlci))
  1921. continue;
  1922. clear_bit(0,&chan->config_dlci);
  1923. /* If signalling is set to NO, then setup 
  1924.           * DLCI addresses right away.  Don't have to wait for
  1925.  * link to connect. 
  1926.  */
  1927. if (card->wandev.signalling == WANOPT_NO){
  1928. printk(KERN_INFO "%s: Signalling set to NO: Mapping DLCI'sn",
  1929. card->wandev.name);
  1930. if (fr_init_dlci(card,chan)){
  1931. printk(KERN_INFO "%s: ERROR: Failed to configure DLCI %i !n",
  1932. card->devname, chan->dlci);
  1933. return;
  1934. }
  1935. }
  1936. if (card->wandev.station == WANOPT_CPE) {
  1937. update_chan_state(dev);
  1938. /* CPE: issue full status enquiry */
  1939. fr_issue_isf(card, FR_ISF_FSE);
  1940. } else {
  1941. /* FR switch: activate DLCI(s) */
  1942. /* For Switch emulation we have to ADD and ACTIVATE
  1943.  * the DLCI(s) that were configured with the SET_DLCI_
  1944.  * CONFIGURATION command. Add and Activate will fail if
  1945.  * DLCI specified is not included in the list.
  1946.  *
  1947.  * Also If_open is called once for each interface. But
  1948.  * it does not get in here for all the interface. So
  1949.    * we have to pass the entire list of DLCI(s) to add 
  1950.  * activate routines.  
  1951.  */ 
  1952. if (!check_dlci_config (card, chan)){
  1953. fr_add_dlci(card, chan->dlci);
  1954. fr_activate_dlci(card, chan->dlci);
  1955. }
  1956. }
  1957. card->u.f.dlci_to_dev_map[chan->dlci] = dev;
  1958. }
  1959. return;
  1960. }
  1961. /*==============================================================
  1962.  * config_fr
  1963.  *
  1964.  * Rationale:
  1965.  * All commands must be executed during an interrupt.
  1966.  * 
  1967.  * Description:
  1968.  * Trigger uncofig_fr() function through 
  1969.  *      the timer interrupt.
  1970.  *
  1971.  */
  1972. static void trigger_unconfig_fr (netdevice_t *dev)
  1973. {
  1974. fr_channel_t *chan = dev->priv;
  1975. volatile sdla_t *card = chan->card;
  1976. u32 timeout;
  1977. fr508_flags_t* flags = card->flags;
  1978. int reset_critical=0;
  1979. if (test_bit(PERI_CRIT,(void*)&card->wandev.critical)){
  1980. clear_bit(PERI_CRIT,(void*)&card->wandev.critical);
  1981. reset_critical=1;
  1982. }
  1983. /* run unconfig_dlci() function 
  1984.          * throught the timer interrupt */
  1985. set_bit(0,(void*)&chan->unconfig_dlci);
  1986. card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UNCONFIG;
  1987. flags->imask |= FR_INTR_TIMER;
  1988. /* Wait for the command to complete */
  1989. timeout = jiffies;
  1990.       for(;;) {
  1991. if(!(card->u.f.timer_int_enabled & TMR_INT_ENABLED_UNCONFIG))
  1992. break;
  1993.               if ((jiffies - timeout) > (1 * HZ)){
  1994.      card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UNCONFIG;
  1995. printk(KERN_INFO "%s: Failed to delete DLCI %in",
  1996. card->devname,chan->dlci);
  1997.   break;
  1998. }
  1999. }
  2000. if (reset_critical){
  2001. set_bit(PERI_CRIT,(void*)&card->wandev.critical);
  2002. }
  2003. }
  2004. /*==============================================================
  2005.  * unconfig_fr
  2006.  *
  2007.  * Rationale:
  2008.  * All commands must be executed during an interrupt.
  2009.  * 
  2010.  * Description:
  2011.  * Remove the dlci from firmware.
  2012.  * This funciton is used in NODE shutdown.
  2013.  */
  2014. static void unconfig_fr (sdla_t *card)
  2015. {
  2016. netdevice_t *dev;
  2017. fr_channel_t *chan;
  2018. for (dev=card->wandev.dev; dev; dev=*((netdevice_t **)dev->priv)){
  2019. if ((chan=dev->priv) == NULL)
  2020. continue;
  2021. if (!test_bit(0,&chan->unconfig_dlci))
  2022. continue;
  2023. clear_bit(0,&chan->unconfig_dlci);
  2024. if (card->wandev.station == WANOPT_NODE){
  2025. printk(KERN_INFO "%s: Unconfiguring DLCI %in",
  2026. card->devname,chan->dlci);
  2027. fr_delete_dlci(card,chan->dlci);
  2028. }
  2029. card->u.f.dlci_to_dev_map[chan->dlci] = NULL;
  2030. }
  2031. }
  2032. static int setup_fr_header(struct sk_buff ** skb_orig, netdevice_t* dev, char op_mode)
  2033. {
  2034. struct sk_buff *skb = *skb_orig;
  2035. fr_channel_t *chan=dev->priv;
  2036. if (op_mode == WANPIPE){
  2037. chan->fr_header[0]=Q922_UI;
  2038. switch (htons(skb->protocol)){
  2039. case ETH_P_IP:
  2040. chan->fr_header[1]=NLPID_IP;
  2041. break;
  2042. default:
  2043. return -EINVAL;
  2044. }
  2045. return 2;
  2046. }
  2047. /* If we are in bridging mode, we must apply
  2048.  * an Ethernet header */
  2049. if (op_mode == BRIDGE || op_mode == BRIDGE_NODE){
  2050. #if defined(LINUX_2_1) || defined(LINUX_2_4)
  2051. /* Encapsulate the packet as a bridged Ethernet frame. */
  2052. #ifdef DEBUG
  2053. printk(KERN_INFO "%s: encapsulating skb for frame relayn", 
  2054. dev->name);
  2055. #endif
  2056. chan->fr_header[0] = 0x03;
  2057. chan->fr_header[1] = 0x00;
  2058. chan->fr_header[2] = 0x80;
  2059. chan->fr_header[3] = 0x00;
  2060. chan->fr_header[4] = 0x80;
  2061. chan->fr_header[5] = 0xC2;
  2062. chan->fr_header[6] = 0x00;
  2063. chan->fr_header[7] = 0x07;
  2064. /* Yuck. */
  2065. skb->protocol = ETH_P_802_3;
  2066. return 8;
  2067. #else
  2068. /* BRIDGING is not supported in 2.0.X */
  2069. return -EINVAL;
  2070. #endif
  2071. }
  2072. return 0;
  2073. }
  2074. static int check_dlci_config (sdla_t *card, fr_channel_t *chan)
  2075. {
  2076. fr_mbox_t* mbox = card->mbox;
  2077. int err=0;
  2078. fr_conf_t *conf=NULL;
  2079. unsigned short dlci_num = chan->dlci;
  2080. int dlci_offset=0;
  2081. netdevice_t *dev=NULL;
  2082. mbox->cmd.command = FR_READ_CONFIG;
  2083. mbox->cmd.length = 0;
  2084. mbox->cmd.dlci = dlci_num; 
  2085. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2086. if (err == CMD_OK){
  2087. return 0;
  2088. }
  2089. for (dev=card->wandev.dev; dev; dev=*((netdevice_t**)dev->priv)){
  2090. set_chan_state(dev,WAN_DISCONNECTED);
  2091. }
  2092. printk(KERN_INFO "DLCI %i Not configured, configuringn",dlci_num);
  2093. mbox->cmd.command = FR_COMM_DISABLE;
  2094. mbox->cmd.length = 0;
  2095. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2096. if (err != CMD_OK){
  2097. fr_event(card, err, mbox);
  2098. return 2;
  2099. }
  2100. printk(KERN_INFO "Disabled Communications n");
  2101. mbox->cmd.command = FR_READ_CONFIG;
  2102. mbox->cmd.length = 0;
  2103. mbox->cmd.dlci = 0; 
  2104. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2105. if (err != CMD_OK){
  2106. fr_event(card, err, mbox);
  2107. return 2;
  2108. }
  2109. conf = (fr_conf_t *)mbox->data;
  2110. dlci_offset=0;
  2111. for (dev=card->wandev.dev; dev; dev=*((netdevice_t**)dev->priv)){
  2112. fr_channel_t *chan_tmp = dev->priv;
  2113. conf->dlci[dlci_offset] = chan_tmp->dlci;
  2114. dlci_offset++;
  2115. }
  2116. printk(KERN_INFO "Got Fr configuration Buffer Length is %x Dlci %i Dlci Off %in",
  2117. mbox->cmd.length,
  2118. mbox->cmd.length > 0x20 ? conf->dlci[0] : -1, 
  2119. dlci_offset );
  2120. mbox->cmd.length = 0x20 + dlci_offset*2;
  2121. mbox->cmd.command = FR_SET_CONFIG;
  2122. mbox->cmd.dlci = 0; 
  2123. err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT;
  2124. if (err != CMD_OK){
  2125. fr_event(card, err, mbox);
  2126. return 2;
  2127. }
  2128. initialize_rx_tx_buffers (card);
  2129. printk(KERN_INFO "Configuraiton Succeded for new DLCI %in",dlci_num);
  2130. if (fr_comm_enable (card)){
  2131. return 2;
  2132. }
  2133. printk(KERN_INFO "Enabling Communications n");
  2134. for (dev=card->wandev.dev; dev; dev=*((netdevice_t**)dev->priv)){
  2135. fr_channel_t *chan_tmp = dev->priv;
  2136. fr_init_dlci(card,chan_tmp);
  2137. fr_add_dlci(card, chan_tmp->dlci);
  2138. fr_activate_dlci(card, chan_tmp->dlci);
  2139. }
  2140. printk(KERN_INFO "END OF CONFIGURAITON %in",dlci_num);
  2141. return 1;
  2142. }
  2143. static void initialize_rx_tx_buffers (sdla_t *card)
  2144. {
  2145. fr_buf_info_t* buf_info;
  2146. if (card->hw.type == SDLA_S514) {
  2147.                 buf_info = (void*)(card->hw.dpmbase + FR_MB_VECTOR +
  2148. FR508_RXBC_OFFS);
  2149.                 card->rxmb = (void*)(buf_info->rse_next + card->hw.dpmbase);
  2150.                 card->u.f.rxmb_base =
  2151.                         (void*)(buf_info->rse_base + card->hw.dpmbase); 
  2152.                 card->u.f.rxmb_last =
  2153.                         (void*)(buf_info->rse_base +
  2154.                         (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) +
  2155.                         card->hw.dpmbase);
  2156. }else{
  2157. buf_info = (void*)(card->hw.dpmbase + FR508_RXBC_OFFS);
  2158. card->rxmb = (void*)(buf_info->rse_next -
  2159. FR_MB_VECTOR + card->hw.dpmbase);
  2160. card->u.f.rxmb_base =
  2161. (void*)(buf_info->rse_base -
  2162. FR_MB_VECTOR + card->hw.dpmbase);
  2163. card->u.f.rxmb_last =
  2164. (void*)(buf_info->rse_base +
  2165. (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) -
  2166. FR_MB_VECTOR + card->hw.dpmbase);
  2167. }
  2168. card->u.f.rx_base = buf_info->buf_base;
  2169. card->u.f.rx_top  = buf_info->buf_top;
  2170. card->u.f.tx_interrupts_pending = 0;
  2171. return;
  2172. }
  2173. MODULE_LICENSE("GPL");
  2174. /****** End *****************************************************************/