sdla_fr.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:148k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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