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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * SDLA An implementation of a driver for the Sangoma S502/S508 series
  3.  * multi-protocol PC interface card.  Initial offering is with 
  4.  * the DLCI driver, providing Frame Relay support for linux.
  5.  *
  6.  * Global definitions for the Frame relay interface.
  7.  *
  8.  * Version: @(#)sdla.c   0.30 12 Sep 1996
  9.  *
  10.  * Credits: Sangoma Technologies, for the use of 2 cards for an extended
  11.  * period of time.
  12.  * David Mandelstam <dm@sangoma.com> for getting me started on 
  13.  * this project, and incentive to complete it.
  14.  * Gene Kozen <74604.152@compuserve.com> for providing me with
  15.  * important information about the cards.
  16.  *
  17.  * Author: Mike McLagan <mike.mclagan@linux.org>
  18.  *
  19.  * Changes:
  20.  * 0.15 Mike McLagan Improved error handling, packet dropping
  21.  * 0.20 Mike McLagan New transmit/receive flags for config
  22.  * If in FR mode, don't accept packets from
  23.  * non DLCI devices.
  24.  * 0.25 Mike McLagan Fixed problem with rejecting packets
  25.  * from non DLCI devices.
  26.  * 0.30 Mike McLagan Fixed kernel panic when used with modified
  27.  * ifconfig
  28.  *
  29.  * This program is free software; you can redistribute it and/or
  30.  * modify it under the terms of the GNU General Public License
  31.  * as published by the Free Software Foundation; either version
  32.  * 2 of the License, or (at your option) any later version.
  33.  */
  34. #include <linux/config.h> /* for CONFIG_DLCI_MAX */
  35. #include <linux/module.h>
  36. #include <linux/kernel.h>
  37. #include <linux/sched.h>
  38. #include <linux/types.h>
  39. #include <linux/fcntl.h>
  40. #include <linux/interrupt.h>
  41. #include <linux/ptrace.h>
  42. #include <linux/ioport.h>
  43. #include <linux/in.h>
  44. #include <linux/slab.h>
  45. #include <linux/string.h>
  46. #include <linux/timer.h>
  47. #include <linux/errno.h>
  48. #include <linux/init.h>
  49. #include <asm/system.h>
  50. #include <asm/bitops.h>
  51. #include <asm/io.h>
  52. #include <asm/dma.h>
  53. #include <asm/uaccess.h>
  54. #include <linux/netdevice.h>
  55. #include <linux/skbuff.h>
  56. #include <linux/if_arp.h>
  57. #include <linux/if_frad.h>
  58. #include <linux/sdla.h>
  59. static const char* version = "SDLA driver v0.30, 12 Sep 1996, mike.mclagan@linux.org";
  60. static const char* devname = "sdla";
  61. static unsigned int valid_port[] __initdata = { 0x250, 0x270, 0x280, 0x300, 0x350, 0x360, 0x380, 0x390};
  62. static unsigned int valid_mem[]  __initdata = {
  63.     0xA0000, 0xA2000, 0xA4000, 0xA6000, 0xA8000, 0xAA000, 0xAC000, 0xAE000, 
  64.                                     0xB0000, 0xB2000, 0xB4000, 0xB6000, 0xB8000, 0xBA000, 0xBC000, 0xBE000,
  65.                                     0xC0000, 0xC2000, 0xC4000, 0xC6000, 0xC8000, 0xCA000, 0xCC000, 0xCE000,
  66.                                     0xD0000, 0xD2000, 0xD4000, 0xD6000, 0xD8000, 0xDA000, 0xDC000, 0xDE000,
  67.                                     0xE0000, 0xE2000, 0xE4000, 0xE6000, 0xE8000, 0xEA000, 0xEC000, 0xEE000}; 
  68. /*********************************************************
  69.  *
  70.  * these are the core routines that access the card itself 
  71.  *
  72.  *********************************************************/
  73. #define SDLA_WINDOW(dev,addr) outb((((addr) >> 13) & 0x1F), (dev)->base_addr + SDLA_REG_Z80_WINDOW)
  74. static void sdla_read(struct net_device *dev, int addr, void *buf, short len)
  75. {
  76. unsigned long flags;
  77. char          *temp, *base;
  78. int           offset, bytes;
  79. temp = buf;
  80. while(len)
  81. {
  82. offset = addr & SDLA_ADDR_MASK;
  83. bytes = offset + len > SDLA_WINDOW_SIZE ? SDLA_WINDOW_SIZE - offset : len;
  84. base = (void *) (dev->mem_start + offset);
  85. save_flags(flags);
  86. cli();
  87. SDLA_WINDOW(dev, addr);
  88. memcpy(temp, base, bytes);
  89. restore_flags(flags);
  90. addr += bytes;
  91. temp += bytes;
  92. len  -= bytes;
  93. }  
  94. }
  95. static void sdla_write(struct net_device *dev, int addr, void *buf, short len)
  96. {
  97. unsigned long flags;
  98. char          *temp, *base;
  99. int           offset, bytes;
  100. temp = buf;
  101. while(len)
  102. {
  103. offset = addr & SDLA_ADDR_MASK;
  104. bytes = offset + len > SDLA_WINDOW_SIZE ? SDLA_WINDOW_SIZE - offset : len;
  105. base = (void *) (dev->mem_start + offset);
  106. save_flags(flags);
  107. cli();
  108. SDLA_WINDOW(dev, addr);
  109. memcpy(base, temp, bytes);
  110. restore_flags(flags);
  111. addr += bytes;
  112. temp += bytes;
  113. len  -= bytes;
  114. }
  115. }
  116. static void sdla_clear(struct net_device *dev)
  117. {
  118. unsigned long flags;
  119. char          *base;
  120. int           len, addr, bytes;
  121. len = 65536;
  122. addr = 0;
  123. bytes = SDLA_WINDOW_SIZE;
  124. base = (void *) dev->mem_start;
  125. save_flags(flags);
  126. cli();
  127. while(len)
  128. {
  129. SDLA_WINDOW(dev, addr);
  130. memset(base, 0, bytes);
  131. addr += bytes;
  132. len  -= bytes;
  133. }
  134. restore_flags(flags);
  135. }
  136. static char sdla_byte(struct net_device *dev, int addr)
  137. {
  138. unsigned long flags;
  139. char          byte, *temp;
  140. temp = (void *) (dev->mem_start + (addr & SDLA_ADDR_MASK));
  141. save_flags(flags);
  142. cli();
  143. SDLA_WINDOW(dev, addr);
  144. byte = *temp;
  145. restore_flags(flags);
  146. return(byte);
  147. }
  148. void sdla_stop(struct net_device *dev)
  149. {
  150. struct frad_local *flp;
  151. flp = dev->priv;
  152. switch(flp->type)
  153. {
  154. case SDLA_S502A:
  155. outb(SDLA_S502A_HALT, dev->base_addr + SDLA_REG_CONTROL);
  156. flp->state = SDLA_HALT;
  157. break;
  158. case SDLA_S502E:
  159. outb(SDLA_HALT, dev->base_addr + SDLA_REG_Z80_CONTROL);
  160. outb(SDLA_S502E_ENABLE, dev->base_addr + SDLA_REG_CONTROL);
  161. flp->state = SDLA_S502E_ENABLE;
  162. break;
  163. case SDLA_S507:
  164. flp->state &= ~SDLA_CPUEN;
  165. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  166. break;
  167. case SDLA_S508:
  168. flp->state &= ~SDLA_CPUEN;
  169. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  170. break;
  171. }
  172. }
  173. void sdla_start(struct net_device *dev)
  174. {
  175. struct frad_local *flp;
  176. flp = dev->priv;
  177. switch(flp->type)
  178. {
  179. case SDLA_S502A:
  180. outb(SDLA_S502A_NMI, dev->base_addr + SDLA_REG_CONTROL);
  181. outb(SDLA_S502A_START, dev->base_addr + SDLA_REG_CONTROL);
  182. flp->state = SDLA_S502A_START;
  183. break;
  184. case SDLA_S502E:
  185. outb(SDLA_S502E_CPUEN, dev->base_addr + SDLA_REG_Z80_CONTROL);
  186. outb(0x00, dev->base_addr + SDLA_REG_CONTROL);
  187. flp->state = 0;
  188. break;
  189. case SDLA_S507:
  190. flp->state |= SDLA_CPUEN;
  191. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  192. break;
  193. case SDLA_S508:
  194. flp->state |= SDLA_CPUEN;
  195. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  196. break;
  197. }
  198. }
  199. /****************************************************
  200.  *
  201.  * this is used for the S502A/E cards to determine
  202.  * the speed of the onboard CPU.  Calibration is
  203.  * necessary for the Frame Relay code uploaded 
  204.  * later.  Incorrect results cause timing problems
  205.  * with link checks & status messages
  206.  *
  207.  ***************************************************/
  208. int sdla_z80_poll(struct net_device *dev, int z80_addr, int jiffs, char resp1, char resp2)
  209. {
  210. unsigned long start, done, now;
  211. char          resp, *temp;
  212. start = now = jiffies;
  213. done = jiffies + jiffs;
  214. temp = (void *)dev->mem_start;
  215. temp += z80_addr & SDLA_ADDR_MASK;
  216. resp = ~resp1;
  217. while (time_before(jiffies, done) && (resp != resp1) && (!resp2 || (resp != resp2)))
  218. {
  219. if (jiffies != now)
  220. {
  221. SDLA_WINDOW(dev, z80_addr);
  222. now = jiffies;
  223. resp = *temp;
  224. }
  225. }
  226. return(time_before(jiffies, done) ? jiffies - start : -1);
  227. }
  228. /* constants for Z80 CPU speed */
  229. #define Z80_READY  '1' /* Z80 is ready to begin */
  230. #define LOADER_READY  '2' /* driver is ready to begin */
  231. #define Z80_SCC_OK  '3' /* SCC is on board */
  232. #define Z80_SCC_BAD   '4' /* SCC was not found */
  233. static int sdla_cpuspeed(struct net_device *dev, struct ifreq *ifr)
  234. {
  235. int  jiffs;
  236. char data;
  237. sdla_start(dev);
  238. if (sdla_z80_poll(dev, 0, 3*HZ, Z80_READY, 0) < 0)
  239. return(-EIO);
  240. data = LOADER_READY;
  241. sdla_write(dev, 0, &data, 1);
  242. if ((jiffs = sdla_z80_poll(dev, 0, 8*HZ, Z80_SCC_OK, Z80_SCC_BAD)) < 0)
  243. return(-EIO);
  244. sdla_stop(dev);
  245. sdla_read(dev, 0, &data, 1);
  246. if (data == Z80_SCC_BAD)
  247. {
  248. printk("%s: SCC badn", dev->name);
  249. return(-EIO);
  250. }
  251. if (data != Z80_SCC_OK)
  252. return(-EINVAL);
  253. if (jiffs < 165)
  254. ifr->ifr_mtu = SDLA_CPU_16M;
  255. else if (jiffs < 220)
  256. ifr->ifr_mtu = SDLA_CPU_10M;
  257. else if (jiffs < 258)
  258. ifr->ifr_mtu = SDLA_CPU_8M;
  259. else if (jiffs < 357)
  260. ifr->ifr_mtu = SDLA_CPU_7M;
  261. else if (jiffs < 467)
  262. ifr->ifr_mtu = SDLA_CPU_5M;
  263. else
  264. ifr->ifr_mtu = SDLA_CPU_3M;
  265.  
  266. return(0);
  267. }
  268. /************************************************
  269.  *
  270.  *  Direct interaction with the Frame Relay code 
  271.  *  starts here.
  272.  *
  273.  ************************************************/
  274. struct _dlci_stat 
  275. {
  276. short dlci __attribute__((packed));
  277. char  flags __attribute__((packed));
  278. };
  279. struct _frad_stat 
  280. {
  281. char    flags;
  282. struct _dlci_stat dlcis[SDLA_MAX_DLCI];
  283. };
  284. static void sdla_errors(struct net_device *dev, int cmd, int dlci, int ret, int len, void *data) 
  285. {
  286. struct _dlci_stat *pstatus;
  287. short             *pdlci;
  288. int               i;
  289. char              *state, line[30];
  290. switch (ret)
  291. {
  292. case SDLA_RET_MODEM:
  293. state = data;
  294. if (*state & SDLA_MODEM_DCD_LOW)
  295. printk(KERN_INFO "%s: Modem DCD unexpectedly low!n", dev->name);
  296. if (*state & SDLA_MODEM_CTS_LOW)
  297. printk(KERN_INFO "%s: Modem CTS unexpectedly low!n", dev->name);
  298. /* I should probably do something about this! */
  299. break;
  300. case SDLA_RET_CHANNEL_OFF:
  301. printk(KERN_INFO "%s: Channel became inoperative!n", dev->name);
  302. /* same here */
  303. break;
  304. case SDLA_RET_CHANNEL_ON:
  305. printk(KERN_INFO "%s: Channel became operative!n", dev->name);
  306. /* same here */
  307. break;
  308. case SDLA_RET_DLCI_STATUS:
  309. printk(KERN_INFO "%s: Status change reported by Access Node.n", dev->name);
  310. len /= sizeof(struct _dlci_stat);
  311. for(pstatus = data, i=0;i < len;i++,pstatus++)
  312. {
  313. if (pstatus->flags & SDLA_DLCI_NEW)
  314. state = "new";
  315. else if (pstatus->flags & SDLA_DLCI_DELETED)
  316. state = "deleted";
  317. else if (pstatus->flags & SDLA_DLCI_ACTIVE)
  318. state = "active";
  319. else
  320. {
  321. sprintf(line, "unknown status: %02X", pstatus->flags);
  322. state = line;
  323. }
  324. printk(KERN_INFO "%s: DLCI %i: %s.n", dev->name, pstatus->dlci, state);
  325. /* same here */
  326. }
  327. break;
  328. case SDLA_RET_DLCI_UNKNOWN:
  329. printk(KERN_INFO "%s: Received unknown DLCIs:", dev->name);
  330. len /= sizeof(short);
  331. for(pdlci = data,i=0;i < len;i++,pdlci++)
  332. printk(" %i", *pdlci);
  333. printk("n");
  334. break;
  335. case SDLA_RET_TIMEOUT:
  336. printk(KERN_ERR "%s: Command timed out!n", dev->name);
  337. break;
  338. case SDLA_RET_BUF_OVERSIZE:
  339. printk(KERN_INFO "%s: Bc/CIR overflow, acceptable size is %in", dev->name, len);
  340. break;
  341. case SDLA_RET_BUF_TOO_BIG:
  342. printk(KERN_INFO "%s: Buffer size over specified max of %in", dev->name, len);
  343. break;
  344. case SDLA_RET_CHANNEL_INACTIVE:
  345. case SDLA_RET_DLCI_INACTIVE:
  346. case SDLA_RET_CIR_OVERFLOW:
  347. case SDLA_RET_NO_BUFS:
  348. if (cmd == SDLA_INFORMATION_WRITE)
  349. break;
  350. default: 
  351. printk(KERN_DEBUG "%s: Cmd 0x%2.2X generated return code 0x%2.2Xn", dev->name, cmd, ret);
  352. /* Further processing could be done here */
  353. break;
  354. }
  355. }
  356. static int sdla_cmd(struct net_device *dev, int cmd, short dlci, short flags, 
  357.                         void *inbuf, short inlen, void *outbuf, short *outlen)
  358. {
  359. static struct _frad_stat status;
  360. struct frad_local        *flp;
  361. struct sdla_cmd          *cmd_buf;
  362. unsigned long            pflags;
  363. int                      jiffs, ret, waiting, len;
  364. long                     window;
  365. flp = dev->priv;
  366. window = flp->type == SDLA_S508 ? SDLA_508_CMD_BUF : SDLA_502_CMD_BUF;
  367. cmd_buf = (struct sdla_cmd *)(dev->mem_start + (window & SDLA_ADDR_MASK));
  368. ret = 0;
  369. len = 0;
  370. jiffs = jiffies + HZ;  /* 1 second is plenty */
  371. save_flags(pflags);
  372. cli();
  373. SDLA_WINDOW(dev, window);
  374. cmd_buf->cmd = cmd;
  375. cmd_buf->dlci = dlci;
  376. cmd_buf->flags = flags;
  377. if (inbuf)
  378. memcpy(cmd_buf->data, inbuf, inlen);
  379. cmd_buf->length = inlen;
  380. cmd_buf->opp_flag = 1;
  381. restore_flags(pflags);
  382. waiting = 1;
  383. len = 0;
  384. while (waiting && time_before_eq(jiffies, jiffs))
  385. {
  386. if (waiting++ % 3) 
  387. {
  388. save_flags(pflags);
  389. cli();
  390. SDLA_WINDOW(dev, window);
  391. waiting = ((volatile int)(cmd_buf->opp_flag));
  392. restore_flags(pflags);
  393. }
  394. }
  395. if (!waiting)
  396. {
  397. save_flags(pflags);
  398. cli();
  399. SDLA_WINDOW(dev, window);
  400. ret = cmd_buf->retval;
  401. len = cmd_buf->length;
  402. if (outbuf && outlen)
  403. {
  404. *outlen = *outlen >= len ? len : *outlen;
  405. if (*outlen)
  406. memcpy(outbuf, cmd_buf->data, *outlen);
  407. }
  408. /* This is a local copy that's used for error handling */
  409. if (ret)
  410. memcpy(&status, cmd_buf->data, len > sizeof(status) ? sizeof(status) : len);
  411. restore_flags(pflags);
  412. }
  413. else
  414. ret = SDLA_RET_TIMEOUT;
  415. if (ret != SDLA_RET_OK)
  416.     sdla_errors(dev, cmd, dlci, ret, len, &status);
  417. return(ret);
  418. }
  419. /***********************************************
  420.  *
  421.  * these functions are called by the DLCI driver 
  422.  *
  423.  ***********************************************/
  424. static int sdla_reconfig(struct net_device *dev);
  425. int sdla_activate(struct net_device *slave, struct net_device *master)
  426. {
  427. struct frad_local *flp;
  428. int i;
  429. flp = slave->priv;
  430. for(i=0;i<CONFIG_DLCI_MAX;i++)
  431. if (flp->master[i] == master)
  432. break;
  433. if (i == CONFIG_DLCI_MAX)
  434. return(-ENODEV);
  435. flp->dlci[i] = abs(flp->dlci[i]);
  436. if (netif_running(slave) && (flp->config.station == FRAD_STATION_NODE))
  437. sdla_cmd(slave, SDLA_ACTIVATE_DLCI, 0, 0, &flp->dlci[i], sizeof(short), NULL, NULL);
  438. return(0);
  439. }
  440. int sdla_deactivate(struct net_device *slave, struct net_device *master)
  441. {
  442. struct frad_local *flp;
  443. int               i;
  444. flp = slave->priv;
  445. for(i=0;i<CONFIG_DLCI_MAX;i++)
  446. if (flp->master[i] == master)
  447. break;
  448. if (i == CONFIG_DLCI_MAX)
  449. return(-ENODEV);
  450. flp->dlci[i] = -abs(flp->dlci[i]);
  451. if (netif_running(slave) && (flp->config.station == FRAD_STATION_NODE))
  452. sdla_cmd(slave, SDLA_DEACTIVATE_DLCI, 0, 0, &flp->dlci[i], sizeof(short), NULL, NULL);
  453. return(0);
  454. }
  455. int sdla_assoc(struct net_device *slave, struct net_device *master)
  456. {
  457. struct frad_local *flp;
  458. int               i;
  459. if (master->type != ARPHRD_DLCI)
  460. return(-EINVAL);
  461. flp = slave->priv;
  462. for(i=0;i<CONFIG_DLCI_MAX;i++)
  463. {
  464. if (!flp->master[i])
  465. break;
  466. if (abs(flp->dlci[i]) == *(short *)(master->dev_addr))
  467. return(-EADDRINUSE);
  468. if (i == CONFIG_DLCI_MAX)
  469. return(-EMLINK);  /* #### Alan: Comments on this ?? */
  470. MOD_INC_USE_COUNT;
  471. flp->master[i] = master;
  472. flp->dlci[i] = -*(short *)(master->dev_addr);
  473. master->mtu = slave->mtu;
  474. if (netif_running(slave)) {
  475. if (flp->config.station == FRAD_STATION_CPE)
  476. sdla_reconfig(slave);
  477. else
  478. sdla_cmd(slave, SDLA_ADD_DLCI, 0, 0, master->dev_addr, sizeof(short), NULL, NULL);
  479. }
  480. return(0);
  481. }
  482. int sdla_deassoc(struct net_device *slave, struct net_device *master)
  483. {
  484. struct frad_local *flp;
  485. int               i;
  486. flp = slave->priv;
  487. for(i=0;i<CONFIG_DLCI_MAX;i++)
  488. if (flp->master[i] == master)
  489. break;
  490. if (i == CONFIG_DLCI_MAX)
  491. return(-ENODEV);
  492. flp->master[i] = NULL;
  493. flp->dlci[i] = 0;
  494. MOD_DEC_USE_COUNT;
  495. if (netif_running(slave)) {
  496. if (flp->config.station == FRAD_STATION_CPE)
  497. sdla_reconfig(slave);
  498. else
  499. sdla_cmd(slave, SDLA_DELETE_DLCI, 0, 0, master->dev_addr, sizeof(short), NULL, NULL);
  500. }
  501. return(0);
  502. }
  503. int sdla_dlci_conf(struct net_device *slave, struct net_device *master, int get)
  504. {
  505. struct frad_local *flp;
  506. struct dlci_local *dlp;
  507. int               i;
  508. short             len, ret;
  509. flp = slave->priv;
  510. for(i=0;i<CONFIG_DLCI_MAX;i++)
  511. if (flp->master[i] == master)
  512. break;
  513. if (i == CONFIG_DLCI_MAX)
  514. return(-ENODEV);
  515. dlp = master->priv;
  516. ret = SDLA_RET_OK;
  517. len = sizeof(struct dlci_conf);
  518. if (netif_running(slave)) {
  519. if (get)
  520. ret = sdla_cmd(slave, SDLA_READ_DLCI_CONFIGURATION, abs(flp->dlci[i]), 0,  
  521.             NULL, 0, &dlp->config, &len);
  522. else
  523. ret = sdla_cmd(slave, SDLA_SET_DLCI_CONFIGURATION, abs(flp->dlci[i]), 0,  
  524.             &dlp->config, sizeof(struct dlci_conf) - 4 * sizeof(short), NULL, NULL);
  525. }
  526. return(ret == SDLA_RET_OK ? 0 : -EIO);
  527. }
  528. /**************************
  529.  *
  530.  * now for the Linux driver 
  531.  *
  532.  **************************/
  533. /* NOTE: the DLCI driver deals with freeing the SKB!! */
  534. static int sdla_transmit(struct sk_buff *skb, struct net_device *dev)
  535. {
  536. struct frad_local *flp;
  537. int               ret, addr, accept, i;
  538. short             size;
  539. unsigned long     flags;
  540. struct buf_entry  *pbuf;
  541. flp = dev->priv;
  542. ret = 0;
  543. accept = 1;
  544. netif_stop_queue(dev);
  545. /*
  546.  * stupid GateD insists on setting up the multicast router thru us
  547.  * and we're ill equipped to handle a non Frame Relay packet at this
  548.  * time!
  549.  */
  550. accept = 1;
  551. switch (dev->type)
  552. {
  553. case ARPHRD_FRAD:
  554. if (skb->dev->type != ARPHRD_DLCI)
  555. {
  556. printk(KERN_WARNING "%s: Non DLCI device, type %i, tried to send on FRAD module.n", dev->name, skb->dev->type);
  557. accept = 0;
  558. }
  559. break;
  560. default:
  561. printk(KERN_WARNING "%s: unknown firmware type 0x%4.4Xn", dev->name, dev->type);
  562. accept = 0;
  563. break;
  564. }
  565. if (accept)
  566. {
  567. /* this is frame specific, but till there's a PPP module, it's the default */
  568. switch (flp->type)
  569. {
  570. case SDLA_S502A:
  571. case SDLA_S502E:
  572. ret = sdla_cmd(dev, SDLA_INFORMATION_WRITE, *(short *)(skb->dev->dev_addr), 0, skb->data, skb->len, NULL, NULL);
  573. break;
  574. case SDLA_S508:
  575. size = sizeof(addr);
  576. ret = sdla_cmd(dev, SDLA_INFORMATION_WRITE, *(short *)(skb->dev->dev_addr), 0, NULL, skb->len, &addr, &size);
  577. if (ret == SDLA_RET_OK)
  578. {
  579. save_flags(flags); 
  580. cli();
  581. SDLA_WINDOW(dev, addr);
  582. pbuf = (void *)(((unsigned long) dev->mem_start) + (addr & SDLA_ADDR_MASK));
  583. sdla_write(dev, pbuf->buf_addr, skb->data, skb->len);
  584. SDLA_WINDOW(dev, addr);
  585. pbuf->opp_flag = 1;
  586. restore_flags(flags);
  587. }
  588. break;
  589. }
  590. switch (ret)
  591. {
  592. case SDLA_RET_OK:
  593. flp->stats.tx_packets++;
  594. ret = DLCI_RET_OK;
  595. break;
  596. case SDLA_RET_CIR_OVERFLOW:
  597. case SDLA_RET_BUF_OVERSIZE:
  598. case SDLA_RET_NO_BUFS:
  599. flp->stats.tx_dropped++;
  600. ret = DLCI_RET_DROP;
  601. break;
  602. default:
  603. flp->stats.tx_errors++;
  604. ret = DLCI_RET_ERR;
  605. break;
  606. }
  607. }
  608. netif_wake_queue(dev);
  609. for(i=0;i<CONFIG_DLCI_MAX;i++)
  610. {
  611. if(flp->master[i]!=NULL)
  612. netif_wake_queue(flp->master[i]);
  613. }
  614. return(ret);
  615. }
  616. static void sdla_receive(struct net_device *dev)
  617. {
  618. struct net_device   *master;
  619. struct frad_local *flp;
  620. struct dlci_local *dlp;
  621. struct sk_buff  *skb;
  622. struct sdla_cmd *cmd;
  623. struct buf_info *pbufi;
  624. struct buf_entry  *pbuf;
  625. unsigned long   flags;
  626. int               i=0, received, success, addr, buf_base, buf_top;
  627. short             dlci, len, len2, split;
  628. flp = dev->priv;
  629. success = 1;
  630. received = addr = buf_top = buf_base = 0;
  631. len = dlci = 0;
  632. skb = NULL;
  633. master = NULL;
  634. cmd = NULL;
  635. pbufi = NULL;
  636. pbuf = NULL;
  637. save_flags(flags);
  638. cli();
  639. switch (flp->type)
  640. {
  641. case SDLA_S502A:
  642. case SDLA_S502E:
  643. cmd = (void *) (dev->mem_start + (SDLA_502_RCV_BUF & SDLA_ADDR_MASK));
  644. SDLA_WINDOW(dev, SDLA_502_RCV_BUF);
  645. success = cmd->opp_flag;
  646. if (!success)
  647. break;
  648. dlci = cmd->dlci;
  649. len = cmd->length;
  650. break;
  651. case SDLA_S508:
  652. pbufi = (void *) (dev->mem_start + (SDLA_508_RXBUF_INFO & SDLA_ADDR_MASK));
  653. SDLA_WINDOW(dev, SDLA_508_RXBUF_INFO);
  654. pbuf = (void *) (dev->mem_start + ((pbufi->rse_base + flp->buffer * sizeof(struct buf_entry)) & SDLA_ADDR_MASK));
  655. success = pbuf->opp_flag;
  656. if (!success)
  657. break;
  658. buf_top = pbufi->buf_top;
  659. buf_base = pbufi->buf_base;
  660. dlci = pbuf->dlci;
  661. len = pbuf->length;
  662. addr = pbuf->buf_addr;
  663. break;
  664. }
  665. /* common code, find the DLCI and get the SKB */
  666. if (success)
  667. {
  668. for (i=0;i<CONFIG_DLCI_MAX;i++)
  669. if (flp->dlci[i] == dlci)
  670. break;
  671. if (i == CONFIG_DLCI_MAX)
  672. {
  673. printk(KERN_NOTICE "%s: Received packet from invalid DLCI %i, ignoring.", dev->name, dlci);
  674. flp->stats.rx_errors++;
  675. success = 0;
  676. }
  677. }
  678. if (success)
  679. {
  680. master = flp->master[i];
  681. skb = dev_alloc_skb(len + sizeof(struct frhdr));
  682. if (skb == NULL) 
  683. {
  684. printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.n", dev->name);
  685. flp->stats.rx_dropped++; 
  686. success = 0;
  687. }
  688. else
  689. skb_reserve(skb, sizeof(struct frhdr));
  690. }
  691. /* pick up the data */
  692. switch (flp->type)
  693. {
  694. case SDLA_S502A:
  695. case SDLA_S502E:
  696. if (success)
  697. sdla_read(dev, SDLA_502_RCV_BUF + SDLA_502_DATA_OFS, skb_put(skb,len), len);
  698. SDLA_WINDOW(dev, SDLA_502_RCV_BUF);
  699. cmd->opp_flag = 0;
  700. break;
  701. case SDLA_S508:
  702. if (success)
  703. {
  704. /* is this buffer split off the end of the internal ring buffer */
  705. split = addr + len > buf_top + 1 ? len - (buf_top - addr + 1) : 0;
  706. len2 = len - split;
  707. sdla_read(dev, addr, skb_put(skb, len2), len2);
  708. if (split)
  709. sdla_read(dev, buf_base, skb_put(skb, split), split);
  710. }
  711. /* increment the buffer we're looking at */
  712. SDLA_WINDOW(dev, SDLA_508_RXBUF_INFO);
  713. flp->buffer = (flp->buffer + 1) % pbufi->rse_num;
  714. pbuf->opp_flag = 0;
  715. break;
  716. }
  717. if (success)
  718. {
  719. flp->stats.rx_packets++;
  720. dlp = master->priv;
  721. (*dlp->receive)(skb, master);
  722. }
  723. restore_flags(flags);
  724. }
  725. static void sdla_isr(int irq, void *dev_id, struct pt_regs * regs)
  726. {
  727. struct net_device     *dev;
  728. struct frad_local *flp;
  729. char              byte;
  730. dev = dev_id;
  731. if (dev == NULL)
  732. {
  733. printk(KERN_WARNING "sdla_isr(): irq %d for unknown device.n", irq);
  734. return;
  735. }
  736. flp = dev->priv;
  737. if (!flp->initialized)
  738. {
  739. printk(KERN_WARNING "%s: irq %d for uninitialized device.n", dev->name, irq);
  740. return;
  741. }
  742. byte = sdla_byte(dev, flp->type == SDLA_S508 ? SDLA_508_IRQ_INTERFACE : SDLA_502_IRQ_INTERFACE);
  743. switch (byte)
  744. {
  745. case SDLA_INTR_RX:
  746. sdla_receive(dev);
  747. break;
  748. /* the command will get an error return, which is processed above */
  749. case SDLA_INTR_MODEM:
  750. case SDLA_INTR_STATUS:
  751. sdla_cmd(dev, SDLA_READ_DLC_STATUS, 0, 0, NULL, 0, NULL, NULL);
  752. break;
  753. case SDLA_INTR_TX:
  754. case SDLA_INTR_COMPLETE:
  755. case SDLA_INTR_TIMER:
  756. printk(KERN_WARNING "%s: invalid irq flag 0x%02X.n", dev->name, byte);
  757. break;
  758. }
  759. /* the S502E requires a manual acknowledgement of the interrupt */ 
  760. if (flp->type == SDLA_S502E)
  761. {
  762. flp->state &= ~SDLA_S502E_INTACK;
  763. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  764. flp->state |= SDLA_S502E_INTACK;
  765. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  766. }
  767. /* this clears the byte, informing the Z80 we're done */
  768. byte = 0;
  769. sdla_write(dev, flp->type == SDLA_S508 ? SDLA_508_IRQ_INTERFACE : SDLA_502_IRQ_INTERFACE, &byte, sizeof(byte));
  770. }
  771. static void sdla_poll(unsigned long device)
  772. {
  773. struct net_device   *dev;
  774. struct frad_local *flp;
  775. dev = (struct net_device *) device;
  776. flp = dev->priv;
  777. if (sdla_byte(dev, SDLA_502_RCV_BUF))
  778. sdla_receive(dev);
  779. flp->timer.expires = 1;
  780. add_timer(&flp->timer);
  781. }
  782. static int sdla_close(struct net_device *dev)
  783. {
  784. struct frad_local *flp;
  785. struct intr_info  intr;
  786. int               len, i;
  787. short             dlcis[CONFIG_DLCI_MAX];
  788. flp = dev->priv;
  789. len = 0;
  790. for(i=0;i<CONFIG_DLCI_MAX;i++)
  791. if (flp->dlci[i])
  792. dlcis[len++] = abs(flp->dlci[i]);
  793. len *= 2;
  794. if (flp->config.station == FRAD_STATION_NODE)
  795. {
  796. for(i=0;i<CONFIG_DLCI_MAX;i++)
  797. if (flp->dlci[i] > 0) 
  798. sdla_cmd(dev, SDLA_DEACTIVATE_DLCI, 0, 0, dlcis, len, NULL, NULL);
  799. sdla_cmd(dev, SDLA_DELETE_DLCI, 0, 0, &flp->dlci[i], sizeof(flp->dlci[i]), NULL, NULL);
  800. }
  801. memset(&intr, 0, sizeof(intr));
  802. /* let's start up the reception */
  803. switch(flp->type)
  804. {
  805. case SDLA_S502A:
  806. del_timer(&flp->timer); 
  807. break;
  808. case SDLA_S502E:
  809. sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(char) + sizeof(short), NULL, NULL);
  810. flp->state &= ~SDLA_S502E_INTACK;
  811. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  812. break;
  813. case SDLA_S507:
  814. break;
  815. case SDLA_S508:
  816. sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(struct intr_info), NULL, NULL);
  817. flp->state &= ~SDLA_S508_INTEN;
  818. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  819. break;
  820. }
  821. sdla_cmd(dev, SDLA_DISABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL);
  822. netif_stop_queue(dev);
  823. MOD_DEC_USE_COUNT;
  824. return(0);
  825. }
  826. struct conf_data {
  827. struct frad_conf config;
  828. short            dlci[CONFIG_DLCI_MAX];
  829. };
  830. static int sdla_open(struct net_device *dev)
  831. {
  832. struct frad_local *flp;
  833. struct dlci_local *dlp;
  834. struct conf_data  data;
  835. struct intr_info  intr;
  836. int               len, i;
  837. char              byte;
  838. flp = dev->priv;
  839. if (!flp->initialized)
  840. return(-EPERM);
  841. if (!flp->configured)
  842. return(-EPERM);
  843. /* time to send in the configuration */
  844. len = 0;
  845. for(i=0;i<CONFIG_DLCI_MAX;i++)
  846. if (flp->dlci[i])
  847. data.dlci[len++] = abs(flp->dlci[i]);
  848. len *= 2;
  849. memcpy(&data.config, &flp->config, sizeof(struct frad_conf));
  850. len += sizeof(struct frad_conf);
  851. sdla_cmd(dev, SDLA_DISABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL);
  852. sdla_cmd(dev, SDLA_SET_DLCI_CONFIGURATION, 0, 0, &data, len, NULL, NULL);
  853. if (flp->type == SDLA_S508)
  854. flp->buffer = 0;
  855. sdla_cmd(dev, SDLA_ENABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL);
  856. /* let's start up the reception */
  857. memset(&intr, 0, sizeof(intr));
  858. switch(flp->type)
  859. {
  860. case SDLA_S502A:
  861. flp->timer.expires = 1;
  862. add_timer(&flp->timer);
  863. break;
  864. case SDLA_S502E:
  865. flp->state |= SDLA_S502E_ENABLE;
  866. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  867. flp->state |= SDLA_S502E_INTACK;
  868. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  869. byte = 0;
  870. sdla_write(dev, SDLA_502_IRQ_INTERFACE, &byte, sizeof(byte));
  871. intr.flags = SDLA_INTR_RX | SDLA_INTR_STATUS | SDLA_INTR_MODEM;
  872. sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(char) + sizeof(short), NULL, NULL);
  873. break;
  874. case SDLA_S507:
  875. break;
  876. case SDLA_S508:
  877. flp->state |= SDLA_S508_INTEN;
  878. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  879. byte = 0;
  880. sdla_write(dev, SDLA_508_IRQ_INTERFACE, &byte, sizeof(byte));
  881. intr.flags = SDLA_INTR_RX | SDLA_INTR_STATUS | SDLA_INTR_MODEM;
  882. intr.irq = dev->irq;
  883. sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(struct intr_info), NULL, NULL);
  884. break;
  885. }
  886. if (flp->config.station == FRAD_STATION_CPE)
  887. {
  888. byte = SDLA_ICS_STATUS_ENQ;
  889. sdla_cmd(dev, SDLA_ISSUE_IN_CHANNEL_SIGNAL, 0, 0, &byte, sizeof(byte), NULL, NULL);
  890. }
  891. else
  892. {
  893. sdla_cmd(dev, SDLA_ADD_DLCI, 0, 0, data.dlci, len - sizeof(struct frad_conf), NULL, NULL);
  894. for(i=0;i<CONFIG_DLCI_MAX;i++)
  895. if (flp->dlci[i] > 0)
  896. sdla_cmd(dev, SDLA_ACTIVATE_DLCI, 0, 0, &flp->dlci[i], 2*sizeof(flp->dlci[i]), NULL, NULL);
  897. }
  898. /* configure any specific DLCI settings */
  899. for(i=0;i<CONFIG_DLCI_MAX;i++)
  900. if (flp->dlci[i])
  901. {
  902. dlp = flp->master[i]->priv;
  903. if (dlp->configured)
  904. sdla_cmd(dev, SDLA_SET_DLCI_CONFIGURATION, abs(flp->dlci[i]), 0, &dlp->config, sizeof(struct dlci_conf), NULL, NULL);
  905. }
  906. netif_start_queue(dev);
  907. MOD_INC_USE_COUNT;
  908. return(0);
  909. }
  910. static int sdla_config(struct net_device *dev, struct frad_conf *conf, int get)
  911. {
  912. struct frad_local *flp;
  913. struct conf_data  data;
  914. int               i;
  915. short             size;
  916. if (dev->type == 0xFFFF)
  917. return(-EUNATCH);
  918. flp = dev->priv;
  919. if (!get)
  920. {
  921. if (netif_running(dev))
  922. return(-EBUSY);
  923. if(copy_from_user(&data.config, conf, sizeof(struct frad_conf)))
  924. return -EFAULT;
  925. if (data.config.station & ~FRAD_STATION_NODE)
  926. return(-EINVAL);
  927. if (data.config.flags & ~FRAD_VALID_FLAGS)
  928. return(-EINVAL);
  929. if ((data.config.kbaud < 0) || 
  930.  ((data.config.kbaud > 128) && (flp->type != SDLA_S508)))
  931. return(-EINVAL);
  932. if (data.config.clocking & ~(FRAD_CLOCK_INT | SDLA_S508_PORT_RS232))
  933. return(-EINVAL);
  934. if ((data.config.mtu < 0) || (data.config.mtu > SDLA_MAX_MTU))
  935. return(-EINVAL);
  936. if ((data.config.T391 < 5) || (data.config.T391 > 30))
  937. return(-EINVAL);
  938. if ((data.config.T392 < 5) || (data.config.T392 > 30))
  939. return(-EINVAL);
  940. if ((data.config.N391 < 1) || (data.config.N391 > 255))
  941. return(-EINVAL);
  942. if ((data.config.N392 < 1) || (data.config.N392 > 10))
  943. return(-EINVAL);
  944. if ((data.config.N393 < 1) || (data.config.N393 > 10))
  945. return(-EINVAL);
  946. memcpy(&flp->config, &data.config, sizeof(struct frad_conf));
  947. flp->config.flags |= SDLA_DIRECT_RECV;
  948. if (flp->type == SDLA_S508)
  949. flp->config.flags |= SDLA_TX70_RX30;
  950. if (dev->mtu != flp->config.mtu)
  951. {
  952. /* this is required to change the MTU */
  953. dev->mtu = flp->config.mtu;
  954. for(i=0;i<CONFIG_DLCI_MAX;i++)
  955. if (flp->master[i])
  956. flp->master[i]->mtu = flp->config.mtu;
  957. }
  958. flp->config.mtu += sizeof(struct frhdr);
  959. /* off to the races! */
  960. if (!flp->configured)
  961. sdla_start(dev);
  962. flp->configured = 1;
  963. }
  964. else
  965. {
  966. /* no sense reading if the CPU isn't started */
  967. if (netif_running(dev))
  968. {
  969. size = sizeof(data);
  970. if (sdla_cmd(dev, SDLA_READ_DLCI_CONFIGURATION, 0, 0, NULL, 0, &data, &size) != SDLA_RET_OK)
  971. return(-EIO);
  972. }
  973. else
  974. if (flp->configured)
  975. memcpy(&data.config, &flp->config, sizeof(struct frad_conf));
  976. else
  977. memset(&data.config, 0, sizeof(struct frad_conf));
  978. memcpy(&flp->config, &data.config, sizeof(struct frad_conf));
  979. data.config.flags &= FRAD_VALID_FLAGS;
  980. data.config.mtu -= data.config.mtu > sizeof(struct frhdr) ? sizeof(struct frhdr) : data.config.mtu;
  981. return copy_to_user(conf, &data.config, sizeof(struct frad_conf))?-EFAULT:0;
  982. }
  983. return(0);
  984. }
  985. static int sdla_xfer(struct net_device *dev, struct sdla_mem *info, int read)
  986. {
  987. struct sdla_mem mem;
  988. char *temp;
  989. if(copy_from_user(&mem, info, sizeof(mem)))
  990. return -EFAULT;
  991. if (read)
  992. {
  993. temp = kmalloc(mem.len, GFP_KERNEL);
  994. if (!temp)
  995. return(-ENOMEM);
  996. sdla_read(dev, mem.addr, temp, mem.len);
  997. if(copy_to_user(mem.data, temp, mem.len))
  998. {
  999. kfree(temp);
  1000. return -EFAULT;
  1001. }
  1002. kfree(temp);
  1003. }
  1004. else
  1005. {
  1006. temp = kmalloc(mem.len, GFP_KERNEL);
  1007. if (!temp)
  1008. return(-ENOMEM);
  1009. if(copy_from_user(temp, mem.data, mem.len))
  1010. {
  1011. kfree(temp);
  1012. return -EFAULT;
  1013. }
  1014. sdla_write(dev, mem.addr, temp, mem.len);
  1015. kfree(temp);
  1016. }
  1017. return(0);
  1018. }
  1019. static int sdla_reconfig(struct net_device *dev)
  1020. {
  1021. struct frad_local *flp;
  1022. struct conf_data  data;
  1023. int               i, len;
  1024. flp = dev->priv;
  1025. len = 0;
  1026. for(i=0;i<CONFIG_DLCI_MAX;i++)
  1027. if (flp->dlci[i])
  1028. data.dlci[len++] = flp->dlci[i];
  1029. len *= 2;
  1030. memcpy(&data, &flp->config, sizeof(struct frad_conf));
  1031. len += sizeof(struct frad_conf);
  1032. sdla_cmd(dev, SDLA_DISABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL);
  1033. sdla_cmd(dev, SDLA_SET_DLCI_CONFIGURATION, 0, 0, &data, len, NULL, NULL);
  1034. sdla_cmd(dev, SDLA_ENABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL);
  1035. return(0);
  1036. }
  1037. static int sdla_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
  1038. {
  1039. struct frad_local *flp;
  1040. if(!capable(CAP_NET_ADMIN))
  1041. return -EPERM;
  1042. flp = dev->priv;
  1043. if (!flp->initialized)
  1044. return(-EINVAL);
  1045. switch (cmd)
  1046. {
  1047. case FRAD_GET_CONF:
  1048. case FRAD_SET_CONF:
  1049. return(sdla_config(dev, (struct frad_conf *)ifr->ifr_data, cmd == FRAD_GET_CONF));
  1050. case SDLA_IDENTIFY:
  1051. ifr->ifr_flags = flp->type;
  1052. break;
  1053. case SDLA_CPUSPEED:
  1054. return(sdla_cpuspeed(dev, ifr)); 
  1055. /* ==========================================================
  1056. NOTE:  This is rather a useless action right now, as the
  1057.        current driver does not support protocols other than
  1058.        FR.  However, Sangoma has modules for a number of
  1059.        other protocols in the works.
  1060. ============================================================*/
  1061. case SDLA_PROTOCOL:
  1062. if (flp->configured)
  1063. return(-EALREADY);
  1064. switch (ifr->ifr_flags)
  1065. {
  1066. case ARPHRD_FRAD:
  1067. dev->type = ifr->ifr_flags;
  1068. break;
  1069. default:
  1070. return(-ENOPROTOOPT);
  1071. }
  1072. break;
  1073. case SDLA_CLEARMEM:
  1074. sdla_clear(dev);
  1075. break;
  1076. case SDLA_WRITEMEM:
  1077. case SDLA_READMEM:
  1078. return(sdla_xfer(dev, (struct sdla_mem *)ifr->ifr_data, cmd == SDLA_READMEM));
  1079. case SDLA_START:
  1080. sdla_start(dev);
  1081. break;
  1082. case SDLA_STOP:
  1083. sdla_stop(dev);
  1084. break;
  1085. default:
  1086. return(-EOPNOTSUPP);
  1087. }
  1088. return(0);
  1089. }
  1090. int sdla_change_mtu(struct net_device *dev, int new_mtu)
  1091. {
  1092. struct frad_local *flp;
  1093. flp = dev->priv;
  1094. if (netif_running(dev))
  1095. return(-EBUSY);
  1096. /* for now, you can't change the MTU! */
  1097. return(-EOPNOTSUPP);
  1098. }
  1099. int sdla_set_config(struct net_device *dev, struct ifmap *map)
  1100. {
  1101. struct frad_local *flp;
  1102. int               i;
  1103. char              byte;
  1104. flp = dev->priv;
  1105. if (flp->initialized)
  1106. return(-EINVAL);
  1107. for(i=0;i < sizeof(valid_port) / sizeof (int) ; i++)
  1108. if (valid_port[i] == map->base_addr)
  1109. break;   
  1110. if (i == sizeof(valid_port) / sizeof(int))
  1111. return(-EINVAL);
  1112. dev->base_addr = map->base_addr;
  1113. if (!request_region(dev->base_addr, SDLA_IO_EXTENTS, dev->name)){
  1114. printk(KERN_WARNING "SDLA: io-port 0x%04lx in use n", dev->base_addr);
  1115. return(-EINVAL);
  1116. }
  1117. /* test for card types, S502A, S502E, S507, S508                 */
  1118. /* these tests shut down the card completely, so clear the state */
  1119. flp->type = SDLA_UNKNOWN;
  1120. flp->state = 0;
  1121.    
  1122. for(i=1;i<SDLA_IO_EXTENTS;i++)
  1123. if (inb(dev->base_addr + i) != 0xFF)
  1124. break;
  1125. if (i == SDLA_IO_EXTENTS)
  1126. {   
  1127. outb(SDLA_HALT, dev->base_addr + SDLA_REG_Z80_CONTROL);
  1128. if ((inb(dev->base_addr + SDLA_S502_STS) & 0x0F) == 0x08)
  1129. {
  1130. outb(SDLA_S502E_INTACK, dev->base_addr + SDLA_REG_CONTROL);
  1131. if ((inb(dev->base_addr + SDLA_S502_STS) & 0x0F) == 0x0C)
  1132. {
  1133. outb(SDLA_HALT, dev->base_addr + SDLA_REG_CONTROL);
  1134. flp->type = SDLA_S502E;
  1135. }
  1136. }
  1137. }
  1138. if (flp->type == SDLA_UNKNOWN)
  1139. {
  1140. for(byte=inb(dev->base_addr),i=0;i<SDLA_IO_EXTENTS;i++)
  1141. if (inb(dev->base_addr + i) != byte)
  1142. break;
  1143. if (i == SDLA_IO_EXTENTS)
  1144. {
  1145. outb(SDLA_HALT, dev->base_addr + SDLA_REG_CONTROL);
  1146. if ((inb(dev->base_addr + SDLA_S502_STS) & 0x7E) == 0x30)
  1147. {
  1148. outb(SDLA_S507_ENABLE, dev->base_addr + SDLA_REG_CONTROL);
  1149. if ((inb(dev->base_addr + SDLA_S502_STS) & 0x7E) == 0x32)
  1150. {
  1151. outb(SDLA_HALT, dev->base_addr + SDLA_REG_CONTROL);
  1152. flp->type = SDLA_S507;
  1153. }
  1154. }
  1155. }
  1156. }
  1157. if (flp->type == SDLA_UNKNOWN)
  1158. {
  1159. outb(SDLA_HALT, dev->base_addr + SDLA_REG_CONTROL);
  1160. if ((inb(dev->base_addr + SDLA_S508_STS) & 0x3F) == 0x00)
  1161. {
  1162. outb(SDLA_S508_INTEN, dev->base_addr + SDLA_REG_CONTROL);
  1163. if ((inb(dev->base_addr + SDLA_S508_STS) & 0x3F) == 0x10)
  1164. {
  1165. outb(SDLA_HALT, dev->base_addr + SDLA_REG_CONTROL);
  1166. flp->type = SDLA_S508;
  1167. }
  1168. }
  1169. }
  1170. if (flp->type == SDLA_UNKNOWN)
  1171. {
  1172. outb(SDLA_S502A_HALT, dev->base_addr + SDLA_REG_CONTROL);
  1173. if (inb(dev->base_addr + SDLA_S502_STS) == 0x40)
  1174. {
  1175. outb(SDLA_S502A_START, dev->base_addr + SDLA_REG_CONTROL);
  1176. if (inb(dev->base_addr + SDLA_S502_STS) == 0x40)
  1177. {
  1178. outb(SDLA_S502A_INTEN, dev->base_addr + SDLA_REG_CONTROL);
  1179. if (inb(dev->base_addr + SDLA_S502_STS) == 0x44)
  1180. {
  1181. outb(SDLA_S502A_START, dev->base_addr + SDLA_REG_CONTROL);
  1182. flp->type = SDLA_S502A;
  1183. }
  1184. }
  1185. }
  1186. }
  1187. if (flp->type == SDLA_UNKNOWN)
  1188. {
  1189. printk(KERN_NOTICE "%s: Unknown card typen", dev->name);
  1190. return(-ENODEV);
  1191. }
  1192. switch(dev->base_addr)
  1193. {
  1194. case 0x270:
  1195. case 0x280:
  1196. case 0x380: 
  1197. case 0x390:
  1198. if ((flp->type != SDLA_S508) && (flp->type != SDLA_S507))
  1199. return(-EINVAL);
  1200. }
  1201. switch (map->irq)
  1202. {
  1203. case 2:
  1204. if (flp->type != SDLA_S502E)
  1205. return(-EINVAL);
  1206. break;
  1207. case 10:
  1208. case 11:
  1209. case 12:
  1210. case 15:
  1211. case 4:
  1212. if ((flp->type != SDLA_S508) && (flp->type != SDLA_S507))
  1213. return(-EINVAL);
  1214. case 3:
  1215. case 5:
  1216. case 7:
  1217. if (flp->type == SDLA_S502A)
  1218. return(-EINVAL);
  1219. break;
  1220. default:
  1221. return(-EINVAL);
  1222. }
  1223. dev->irq = map->irq;
  1224. if (request_irq(dev->irq, &sdla_isr, 0, dev->name, dev)) 
  1225. return(-EAGAIN);
  1226. if (flp->type == SDLA_S507)
  1227. {
  1228. switch(dev->irq)
  1229. {
  1230. case 3:
  1231. flp->state = SDLA_S507_IRQ3;
  1232. break;
  1233. case 4:
  1234. flp->state = SDLA_S507_IRQ4;
  1235. break;
  1236. case 5:
  1237. flp->state = SDLA_S507_IRQ5;
  1238. break;
  1239. case 7:
  1240. flp->state = SDLA_S507_IRQ7;
  1241. break;
  1242. case 10:
  1243. flp->state = SDLA_S507_IRQ10;
  1244. break;
  1245. case 11:
  1246. flp->state = SDLA_S507_IRQ11;
  1247. break;
  1248. case 12:
  1249. flp->state = SDLA_S507_IRQ12;
  1250. break;
  1251. case 15:
  1252. flp->state = SDLA_S507_IRQ15;
  1253. break;
  1254. }
  1255. }
  1256. for(i=0;i < sizeof(valid_mem) / sizeof (int) ; i++)
  1257. if (valid_mem[i] == map->mem_start)
  1258. break;   
  1259. if (i == sizeof(valid_mem) / sizeof(int))
  1260. /*
  1261.  * FIXME:
  1262.  * BUG BUG BUG: MUST RELEASE THE IRQ WE ALLOCATED IN
  1263.  * ALL THESE CASES
  1264.  *
  1265.  */
  1266. return(-EINVAL);
  1267. if ((flp->type == SDLA_S502A) && (((map->mem_start & 0xF000) >> 12) == 0x0E))
  1268. return(-EINVAL);
  1269. if ((flp->type != SDLA_S507) && ((map->mem_start >> 16) == 0x0B))
  1270. return(-EINVAL);
  1271. if ((flp->type == SDLA_S507) && ((map->mem_start >> 16) == 0x0D))
  1272. return(-EINVAL);
  1273. dev->mem_start = map->mem_start;
  1274. dev->mem_end = dev->mem_start + 0x2000;
  1275. byte = flp->type != SDLA_S508 ? SDLA_8K_WINDOW : 0;
  1276. byte |= (map->mem_start & 0xF000) >> (12 + (flp->type == SDLA_S508 ? 1 : 0));
  1277. switch(flp->type)
  1278. {
  1279. case SDLA_S502A:
  1280. case SDLA_S502E:
  1281. switch (map->mem_start >> 16)
  1282. {
  1283. case 0x0A:
  1284. byte |= SDLA_S502_SEG_A;
  1285. break;
  1286. case 0x0C:
  1287. byte |= SDLA_S502_SEG_C;
  1288. break;
  1289. case 0x0D:
  1290. byte |= SDLA_S502_SEG_D;
  1291. break;
  1292. case 0x0E:
  1293. byte |= SDLA_S502_SEG_E;
  1294. break;
  1295. }
  1296. break;
  1297. case SDLA_S507:
  1298. switch (map->mem_start >> 16)
  1299. {
  1300. case 0x0A:
  1301. byte |= SDLA_S507_SEG_A;
  1302. break;
  1303. case 0x0B:
  1304. byte |= SDLA_S507_SEG_B;
  1305. break;
  1306. case 0x0C:
  1307. byte |= SDLA_S507_SEG_C;
  1308. break;
  1309. case 0x0E:
  1310. byte |= SDLA_S507_SEG_E;
  1311. break;
  1312. }
  1313. break;
  1314. case SDLA_S508:
  1315. switch (map->mem_start >> 16)
  1316. {
  1317. case 0x0A:
  1318. byte |= SDLA_S508_SEG_A;
  1319. break;
  1320. case 0x0C:
  1321. byte |= SDLA_S508_SEG_C;
  1322. break;
  1323. case 0x0D:
  1324. byte |= SDLA_S508_SEG_D;
  1325. break;
  1326. case 0x0E:
  1327. byte |= SDLA_S508_SEG_E;
  1328. break;
  1329. }
  1330. break;
  1331. }
  1332. /* set the memory bits, and enable access */
  1333. outb(byte, dev->base_addr + SDLA_REG_PC_WINDOW);
  1334. switch(flp->type)
  1335. {
  1336. case SDLA_S502E:
  1337. flp->state = SDLA_S502E_ENABLE;
  1338. break;
  1339. case SDLA_S507:
  1340. flp->state |= SDLA_MEMEN;
  1341. break;
  1342. case SDLA_S508:
  1343. flp->state = SDLA_MEMEN;
  1344. break;
  1345. }
  1346. outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
  1347. flp->initialized = 1;
  1348. return(0);
  1349. }
  1350.  
  1351. static struct net_device_stats *sdla_stats(struct net_device *dev)
  1352. {
  1353. struct frad_local *flp;
  1354. flp = dev->priv;
  1355. return(&flp->stats);
  1356. }
  1357. int __init sdla_init(struct net_device *dev)
  1358. {
  1359. struct frad_local *flp;
  1360. /* allocate the private data structure */
  1361. flp = kmalloc(sizeof(struct frad_local), GFP_KERNEL);
  1362. if (!flp)
  1363. return(-ENOMEM);
  1364. memset(flp, 0, sizeof(struct frad_local));
  1365. dev->priv = flp;
  1366. dev->flags = 0;
  1367. dev->open = sdla_open;
  1368. dev->stop = sdla_close;
  1369. dev->do_ioctl = sdla_ioctl;
  1370. dev->set_config = sdla_set_config;
  1371. dev->get_stats = sdla_stats;
  1372. dev->hard_start_xmit = sdla_transmit;
  1373. dev->change_mtu = sdla_change_mtu;
  1374. dev->type = 0xFFFF;
  1375. dev->hard_header_len = 0;
  1376. dev->addr_len = 0;
  1377. dev->mtu = SDLA_MAX_MTU;
  1378. flp->activate = sdla_activate;
  1379. flp->deactivate = sdla_deactivate;
  1380. flp->assoc = sdla_assoc;
  1381. flp->deassoc = sdla_deassoc;
  1382. flp->dlci_conf = sdla_dlci_conf;
  1383. init_timer(&flp->timer);
  1384. flp->timer.expires = 1;
  1385. flp->timer.data = (unsigned long) dev;
  1386. flp->timer.function = sdla_poll;
  1387. return(0);
  1388. }
  1389. int __init sdla_c_setup(void)
  1390. {
  1391. printk("%s.n", version);
  1392. register_frad(devname);
  1393. return 0;
  1394. }
  1395. #ifdef MODULE
  1396. static struct net_device sdla0 = {"sdla0", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, sdla_init};
  1397. MODULE_LICENSE("GPL");
  1398. int init_module(void)
  1399. {
  1400. int result;
  1401. sdla_c_setup();
  1402. if ((result = register_netdev(&sdla0)) != 0)
  1403. return result;
  1404. return 0;
  1405. }
  1406. void cleanup_module(void)
  1407. {
  1408. unregister_netdev(&sdla0);
  1409. if (sdla0.priv)
  1410. kfree(sdla0.priv);
  1411. if (sdla0.irq)
  1412. free_irq(sdla0.irq, &sdla0);
  1413. }
  1414. #endif /* MODULE */