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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * WaveLAN ISA driver
  3.  *
  4.  * Jean II - HPLB '96
  5.  *
  6.  * Reorganisation and extension of the driver.
  7.  * Original copyright follows (also see the end of this file).
  8.  * See wavelan.p.h for details.
  9.  *
  10.  *
  11.  *
  12.  * AT&T GIS (nee NCR) WaveLAN card:
  13.  * An Ethernet-like radio transceiver
  14.  * controlled by an Intel 82586 coprocessor.
  15.  */
  16. #include "wavelan.p.h" /* Private header */
  17. /************************* MISC SUBROUTINES **************************/
  18. /*
  19.  * Subroutines which won't fit in one of the following category
  20.  * (WaveLAN modem or i82586)
  21.  */
  22. /*------------------------------------------------------------------*/
  23. /*
  24.  * Wrapper for disabling interrupts and locking the driver.
  25.  * (note : inline, so optimised away)
  26.  */
  27. static inline void wv_splhi(net_local * lp,
  28.     unsigned long * pflags)
  29. {
  30. spin_lock_irqsave(&lp->spinlock, *pflags);
  31. /* Note : above does the cli(); itself */
  32. }
  33. /*------------------------------------------------------------------*/
  34. /*
  35.  * Wrapper for re-enabling interrupts and un-locking the driver.
  36.  */
  37. static inline void wv_splx(net_local * lp,
  38.    unsigned long * pflags)
  39. {
  40. spin_unlock_irqrestore(&lp->spinlock, *pflags);
  41. }
  42. /*------------------------------------------------------------------*/
  43. /*
  44.  * Translate irq number to PSA irq parameter
  45.  */
  46. static u8 wv_irq_to_psa(int irq)
  47. {
  48. if (irq < 0 || irq >= NELS(irqvals))
  49. return 0;
  50. return irqvals[irq];
  51. }
  52. /*------------------------------------------------------------------*/
  53. /*
  54.  * Translate PSA irq parameter to irq number 
  55.  */
  56. static int __init wv_psa_to_irq(u8 irqval)
  57. {
  58. int irq;
  59. for (irq = 0; irq < NELS(irqvals); irq++)
  60. if (irqvals[irq] == irqval)
  61. return irq;
  62. return -1;
  63. }
  64. #ifdef STRUCT_CHECK
  65. /*------------------------------------------------------------------*/
  66. /*
  67.  * Sanity routine to verify the sizes of the various WaveLAN interface
  68.  * structures.
  69.  */
  70. static char *wv_struct_check(void)
  71. {
  72. #define SC(t,s,n) if (sizeof(t) != s) return(n);
  73. SC(psa_t, PSA_SIZE, "psa_t");
  74. SC(mmw_t, MMW_SIZE, "mmw_t");
  75. SC(mmr_t, MMR_SIZE, "mmr_t");
  76. SC(ha_t, HA_SIZE, "ha_t");
  77. #undef SC
  78. return ((char *) NULL);
  79. } /* wv_struct_check */
  80. #endif /* STRUCT_CHECK */
  81. /********************* HOST ADAPTER SUBROUTINES *********************/
  82. /*
  83.  * Useful subroutines to manage the WaveLAN ISA interface
  84.  *
  85.  * One major difference with the PCMCIA hardware (except the port mapping)
  86.  * is that we have to keep the state of the Host Control Register
  87.  * because of the interrupt enable & bus size flags.
  88.  */
  89. /*------------------------------------------------------------------*/
  90. /*
  91.  * Read from card's Host Adaptor Status Register.
  92.  */
  93. static inline u16 hasr_read(unsigned long ioaddr)
  94. {
  95. return (inw(HASR(ioaddr)));
  96. } /* hasr_read */
  97. /*------------------------------------------------------------------*/
  98. /*
  99.  * Write to card's Host Adapter Command Register.
  100.  */
  101. static inline void hacr_write(unsigned long ioaddr, u16 hacr)
  102. {
  103. outw(hacr, HACR(ioaddr));
  104. } /* hacr_write */
  105. /*------------------------------------------------------------------*/
  106. /*
  107.  * Write to card's Host Adapter Command Register. Include a delay for
  108.  * those times when it is needed.
  109.  */
  110. static inline void hacr_write_slow(unsigned long ioaddr, u16 hacr)
  111. {
  112. hacr_write(ioaddr, hacr);
  113. /* delay might only be needed sometimes */
  114. mdelay(1);
  115. } /* hacr_write_slow */
  116. /*------------------------------------------------------------------*/
  117. /*
  118.  * Set the channel attention bit.
  119.  */
  120. static inline void set_chan_attn(unsigned long ioaddr, u16 hacr)
  121. {
  122. hacr_write(ioaddr, hacr | HACR_CA);
  123. } /* set_chan_attn */
  124. /*------------------------------------------------------------------*/
  125. /*
  126.  * Reset, and then set host adaptor into default mode.
  127.  */
  128. static inline void wv_hacr_reset(unsigned long ioaddr)
  129. {
  130. hacr_write_slow(ioaddr, HACR_RESET);
  131. hacr_write(ioaddr, HACR_DEFAULT);
  132. } /* wv_hacr_reset */
  133. /*------------------------------------------------------------------*/
  134. /*
  135.  * Set the I/O transfer over the ISA bus to 8-bit mode
  136.  */
  137. static inline void wv_16_off(unsigned long ioaddr, u16 hacr)
  138. {
  139. hacr &= ~HACR_16BITS;
  140. hacr_write(ioaddr, hacr);
  141. } /* wv_16_off */
  142. /*------------------------------------------------------------------*/
  143. /*
  144.  * Set the I/O transfer over the ISA bus to 8-bit mode
  145.  */
  146. static inline void wv_16_on(unsigned long ioaddr, u16 hacr)
  147. {
  148. hacr |= HACR_16BITS;
  149. hacr_write(ioaddr, hacr);
  150. } /* wv_16_on */
  151. /*------------------------------------------------------------------*/
  152. /*
  153.  * Disable interrupts on the WaveLAN hardware.
  154.  * (called by wv_82586_stop())
  155.  */
  156. static inline void wv_ints_off(device * dev)
  157. {
  158. net_local *lp = (net_local *) dev->priv;
  159. unsigned long ioaddr = dev->base_addr;
  160. lp->hacr &= ~HACR_INTRON;
  161. hacr_write(ioaddr, lp->hacr);
  162. } /* wv_ints_off */
  163. /*------------------------------------------------------------------*/
  164. /*
  165.  * Enable interrupts on the WaveLAN hardware.
  166.  * (called by wv_hw_reset())
  167.  */
  168. static inline void wv_ints_on(device * dev)
  169. {
  170. net_local *lp = (net_local *) dev->priv;
  171. unsigned long ioaddr = dev->base_addr;
  172. lp->hacr |= HACR_INTRON;
  173. hacr_write(ioaddr, lp->hacr);
  174. } /* wv_ints_on */
  175. /******************* MODEM MANAGEMENT SUBROUTINES *******************/
  176. /*
  177.  * Useful subroutines to manage the modem of the WaveLAN
  178.  */
  179. /*------------------------------------------------------------------*/
  180. /*
  181.  * Read the Parameter Storage Area from the WaveLAN card's memory
  182.  */
  183. /*
  184.  * Read bytes from the PSA.
  185.  */
  186. static void psa_read(unsigned long ioaddr, u16 hacr, int o, /* offset in PSA */
  187.      u8 * b, /* buffer to fill */
  188.      int n)
  189. { /* size to read */
  190. wv_16_off(ioaddr, hacr);
  191. while (n-- > 0) {
  192. outw(o, PIOR2(ioaddr));
  193. o++;
  194. *b++ = inb(PIOP2(ioaddr));
  195. }
  196. wv_16_on(ioaddr, hacr);
  197. } /* psa_read */
  198. /*------------------------------------------------------------------*/
  199. /*
  200.  * Write the Parameter Storage Area to the WaveLAN card's memory.
  201.  */
  202. static void psa_write(unsigned long ioaddr, u16 hacr, int o, /* Offset in PSA */
  203.       u8 * b, /* Buffer in memory */
  204.       int n)
  205. { /* Length of buffer */
  206. int count = 0;
  207. wv_16_off(ioaddr, hacr);
  208. while (n-- > 0) {
  209. outw(o, PIOR2(ioaddr));
  210. o++;
  211. outb(*b, PIOP2(ioaddr));
  212. b++;
  213. /* Wait for the memory to finish its write cycle */
  214. count = 0;
  215. while ((count++ < 100) &&
  216.        (hasr_read(ioaddr) & HASR_PSA_BUSY)) mdelay(1);
  217. }
  218. wv_16_on(ioaddr, hacr);
  219. } /* psa_write */
  220. #ifdef SET_PSA_CRC
  221. /*------------------------------------------------------------------*/
  222. /*
  223.  * Calculate the PSA CRC
  224.  * Thanks to Valster, Nico <NVALSTER@wcnd.nl.lucent.com> for the code
  225.  * NOTE: By specifying a length including the CRC position the
  226.  * returned value should be zero. (i.e. a correct checksum in the PSA)
  227.  *
  228.  * The Windows drivers don't use the CRC, but the AP and the PtP tool
  229.  * depend on it.
  230.  */
  231. static inline u16 psa_crc(u8 * psa, /* The PSA */
  232.       int size)
  233. { /* Number of short for CRC */
  234. int byte_cnt; /* Loop on the PSA */
  235. u16 crc_bytes = 0; /* Data in the PSA */
  236. int bit_cnt; /* Loop on the bits of the short */
  237. for (byte_cnt = 0; byte_cnt < size; byte_cnt++) {
  238. crc_bytes ^= psa[byte_cnt]; /* Its an xor */
  239. for (bit_cnt = 1; bit_cnt < 9; bit_cnt++) {
  240. if (crc_bytes & 0x0001)
  241. crc_bytes = (crc_bytes >> 1) ^ 0xA001;
  242. else
  243. crc_bytes >>= 1;
  244. }
  245. }
  246. return crc_bytes;
  247. } /* psa_crc */
  248. #endif /* SET_PSA_CRC */
  249. /*------------------------------------------------------------------*/
  250. /*
  251.  * update the checksum field in the Wavelan's PSA
  252.  */
  253. static void update_psa_checksum(device * dev, unsigned long ioaddr, u16 hacr)
  254. {
  255. #ifdef SET_PSA_CRC
  256. psa_t psa;
  257. u16 crc;
  258. /* read the parameter storage area */
  259. psa_read(ioaddr, hacr, 0, (unsigned char *) &psa, sizeof(psa));
  260. /* update the checksum */
  261. crc = psa_crc((unsigned char *) &psa,
  262.       sizeof(psa) - sizeof(psa.psa_crc[0]) -
  263.       sizeof(psa.psa_crc[1])
  264.       - sizeof(psa.psa_crc_status));
  265. psa.psa_crc[0] = crc & 0xFF;
  266. psa.psa_crc[1] = (crc & 0xFF00) >> 8;
  267. /* Write it ! */
  268. psa_write(ioaddr, hacr, (char *) &psa.psa_crc - (char *) &psa,
  269.   (unsigned char *) &psa.psa_crc, 2);
  270. #ifdef DEBUG_IOCTL_INFO
  271. printk(KERN_DEBUG "%s: update_psa_checksum(): crc = 0x%02x%02xn",
  272.        dev->name, psa.psa_crc[0], psa.psa_crc[1]);
  273. /* Check again (luxury !) */
  274. crc = psa_crc((unsigned char *) &psa,
  275.       sizeof(psa) - sizeof(psa.psa_crc_status));
  276. if (crc != 0)
  277. printk(KERN_WARNING
  278.        "%s: update_psa_checksum(): CRC does not agree with PSA data (even after recalculating)n",
  279.        dev->name);
  280. #endif /* DEBUG_IOCTL_INFO */
  281. #endif /* SET_PSA_CRC */
  282. } /* update_psa_checksum */
  283. /*------------------------------------------------------------------*/
  284. /*
  285.  * Write 1 byte to the MMC.
  286.  */
  287. static inline void mmc_out(unsigned long ioaddr, u16 o, u8 d)
  288. {
  289. /* Wait for MMC to go idle */
  290. while (inw(HASR(ioaddr)) & HASR_MMC_BUSY);
  291. outw((u16) (((u16) d << 8) | (o << 1) | 1), MMCR(ioaddr));
  292. }
  293. /*------------------------------------------------------------------*/
  294. /*
  295.  * Routine to write bytes to the Modem Management Controller.
  296.  * We start at the end because it is the way it should be!
  297.  */
  298. static inline void mmc_write(unsigned long ioaddr, u8 o, u8 * b, int n)
  299. {
  300. o += n;
  301. b += n;
  302. while (n-- > 0)
  303. mmc_out(ioaddr, --o, *(--b));
  304. } /* mmc_write */
  305. /*------------------------------------------------------------------*/
  306. /*
  307.  * Read a byte from the MMC.
  308.  * Optimised version for 1 byte, avoid using memory.
  309.  */
  310. static inline u8 mmc_in(unsigned long ioaddr, u16 o)
  311. {
  312. while (inw(HASR(ioaddr)) & HASR_MMC_BUSY);
  313. outw(o << 1, MMCR(ioaddr));
  314. while (inw(HASR(ioaddr)) & HASR_MMC_BUSY);
  315. return (u8) (inw(MMCR(ioaddr)) >> 8);
  316. }
  317. /*------------------------------------------------------------------*/
  318. /*
  319.  * Routine to read bytes from the Modem Management Controller.
  320.  * The implementation is complicated by a lack of address lines,
  321.  * which prevents decoding of the low-order bit.
  322.  * (code has just been moved in the above function)
  323.  * We start at the end because it is the way it should be!
  324.  */
  325. static inline void mmc_read(unsigned long ioaddr, u8 o, u8 * b, int n)
  326. {
  327. o += n;
  328. b += n;
  329. while (n-- > 0)
  330. *(--b) = mmc_in(ioaddr, --o);
  331. } /* mmc_read */
  332. /*------------------------------------------------------------------*/
  333. /*
  334.  * Get the type of encryption available.
  335.  */
  336. static inline int mmc_encr(unsigned long ioaddr)
  337. { /* I/O port of the card */
  338. int temp;
  339. temp = mmc_in(ioaddr, mmroff(0, mmr_des_avail));
  340. if ((temp != MMR_DES_AVAIL_DES) && (temp != MMR_DES_AVAIL_AES))
  341. return 0;
  342. else
  343. return temp;
  344. }
  345. /*------------------------------------------------------------------*/
  346. /*
  347.  * Wait for the frequency EEPROM to complete a command.
  348.  * I hope this one will be optimally inlined.
  349.  */
  350. static inline void fee_wait(unsigned long ioaddr, /* I/O port of the card */
  351.     int delay, /* Base delay to wait for */
  352.     int number)
  353. { /* Number of time to wait */
  354. int count = 0; /* Wait only a limited time */
  355. while ((count++ < number) &&
  356.        (mmc_in(ioaddr, mmroff(0, mmr_fee_status)) &
  357. MMR_FEE_STATUS_BUSY)) udelay(delay);
  358. }
  359. /*------------------------------------------------------------------*/
  360. /*
  361.  * Read bytes from the Frequency EEPROM (frequency select cards).
  362.  */
  363. static void fee_read(unsigned long ioaddr, /* I/O port of the card */
  364.      u16 o, /* destination offset */
  365.      u16 * b, /* data buffer */
  366.      int n)
  367. { /* number of registers */
  368. b += n; /* Position at the end of the area */
  369. /* Write the address */
  370. mmc_out(ioaddr, mmwoff(0, mmw_fee_addr), o + n - 1);
  371. /* Loop on all buffer */
  372. while (n-- > 0) {
  373. /* Write the read command */
  374. mmc_out(ioaddr, mmwoff(0, mmw_fee_ctrl),
  375. MMW_FEE_CTRL_READ);
  376. /* Wait until EEPROM is ready (should be quick). */
  377. fee_wait(ioaddr, 10, 100);
  378. /* Read the value. */
  379. *--b = ((mmc_in(ioaddr, mmroff(0, mmr_fee_data_h)) << 8) |
  380. mmc_in(ioaddr, mmroff(0, mmr_fee_data_l)));
  381. }
  382. }
  383. #ifdef WIRELESS_EXT /* if the wireless extension exists in the kernel */
  384. /*------------------------------------------------------------------*/
  385. /*
  386.  * Write bytes from the Frequency EEPROM (frequency select cards).
  387.  * This is a bit complicated, because the frequency EEPROM has to
  388.  * be unprotected and the write enabled.
  389.  * Jean II
  390.  */
  391. static void fee_write(unsigned long ioaddr, /* I/O port of the card */
  392.       u16 o, /* destination offset */
  393.       u16 * b, /* data buffer */
  394.       int n)
  395. { /* number of registers */
  396. b += n; /* Position at the end of the area. */
  397. #ifdef EEPROM_IS_PROTECTED /* disabled */
  398. #ifdef DOESNT_SEEM_TO_WORK /* disabled */
  399. /* Ask to read the protected register */
  400. mmc_out(ioaddr, mmwoff(0, mmw_fee_ctrl), MMW_FEE_CTRL_PRREAD);
  401. fee_wait(ioaddr, 10, 100);
  402. /* Read the protected register. */
  403. printk("Protected 2:  %02X-%02Xn",
  404.        mmc_in(ioaddr, mmroff(0, mmr_fee_data_h)),
  405.        mmc_in(ioaddr, mmroff(0, mmr_fee_data_l)));
  406. #endif /* DOESNT_SEEM_TO_WORK */
  407. /* Enable protected register. */
  408. mmc_out(ioaddr, mmwoff(0, mmw_fee_addr), MMW_FEE_ADDR_EN);
  409. mmc_out(ioaddr, mmwoff(0, mmw_fee_ctrl), MMW_FEE_CTRL_PREN);
  410. fee_wait(ioaddr, 10, 100);
  411. /* Unprotect area. */
  412. mmc_out(ioaddr, mmwoff(0, mmw_fee_addr), o + n);
  413. mmc_out(ioaddr, mmwoff(0, mmw_fee_ctrl), MMW_FEE_CTRL_PRWRITE);
  414. #ifdef DOESNT_SEEM_TO_WORK /* disabled */
  415. /* or use: */
  416. mmc_out(ioaddr, mmwoff(0, mmw_fee_ctrl), MMW_FEE_CTRL_PRCLEAR);
  417. #endif /* DOESNT_SEEM_TO_WORK */
  418. fee_wait(ioaddr, 10, 100);
  419. #endif /* EEPROM_IS_PROTECTED */
  420. /* Write enable. */
  421. mmc_out(ioaddr, mmwoff(0, mmw_fee_addr), MMW_FEE_ADDR_EN);
  422. mmc_out(ioaddr, mmwoff(0, mmw_fee_ctrl), MMW_FEE_CTRL_WREN);
  423. fee_wait(ioaddr, 10, 100);
  424. /* Write the EEPROM address. */
  425. mmc_out(ioaddr, mmwoff(0, mmw_fee_addr), o + n - 1);
  426. /* Loop on all buffer */
  427. while (n-- > 0) {
  428. /* Write the value. */
  429. mmc_out(ioaddr, mmwoff(0, mmw_fee_data_h), (*--b) >> 8);
  430. mmc_out(ioaddr, mmwoff(0, mmw_fee_data_l), *b & 0xFF);
  431. /* Write the write command. */
  432. mmc_out(ioaddr, mmwoff(0, mmw_fee_ctrl),
  433. MMW_FEE_CTRL_WRITE);
  434. /* WaveLAN documentation says to wait at least 10 ms for EEBUSY = 0 */
  435. mdelay(10);
  436. fee_wait(ioaddr, 10, 100);
  437. }
  438. /* Write disable. */
  439. mmc_out(ioaddr, mmwoff(0, mmw_fee_addr), MMW_FEE_ADDR_DS);
  440. mmc_out(ioaddr, mmwoff(0, mmw_fee_ctrl), MMW_FEE_CTRL_WDS);
  441. fee_wait(ioaddr, 10, 100);
  442. #ifdef EEPROM_IS_PROTECTED /* disabled */
  443. /* Reprotect EEPROM. */
  444. mmc_out(ioaddr, mmwoff(0, mmw_fee_addr), 0x00);
  445. mmc_out(ioaddr, mmwoff(0, mmw_fee_ctrl), MMW_FEE_CTRL_PRWRITE);
  446. fee_wait(ioaddr, 10, 100);
  447. #endif /* EEPROM_IS_PROTECTED */
  448. }
  449. #endif /* WIRELESS_EXT */
  450. /************************ I82586 SUBROUTINES *************************/
  451. /*
  452.  * Useful subroutines to manage the Ethernet controller
  453.  */
  454. /*------------------------------------------------------------------*/
  455. /*
  456.  * Read bytes from the on-board RAM.
  457.  * Why does inlining this function make it fail?
  458.  */
  459. static /*inline */ void obram_read(unsigned long ioaddr,
  460.    u16 o, u8 * b, int n)
  461. {
  462. outw(o, PIOR1(ioaddr));
  463. insw(PIOP1(ioaddr), (unsigned short *) b, (n + 1) >> 1);
  464. }
  465. /*------------------------------------------------------------------*/
  466. /*
  467.  * Write bytes to the on-board RAM.
  468.  */
  469. static inline void obram_write(unsigned long ioaddr, u16 o, u8 * b, int n)
  470. {
  471. outw(o, PIOR1(ioaddr));
  472. outsw(PIOP1(ioaddr), (unsigned short *) b, (n + 1) >> 1);
  473. }
  474. /*------------------------------------------------------------------*/
  475. /*
  476.  * Acknowledge the reading of the status issued by the i82586.
  477.  */
  478. static void wv_ack(device * dev)
  479. {
  480. net_local *lp = (net_local *) dev->priv;
  481. unsigned long ioaddr = dev->base_addr;
  482. u16 scb_cs;
  483. int i;
  484. obram_read(ioaddr, scboff(OFFSET_SCB, scb_status),
  485.    (unsigned char *) &scb_cs, sizeof(scb_cs));
  486. scb_cs &= SCB_ST_INT;
  487. if (scb_cs == 0)
  488. return;
  489. obram_write(ioaddr, scboff(OFFSET_SCB, scb_command),
  490.     (unsigned char *) &scb_cs, sizeof(scb_cs));
  491. set_chan_attn(ioaddr, lp->hacr);
  492. for (i = 1000; i > 0; i--) {
  493. obram_read(ioaddr, scboff(OFFSET_SCB, scb_command),
  494.    (unsigned char *) &scb_cs, sizeof(scb_cs));
  495. if (scb_cs == 0)
  496. break;
  497. udelay(10);
  498. }
  499. udelay(100);
  500. #ifdef DEBUG_CONFIG_ERROR
  501. if (i <= 0)
  502. printk(KERN_INFO
  503.        "%s: wv_ack(): board not accepting command.n",
  504.        dev->name);
  505. #endif
  506. }
  507. /*------------------------------------------------------------------*/
  508. /*
  509.  * Set channel attention bit and busy wait until command has
  510.  * completed, then acknowledge completion of the command.
  511.  */
  512. static inline int wv_synchronous_cmd(device * dev, const char *str)
  513. {
  514. net_local *lp = (net_local *) dev->priv;
  515. unsigned long ioaddr = dev->base_addr;
  516. u16 scb_cmd;
  517. ach_t cb;
  518. int i;
  519. scb_cmd = SCB_CMD_CUC & SCB_CMD_CUC_GO;
  520. obram_write(ioaddr, scboff(OFFSET_SCB, scb_command),
  521.     (unsigned char *) &scb_cmd, sizeof(scb_cmd));
  522. set_chan_attn(ioaddr, lp->hacr);
  523. for (i = 1000; i > 0; i--) {
  524. obram_read(ioaddr, OFFSET_CU, (unsigned char *) &cb,
  525.    sizeof(cb));
  526. if (cb.ac_status & AC_SFLD_C)
  527. break;
  528. udelay(10);
  529. }
  530. udelay(100);
  531. if (i <= 0 || !(cb.ac_status & AC_SFLD_OK)) {
  532. #ifdef DEBUG_CONFIG_ERROR
  533. printk(KERN_INFO "%s: %s failed; status = 0x%xn",
  534.        dev->name, str, cb.ac_status);
  535. #endif
  536. #ifdef DEBUG_I82586_SHOW
  537. wv_scb_show(ioaddr);
  538. #endif
  539. return -1;
  540. }
  541. /* Ack the status */
  542. wv_ack(dev);
  543. return 0;
  544. }
  545. /*------------------------------------------------------------------*/
  546. /*
  547.  * Configuration commands completion interrupt.
  548.  * Check if done, and if OK.
  549.  */
  550. static inline int
  551. wv_config_complete(device * dev, unsigned long ioaddr, net_local * lp)
  552. {
  553. unsigned short mcs_addr;
  554. unsigned short status;
  555. int ret;
  556. #ifdef DEBUG_INTERRUPT_TRACE
  557. printk(KERN_DEBUG "%s: ->wv_config_complete()n", dev->name);
  558. #endif
  559. mcs_addr = lp->tx_first_in_use + sizeof(ac_tx_t) + sizeof(ac_nop_t)
  560.     + sizeof(tbd_t) + sizeof(ac_cfg_t) + sizeof(ac_ias_t);
  561. /* Read the status of the last command (set mc list). */
  562. obram_read(ioaddr, acoff(mcs_addr, ac_status),
  563.    (unsigned char *) &status, sizeof(status));
  564. /* If not completed -> exit */
  565. if ((status & AC_SFLD_C) == 0)
  566. ret = 0; /* Not ready to be scrapped */
  567. else {
  568. #ifdef DEBUG_CONFIG_ERROR
  569. unsigned short cfg_addr;
  570. unsigned short ias_addr;
  571. /* Check mc_config command */
  572. if ((status & AC_SFLD_OK) != AC_SFLD_OK)
  573. printk(KERN_INFO
  574.        "%s: wv_config_complete(): set_multicast_address failed; status = 0x%xn",
  575.        dev->name, status);
  576. /* check ia-config command */
  577. ias_addr = mcs_addr - sizeof(ac_ias_t);
  578. obram_read(ioaddr, acoff(ias_addr, ac_status),
  579.    (unsigned char *) &status, sizeof(status));
  580. if ((status & AC_SFLD_OK) != AC_SFLD_OK)
  581. printk(KERN_INFO
  582.        "%s: wv_config_complete(): set_MAC_address failed; status = 0x%xn",
  583.        dev->name, status);
  584. /* Check config command. */
  585. cfg_addr = ias_addr - sizeof(ac_cfg_t);
  586. obram_read(ioaddr, acoff(cfg_addr, ac_status),
  587.    (unsigned char *) &status, sizeof(status));
  588. if ((status & AC_SFLD_OK) != AC_SFLD_OK)
  589. printk(KERN_INFO
  590.        "%s: wv_config_complete(): configure failed; status = 0x%xn",
  591.        dev->name, status);
  592. #endif /* DEBUG_CONFIG_ERROR */
  593. ret = 1; /* Ready to be scrapped */
  594. }
  595. #ifdef DEBUG_INTERRUPT_TRACE
  596. printk(KERN_DEBUG "%s: <-wv_config_complete() - %dn", dev->name,
  597.        ret);
  598. #endif
  599. return ret;
  600. }
  601. /*------------------------------------------------------------------*/
  602. /*
  603.  * Command completion interrupt.
  604.  * Reclaim as many freed tx buffers as we can.
  605.  * (called in wavelan_interrupt()).
  606.  * Note : the spinlock is already grabbed for us.
  607.  */
  608. static int wv_complete(device * dev, unsigned long ioaddr, net_local * lp)
  609. {
  610. int nreaped = 0;
  611. #ifdef DEBUG_INTERRUPT_TRACE
  612. printk(KERN_DEBUG "%s: ->wv_complete()n", dev->name);
  613. #endif
  614. /* Loop on all the transmit buffers */
  615. while (lp->tx_first_in_use != I82586NULL) {
  616. unsigned short tx_status;
  617. /* Read the first transmit buffer */
  618. obram_read(ioaddr, acoff(lp->tx_first_in_use, ac_status),
  619.    (unsigned char *) &tx_status,
  620.    sizeof(tx_status));
  621. /* If not completed -> exit */
  622. if ((tx_status & AC_SFLD_C) == 0)
  623. break;
  624. /* Hack for reconfiguration */
  625. if (tx_status == 0xFFFF)
  626. if (!wv_config_complete(dev, ioaddr, lp))
  627. break; /* Not completed */
  628. /* We now remove this buffer */
  629. nreaped++;
  630. --lp->tx_n_in_use;
  631. /*
  632. if (lp->tx_n_in_use > 0)
  633. printk("%c", "0123456789abcdefghijk"[lp->tx_n_in_use]);
  634. */
  635. /* Was it the last one? */
  636. if (lp->tx_n_in_use <= 0)
  637. lp->tx_first_in_use = I82586NULL;
  638. else {
  639. /* Next one in the chain */
  640. lp->tx_first_in_use += TXBLOCKZ;
  641. if (lp->tx_first_in_use >=
  642.     OFFSET_CU +
  643.     NTXBLOCKS * TXBLOCKZ) lp->tx_first_in_use -=
  644.     NTXBLOCKS * TXBLOCKZ;
  645. }
  646. /* Hack for reconfiguration */
  647. if (tx_status == 0xFFFF)
  648. continue;
  649. /* Now, check status of the finished command */
  650. if (tx_status & AC_SFLD_OK) {
  651. int ncollisions;
  652. lp->stats.tx_packets++;
  653. ncollisions = tx_status & AC_SFLD_MAXCOL;
  654. lp->stats.collisions += ncollisions;
  655. #ifdef DEBUG_TX_INFO
  656. if (ncollisions > 0)
  657. printk(KERN_DEBUG
  658.        "%s: wv_complete(): tx completed after %d collisions.n",
  659.        dev->name, ncollisions);
  660. #endif
  661. } else {
  662. lp->stats.tx_errors++;
  663. if (tx_status & AC_SFLD_S10) {
  664. lp->stats.tx_carrier_errors++;
  665. #ifdef DEBUG_TX_FAIL
  666. printk(KERN_DEBUG
  667.        "%s: wv_complete(): tx error: no CS.n",
  668.        dev->name);
  669. #endif
  670. }
  671. if (tx_status & AC_SFLD_S9) {
  672. lp->stats.tx_carrier_errors++;
  673. #ifdef DEBUG_TX_FAIL
  674. printk(KERN_DEBUG
  675.        "%s: wv_complete(): tx error: lost CTS.n",
  676.        dev->name);
  677. #endif
  678. }
  679. if (tx_status & AC_SFLD_S8) {
  680. lp->stats.tx_fifo_errors++;
  681. #ifdef DEBUG_TX_FAIL
  682. printk(KERN_DEBUG
  683.        "%s: wv_complete(): tx error: slow DMA.n",
  684.        dev->name);
  685. #endif
  686. }
  687. if (tx_status & AC_SFLD_S6) {
  688. lp->stats.tx_heartbeat_errors++;
  689. #ifdef DEBUG_TX_FAIL
  690. printk(KERN_DEBUG
  691.        "%s: wv_complete(): tx error: heart beat.n",
  692.        dev->name);
  693. #endif
  694. }
  695. if (tx_status & AC_SFLD_S5) {
  696. lp->stats.tx_aborted_errors++;
  697. #ifdef DEBUG_TX_FAIL
  698. printk(KERN_DEBUG
  699.        "%s: wv_complete(): tx error: too many collisions.n",
  700.        dev->name);
  701. #endif
  702. }
  703. }
  704. #ifdef DEBUG_TX_INFO
  705. printk(KERN_DEBUG
  706.        "%s: wv_complete(): tx completed, tx_status 0x%04xn",
  707.        dev->name, tx_status);
  708. #endif
  709. }
  710. #ifdef DEBUG_INTERRUPT_INFO
  711. if (nreaped > 1)
  712. printk(KERN_DEBUG "%s: wv_complete(): reaped %dn",
  713.        dev->name, nreaped);
  714. #endif
  715. /*
  716.  * Inform upper layers.
  717.  */
  718. if (lp->tx_n_in_use < NTXBLOCKS - 1) {
  719. netif_wake_queue(dev);
  720. }
  721. #ifdef DEBUG_INTERRUPT_TRACE
  722. printk(KERN_DEBUG "%s: <-wv_complete()n", dev->name);
  723. #endif
  724. return nreaped;
  725. }
  726. /*------------------------------------------------------------------*/
  727. /*
  728.  * Reconfigure the i82586, or at least ask for it.
  729.  * Because wv_82586_config uses a transmission buffer, we must do it
  730.  * when we are sure that there is one left, so we do it now
  731.  * or in wavelan_packet_xmit() (I can't find any better place,
  732.  * wavelan_interrupt is not an option), so you may experience
  733.  * delays sometimes.
  734.  */
  735. static inline void wv_82586_reconfig(device * dev)
  736. {
  737. net_local *lp = (net_local *) dev->priv;
  738. unsigned long flags;
  739. /* Arm the flag, will be cleard in wv_82586_config() */
  740. lp->reconfig_82586 = 1;
  741. /* Check if we can do it now ! */
  742. if((netif_running(dev)) && !(netif_queue_stopped(dev))) {
  743. wv_splhi(lp, &flags);
  744. /* May fail */
  745. wv_82586_config(dev);
  746. wv_splx(lp, &flags);
  747. }
  748. else {
  749. #ifdef DEBUG_CONFIG_INFO
  750. printk(KERN_DEBUG
  751.        "%s: wv_82586_reconfig(): delayed (state = %lX)n",
  752.        dev->name, dev->state);
  753. #endif
  754. }
  755. }
  756. /********************* DEBUG & INFO SUBROUTINES *********************/
  757. /*
  758.  * This routine is used in the code to show information for debugging.
  759.  * Most of the time, it dumps the contents of hardware structures.
  760.  */
  761. #ifdef DEBUG_PSA_SHOW
  762. /*------------------------------------------------------------------*/
  763. /*
  764.  * Print the formatted contents of the Parameter Storage Area.
  765.  */
  766. static void wv_psa_show(psa_t * p)
  767. {
  768. printk(KERN_DEBUG "##### WaveLAN PSA contents: #####n");
  769. printk(KERN_DEBUG "psa_io_base_addr_1: 0x%02X %02X %02X %02Xn",
  770.        p->psa_io_base_addr_1,
  771.        p->psa_io_base_addr_2,
  772.        p->psa_io_base_addr_3, p->psa_io_base_addr_4);
  773. printk(KERN_DEBUG "psa_rem_boot_addr_1: 0x%02X %02X %02Xn",
  774.        p->psa_rem_boot_addr_1,
  775.        p->psa_rem_boot_addr_2, p->psa_rem_boot_addr_3);
  776. printk(KERN_DEBUG "psa_holi_params: 0x%02x, ", p->psa_holi_params);
  777. printk("psa_int_req_no: %dn", p->psa_int_req_no);
  778. #ifdef DEBUG_SHOW_UNUSED
  779. printk(KERN_DEBUG
  780.        "psa_unused0[]: %02X:%02X:%02X:%02X:%02X:%02X:%02Xn",
  781.        p->psa_unused0[0], p->psa_unused0[1], p->psa_unused0[2],
  782.        p->psa_unused0[3], p->psa_unused0[4], p->psa_unused0[5],
  783.        p->psa_unused0[6]);
  784. #endif /* DEBUG_SHOW_UNUSED */
  785. printk(KERN_DEBUG
  786.        "psa_univ_mac_addr[]: %02x:%02x:%02x:%02x:%02x:%02xn",
  787.        p->psa_univ_mac_addr[0], p->psa_univ_mac_addr[1],
  788.        p->psa_univ_mac_addr[2], p->psa_univ_mac_addr[3],
  789.        p->psa_univ_mac_addr[4], p->psa_univ_mac_addr[5]);
  790. printk(KERN_DEBUG
  791.        "psa_local_mac_addr[]: %02x:%02x:%02x:%02x:%02x:%02xn",
  792.        p->psa_local_mac_addr[0], p->psa_local_mac_addr[1],
  793.        p->psa_local_mac_addr[2], p->psa_local_mac_addr[3],
  794.        p->psa_local_mac_addr[4], p->psa_local_mac_addr[5]);
  795. printk(KERN_DEBUG "psa_univ_local_sel: %d, ",
  796.        p->psa_univ_local_sel);
  797. printk("psa_comp_number: %d, ", p->psa_comp_number);
  798. printk("psa_thr_pre_set: 0x%02xn", p->psa_thr_pre_set);
  799. printk(KERN_DEBUG "psa_feature_select/decay_prm: 0x%02x, ",
  800.        p->psa_feature_select);
  801. printk("psa_subband/decay_update_prm: %dn", p->psa_subband);
  802. printk(KERN_DEBUG "psa_quality_thr: 0x%02x, ", p->psa_quality_thr);
  803. printk("psa_mod_delay: 0x%02xn", p->psa_mod_delay);
  804. printk(KERN_DEBUG "psa_nwid: 0x%02x%02x, ", p->psa_nwid[0],
  805.        p->psa_nwid[1]);
  806. printk("psa_nwid_select: %dn", p->psa_nwid_select);
  807. printk(KERN_DEBUG "psa_encryption_select: %d, ",
  808.        p->psa_encryption_select);
  809. printk
  810.     ("psa_encryption_key[]: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02xn",
  811.      p->psa_encryption_key[0], p->psa_encryption_key[1],
  812.      p->psa_encryption_key[2], p->psa_encryption_key[3],
  813.      p->psa_encryption_key[4], p->psa_encryption_key[5],
  814.      p->psa_encryption_key[6], p->psa_encryption_key[7]);
  815. printk(KERN_DEBUG "psa_databus_width: %dn", p->psa_databus_width);
  816. printk(KERN_DEBUG "psa_call_code/auto_squelch: 0x%02x, ",
  817.        p->psa_call_code[0]);
  818. printk
  819.     ("psa_call_code[]: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02Xn",
  820.      p->psa_call_code[0], p->psa_call_code[1], p->psa_call_code[2],
  821.      p->psa_call_code[3], p->psa_call_code[4], p->psa_call_code[5],
  822.      p->psa_call_code[6], p->psa_call_code[7]);
  823. #ifdef DEBUG_SHOW_UNUSED
  824. printk(KERN_DEBUG "psa_reserved[]: %02X:%02X:%02X:%02Xn",
  825.        p->psa_reserved[0],
  826.        p->psa_reserved[1], p->psa_reserved[2], p->psa_reserved[3]);
  827. #endif /* DEBUG_SHOW_UNUSED */
  828. printk(KERN_DEBUG "psa_conf_status: %d, ", p->psa_conf_status);
  829. printk("psa_crc: 0x%02x%02x, ", p->psa_crc[0], p->psa_crc[1]);
  830. printk("psa_crc_status: 0x%02xn", p->psa_crc_status);
  831. } /* wv_psa_show */
  832. #endif /* DEBUG_PSA_SHOW */
  833. #ifdef DEBUG_MMC_SHOW
  834. /*------------------------------------------------------------------*/
  835. /*
  836.  * Print the formatted status of the Modem Management Controller.
  837.  * This function needs to be completed.
  838.  */
  839. static void wv_mmc_show(device * dev)
  840. {
  841. unsigned long ioaddr = dev->base_addr;
  842. net_local *lp = (net_local *) dev->priv;
  843. mmr_t m;
  844. /* Basic check */
  845. if (hasr_read(ioaddr) & HASR_NO_CLK) {
  846. printk(KERN_WARNING
  847.        "%s: wv_mmc_show: modem not connectedn",
  848.        dev->name);
  849. return;
  850. }
  851. /* Read the mmc */
  852. mmc_out(ioaddr, mmwoff(0, mmw_freeze), 1);
  853. mmc_read(ioaddr, 0, (u8 *) & m, sizeof(m));
  854. mmc_out(ioaddr, mmwoff(0, mmw_freeze), 0);
  855. #ifdef WIRELESS_EXT /* if wireless extension exists in the kernel */
  856. /* Don't forget to update statistics */
  857. lp->wstats.discard.nwid +=
  858.     (m.mmr_wrong_nwid_h << 8) | m.mmr_wrong_nwid_l;
  859. #endif /* WIRELESS_EXT */
  860. printk(KERN_DEBUG "##### WaveLAN modem status registers: #####n");
  861. #ifdef DEBUG_SHOW_UNUSED
  862. printk(KERN_DEBUG
  863.        "mmc_unused0[]: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02Xn",
  864.        m.mmr_unused0[0], m.mmr_unused0[1], m.mmr_unused0[2],
  865.        m.mmr_unused0[3], m.mmr_unused0[4], m.mmr_unused0[5],
  866.        m.mmr_unused0[6], m.mmr_unused0[7]);
  867. #endif /* DEBUG_SHOW_UNUSED */
  868. printk(KERN_DEBUG "Encryption algorithm: %02X - Status: %02Xn",
  869.        m.mmr_des_avail, m.mmr_des_status);
  870. #ifdef DEBUG_SHOW_UNUSED
  871. printk(KERN_DEBUG "mmc_unused1[]: %02X:%02X:%02X:%02X:%02Xn",
  872.        m.mmr_unused1[0],
  873.        m.mmr_unused1[1],
  874.        m.mmr_unused1[2], m.mmr_unused1[3], m.mmr_unused1[4]);
  875. #endif /* DEBUG_SHOW_UNUSED */
  876. printk(KERN_DEBUG "dce_status: 0x%x [%s%s%s%s]n",
  877.        m.mmr_dce_status,
  878.        (m.
  879. mmr_dce_status & MMR_DCE_STATUS_RX_BUSY) ?
  880.        "energy detected," : "",
  881.        (m.
  882. mmr_dce_status & MMR_DCE_STATUS_LOOPT_IND) ?
  883.        "loop test indicated," : "",
  884.        (m.
  885. mmr_dce_status & MMR_DCE_STATUS_TX_BUSY) ?
  886.        "transmitter on," : "",
  887.        (m.
  888. mmr_dce_status & MMR_DCE_STATUS_JBR_EXPIRED) ?
  889.        "jabber timer expired," : "");
  890. printk(KERN_DEBUG "Dsp ID: %02Xn", m.mmr_dsp_id);
  891. #ifdef DEBUG_SHOW_UNUSED
  892. printk(KERN_DEBUG "mmc_unused2[]: %02X:%02Xn",
  893.        m.mmr_unused2[0], m.mmr_unused2[1]);
  894. #endif /* DEBUG_SHOW_UNUSED */
  895. printk(KERN_DEBUG "# correct_nwid: %d, # wrong_nwid: %dn",
  896.        (m.mmr_correct_nwid_h << 8) | m.mmr_correct_nwid_l,
  897.        (m.mmr_wrong_nwid_h << 8) | m.mmr_wrong_nwid_l);
  898. printk(KERN_DEBUG "thr_pre_set: 0x%x [current signal %s]n",
  899.        m.mmr_thr_pre_set & MMR_THR_PRE_SET,
  900.        (m.
  901. mmr_thr_pre_set & MMR_THR_PRE_SET_CUR) ? "above" :
  902.        "below");
  903. printk(KERN_DEBUG "signal_lvl: %d [%s], ",
  904.        m.mmr_signal_lvl & MMR_SIGNAL_LVL,
  905.        (m.
  906. mmr_signal_lvl & MMR_SIGNAL_LVL_VALID) ? "new msg" :
  907.        "no new msg");
  908. printk("silence_lvl: %d [%s], ",
  909.        m.mmr_silence_lvl & MMR_SILENCE_LVL,
  910.        (m.
  911. mmr_silence_lvl & MMR_SILENCE_LVL_VALID) ? "update done" :
  912.        "no new update");
  913. printk("sgnl_qual: 0x%x [%s]n", m.mmr_sgnl_qual & MMR_SGNL_QUAL,
  914.        (m.
  915. mmr_sgnl_qual & MMR_SGNL_QUAL_ANT) ? "Antenna 1" :
  916.        "Antenna 0");
  917. #ifdef DEBUG_SHOW_UNUSED
  918. printk(KERN_DEBUG "netw_id_l: %xn", m.mmr_netw_id_l);
  919. #endif /* DEBUG_SHOW_UNUSED */
  920. } /* wv_mmc_show */
  921. #endif /* DEBUG_MMC_SHOW */
  922. #ifdef DEBUG_I82586_SHOW
  923. /*------------------------------------------------------------------*/
  924. /*
  925.  * Print the last block of the i82586 memory.
  926.  */
  927. static void wv_scb_show(unsigned long ioaddr)
  928. {
  929. scb_t scb;
  930. obram_read(ioaddr, OFFSET_SCB, (unsigned char *) &scb,
  931.    sizeof(scb));
  932. printk(KERN_DEBUG "##### WaveLAN system control block: #####n");
  933. printk(KERN_DEBUG "status: ");
  934. printk("stat 0x%x[%s%s%s%s] ",
  935.        (scb.
  936. scb_status & (SCB_ST_CX | SCB_ST_FR | SCB_ST_CNA |
  937.       SCB_ST_RNR)) >> 12,
  938.        (scb.
  939. scb_status & SCB_ST_CX) ? "command completion interrupt," :
  940.        "", (scb.scb_status & SCB_ST_FR) ? "frame received," : "",
  941.        (scb.
  942. scb_status & SCB_ST_CNA) ? "command unit not active," : "",
  943.        (scb.
  944. scb_status & SCB_ST_RNR) ? "receiving unit not ready," :
  945.        "");
  946. printk("cus 0x%x[%s%s%s] ", (scb.scb_status & SCB_ST_CUS) >> 8,
  947.        ((scb.scb_status & SCB_ST_CUS) ==
  948. SCB_ST_CUS_IDLE) ? "idle" : "",
  949.        ((scb.scb_status & SCB_ST_CUS) ==
  950. SCB_ST_CUS_SUSP) ? "suspended" : "",
  951.        ((scb.scb_status & SCB_ST_CUS) ==
  952. SCB_ST_CUS_ACTV) ? "active" : "");
  953. printk("rus 0x%x[%s%s%s%s]n", (scb.scb_status & SCB_ST_RUS) >> 4,
  954.        ((scb.scb_status & SCB_ST_RUS) ==
  955. SCB_ST_RUS_IDLE) ? "idle" : "",
  956.        ((scb.scb_status & SCB_ST_RUS) ==
  957. SCB_ST_RUS_SUSP) ? "suspended" : "",
  958.        ((scb.scb_status & SCB_ST_RUS) ==
  959. SCB_ST_RUS_NRES) ? "no resources" : "",
  960.        ((scb.scb_status & SCB_ST_RUS) ==
  961. SCB_ST_RUS_RDY) ? "ready" : "");
  962. printk(KERN_DEBUG "command: ");
  963. printk("ack 0x%x[%s%s%s%s] ",
  964.        (scb.
  965. scb_command & (SCB_CMD_ACK_CX | SCB_CMD_ACK_FR |
  966.        SCB_CMD_ACK_CNA | SCB_CMD_ACK_RNR)) >> 12,
  967.        (scb.
  968. scb_command & SCB_CMD_ACK_CX) ? "ack cmd completion," : "",
  969.        (scb.
  970. scb_command & SCB_CMD_ACK_FR) ? "ack frame received," : "",
  971.        (scb.
  972. scb_command & SCB_CMD_ACK_CNA) ? "ack CU not active," : "",
  973.        (scb.
  974. scb_command & SCB_CMD_ACK_RNR) ? "ack RU not ready," : "");
  975. printk("cuc 0x%x[%s%s%s%s%s] ",
  976.        (scb.scb_command & SCB_CMD_CUC) >> 8,
  977.        ((scb.scb_command & SCB_CMD_CUC) ==
  978. SCB_CMD_CUC_NOP) ? "nop" : "",
  979.        ((scb.scb_command & SCB_CMD_CUC) ==
  980. SCB_CMD_CUC_GO) ? "start cbl_offset" : "",
  981.        ((scb.scb_command & SCB_CMD_CUC) ==
  982. SCB_CMD_CUC_RES) ? "resume execution" : "",
  983.        ((scb.scb_command & SCB_CMD_CUC) ==
  984. SCB_CMD_CUC_SUS) ? "suspend execution" : "",
  985.        ((scb.scb_command & SCB_CMD_CUC) ==
  986. SCB_CMD_CUC_ABT) ? "abort execution" : "");
  987. printk("ruc 0x%x[%s%s%s%s%s]n",
  988.        (scb.scb_command & SCB_CMD_RUC) >> 4,
  989.        ((scb.scb_command & SCB_CMD_RUC) ==
  990. SCB_CMD_RUC_NOP) ? "nop" : "",
  991.        ((scb.scb_command & SCB_CMD_RUC) ==
  992. SCB_CMD_RUC_GO) ? "start rfa_offset" : "",
  993.        ((scb.scb_command & SCB_CMD_RUC) ==
  994. SCB_CMD_RUC_RES) ? "resume reception" : "",
  995.        ((scb.scb_command & SCB_CMD_RUC) ==
  996. SCB_CMD_RUC_SUS) ? "suspend reception" : "",
  997.        ((scb.scb_command & SCB_CMD_RUC) ==
  998. SCB_CMD_RUC_ABT) ? "abort reception" : "");
  999. printk(KERN_DEBUG "cbl_offset 0x%x ", scb.scb_cbl_offset);
  1000. printk("rfa_offset 0x%xn", scb.scb_rfa_offset);
  1001. printk(KERN_DEBUG "crcerrs %d ", scb.scb_crcerrs);
  1002. printk("alnerrs %d ", scb.scb_alnerrs);
  1003. printk("rscerrs %d ", scb.scb_rscerrs);
  1004. printk("ovrnerrs %dn", scb.scb_ovrnerrs);
  1005. }
  1006. /*------------------------------------------------------------------*/
  1007. /*
  1008.  * Print the formatted status of the i82586's receive unit.
  1009.  */
  1010. static void wv_ru_show(device * dev)
  1011. {
  1012. /* net_local *lp = (net_local *) dev->priv; */
  1013. printk(KERN_DEBUG
  1014.        "##### WaveLAN i82586 receiver unit status: #####n");
  1015. printk(KERN_DEBUG "ru:");
  1016. /*
  1017.  * Not implemented yet
  1018.  */
  1019. printk("n");
  1020. } /* wv_ru_show */
  1021. /*------------------------------------------------------------------*/
  1022. /*
  1023.  * Display info about one control block of the i82586 memory.
  1024.  */
  1025. static void wv_cu_show_one(device * dev, net_local * lp, int i, u16 p)
  1026. {
  1027. unsigned long ioaddr;
  1028. ac_tx_t actx;
  1029. ioaddr = dev->base_addr;
  1030. printk("%d: 0x%x:", i, p);
  1031. obram_read(ioaddr, p, (unsigned char *) &actx, sizeof(actx));
  1032. printk(" status=0x%x,", actx.tx_h.ac_status);
  1033. printk(" command=0x%x,", actx.tx_h.ac_command);
  1034. /*
  1035.    {
  1036.    tbd_t      tbd;
  1037.    obram_read(ioaddr, actx.tx_tbd_offset, (unsigned char *)&tbd, sizeof(tbd));
  1038.    printk(" tbd_status=0x%x,", tbd.tbd_status);
  1039.    }
  1040.  */
  1041. printk("|");
  1042. }
  1043. /*------------------------------------------------------------------*/
  1044. /*
  1045.  * Print status of the command unit of the i82586.
  1046.  */
  1047. static void wv_cu_show(device * dev)
  1048. {
  1049. net_local *lp = (net_local *) dev->priv;
  1050. unsigned int i;
  1051. u16 p;
  1052. printk(KERN_DEBUG
  1053.        "##### WaveLAN i82586 command unit status: #####n");
  1054. printk(KERN_DEBUG);
  1055. for (i = 0, p = lp->tx_first_in_use; i < NTXBLOCKS; i++) {
  1056. wv_cu_show_one(dev, lp, i, p);
  1057. p += TXBLOCKZ;
  1058. if (p >= OFFSET_CU + NTXBLOCKS * TXBLOCKZ)
  1059. p -= NTXBLOCKS * TXBLOCKZ;
  1060. }
  1061. printk("n");
  1062. }
  1063. #endif /* DEBUG_I82586_SHOW */
  1064. #ifdef DEBUG_DEVICE_SHOW
  1065. /*------------------------------------------------------------------*/
  1066. /*
  1067.  * Print the formatted status of the WaveLAN PCMCIA device driver.
  1068.  */
  1069. static void wv_dev_show(device * dev)
  1070. {
  1071. printk(KERN_DEBUG "dev:");
  1072. printk(" state=%lX,", dev->state);
  1073. printk(" trans_start=%ld,", dev->trans_start);
  1074. printk(" flags=0x%x,", dev->flags);
  1075. printk("n");
  1076. } /* wv_dev_show */
  1077. /*------------------------------------------------------------------*/
  1078. /*
  1079.  * Print the formatted status of the WaveLAN PCMCIA device driver's
  1080.  * private information.
  1081.  */
  1082. static void wv_local_show(device * dev)
  1083. {
  1084. net_local *lp;
  1085. lp = (net_local *) dev->priv;
  1086. printk(KERN_DEBUG "local:");
  1087. printk(" tx_n_in_use=%d,", lp->tx_n_in_use);
  1088. printk(" hacr=0x%x,", lp->hacr);
  1089. printk(" rx_head=0x%x,", lp->rx_head);
  1090. printk(" rx_last=0x%x,", lp->rx_last);
  1091. printk(" tx_first_free=0x%x,", lp->tx_first_free);
  1092. printk(" tx_first_in_use=0x%x,", lp->tx_first_in_use);
  1093. printk("n");
  1094. } /* wv_local_show */
  1095. #endif /* DEBUG_DEVICE_SHOW */
  1096. #if defined(DEBUG_RX_INFO) || defined(DEBUG_TX_INFO)
  1097. /*------------------------------------------------------------------*/
  1098. /*
  1099.  * Dump packet header (and content if necessary) on the screen
  1100.  */
  1101. static inline void wv_packet_info(u8 * p, /* Packet to dump */
  1102.   int length, /* Length of the packet */
  1103.   char *msg1, /* Name of the device */
  1104.   char *msg2)
  1105. { /* Name of the function */
  1106. int i;
  1107. int maxi;
  1108. printk(KERN_DEBUG
  1109.        "%s: %s(): dest %02X:%02X:%02X:%02X:%02X:%02X, length %dn",
  1110.        msg1, msg2, p[0], p[1], p[2], p[3], p[4], p[5], length);
  1111. printk(KERN_DEBUG
  1112.        "%s: %s(): src %02X:%02X:%02X:%02X:%02X:%02X, type 0x%02X%02Xn",
  1113.        msg1, msg2, p[6], p[7], p[8], p[9], p[10], p[11], p[12],
  1114.        p[13]);
  1115. #ifdef DEBUG_PACKET_DUMP
  1116. printk(KERN_DEBUG "data="");
  1117. if ((maxi = length) > DEBUG_PACKET_DUMP)
  1118. maxi = DEBUG_PACKET_DUMP;
  1119. for (i = 14; i < maxi; i++)
  1120. if (p[i] >= ' ' && p[i] <= '~')
  1121. printk(" %c", p[i]);
  1122. else
  1123. printk("%02X", p[i]);
  1124. if (maxi < length)
  1125. printk("..");
  1126. printk(""n");
  1127. printk(KERN_DEBUG "n");
  1128. #endif /* DEBUG_PACKET_DUMP */
  1129. }
  1130. #endif /* defined(DEBUG_RX_INFO) || defined(DEBUG_TX_INFO) */
  1131. /*------------------------------------------------------------------*/
  1132. /*
  1133.  * This is the information which is displayed by the driver at startup.
  1134.  * There are lots of flags for configuring it to your liking.
  1135.  */
  1136. static inline void wv_init_info(device * dev)
  1137. {
  1138. short ioaddr = dev->base_addr;
  1139. net_local *lp = (net_local *) dev->priv;
  1140. psa_t psa;
  1141. int i;
  1142. /* Read the parameter storage area */
  1143. psa_read(ioaddr, lp->hacr, 0, (unsigned char *) &psa, sizeof(psa));
  1144. #ifdef DEBUG_PSA_SHOW
  1145. wv_psa_show(&psa);
  1146. #endif
  1147. #ifdef DEBUG_MMC_SHOW
  1148. wv_mmc_show(dev);
  1149. #endif
  1150. #ifdef DEBUG_I82586_SHOW
  1151. wv_cu_show(dev);
  1152. #endif
  1153. #ifdef DEBUG_BASIC_SHOW
  1154. /* Now, let's go for the basic stuff. */
  1155. printk(KERN_NOTICE "%s: WaveLAN at %#x,", dev->name, ioaddr);
  1156. for (i = 0; i < WAVELAN_ADDR_SIZE; i++)
  1157. printk("%s%02X", (i == 0) ? " " : ":", dev->dev_addr[i]);
  1158. printk(", IRQ %d", dev->irq);
  1159. /* Print current network ID. */
  1160. if (psa.psa_nwid_select)
  1161. printk(", nwid 0x%02X-%02X", psa.psa_nwid[0],
  1162.        psa.psa_nwid[1]);
  1163. else
  1164. printk(", nwid off");
  1165. /* If 2.00 card */
  1166. if (!(mmc_in(ioaddr, mmroff(0, mmr_fee_status)) &
  1167.       (MMR_FEE_STATUS_DWLD | MMR_FEE_STATUS_BUSY))) {
  1168. unsigned short freq;
  1169. /* Ask the EEPROM to read the frequency from the first area. */
  1170. fee_read(ioaddr, 0x00, &freq, 1);
  1171. /* Print frequency */
  1172. printk(", 2.00, %ld", (freq >> 6) + 2400L);
  1173. /* Hack! */
  1174. if (freq & 0x20)
  1175. printk(".5");
  1176. } else {
  1177. printk(", PC");
  1178. switch (psa.psa_comp_number) {
  1179. case PSA_COMP_PC_AT_915:
  1180. case PSA_COMP_PC_AT_2400:
  1181. printk("-AT");
  1182. break;
  1183. case PSA_COMP_PC_MC_915:
  1184. case PSA_COMP_PC_MC_2400:
  1185. printk("-MC");
  1186. break;
  1187. case PSA_COMP_PCMCIA_915:
  1188. printk("MCIA");
  1189. break;
  1190. default:
  1191. printk("?");
  1192. }
  1193. printk(", ");
  1194. switch (psa.psa_subband) {
  1195. case PSA_SUBBAND_915:
  1196. printk("915");
  1197. break;
  1198. case PSA_SUBBAND_2425:
  1199. printk("2425");
  1200. break;
  1201. case PSA_SUBBAND_2460:
  1202. printk("2460");
  1203. break;
  1204. case PSA_SUBBAND_2484:
  1205. printk("2484");
  1206. break;
  1207. case PSA_SUBBAND_2430_5:
  1208. printk("2430.5");
  1209. break;
  1210. default:
  1211. printk("?");
  1212. }
  1213. }
  1214. printk(" MHzn");
  1215. #endif /* DEBUG_BASIC_SHOW */
  1216. #ifdef DEBUG_VERSION_SHOW
  1217. /* Print version information */
  1218. printk(KERN_NOTICE "%s", version);
  1219. #endif
  1220. } /* wv_init_info */
  1221. /********************* IOCTL, STATS & RECONFIG *********************/
  1222. /*
  1223.  * We found here routines that are called by Linux on different
  1224.  * occasions after the configuration and not for transmitting data
  1225.  * These may be called when the user use ifconfig, /proc/net/dev
  1226.  * or wireless extensions
  1227.  */
  1228. /*------------------------------------------------------------------*/
  1229. /*
  1230.  * Get the current Ethernet statistics. This may be called with the
  1231.  * card open or closed.
  1232.  * Used when the user read /proc/net/dev
  1233.  */
  1234. static en_stats *wavelan_get_stats(device * dev)
  1235. {
  1236. #ifdef DEBUG_IOCTL_TRACE
  1237. printk(KERN_DEBUG "%s: <>wavelan_get_stats()n", dev->name);
  1238. #endif
  1239. return (&((net_local *) dev->priv)->stats);
  1240. }
  1241. /*------------------------------------------------------------------*/
  1242. /*
  1243.  * Set or clear the multicast filter for this adaptor.
  1244.  * num_addrs == -1 Promiscuous mode, receive all packets
  1245.  * num_addrs == 0 Normal mode, clear multicast list
  1246.  * num_addrs > 0 Multicast mode, receive normal and MC packets,
  1247.  * and do best-effort filtering.
  1248.  */
  1249. static void wavelan_set_multicast_list(device * dev)
  1250. {
  1251. net_local *lp = (net_local *) dev->priv;
  1252. #ifdef DEBUG_IOCTL_TRACE
  1253. printk(KERN_DEBUG "%s: ->wavelan_set_multicast_list()n",
  1254.        dev->name);
  1255. #endif
  1256. #ifdef DEBUG_IOCTL_INFO
  1257. printk(KERN_DEBUG
  1258.        "%s: wavelan_set_multicast_list(): setting Rx mode %02X to %d addresses.n",
  1259.        dev->name, dev->flags, dev->mc_count);
  1260. #endif
  1261. /* Are we asking for promiscuous mode,
  1262.  * or all multicast addresses (we don't have that!)
  1263.  * or too many multicast addresses for the hardware filter? */
  1264. if ((dev->flags & IFF_PROMISC) ||
  1265.     (dev->flags & IFF_ALLMULTI) ||
  1266.     (dev->mc_count > I82586_MAX_MULTICAST_ADDRESSES)) {
  1267. /*
  1268.  * Enable promiscuous mode: receive all packets.
  1269.  */
  1270. if (!lp->promiscuous) {
  1271. lp->promiscuous = 1;
  1272. lp->mc_count = 0;
  1273. wv_82586_reconfig(dev);
  1274. /* Tell the kernel that we are doing a really bad job. */
  1275. dev->flags |= IFF_PROMISC;
  1276. }
  1277. } else
  1278. /* Are there multicast addresses to send? */
  1279. if (dev->mc_list != (struct dev_mc_list *) NULL) {
  1280. /*
  1281.  * Disable promiscuous mode, but receive all packets
  1282.  * in multicast list
  1283.  */
  1284. #ifdef MULTICAST_AVOID
  1285. if (lp->promiscuous || (dev->mc_count != lp->mc_count))
  1286. #endif
  1287. {
  1288. lp->promiscuous = 0;
  1289. lp->mc_count = dev->mc_count;
  1290. wv_82586_reconfig(dev);
  1291. }
  1292. } else {
  1293. /*
  1294.  * Switch to normal mode: disable promiscuous mode and 
  1295.  * clear the multicast list.
  1296.  */
  1297. if (lp->promiscuous || lp->mc_count == 0) {
  1298. lp->promiscuous = 0;
  1299. lp->mc_count = 0;
  1300. wv_82586_reconfig(dev);
  1301. }
  1302. }
  1303. #ifdef DEBUG_IOCTL_TRACE
  1304. printk(KERN_DEBUG "%s: <-wavelan_set_multicast_list()n",
  1305.        dev->name);
  1306. #endif
  1307. }
  1308. /*------------------------------------------------------------------*/
  1309. /*
  1310.  * This function doesn't exist.
  1311.  * (Note : it was a nice way to test the reconfigure stuff...)
  1312.  */
  1313. #ifdef SET_MAC_ADDRESS
  1314. static int wavelan_set_mac_address(device * dev, void *addr)
  1315. {
  1316. struct sockaddr *mac = addr;
  1317. /* Copy the address. */
  1318. memcpy(dev->dev_addr, mac->sa_data, WAVELAN_ADDR_SIZE);
  1319. /* Reconfigure the beast. */
  1320. wv_82586_reconfig(dev);
  1321. return 0;
  1322. }
  1323. #endif /* SET_MAC_ADDRESS */
  1324. #ifdef WIRELESS_EXT /* if wireless extensions exist in the kernel */
  1325. /*------------------------------------------------------------------*/
  1326. /*
  1327.  * Frequency setting (for hardware capable of it)
  1328.  * It's a bit complicated and you don't really want to look into it.
  1329.  * (called in wavelan_ioctl)
  1330.  */
  1331. static inline int wv_set_frequency(unsigned long ioaddr, /* I/O port of the card */
  1332.    iw_freq * frequency)
  1333. {
  1334. const int BAND_NUM = 10; /* Number of bands */
  1335. long freq = 0L; /* offset to 2.4 GHz in .5 MHz */
  1336. #ifdef DEBUG_IOCTL_INFO
  1337. int i;
  1338. #endif
  1339. /* Setting by frequency */
  1340. /* Theoretically, you may set any frequency between
  1341.  * the two limits with a 0.5 MHz precision. In practice,
  1342.  * I don't want you to have trouble with local regulations.
  1343.  */
  1344. if ((frequency->e == 1) &&
  1345.     (frequency->m >= (int) 2.412e8)
  1346.     && (frequency->m <= (int) 2.487e8)) {
  1347. freq = ((frequency->m / 10000) - 24000L) / 5;
  1348. }
  1349. /* Setting by channel (same as wfreqsel) */
  1350. /* Warning: each channel is 22 MHz wide, so some of the channels
  1351.  * will interfere. */
  1352. if ((frequency->e == 0) && (frequency->m < BAND_NUM)) {
  1353. /* Get frequency offset. */
  1354. freq = channel_bands[frequency->m] >> 1;
  1355. }
  1356. /* Verify that the frequency is allowed. */
  1357. if (freq != 0L) {
  1358. u16 table[10]; /* Authorized frequency table */
  1359. /* Read the frequency table. */
  1360. fee_read(ioaddr, 0x71, table, 10);
  1361. #ifdef DEBUG_IOCTL_INFO
  1362. printk(KERN_DEBUG "Frequency table: ");
  1363. for (i = 0; i < 10; i++) {
  1364. printk(" %04X", table[i]);
  1365. }
  1366. printk("n");
  1367. #endif
  1368. /* Look in the table to see whether the frequency is allowed. */
  1369. if (!(table[9 - ((freq - 24) / 16)] &
  1370.       (1 << ((freq - 24) % 16)))) return -EINVAL; /* not allowed */
  1371. } else
  1372. return -EINVAL;
  1373. /* if we get a usable frequency */
  1374. if (freq != 0L) {
  1375. unsigned short area[16];
  1376. unsigned short dac[2];
  1377. unsigned short area_verify[16];
  1378. unsigned short dac_verify[2];
  1379. /* Corresponding gain (in the power adjust value table)
  1380.  * See AT&T WaveLAN Data Manual, REF 407-024689/E, page 3-8
  1381.  * and WCIN062D.DOC, page 6.2.9. */
  1382. unsigned short power_limit[] = { 40, 80, 120, 160, 0 };
  1383. int power_band = 0; /* Selected band */
  1384. unsigned short power_adjust; /* Correct value */
  1385. /* Search for the gain. */
  1386. power_band = 0;
  1387. while ((freq > power_limit[power_band]) &&
  1388.        (power_limit[++power_band] != 0));
  1389. /* Read the first area. */
  1390. fee_read(ioaddr, 0x00, area, 16);
  1391. /* Read the DAC. */
  1392. fee_read(ioaddr, 0x60, dac, 2);
  1393. /* Read the new power adjust value. */
  1394. fee_read(ioaddr, 0x6B - (power_band >> 1), &power_adjust,
  1395.  1);
  1396. if (power_band & 0x1)
  1397. power_adjust >>= 8;
  1398. else
  1399. power_adjust &= 0xFF;
  1400. #ifdef DEBUG_IOCTL_INFO
  1401. printk(KERN_DEBUG "WaveLAN EEPROM Area 1: ");
  1402. for (i = 0; i < 16; i++) {
  1403. printk(" %04X", area[i]);
  1404. }
  1405. printk("n");
  1406. printk(KERN_DEBUG "WaveLAN EEPROM DAC: %04X %04Xn",
  1407.        dac[0], dac[1]);
  1408. #endif
  1409. /* Frequency offset (for info only) */
  1410. area[0] = ((freq << 5) & 0xFFE0) | (area[0] & 0x1F);
  1411. /* Receiver Principle main divider coefficient */
  1412. area[3] = (freq >> 1) + 2400L - 352L;
  1413. area[2] = ((freq & 0x1) << 4) | (area[2] & 0xFFEF);
  1414. /* Transmitter Main divider coefficient */
  1415. area[13] = (freq >> 1) + 2400L;
  1416. area[12] = ((freq & 0x1) << 4) | (area[2] & 0xFFEF);
  1417. /* Other parts of the area are flags, bit streams or unused. */
  1418. /* Set the value in the DAC. */
  1419. dac[1] = ((power_adjust >> 1) & 0x7F) | (dac[1] & 0xFF80);
  1420. dac[0] = ((power_adjust & 0x1) << 4) | (dac[0] & 0xFFEF);
  1421. /* Write the first area. */
  1422. fee_write(ioaddr, 0x00, area, 16);
  1423. /* Write the DAC. */
  1424. fee_write(ioaddr, 0x60, dac, 2);
  1425. /* We now should verify here that the writing of the EEPROM went OK. */
  1426. /* Reread the first area. */
  1427. fee_read(ioaddr, 0x00, area_verify, 16);
  1428. /* Reread the DAC. */
  1429. fee_read(ioaddr, 0x60, dac_verify, 2);
  1430. /* Compare. */
  1431. if (memcmp(area, area_verify, 16 * 2) ||
  1432.     memcmp(dac, dac_verify, 2 * 2)) {
  1433. #ifdef DEBUG_IOCTL_ERROR
  1434. printk(KERN_INFO
  1435.        "WaveLAN: wv_set_frequency: unable to write new frequency to EEPROM(?).n");
  1436. #endif
  1437. return -EOPNOTSUPP;
  1438. }
  1439. /* We must download the frequency parameters to the
  1440.  * synthesizers (from the EEPROM - area 1)
  1441.  * Note: as the EEPROM is automatically decremented, we set the end
  1442.  * if the area... */
  1443. mmc_out(ioaddr, mmwoff(0, mmw_fee_addr), 0x0F);
  1444. mmc_out(ioaddr, mmwoff(0, mmw_fee_ctrl),
  1445. MMW_FEE_CTRL_READ | MMW_FEE_CTRL_DWLD);
  1446. /* Wait until the download is finished. */
  1447. fee_wait(ioaddr, 100, 100);
  1448. /* We must now download the power adjust value (gain) to
  1449.  * the synthesizers (from the EEPROM - area 7 - DAC). */
  1450. mmc_out(ioaddr, mmwoff(0, mmw_fee_addr), 0x61);
  1451. mmc_out(ioaddr, mmwoff(0, mmw_fee_ctrl),
  1452. MMW_FEE_CTRL_READ | MMW_FEE_CTRL_DWLD);
  1453. /* Wait for the download to finish. */
  1454. fee_wait(ioaddr, 100, 100);
  1455. #ifdef DEBUG_IOCTL_INFO
  1456. /* Verification of what we have done */
  1457. printk(KERN_DEBUG "WaveLAN EEPROM Area 1: ");
  1458. for (i = 0; i < 16; i++) {
  1459. printk(" %04X", area_verify[i]);
  1460. }
  1461. printk("n");
  1462. printk(KERN_DEBUG "WaveLAN EEPROM DAC:  %04X %04Xn",
  1463.        dac_verify[0], dac_verify[1]);
  1464. #endif
  1465. return 0;
  1466. } else
  1467. return -EINVAL; /* Bah, never get there... */
  1468. }
  1469. /*------------------------------------------------------------------*/
  1470. /*
  1471.  * Give the list of available frequencies.
  1472.  */
  1473. static inline int wv_frequency_list(unsigned long ioaddr, /* I/O port of the card */
  1474.     iw_freq * list, /* List of frequencies to fill */
  1475.     int max)
  1476. { /* Maximum number of frequencies */
  1477. u16 table[10]; /* Authorized frequency table */
  1478. long freq = 0L; /* offset to 2.4 GHz in .5 MHz + 12 MHz */
  1479. int i; /* index in the table */
  1480. int c = 0; /* Channel number */
  1481. /* Read the frequency table. */
  1482. fee_read(ioaddr, 0x71 /* frequency table */ , table, 10);
  1483. /* Check all frequencies. */
  1484. i = 0;
  1485. for (freq = 0; freq < 150; freq++)
  1486. /* Look in the table if the frequency is allowed */
  1487. if (table[9 - (freq / 16)] & (1 << (freq % 16))) {
  1488. /* Compute approximate channel number */
  1489. while ((((channel_bands[c] >> 1) - 24) < freq) &&
  1490.        (c < NELS(channel_bands)))
  1491. c++;
  1492. list[i].i = c; /* Set the list index */
  1493. /* put in the list */
  1494. list[i].m = (((freq + 24) * 5) + 24000L) * 10000;
  1495. list[i++].e = 1;
  1496. /* Check number. */
  1497. if (i >= max)
  1498. return (i);
  1499. }
  1500. return (i);
  1501. }
  1502. #ifdef WIRELESS_SPY
  1503. /*------------------------------------------------------------------*/
  1504. /*
  1505.  * Gather wireless spy statistics:  for each packet, compare the source
  1506.  * address with our list, and if they match, get the statistics.
  1507.  * Sorry, but this function really needs the wireless extensions.
  1508.  */
  1509. static inline void wl_spy_gather(device * dev, u8 * mac, /* MAC address */
  1510.  u8 * stats)
  1511. { /* Statistics to gather */
  1512. net_local *lp = (net_local *) dev->priv;
  1513. int i;
  1514. /* Check all addresses. */
  1515. for (i = 0; i < lp->spy_number; i++)
  1516. /* If match */
  1517. if (!memcmp(mac, lp->spy_address[i], WAVELAN_ADDR_SIZE)) {
  1518. /* Update statistics */
  1519. lp->spy_stat[i].qual = stats[2] & MMR_SGNL_QUAL;
  1520. lp->spy_stat[i].level = stats[0] & MMR_SIGNAL_LVL;
  1521. lp->spy_stat[i].noise = stats[1] & MMR_SILENCE_LVL;
  1522. lp->spy_stat[i].updated = 0x7;
  1523. }
  1524. }
  1525. #endif /* WIRELESS_SPY */
  1526. #ifdef HISTOGRAM
  1527. /*------------------------------------------------------------------*/
  1528. /*
  1529.  * This function calculates a histogram of the signal level.
  1530.  * As the noise is quite constant, it's like doing it on the SNR.
  1531.  * We have defined a set of interval (lp->his_range), and each time
  1532.  * the level goes in that interval, we increment the count (lp->his_sum).
  1533.  * With this histogram you may detect if one WaveLAN is really weak,
  1534.  * or you may also calculate the mean and standard deviation of the level.
  1535.  */
  1536. static inline void wl_his_gather(device * dev, u8 * stats)
  1537. { /* Statistics to gather */
  1538. net_local *lp = (net_local *) dev->priv;
  1539. u8 level = stats[0] & MMR_SIGNAL_LVL;
  1540. int i;
  1541. /* Find the correct interval. */
  1542. i = 0;
  1543. while ((i < (lp->his_number - 1))
  1544.        && (level >= lp->his_range[i++]));
  1545. /* Increment interval counter. */
  1546. (lp->his_sum[i])++;
  1547. }
  1548. #endif /* HISTOGRAM */
  1549. /*------------------------------------------------------------------*/
  1550. /*
  1551.  * Perform ioctl for configuration and information.
  1552.  * It is here that the wireless extensions are treated (iwconfig).
  1553.  */
  1554. static int wavelan_ioctl(struct net_device *dev, /* device on which the ioctl is applied */
  1555.  struct ifreq *rq, /* data passed */
  1556.  int cmd)
  1557. { /* ioctl number */
  1558. unsigned long ioaddr = dev->base_addr;
  1559. net_local *lp = (net_local *) dev->priv; /* lp is not unused */
  1560. struct iwreq *wrq = (struct iwreq *) rq;
  1561. psa_t psa;
  1562. mm_t m;
  1563. unsigned long flags;
  1564. int ret = 0;
  1565. int err = 0;
  1566. #ifdef DEBUG_IOCTL_TRACE
  1567. printk(KERN_DEBUG "%s: ->wavelan_ioctl(cmd=0x%X)n", dev->name,
  1568.        cmd);
  1569. #endif
  1570. /* Disable interrupts and save flags. */
  1571. wv_splhi(lp, &flags);
  1572. /* Look what is the request */
  1573. switch (cmd) {
  1574. /* --------------- WIRELESS EXTENSIONS --------------- */
  1575. case SIOCGIWNAME:
  1576. strcpy(wrq->u.name, "WaveLAN");
  1577. break;
  1578. case SIOCSIWNWID:
  1579. /* Set NWID in WaveLAN. */
  1580. if (!wrq->u.nwid.disabled) {
  1581. /* Set NWID in psa */
  1582. psa.psa_nwid[0] =
  1583.     (wrq->u.nwid.value & 0xFF00) >> 8;
  1584. psa.psa_nwid[1] = wrq->u.nwid.value & 0xFF;
  1585. psa.psa_nwid_select = 0x01;
  1586. psa_write(ioaddr, lp->hacr,
  1587.   (char *) psa.psa_nwid - (char *) &psa,
  1588.   (unsigned char *) psa.psa_nwid, 3);
  1589. /* Set NWID in mmc. */
  1590. m.w.mmw_netw_id_l = psa.psa_nwid[1];
  1591. m.w.mmw_netw_id_h = psa.psa_nwid[0];
  1592. mmc_write(ioaddr,
  1593.   (char *) &m.w.mmw_netw_id_l -
  1594.   (char *) &m,
  1595.   (unsigned char *) &m.w.mmw_netw_id_l, 2);
  1596. mmc_out(ioaddr, mmwoff(0, mmw_loopt_sel), 0x00);
  1597. } else {
  1598. /* Disable NWID in the psa. */
  1599. psa.psa_nwid_select = 0x00;
  1600. psa_write(ioaddr, lp->hacr,
  1601.   (char *) &psa.psa_nwid_select -
  1602.   (char *) &psa,
  1603.   (unsigned char *) &psa.psa_nwid_select,
  1604.   1);
  1605. /* Disable NWID in the mmc (no filtering). */
  1606. mmc_out(ioaddr, mmwoff(0, mmw_loopt_sel),
  1607. MMW_LOOPT_SEL_DIS_NWID);
  1608. }
  1609. /* update the Wavelan checksum */
  1610. update_psa_checksum(dev, ioaddr, lp->hacr);
  1611. break;
  1612. case SIOCGIWNWID:
  1613. /* Read the NWID. */
  1614. psa_read(ioaddr, lp->hacr,
  1615.  (char *) psa.psa_nwid - (char *) &psa,
  1616.  (unsigned char *) psa.psa_nwid, 3);
  1617. wrq->u.nwid.value =
  1618.     (psa.psa_nwid[0] << 8) + psa.psa_nwid[1];
  1619. wrq->u.nwid.disabled = !(psa.psa_nwid_select);
  1620. wrq->u.nwid.fixed = 1; /* Superfluous */
  1621. break;
  1622. case SIOCSIWFREQ:
  1623. /* Attempt to recognise 2.00 cards (2.4 GHz frequency selectable). */
  1624. if (!(mmc_in(ioaddr, mmroff(0, mmr_fee_status)) &
  1625.       (MMR_FEE_STATUS_DWLD | MMR_FEE_STATUS_BUSY)))
  1626. ret = wv_set_frequency(ioaddr, &(wrq->u.freq));
  1627. else
  1628. ret = -EOPNOTSUPP;
  1629. break;
  1630. case SIOCGIWFREQ:
  1631. /* Attempt to recognise 2.00 cards (2.4 GHz frequency selectable).
  1632.  * Does it work for everybody, especially old cards? */
  1633. if (!(mmc_in(ioaddr, mmroff(0, mmr_fee_status)) &
  1634.       (MMR_FEE_STATUS_DWLD | MMR_FEE_STATUS_BUSY))) {
  1635. unsigned short freq;
  1636. /* Ask the EEPROM to read the frequency from the first area. */
  1637. fee_read(ioaddr, 0x00, &freq, 1);
  1638. wrq->u.freq.m = ((freq >> 5) * 5 + 24000L) * 10000;
  1639. wrq->u.freq.e = 1;
  1640. } else {
  1641. psa_read(ioaddr, lp->hacr,
  1642.  (char *) &psa.psa_subband - (char *) &psa,
  1643.  (unsigned char *) &psa.psa_subband, 1);
  1644. if (psa.psa_subband <= 4) {
  1645. wrq->u.freq.m =
  1646.     fixed_bands[psa.psa_subband];
  1647. wrq->u.freq.e = (psa.psa_subband != 0);
  1648. } else
  1649. ret = -EOPNOTSUPP;
  1650. }
  1651. break;
  1652. case SIOCSIWSENS:
  1653. /* Set the level threshold. */
  1654. /* We should complain loudly if wrq->u.sens.fixed = 0, because we
  1655.  * can't set auto mode... */
  1656. psa.psa_thr_pre_set = wrq->u.sens.value & 0x3F;
  1657. psa_write(ioaddr, lp->hacr,
  1658.   (char *) &psa.psa_thr_pre_set - (char *) &psa,
  1659.   (unsigned char *) &psa.psa_thr_pre_set, 1);
  1660. /* update the Wavelan checksum */
  1661. update_psa_checksum(dev, ioaddr, lp->hacr);
  1662. mmc_out(ioaddr, mmwoff(0, mmw_thr_pre_set),
  1663. psa.psa_thr_pre_set);
  1664. break;
  1665. case SIOCGIWSENS:
  1666. /* Read the level threshold. */
  1667. psa_read(ioaddr, lp->hacr,
  1668.  (char *) &psa.psa_thr_pre_set - (char *) &psa,
  1669.  (unsigned char *) &psa.psa_thr_pre_set, 1);
  1670. wrq->u.sens.value = psa.psa_thr_pre_set & 0x3F;
  1671. wrq->u.sens.fixed = 1;
  1672. break;
  1673. case SIOCSIWENCODE:
  1674. /* Set encryption key */
  1675. if (!mmc_encr(ioaddr)) {
  1676. ret = -EOPNOTSUPP;
  1677. break;
  1678. }
  1679. /* Basic checking... */
  1680. if (wrq->u.encoding.pointer != (caddr_t) 0) {
  1681. /* Check the size of the key */
  1682. if (wrq->u.encoding.length != 8) {
  1683. ret = -EINVAL;
  1684. break;
  1685. }
  1686. /* Copy the key in the driver */
  1687. wv_splx(lp, &flags);
  1688. err = copy_from_user(psa.psa_encryption_key,
  1689.      wrq->u.encoding.pointer,
  1690.      wrq->u.encoding.length);
  1691. wv_splhi(lp, &flags);
  1692. if (err) {
  1693. ret = -EFAULT;
  1694. break;
  1695. }
  1696. psa.psa_encryption_select = 1;
  1697. psa_write(ioaddr, lp->hacr,
  1698.   (char *) &psa.psa_encryption_select -
  1699.   (char *) &psa,
  1700.   (unsigned char *) &psa.
  1701.   psa_encryption_select, 8 + 1);
  1702. mmc_out(ioaddr, mmwoff(0, mmw_encr_enable),
  1703. MMW_ENCR_ENABLE_EN | MMW_ENCR_ENABLE_MODE);
  1704. mmc_write(ioaddr, mmwoff(0, mmw_encr_key),
  1705.   (unsigned char *) &psa.
  1706.   psa_encryption_key, 8);
  1707. }
  1708. if (wrq->u.encoding.flags & IW_ENCODE_DISABLED) { /* disable encryption */
  1709. psa.psa_encryption_select = 0;
  1710. psa_write(ioaddr, lp->hacr,
  1711.   (char *) &psa.psa_encryption_select -
  1712.   (char *) &psa,
  1713.   (unsigned char *) &psa.
  1714.   psa_encryption_select, 1);
  1715. mmc_out(ioaddr, mmwoff(0, mmw_encr_enable), 0);
  1716. }
  1717. /* update the Wavelan checksum */
  1718. update_psa_checksum(dev, ioaddr, lp->hacr);
  1719. break;
  1720. case SIOCGIWENCODE:
  1721. /* Read the encryption key */
  1722. if (!mmc_encr(ioaddr)) {
  1723. ret = -EOPNOTSUPP;
  1724. break;
  1725. }
  1726. /* only super-user can see encryption key */
  1727. if (!capable(CAP_NET_ADMIN)) {
  1728. ret = -EPERM;
  1729. break;
  1730. }
  1731. /* Basic checking... */
  1732. if (wrq->u.encoding.pointer != (caddr_t) 0) {
  1733. /* Verify the user buffer */
  1734. ret =
  1735.     verify_area(VERIFY_WRITE,
  1736. wrq->u.encoding.pointer, 8);
  1737. if (ret)
  1738. break;
  1739. psa_read(ioaddr, lp->hacr,
  1740.  (char *) &psa.psa_encryption_select -
  1741.  (char *) &psa,
  1742.  (unsigned char *) &psa.
  1743.  psa_encryption_select, 1 + 8);
  1744. /* encryption is enabled ? */
  1745. if (psa.psa_encryption_select)
  1746. wrq->u.encoding.flags = IW_ENCODE_ENABLED;
  1747. else
  1748. wrq->u.encoding.flags = IW_ENCODE_DISABLED;
  1749. wrq->u.encoding.flags |= mmc_encr(ioaddr);
  1750. /* Copy the key to the user buffer */
  1751. wrq->u.encoding.length = 8;
  1752. wv_splx(lp, &flags);
  1753. if (copy_to_user(wrq->u.encoding.pointer,
  1754.  psa.psa_encryption_key, 8))
  1755. ret = -EFAULT;
  1756. wv_splhi(lp, &flags);
  1757. }
  1758. break;
  1759. case SIOCGIWRANGE:
  1760. /* basic checking */
  1761. if (wrq->u.data.pointer != (caddr_t) 0) {
  1762. struct iw_range range;
  1763. /* Set the length (very important for backward
  1764.  * compatibility) */
  1765. wrq->u.data.length = sizeof(struct iw_range);
  1766. /* Set all the info we don't care or don't know
  1767.  * about to zero */
  1768. memset(&range, 0, sizeof(range));
  1769. /* Set the Wireless Extension versions */
  1770. range.we_version_compiled = WIRELESS_EXT;
  1771. range.we_version_source = 9;
  1772. /* Set information in the range struct.  */
  1773. range.throughput = 1.6 * 1000 * 1000; /* don't argue on this ! */
  1774. range.min_nwid = 0x0000;
  1775. range.max_nwid = 0xFFFF;
  1776. /* Attempt to recognise 2.00 cards (2.4 GHz frequency selectable). */
  1777. if (!(mmc_in(ioaddr, mmroff(0, mmr_fee_status)) &
  1778.       (MMR_FEE_STATUS_DWLD | MMR_FEE_STATUS_BUSY))) {
  1779. range.num_channels = 10;
  1780. range.num_frequency =
  1781.     wv_frequency_list(ioaddr, range.freq,
  1782.       IW_MAX_FREQUENCIES);
  1783. } else
  1784. range.num_channels = range.num_frequency =
  1785.     0;
  1786. range.sensitivity = 0x3F;
  1787. range.max_qual.qual = MMR_SGNL_QUAL;
  1788. range.max_qual.level = MMR_SIGNAL_LVL;
  1789. range.max_qual.noise = MMR_SILENCE_LVL;
  1790. range.avg_qual.qual = MMR_SGNL_QUAL; /* Always max */
  1791. /* Need to get better values for those two */
  1792. range.avg_qual.level = 30;
  1793. range.avg_qual.noise = 8;
  1794. range.num_bitrates = 1;
  1795. range.bitrate[0] = 2000000; /* 2 Mb/s */
  1796. /* Encryption supported ? */
  1797. if (mmc_encr(ioaddr)) {
  1798. range.encoding_size[0] = 8; /* DES = 64 bits key */
  1799. range.num_encoding_sizes = 1;
  1800. range.max_encoding_tokens = 1; /* Only one key possible */
  1801. } else {
  1802. range.num_encoding_sizes = 0;
  1803. range.max_encoding_tokens = 0;
  1804. }
  1805. /* Copy structure to the user buffer. */
  1806. wv_splx(lp, &flags);
  1807. if (copy_to_user(wrq->u.data.pointer,
  1808.  &range,
  1809.  sizeof(struct iw_range)))
  1810. ret = -EFAULT;
  1811. wv_splhi(lp, &flags);
  1812. }
  1813. break;
  1814. case SIOCGIWPRIV:
  1815. /* Basic checking */
  1816. if (wrq->u.data.pointer != (caddr_t) 0) {
  1817. struct iw_priv_args priv[] = {
  1818. /* { cmd,
  1819.      set_args,
  1820.      get_args,
  1821.      name } */
  1822. { SIOCSIPQTHR,
  1823.   IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,
  1824.   0,
  1825.   "setqualthr" },
  1826. { SIOCGIPQTHR,
  1827.   0,
  1828.   IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,
  1829.   "getqualthr" },
  1830. { SIOCSIPHISTO,
  1831.   IW_PRIV_TYPE_BYTE | 16,
  1832.   0,
  1833.   "sethisto" },
  1834. { SIOCGIPHISTO,
  1835.   0,
  1836.   IW_PRIV_TYPE_INT | 16,
  1837.  "gethisto" },
  1838. };
  1839. /* Set the number of available ioctls. */
  1840. wrq->u.data.length = 4;
  1841. /* Copy structure to the user buffer. */
  1842. wv_splx(lp, &flags);
  1843. if (copy_to_user(wrq->u.data.pointer,
  1844.       (u8 *) priv,
  1845.       sizeof(priv)))
  1846. ret = -EFAULT;
  1847. wv_splhi(lp, &flags);
  1848. }
  1849. break;
  1850. #ifdef WIRELESS_SPY
  1851. case SIOCSIWSPY:
  1852. /* Set the spy list */
  1853. /* Check the number of addresses. */
  1854. if (wrq->u.data.length > IW_MAX_SPY) {
  1855. ret = -E2BIG;
  1856. break;
  1857. }
  1858. lp->spy_number = wrq->u.data.length;
  1859. /* Are there are addresses to copy? */
  1860. if (lp->spy_number > 0) {
  1861. struct sockaddr address[IW_MAX_SPY];
  1862. int i;
  1863. /* Copy addresses to the driver. */
  1864. wv_splx(lp, &flags);
  1865. err = copy_from_user(address,
  1866.      wrq->u.data.pointer,
  1867.      sizeof(struct sockaddr)
  1868.      * lp->spy_number);
  1869. wv_splhi(lp, &flags);
  1870. if (err) {
  1871. ret = -EFAULT;
  1872. break;
  1873. }
  1874. /* Copy addresses to the lp structure. */
  1875. for (i = 0; i < lp->spy_number; i++) {
  1876. memcpy(lp->spy_address[i],
  1877.        address[i].sa_data,
  1878.        WAVELAN_ADDR_SIZE);
  1879. }
  1880. /* Reset structure. */
  1881. memset(lp->spy_stat, 0x00,
  1882.        sizeof(iw_qual) * IW_MAX_SPY);
  1883. #ifdef DEBUG_IOCTL_INFO
  1884. printk(KERN_DEBUG
  1885.        "SetSpy:  set of new addresses is: n");
  1886. for (i = 0; i < wrq->u.data.length; i++)
  1887. printk(KERN_DEBUG
  1888.        "%02X:%02X:%02X:%02X:%02X:%02X n",
  1889.        lp->spy_address[i][0],
  1890.        lp->spy_address[i][1],
  1891.        lp->spy_address[i][2],
  1892.        lp->spy_address[i][3],
  1893.        lp->spy_address[i][4],
  1894.        lp->spy_address[i][5]);
  1895. #endif /* DEBUG_IOCTL_INFO */
  1896. }
  1897. break;
  1898. case SIOCGIWSPY:
  1899. /* Get the spy list and spy stats. */
  1900. /* Set the number of addresses */
  1901. wrq->u.data.length = lp->spy_number;
  1902. /* Does the user want to have the addresses back? */
  1903. if ((lp->spy_number > 0)
  1904.     && (wrq->u.data.pointer != (caddr_t) 0)) {
  1905. struct sockaddr address[IW_MAX_SPY];
  1906. int i;
  1907. /* Copy addresses from the lp structure. */
  1908. for (i = 0; i < lp->spy_number; i++) {
  1909. memcpy(address[i].sa_data,
  1910.        lp->spy_address[i],
  1911.        WAVELAN_ADDR_SIZE);
  1912. address[i].sa_family = AF_UNIX;
  1913. }
  1914. /* Copy addresses to the user buffer. */
  1915. wv_splx(lp, &flags);
  1916. err = copy_to_user(wrq->u.data.pointer,
  1917.    address,
  1918.    sizeof(struct sockaddr)
  1919.    * lp->spy_number);
  1920. /* Copy stats to the user buffer (just after). */
  1921. err |= copy_to_user(wrq->u.data.pointer
  1922.     + (sizeof(struct sockaddr)
  1923.        * lp->spy_number),
  1924.     lp->spy_stat,
  1925.     sizeof(iw_qual) * lp->spy_number);
  1926. wv_splhi(lp, &flags);
  1927. if (err) {
  1928. ret = -EFAULT;
  1929. break;
  1930. }
  1931. /* Reset updated flags. */
  1932. for (i = 0; i < lp->spy_number; i++)
  1933. lp->spy_stat[i].updated = 0x0;
  1934. }
  1935. /* if(pointer != NULL) */
  1936. break;
  1937. #endif /* WIRELESS_SPY */
  1938. /* ------------------ PRIVATE IOCTL ------------------ */
  1939. case SIOCSIPQTHR:
  1940. if (!capable(CAP_NET_ADMIN)) {
  1941. ret = -EPERM;
  1942. break;
  1943. }
  1944. psa.psa_quality_thr = *(wrq->u.name) & 0x0F;
  1945. psa_write(ioaddr, lp->hacr,
  1946.   (char *) &psa.psa_quality_thr - (char *) &psa,
  1947.   (unsigned char *) &psa.psa_quality_thr, 1);
  1948. /* update the Wavelan checksum */
  1949. update_psa_checksum(dev, ioaddr, lp->hacr);
  1950. mmc_out(ioaddr, mmwoff(0, mmw_quality_thr),
  1951. psa.psa_quality_thr);
  1952. break;
  1953. case SIOCGIPQTHR:
  1954. psa_read(ioaddr, lp->hacr,
  1955.  (char *) &psa.psa_quality_thr - (char *) &psa,
  1956.  (unsigned char *) &psa.psa_quality_thr, 1);
  1957. *(wrq->u.name) = psa.psa_quality_thr & 0x0F;
  1958. break;
  1959. #ifdef HISTOGRAM
  1960. case SIOCSIPHISTO:
  1961. /* Verify that the user is root. */
  1962. if (!capable(CAP_NET_ADMIN)) {
  1963. ret = -EPERM;
  1964. break;
  1965. }
  1966. /* Check the number of intervals. */
  1967. if (wrq->u.data.length > 16) {
  1968. ret = -E2BIG;
  1969. break;
  1970. }
  1971. lp->his_number = wrq->u.data.length;
  1972. /* Are there addresses to copy? */
  1973. if (lp->his_number > 0) {
  1974. /* Copy interval ranges to the driver */
  1975. wv_splx(lp, &flags);
  1976. err = copy_from_user(lp->his_range,
  1977.      wrq->u.data.pointer,
  1978.      sizeof(char) * lp->his_number);
  1979. wv_splhi(lp, &flags);
  1980. if (err) {
  1981. ret = -EFAULT;
  1982. break;
  1983. }
  1984. /* Reset structure. */
  1985. memset(lp->his_sum, 0x00, sizeof(long) * 16);
  1986. }
  1987. break;
  1988. case SIOCGIPHISTO:
  1989. /* Set the number of intervals. */
  1990. wrq->u.data.length = lp->his_number;
  1991. /* Give back the distribution statistics */
  1992. if ((lp->his_number > 0)
  1993.     && (wrq->u.data.pointer != (caddr_t) 0)) {
  1994. /* Copy data to the user buffer. */
  1995. wv_splx(lp, &flags);
  1996. if (copy_to_user(wrq->u.data.pointer,
  1997.  lp->his_sum,
  1998.  sizeof(long) * lp->his_number);
  1999. ret = -EFAULT;
  2000. wv_splhi(lp, &flags);
  2001. } /* if(pointer != NULL) */
  2002. break;
  2003. #endif /* HISTOGRAM */
  2004. /* ------------------- OTHER IOCTL ------------------- */
  2005. default:
  2006. ret = -EOPNOTSUPP;
  2007. } /* switch (cmd) */
  2008. /* Enable interrupts and restore flags. */
  2009. wv_splx(lp, &flags);
  2010. #ifdef DEBUG_IOCTL_TRACE
  2011. printk(KERN_DEBUG "%s: <-wavelan_ioctl()n", dev->name);
  2012. #endif
  2013. return ret;
  2014. }
  2015. /*------------------------------------------------------------------*/
  2016. /*
  2017.  * Get wireless statistics.
  2018.  * Called by /proc/net/wireless
  2019.  */
  2020. static iw_stats *wavelan_get_wireless_stats(device * dev)
  2021. {
  2022. unsigned long ioaddr = dev->base_addr;
  2023. net_local *lp = (net_local *) dev->priv;
  2024. mmr_t m;
  2025. iw_stats *wstats;
  2026. unsigned long flags;
  2027. #ifdef DEBUG_IOCTL_TRACE
  2028. printk(KERN_DEBUG "%s: ->wavelan_get_wireless_stats()n",
  2029.        dev->name);
  2030. #endif
  2031. /* Check */
  2032. if (lp == (net_local *) NULL)
  2033. return (iw_stats *) NULL;
  2034. /* Disable interrupts and save flags. */
  2035. wv_splhi(lp, &flags);
  2036. wstats = &lp->wstats;
  2037. /* Get data from the mmc. */
  2038. mmc_out(ioaddr, mmwoff(0, mmw_freeze), 1);
  2039. mmc_read(ioaddr, mmroff(0, mmr_dce_status), &m.mmr_dce_status, 1);
  2040. mmc_read(ioaddr, mmroff(0, mmr_wrong_nwid_l), &m.mmr_wrong_nwid_l,
  2041.  2);
  2042. mmc_read(ioaddr, mmroff(0, mmr_thr_pre_set), &m.mmr_thr_pre_set,
  2043.  4);
  2044. mmc_out(ioaddr, mmwoff(0, mmw_freeze), 0);
  2045. /* Copy data to wireless stuff. */
  2046. wstats->status = m.mmr_dce_status & MMR_DCE_STATUS;
  2047. wstats->qual.qual = m.mmr_sgnl_qual & MMR_SGNL_QUAL;
  2048. wstats->qual.level = m.mmr_signal_lvl & MMR_SIGNAL_LVL;
  2049. wstats->qual.noise = m.mmr_silence_lvl & MMR_SILENCE_LVL;
  2050. wstats->qual.updated = (((m. mmr_signal_lvl & MMR_SIGNAL_LVL_VALID) >> 7) 
  2051. | ((m.mmr_signal_lvl & MMR_SIGNAL_LVL_VALID) >> 6) 
  2052. | ((m.mmr_silence_lvl & MMR_SILENCE_LVL_VALID) >> 5));
  2053. wstats->discard.nwid += (m.mmr_wrong_nwid_h << 8) | m.mmr_wrong_nwid_l;
  2054. wstats->discard.code = 0L;
  2055. wstats->discard.misc = 0L;
  2056. /* Enable interrupts and restore flags. */
  2057. wv_splx(lp, &flags);
  2058. #ifdef DEBUG_IOCTL_TRACE
  2059. printk(KERN_DEBUG "%s: <-wavelan_get_wireless_stats()n",
  2060.        dev->name);
  2061. #endif
  2062. return &lp->wstats;
  2063. }
  2064. #endif /* WIRELESS_EXT */
  2065. /************************* PACKET RECEPTION *************************/
  2066. /*
  2067.  * This part deals with receiving the packets.
  2068.  * The interrupt handler gets an interrupt when a packet has been
  2069.  * successfully received and calls this part.
  2070.  */
  2071. /*------------------------------------------------------------------*/
  2072. /*
  2073.  * This routine does the actual copying of data (including the Ethernet
  2074.  * header structure) from the WaveLAN card to an sk_buff chain that
  2075.  * will be passed up to the network interface layer. NOTE: we
  2076.  * currently don't handle trailer protocols (neither does the rest of
  2077.  * the network interface), so if that is needed, it will (at least in
  2078.  * part) be added here.  The contents of the receive ring buffer are
  2079.  * copied to a message chain that is then passed to the kernel.
  2080.  *
  2081.  * Note: if any errors occur, the packet is "dropped on the floor".
  2082.  * (called by wv_packet_rcv())
  2083.  */
  2084. static inline void
  2085. wv_packet_read(device * dev, u16 buf_off, int sksize)
  2086. {
  2087. net_local *lp = (net_local *) dev->priv;
  2088. unsigned long ioaddr = dev->base_addr;
  2089. struct sk_buff *skb;
  2090. #ifdef DEBUG_RX_TRACE
  2091. printk(KERN_DEBUG "%s: ->wv_packet_read(0x%X, %d)n",
  2092.        dev->name, buf_off, sksize);
  2093. #endif
  2094. /* Allocate buffer for the data */
  2095. if ((skb = dev_alloc_skb(sksize)) == (struct sk_buff *) NULL) {
  2096. #ifdef DEBUG_RX_ERROR
  2097. printk(KERN_INFO
  2098.        "%s: wv_packet_read(): could not alloc_skb(%d, GFP_ATOMIC).n",
  2099.        dev->name, sksize);
  2100. #endif
  2101. lp->stats.rx_dropped++;
  2102. return;
  2103. }
  2104. skb->dev = dev;
  2105. /* Copy the packet to the buffer. */
  2106. obram_read(ioaddr, buf_off, skb_put(skb, sksize), sksize);
  2107. skb->protocol = eth_type_trans(skb, dev);
  2108. #ifdef DEBUG_RX_INFO
  2109. wv_packet_info(skb->mac.raw, sksize, dev->name, "wv_packet_read");
  2110. #endif /* DEBUG_RX_INFO */
  2111. /* Statistics-gathering and associated stuff.
  2112.  * It seem a bit messy with all the define, but it's really simple... */
  2113. #if defined(WIRELESS_SPY) || defined(HISTOGRAM)
  2114. if (
  2115. #ifdef WIRELESS_SPY
  2116.    (lp->spy_number > 0) ||
  2117. #endif /* WIRELESS_SPY */
  2118. #ifdef HISTOGRAM
  2119.    (lp->his_number > 0) ||
  2120. #endif /* HISTOGRAM */
  2121.    0) {
  2122. u8 stats[3]; /* signal level, noise level, signal quality */
  2123. /* Read signal level, silence level and signal quality bytes. */
  2124. /* Note: in the PCMCIA hardware, these are part of the frame.  It seems
  2125.  * that for the ISA hardware, it's nowhere to be found in the frame,
  2126.  * so I'm obliged to do this (it has a side effect on /proc/net/wireless).
  2127.  * Any ideas?
  2128.  */
  2129. mmc_out(ioaddr, mmwoff(0, mmw_freeze), 1);
  2130. mmc_read(ioaddr, mmroff(0, mmr_signal_lvl), stats, 3);
  2131. mmc_out(ioaddr, mmwoff(0, mmw_freeze), 0);
  2132. #ifdef DEBUG_RX_INFO
  2133. printk(KERN_DEBUG
  2134.        "%s: wv_packet_read(): Signal level %d/63, Silence level %d/63, signal quality %d/16n",
  2135.        dev->name, stats[0] & 0x3F, stats[1] & 0x3F,
  2136.        stats[2] & 0x0F);
  2137. #endif
  2138. /* Spying stuff */
  2139. #ifdef WIRELESS_SPY
  2140. wl_spy_gather(dev, skb->mac.raw + WAVELAN_ADDR_SIZE,
  2141.       stats);
  2142. #endif /* WIRELESS_SPY */
  2143. #ifdef HISTOGRAM
  2144. wl_his_gather(dev, stats);
  2145. #endif /* HISTOGRAM */
  2146. }
  2147. #endif /* defined(WIRELESS_SPY) || defined(HISTOGRAM) */
  2148. /*
  2149.  * Hand the packet to the network module.
  2150.  */
  2151. netif_rx(skb);
  2152. /* Keep statistics up to date */
  2153. dev->last_rx = jiffies;
  2154. lp->stats.rx_packets++;
  2155. lp->stats.rx_bytes += sksize;
  2156. #ifdef DEBUG_RX_TRACE
  2157. printk(KERN_DEBUG "%s: <-wv_packet_read()n", dev->name);
  2158. #endif
  2159. }
  2160. /*------------------------------------------------------------------*/
  2161. /*
  2162.  * Transfer as many packets as we can
  2163.  * from the device RAM.
  2164.  * (called in wavelan_interrupt()).
  2165.  * Note : the spinlock is already grabbed for us.
  2166.  */
  2167. static inline void wv_receive(device * dev)
  2168. {
  2169. unsigned long ioaddr = dev->base_addr;
  2170. net_local *lp = (net_local *) dev->priv;
  2171. fd_t fd;
  2172. rbd_t rbd;
  2173. int nreaped = 0;
  2174. #ifdef DEBUG_RX_TRACE
  2175. printk(KERN_DEBUG "%s: ->wv_receive()n", dev->name);
  2176. #endif
  2177. /* Loop on each received packet. */
  2178. for (;;) {
  2179. obram_read(ioaddr, lp->rx_head, (unsigned char *) &fd,
  2180.    sizeof(fd));
  2181. /* Note about the status :
  2182.  * It start up to be 0 (the value we set). Then, when the RU
  2183.  * grab the buffer to prepare for reception, it sets the
  2184.  * FD_STATUS_B flag. When the RU has finished receiving the
  2185.  * frame, it clears FD_STATUS_B, set FD_STATUS_C to indicate
  2186.  * completion and set the other flags to indicate the eventual
  2187.  * errors. FD_STATUS_OK indicates that the reception was OK.
  2188.  */
  2189. /* If the current frame is not complete, we have reached the end. */
  2190. if ((fd.fd_status & FD_STATUS_C) != FD_STATUS_C)
  2191. break; /* This is how we exit the loop. */
  2192. nreaped++;
  2193. /* Check whether frame was correctly received. */
  2194. if ((fd.fd_status & FD_STATUS_OK) == FD_STATUS_OK) {
  2195. /* Does the frame contain a pointer to the data?  Let's check. */
  2196. if (fd.fd_rbd_offset != I82586NULL) {
  2197. /* Read the receive buffer descriptor */
  2198. obram_read(ioaddr, fd.fd_rbd_offset,
  2199.    (unsigned char *) &rbd,
  2200.    sizeof(rbd));
  2201. #ifdef DEBUG_RX_ERROR
  2202. if ((rbd.rbd_status & RBD_STATUS_EOF) !=
  2203.     RBD_STATUS_EOF) printk(KERN_INFO
  2204.    "%s: wv_receive(): missing EOF flag.n",
  2205.    dev->name);
  2206. if ((rbd.rbd_status & RBD_STATUS_F) !=
  2207.     RBD_STATUS_F) printk(KERN_INFO
  2208.  "%s: wv_receive(): missing F flag.n",
  2209.  dev->name);
  2210. #endif /* DEBUG_RX_ERROR */
  2211. /* Read the packet and transmit to Linux */
  2212. wv_packet_read(dev, rbd.rbd_bufl,
  2213.        rbd.
  2214.        rbd_status &
  2215.        RBD_STATUS_ACNT);
  2216. }
  2217. #ifdef DEBUG_RX_ERROR
  2218. else /* if frame has no data */
  2219. printk(KERN_INFO
  2220.        "%s: wv_receive(): frame has no data.n",
  2221.        dev->name);
  2222. #endif
  2223. } else { /* If reception was no successful */
  2224. lp->stats.rx_errors++;
  2225. #ifdef DEBUG_RX_INFO
  2226. printk(KERN_DEBUG
  2227.        "%s: wv_receive(): frame not received successfully (%X).n",
  2228.        dev->name, fd.fd_status);
  2229. #endif
  2230. #ifdef DEBUG_RX_ERROR
  2231. if ((fd.fd_status & FD_STATUS_S6) != 0)
  2232. printk(KERN_INFO
  2233.        "%s: wv_receive(): no EOF flag.n",
  2234.        dev->name);
  2235. #endif
  2236. if ((fd.fd_status & FD_STATUS_S7) != 0) {
  2237. lp->stats.rx_length_errors++;
  2238. #ifdef DEBUG_RX_FAIL
  2239. printk(KERN_DEBUG
  2240.        "%s: wv_receive(): frame too short.n",
  2241.        dev->name);
  2242. #endif
  2243. }
  2244. if ((fd.fd_status & FD_STATUS_S8) != 0) {
  2245. lp->stats.rx_over_errors++;
  2246. #ifdef DEBUG_RX_FAIL
  2247. printk(KERN_DEBUG
  2248.        "%s: wv_receive(): rx DMA overrun.n",
  2249.        dev->name);
  2250. #endif
  2251. }
  2252. if ((fd.fd_status & FD_STATUS_S9) != 0) {
  2253. lp->stats.rx_fifo_errors++;
  2254. #ifdef DEBUG_RX_FAIL
  2255. printk(KERN_DEBUG
  2256.        "%s: wv_receive(): ran out of resources.n",
  2257.        dev->name);
  2258. #endif
  2259. }
  2260. if ((fd.fd_status & FD_STATUS_S10) != 0) {
  2261. lp->stats.rx_frame_errors++;
  2262. #ifdef DEBUG_RX_FAIL
  2263. printk(KERN_DEBUG
  2264.        "%s: wv_receive(): alignment error.n",
  2265.        dev->name);
  2266. #endif
  2267. }
  2268. if ((fd.fd_status & FD_STATUS_S11) != 0) {
  2269. lp->stats.rx_crc_errors++;
  2270. #ifdef DEBUG_RX_FAIL
  2271. printk(KERN_DEBUG
  2272.        "%s: wv_receive(): CRC error.n",
  2273.        dev->name);
  2274. #endif
  2275. }
  2276. }
  2277. fd.fd_status = 0;
  2278. obram_write(ioaddr, fdoff(lp->rx_head, fd_status),
  2279.     (unsigned char *) &fd.fd_status,
  2280.     sizeof(fd.fd_status));
  2281. fd.fd_command = FD_COMMAND_EL;
  2282. obram_write(ioaddr, fdoff(lp->rx_head, fd_command),
  2283.     (unsigned char *) &fd.fd_command,
  2284.     sizeof(fd.fd_command));
  2285. fd.fd_command = 0;
  2286. obram_write(ioaddr, fdoff(lp->rx_last, fd_command),
  2287.     (unsigned char *) &fd.fd_command,
  2288.     sizeof(fd.fd_command));
  2289. lp->rx_last = lp->rx_head;
  2290. lp->rx_head = fd.fd_link_offset;
  2291. } /* for(;;) -> loop on all frames */
  2292. #ifdef DEBUG_RX_INFO
  2293. if (nreaped > 1)
  2294. printk(KERN_DEBUG "%s: wv_receive(): reaped %dn",
  2295.        dev->name, nreaped);
  2296. #endif
  2297. #ifdef DEBUG_RX_TRACE
  2298. printk(KERN_DEBUG "%s: <-wv_receive()n", dev->name);
  2299. #endif
  2300. }
  2301. /*********************** PACKET TRANSMISSION ***********************/
  2302. /*
  2303.  * This part deals with sending packets through the WaveLAN.
  2304.  *
  2305.  */
  2306. /*------------------------------------------------------------------*/
  2307. /*
  2308.  * This routine fills in the appropriate registers and memory
  2309.  * locations on the WaveLAN card and starts the card off on
  2310.  * the transmit.
  2311.  *
  2312.  * The principle:
  2313.  * Each block contains a transmit command, a NOP command,
  2314.  * a transmit block descriptor and a buffer.
  2315.  * The CU read the transmit block which point to the tbd,
  2316.  * read the tbd and the content of the buffer.
  2317.  * When it has finish with it, it goes to the next command
  2318.  * which in our case is the NOP. The NOP points on itself,
  2319.  * so the CU stop here.
  2320.  * When we add the next block, we modify the previous nop
  2321.  * to make it point on the new tx command.
  2322.  * Simple, isn't it ?
  2323.  *
  2324.  * (called in wavelan_packet_xmit())
  2325.  */
  2326. static inline int wv_packet_write(device * dev, void *buf, short length)
  2327. {
  2328. net_local *lp = (net_local *) dev->priv;
  2329. unsigned long ioaddr = dev->base_addr;
  2330. unsigned short txblock;
  2331. unsigned short txpred;
  2332. unsigned short tx_addr;
  2333. unsigned short nop_addr;
  2334. unsigned short tbd_addr;
  2335. unsigned short buf_addr;
  2336. ac_tx_t tx;
  2337. ac_nop_t nop;
  2338. tbd_t tbd;
  2339. int clen = length;
  2340. unsigned long flags;
  2341. #ifdef DEBUG_TX_TRACE
  2342. printk(KERN_DEBUG "%s: ->wv_packet_write(%d)n", dev->name,
  2343.        length);
  2344. #endif
  2345. /* Do we need some padding? */
  2346. if (clen < ETH_ZLEN)
  2347. clen = ETH_ZLEN;
  2348. wv_splhi(lp, &flags);
  2349. /* Check nothing bad has happened */
  2350. if (lp->tx_n_in_use == (NTXBLOCKS - 1)) {
  2351. #ifdef DEBUG_TX_ERROR
  2352. printk(KERN_INFO "%s: wv_packet_write(): Tx queue full.n",
  2353.        dev->name);
  2354. #endif
  2355. wv_splx(lp, &flags);
  2356. return 1;
  2357. }
  2358. /* Calculate addresses of next block and previous block. */
  2359. txblock = lp->tx_first_free;
  2360. txpred = txblock - TXBLOCKZ;
  2361. if (txpred < OFFSET_CU)
  2362. txpred += NTXBLOCKS * TXBLOCKZ;
  2363. lp->tx_first_free += TXBLOCKZ;
  2364. if (lp->tx_first_free >= OFFSET_CU + NTXBLOCKS * TXBLOCKZ)
  2365. lp->tx_first_free -= NTXBLOCKS * TXBLOCKZ;
  2366. lp->tx_n_in_use++;
  2367. /* Calculate addresses of the different parts of the block. */
  2368. tx_addr = txblock;
  2369. nop_addr = tx_addr + sizeof(tx);
  2370. tbd_addr = nop_addr + sizeof(nop);
  2371. buf_addr = tbd_addr + sizeof(tbd);
  2372. /*
  2373.  * Transmit command
  2374.  */
  2375. tx.tx_h.ac_status = 0;
  2376. obram_write(ioaddr, toff(ac_tx_t, tx_addr, tx_h.ac_status),
  2377.     (unsigned char *) &tx.tx_h.ac_status,
  2378.     sizeof(tx.tx_h.ac_status));
  2379. /*
  2380.  * NOP command
  2381.  */
  2382. nop.nop_h.ac_status = 0;
  2383. obram_write(ioaddr, toff(ac_nop_t, nop_addr, nop_h.ac_status),
  2384.     (unsigned char *) &nop.nop_h.ac_status,
  2385.     sizeof(nop.nop_h.ac_status));
  2386. nop.nop_h.ac_link = nop_addr;
  2387. obram_write(ioaddr, toff(ac_nop_t, nop_addr, nop_h.ac_link),
  2388.     (unsigned char *) &nop.nop_h.ac_link,
  2389.     sizeof(nop.nop_h.ac_link));
  2390. /*
  2391.  * Transmit buffer descriptor
  2392.  */
  2393. tbd.tbd_status = TBD_STATUS_EOF | (TBD_STATUS_ACNT & clen);
  2394. tbd.tbd_next_bd_offset = I82586NULL;
  2395. tbd.tbd_bufl = buf_addr;
  2396. tbd.tbd_bufh = 0;
  2397. obram_write(ioaddr, tbd_addr, (unsigned char *) &tbd, sizeof(tbd));
  2398. /*
  2399.  * Data
  2400.  */
  2401. obram_write(ioaddr, buf_addr, buf, length);
  2402. /*
  2403.  * Overwrite the predecessor NOP link
  2404.  * so that it points to this txblock.
  2405.  */
  2406. nop_addr = txpred + sizeof(tx);
  2407. nop.nop_h.ac_status = 0;
  2408. obram_write(ioaddr, toff(ac_nop_t, nop_addr, nop_h.ac_status),
  2409.     (unsigned char *) &nop.nop_h.ac_status,
  2410.     sizeof(nop.nop_h.ac_status));
  2411. nop.nop_h.ac_link = txblock;
  2412. obram_write(ioaddr, toff(ac_nop_t, nop_addr, nop_h.ac_link),
  2413.     (unsigned char *) &nop.nop_h.ac_link,
  2414.     sizeof(nop.nop_h.ac_link));
  2415. /* Keep stats up to date. */
  2416. lp->stats.tx_bytes += length;
  2417. if (lp->tx_first_in_use == I82586NULL)
  2418. lp->tx_first_in_use = txblock;
  2419. if (lp->tx_n_in_use < NTXBLOCKS - 1)
  2420. netif_wake_queue(dev);
  2421. wv_splx(lp, &flags);
  2422. #ifdef DEBUG_TX_INFO
  2423. wv_packet_info((u8 *) buf, length, dev->name,
  2424.        "wv_packet_write");
  2425. #endif /* DEBUG_TX_INFO */
  2426. #ifdef DEBUG_TX_TRACE
  2427. printk(KERN_DEBUG "%s: <-wv_packet_write()n", dev->name);
  2428. #endif
  2429. return 0;
  2430. }
  2431. /*------------------------------------------------------------------*/
  2432. /*
  2433.  * This routine is called when we want to send a packet (NET3 callback)
  2434.  * In this routine, we check if the harware is ready to accept
  2435.  * the packet.  We also prevent reentrance.  Then we call the function
  2436.  * to send the packet.
  2437.  */
  2438. static int wavelan_packet_xmit(struct sk_buff *skb, device * dev)
  2439. {
  2440. net_local *lp = (net_local *) dev->priv;
  2441. unsigned long flags;
  2442. #ifdef DEBUG_TX_TRACE
  2443. printk(KERN_DEBUG "%s: ->wavelan_packet_xmit(0x%X)n", dev->name,
  2444.        (unsigned) skb);
  2445. #endif
  2446. /*
  2447.  * Block a timer-based transmit from overlapping.
  2448.  * In other words, prevent reentering this routine.
  2449.  */
  2450. netif_stop_queue(dev);
  2451. /* If somebody has asked to reconfigure the controller, 
  2452.  * we can do it now.
  2453.  */
  2454. if (lp->reconfig_82586) {
  2455. wv_splhi(lp, &flags);
  2456. wv_82586_config(dev);
  2457. wv_splx(lp, &flags);
  2458. /* Check that we can continue */
  2459. if (lp->tx_n_in_use == (NTXBLOCKS - 1))
  2460. return 1;
  2461. }
  2462. #ifdef DEBUG_TX_ERROR
  2463. if (skb->next)
  2464. printk(KERN_INFO "skb has nextn");
  2465. #endif
  2466. /* Write packet on the card */
  2467. if(wv_packet_write(dev, skb->data, skb->len))
  2468. return 1; /* We failed */
  2469. dev_kfree_skb(skb);
  2470. #ifdef DEBUG_TX_TRACE
  2471. printk(KERN_DEBUG "%s: <-wavelan_packet_xmit()n", dev->name);
  2472. #endif
  2473. return 0;
  2474. }
  2475. /*********************** HARDWARE CONFIGURATION ***********************/
  2476. /*
  2477.  * This part does the real job of starting and configuring the hardware.
  2478.  */
  2479. /*--------------------------------------------------------------------*/
  2480. /*
  2481.  * Routine to initialize the Modem Management Controller.
  2482.  * (called by wv_hw_reset())
  2483.  */
  2484. static inline int wv_mmc_init(device * dev)
  2485. {
  2486. unsigned long ioaddr = dev->base_addr;
  2487. net_local *lp = (net_local *) dev->priv;
  2488. psa_t psa;
  2489. mmw_t m;
  2490. int configured;
  2491. #ifdef DEBUG_CONFIG_TRACE
  2492. printk(KERN_DEBUG "%s: ->wv_mmc_init()n", dev->name);
  2493. #endif
  2494. /* Read the parameter storage area. */
  2495. psa_read(ioaddr, lp->hacr, 0, (unsigned char *) &psa, sizeof(psa));
  2496. #ifdef USE_PSA_CONFIG
  2497. configured = psa.psa_conf_status & 1;
  2498. #else
  2499. configured = 0;
  2500. #endif
  2501. /* Is the PSA is not configured */
  2502. if (!configured) {
  2503. /* User will be able to configure NWID later (with iwconfig). */
  2504. psa.psa_nwid[0] = 0;
  2505. psa.psa_nwid[1] = 0;
  2506. /* no NWID checking since NWID is not set */
  2507. psa.psa_nwid_select = 0;
  2508. /* Disable encryption */
  2509. psa.psa_encryption_select = 0;
  2510. /* Set to standard values:
  2511.  * 0x04 for AT,
  2512.  * 0x01 for MCA,
  2513.  * 0x04 for PCMCIA and 2.00 card (AT&T 407-024689/E document)
  2514.  */
  2515. if (psa.psa_comp_number & 1)
  2516. psa.psa_thr_pre_set = 0x01;
  2517. else
  2518. psa.psa_thr_pre_set = 0x04;
  2519. psa.psa_quality_thr = 0x03;
  2520. /* It is configured */
  2521. psa.psa_conf_status |= 1;
  2522. #ifdef USE_PSA_CONFIG
  2523. /* Write the psa. */
  2524. psa_write(ioaddr, lp->hacr,
  2525.   (char *) psa.psa_nwid - (char *) &psa,
  2526.   (unsigned char *) psa.psa_nwid, 4);
  2527. psa_write(ioaddr, lp->hacr,
  2528.   (char *) &psa.psa_thr_pre_set - (char *) &psa,
  2529.   (unsigned char *) &psa.psa_thr_pre_set, 1);
  2530. psa_write(ioaddr, lp->hacr,
  2531.   (char *) &psa.psa_quality_thr - (char *) &psa,
  2532.   (unsigned char *) &psa.psa_quality_thr, 1);
  2533. psa_write(ioaddr, lp->hacr,
  2534.   (char *) &psa.psa_conf_status - (char *) &psa,
  2535.   (unsigned char *) &psa.psa_conf_status, 1);
  2536. /* update the Wavelan checksum */
  2537. update_psa_checksum(dev, ioaddr, lp->hacr);
  2538. #endif
  2539. }
  2540. /* Zero the mmc structure. */
  2541. memset(&m, 0x00, sizeof(m));
  2542. /* Copy PSA info to the mmc. */
  2543. m.mmw_netw_id_l = psa.psa_nwid[1];
  2544. m.mmw_netw_id_h = psa.psa_nwid[0];
  2545. if (psa.psa_nwid_select & 1)
  2546. m.mmw_loopt_sel = 0x00;
  2547. else
  2548. m.mmw_loopt_sel = MMW_LOOPT_SEL_DIS_NWID;
  2549. memcpy(&m.mmw_encr_key, &psa.psa_encryption_key,
  2550.        sizeof(m.mmw_encr_key));
  2551. if (psa.psa_encryption_select)
  2552. m.mmw_encr_enable =
  2553.     MMW_ENCR_ENABLE_EN | MMW_ENCR_ENABLE_MODE;
  2554. else
  2555. m.mmw_encr_enable = 0;
  2556. m.mmw_thr_pre_set = psa.psa_thr_pre_set & 0x3F;
  2557. m.mmw_quality_thr = psa.psa_quality_thr & 0x0F;
  2558. /*
  2559.  * Set default modem control parameters.
  2560.  * See NCR document 407-0024326 Rev. A.
  2561.  */
  2562. m.mmw_jabber_enable = 0x01;
  2563. m.mmw_freeze = 0;
  2564. m.mmw_anten_sel = MMW_ANTEN_SEL_ALG_EN;
  2565. m.mmw_ifs = 0x20;
  2566. m.mmw_mod_delay = 0x04;
  2567. m.mmw_jam_time = 0x38;
  2568. m.mmw_des_io_invert = 0;
  2569. m.mmw_decay_prm = 0;
  2570. m.mmw_decay_updat_prm = 0;
  2571. /* Write all info to MMC. */
  2572. mmc_write(ioaddr, 0, (u8 *) & m, sizeof(m));
  2573. /* The following code starts the modem of the 2.00 frequency
  2574.  * selectable cards at power on.  It's not strictly needed for the
  2575.  * following boots.
  2576.  * The original patch was by Joe Finney for the PCMCIA driver, but
  2577.  * I've cleaned it up a bit and added documentation.
  2578.  * Thanks to Loeke Brederveld from Lucent for the info.
  2579.  */
  2580. /* Attempt to recognise 2.00 cards (2.4 GHz frequency selectable)
  2581.  * Does it work for everybody, especially old cards? */
  2582. /* Note: WFREQSEL verifies that it is able to read a sensible
  2583.  * frequency from EEPROM (address 0x00) and that MMR_FEE_STATUS_ID
  2584.  * is 0xA (Xilinx version) or 0xB (Ariadne version).
  2585.  * My test is more crude but does work. */
  2586. if (!(mmc_in(ioaddr, mmroff(0, mmr_fee_status)) &
  2587.       (MMR_FEE_STATUS_DWLD | MMR_FEE_STATUS_BUSY))) {
  2588. /* We must download the frequency parameters to the
  2589.  * synthesizers (from the EEPROM - area 1)
  2590.  * Note: as the EEPROM is automatically decremented, we set the end
  2591.  * if the area... */
  2592. m.mmw_fee_addr = 0x0F;
  2593. m.mmw_fee_ctrl = MMW_FEE_CTRL_READ | MMW_FEE_CTRL_DWLD;
  2594. mmc_write(ioaddr, (char *) &m.mmw_fee_ctrl - (char *) &m,
  2595.   (unsigned char *) &m.mmw_fee_ctrl, 2);
  2596. /* Wait until the download is finished. */
  2597. fee_wait(ioaddr, 100, 100);
  2598. #ifdef DEBUG_CONFIG_INFO
  2599. /* The frequency was in the last word downloaded. */
  2600. mmc_read(ioaddr, (char *) &m.mmw_fee_data_l - (char *) &m,
  2601.  (unsigned char *) &m.mmw_fee_data_l, 2);
  2602. /* Print some info for the user. */
  2603. printk(KERN_DEBUG
  2604.        "%s: WaveLAN 2.00 recognised (frequency select).  Current frequency = %ldn",
  2605.        dev->name,
  2606.        ((m.
  2607.  mmw_fee_data_h << 4) | (m.mmw_fee_data_l >> 4)) *
  2608.        5 / 2 + 24000L);
  2609. #endif
  2610. /* We must now download the power adjust value (gain) to
  2611.  * the synthesizers (from the EEPROM - area 7 - DAC). */
  2612. m.mmw_fee_addr = 0x61;
  2613. m.mmw_fee_ctrl = MMW_FEE_CTRL_READ | MMW_FEE_CTRL_DWLD;
  2614. mmc_write(ioaddr, (char *) &m.mmw_fee_ctrl - (char *) &m,
  2615.   (unsigned char *) &m.mmw_fee_ctrl, 2);
  2616. /* Wait until the download is finished. */
  2617. }
  2618. /* if 2.00 card */
  2619. #ifdef DEBUG_CONFIG_TRACE
  2620. printk(KERN_DEBUG "%s: <-wv_mmc_init()n", dev->name);
  2621. #endif
  2622. return 0;
  2623. }
  2624. /*------------------------------------------------------------------*/
  2625. /*
  2626.  * Construct the fd and rbd structures.
  2627.  * Start the receive unit.
  2628.  * (called by wv_hw_reset())
  2629.  */
  2630. static inline int wv_ru_start(device * dev)
  2631. {
  2632. net_local *lp = (net_local *) dev->priv;
  2633. unsigned long ioaddr = dev->base_addr;
  2634. u16 scb_cs;
  2635. fd_t fd;
  2636. rbd_t rbd;
  2637. u16 rx;
  2638. u16 rx_next;
  2639. int i;
  2640. #ifdef DEBUG_CONFIG_TRACE
  2641. printk(KERN_DEBUG "%s: ->wv_ru_start()n", dev->name);
  2642. #endif
  2643. obram_read(ioaddr, scboff(OFFSET_SCB, scb_status),
  2644.    (unsigned char *) &scb_cs, sizeof(scb_cs));
  2645. if ((scb_cs & SCB_ST_RUS) == SCB_ST_RUS_RDY)
  2646. return 0;
  2647. lp->rx_head = OFFSET_RU;
  2648. for (i = 0, rx = lp->rx_head; i < NRXBLOCKS; i++, rx = rx_next) {
  2649. rx_next =
  2650.     (i == NRXBLOCKS - 1) ? lp->rx_head : rx + RXBLOCKZ;
  2651. fd.fd_status = 0;
  2652. fd.fd_command = (i == NRXBLOCKS - 1) ? FD_COMMAND_EL : 0;
  2653. fd.fd_link_offset = rx_next;
  2654. fd.fd_rbd_offset = rx + sizeof(fd);
  2655. obram_write(ioaddr, rx, (unsigned char *) &fd, sizeof(fd));
  2656. rbd.rbd_status = 0;
  2657. rbd.rbd_next_rbd_offset = I82586NULL;
  2658. rbd.rbd_bufl = rx + sizeof(fd) + sizeof(rbd);
  2659. rbd.rbd_bufh = 0;
  2660. rbd.rbd_el_size = RBD_EL | (RBD_SIZE & MAXDATAZ);
  2661. obram_write(ioaddr, rx + sizeof(fd),
  2662.     (unsigned char *) &rbd, sizeof(rbd));
  2663. lp->rx_last = rx;
  2664. }
  2665. obram_write(ioaddr, scboff(OFFSET_SCB, scb_rfa_offset),
  2666.     (unsigned char *) &lp->rx_head, sizeof(lp->rx_head));
  2667. scb_cs = SCB_CMD_RUC_GO;
  2668. obram_write(ioaddr, scboff(OFFSET_SCB, scb_command),
  2669.     (unsigned char *) &scb_cs, sizeof(scb_cs));
  2670. set_chan_attn(ioaddr, lp->hacr);
  2671. for (i = 1000; i > 0; i--) {
  2672. obram_read(ioaddr, scboff(OFFSET_SCB, scb_command),
  2673.    (unsigned char *) &scb_cs, sizeof(scb_cs));
  2674. if (scb_cs == 0)
  2675. break;
  2676. udelay(10);
  2677. }
  2678. if (i <= 0) {
  2679. #ifdef DEBUG_CONFIG_ERROR
  2680. printk(KERN_INFO
  2681.        "%s: wavelan_ru_start(): board not accepting command.n",
  2682.        dev->name);
  2683. #endif
  2684. return -1;
  2685. }
  2686. #ifdef DEBUG_CONFIG_TRACE
  2687. printk(KERN_DEBUG "%s: <-wv_ru_start()n", dev->name);
  2688. #endif
  2689. return 0;
  2690. }
  2691. /*------------------------------------------------------------------*/
  2692. /*
  2693.  * Initialise the transmit blocks.
  2694.  * Start the command unit executing the NOP
  2695.  * self-loop of the first transmit block.
  2696.  *
  2697.  * Here we create the list of send buffers used to transmit packets
  2698.  * between the PC and the command unit. For each buffer, we create a
  2699.  * buffer descriptor (pointing on the buffer), a transmit command
  2700.  * (pointing to the buffer descriptor) and a NOP command.
  2701.  * The transmit command is linked to the NOP, and the NOP to itself.
  2702.  * When we will have finished executing the transmit command, we will
  2703.  * then loop on the NOP. By releasing the NOP link to a new command,
  2704.  * we may send another buffer.
  2705.  *
  2706.  * (called by wv_hw_reset())
  2707.  */
  2708. static inline int wv_cu_start(device * dev)
  2709. {
  2710. net_local *lp = (net_local *) dev->priv;
  2711. unsigned long ioaddr = dev->base_addr;
  2712. int i;
  2713. u16 txblock;
  2714. u16 first_nop;
  2715. u16 scb_cs;
  2716. #ifdef DEBUG_CONFIG_TRACE
  2717. printk(KERN_DEBUG "%s: ->wv_cu_start()n", dev->name);
  2718. #endif
  2719. lp->tx_first_free = OFFSET_CU;
  2720. lp->tx_first_in_use = I82586NULL;
  2721. for (i = 0, txblock = OFFSET_CU;
  2722.      i < NTXBLOCKS; i++, txblock += TXBLOCKZ) {
  2723. ac_tx_t tx;
  2724. ac_nop_t nop;
  2725. tbd_t tbd;
  2726. unsigned short tx_addr;
  2727. unsigned short nop_addr;
  2728. unsigned short tbd_addr;
  2729. unsigned short buf_addr;
  2730. tx_addr = txblock;
  2731. nop_addr = tx_addr + sizeof(tx);
  2732. tbd_addr = nop_addr + sizeof(nop);
  2733. buf_addr = tbd_addr + sizeof(tbd);
  2734. tx.tx_h.ac_status = 0;
  2735. tx.tx_h.ac_command = acmd_transmit | AC_CFLD_I;
  2736. tx.tx_h.ac_link = nop_addr;
  2737. tx.tx_tbd_offset = tbd_addr;
  2738. obram_write(ioaddr, tx_addr, (unsigned char *) &tx,
  2739.     sizeof(tx));
  2740. nop.nop_h.ac_status = 0;
  2741. nop.nop_h.ac_command = acmd_nop;
  2742. nop.nop_h.ac_link = nop_addr;
  2743. obram_write(ioaddr, nop_addr, (unsigned char *) &nop,
  2744.     sizeof(nop));
  2745. tbd.tbd_status = TBD_STATUS_EOF;
  2746. tbd.tbd_next_bd_offset = I82586NULL;
  2747. tbd.tbd_bufl = buf_addr;
  2748. tbd.tbd_bufh = 0;
  2749. obram_write(ioaddr, tbd_addr, (unsigned char *) &tbd,
  2750.     sizeof(tbd));
  2751. }
  2752. first_nop =
  2753.     OFFSET_CU + (NTXBLOCKS - 1) * TXBLOCKZ + sizeof(ac_tx_t);
  2754. obram_write(ioaddr, scboff(OFFSET_SCB, scb_cbl_offset),
  2755.     (unsigned char *) &first_nop, sizeof(first_nop));
  2756. scb_cs = SCB_CMD_CUC_GO;
  2757. obram_write(ioaddr, scboff(OFFSET_SCB, scb_command),
  2758.     (unsigned char *) &scb_cs, sizeof(scb_cs));
  2759. set_chan_attn(ioaddr, lp->hacr);
  2760. for (i = 1000; i > 0; i--) {
  2761. obram_read(ioaddr, scboff(OFFSET_SCB, scb_command),
  2762.    (unsigned char *) &scb_cs, sizeof(scb_cs));
  2763. if (scb_cs == 0)
  2764. break;
  2765. udelay(10);
  2766. }
  2767. if (i <= 0) {
  2768. #ifdef DEBUG_CONFIG_ERROR
  2769. printk(KERN_INFO
  2770.        "%s: wavelan_cu_start(): board not accepting command.n",
  2771.        dev->name);
  2772. #endif
  2773. return -1;
  2774. }
  2775. lp->tx_n_in_use = 0;
  2776. netif_start_queue(dev);
  2777. #ifdef DEBUG_CONFIG_TRACE
  2778. printk(KERN_DEBUG "%s: <-wv_cu_start()n", dev->name);
  2779. #endif
  2780. return 0;
  2781. }
  2782. /*------------------------------------------------------------------*/
  2783. /*
  2784.  * This routine does a standard configuration of the WaveLAN 
  2785.  * controller (i82586).
  2786.  *
  2787.  * It initialises the scp, iscp and scb structure
  2788.  * The first two are just pointers to the next.
  2789.  * The last one is used for basic configuration and for basic
  2790.  * communication (interrupt status).
  2791.  *
  2792.  * (called by wv_hw_reset())
  2793.  */
  2794. static inline int wv_82586_start(device * dev)
  2795. {
  2796. net_local *lp = (net_local *) dev->priv;
  2797. unsigned long ioaddr = dev->base_addr;
  2798. scp_t scp; /* system configuration pointer */
  2799. iscp_t iscp; /* intermediate scp */
  2800. scb_t scb; /* system control block */
  2801. ach_t cb; /* Action command header */
  2802. u8 zeroes[512];
  2803. int i;
  2804. #ifdef DEBUG_CONFIG_TRACE
  2805. printk(KERN_DEBUG "%s: ->wv_82586_start()n", dev->name);
  2806. #endif
  2807. /*
  2808.  * Clear the onboard RAM.
  2809.  */
  2810. memset(&zeroes[0], 0x00, sizeof(zeroes));
  2811. for (i = 0; i < I82586_MEMZ; i += sizeof(zeroes))
  2812. obram_write(ioaddr, i, &zeroes[0], sizeof(zeroes));
  2813. /*
  2814.  * Construct the command unit structures:
  2815.  * scp, iscp, scb, cb.
  2816.  */
  2817. memset(&scp, 0x00, sizeof(scp));
  2818. scp.scp_sysbus = SCP_SY_16BBUS;
  2819. scp.scp_iscpl = OFFSET_ISCP;
  2820. obram_write(ioaddr, OFFSET_SCP, (unsigned char *) &scp,
  2821.     sizeof(scp));
  2822. memset(&iscp, 0x00, sizeof(iscp));
  2823. iscp.iscp_busy = 1;
  2824. iscp.iscp_offset = OFFSET_SCB;
  2825. obram_write(ioaddr, OFFSET_ISCP, (unsigned char *) &iscp,
  2826.     sizeof(iscp));
  2827. /* Our first command is to reset the i82586. */
  2828. memset(&scb, 0x00, sizeof(scb));
  2829. scb.scb_command = SCB_CMD_RESET;
  2830. scb.scb_cbl_offset = OFFSET_CU;
  2831. scb.scb_rfa_offset = OFFSET_RU;
  2832. obram_write(ioaddr, OFFSET_SCB, (unsigned char *) &scb,
  2833.     sizeof(scb));
  2834. set_chan_attn(ioaddr, lp->hacr);
  2835. /* Wait for command to finish. */
  2836. for (i = 1000; i > 0; i--) {
  2837. obram_read(ioaddr, OFFSET_ISCP, (unsigned char *) &iscp,
  2838.    sizeof(iscp));
  2839. if (iscp.iscp_busy == (unsigned short) 0)
  2840. break;
  2841. udelay(10);
  2842. }
  2843. if (i <= 0) {
  2844. #ifdef DEBUG_CONFIG_ERROR
  2845. printk(KERN_INFO
  2846.        "%s: wv_82586_start(): iscp_busy timeout.n",
  2847.        dev->name);
  2848. #endif
  2849. return -1;
  2850. }
  2851. /* Check command completion. */
  2852. for (i = 15; i > 0; i--) {
  2853. obram_read(ioaddr, OFFSET_SCB, (unsigned char *) &scb,
  2854.    sizeof(scb));
  2855. if (scb.scb_status == (SCB_ST_CX | SCB_ST_CNA))
  2856. break;
  2857. udelay(10);
  2858. }
  2859. if (i <= 0) {
  2860. #ifdef DEBUG_CONFIG_ERROR
  2861. printk(KERN_INFO
  2862.        "%s: wv_82586_start(): status: expected 0x%02x, got 0x%02x.n",
  2863.        dev->name, SCB_ST_CX | SCB_ST_CNA, scb.scb_status);
  2864. #endif
  2865. return -1;
  2866. }
  2867. wv_ack(dev);
  2868. /* Set the action command header. */
  2869. memset(&cb, 0x00, sizeof(cb));
  2870. cb.ac_command = AC_CFLD_EL | (AC_CFLD_CMD & acmd_diagnose);
  2871. cb.ac_link = OFFSET_CU;
  2872. obram_write(ioaddr, OFFSET_CU, (unsigned char *) &cb, sizeof(cb));
  2873. if (wv_synchronous_cmd(dev, "diag()") == -1)
  2874. return -1;
  2875. obram_read(ioaddr, OFFSET_CU, (unsigned char *) &cb, sizeof(cb));
  2876. if (cb.ac_status & AC_SFLD_FAIL) {
  2877. #ifdef DEBUG_CONFIG_ERROR
  2878. printk(KERN_INFO
  2879.        "%s: wv_82586_start(): i82586 Self Test failed.n",
  2880.        dev->name);
  2881. #endif
  2882. return -1;
  2883. }
  2884. #ifdef DEBUG_I82586_SHOW
  2885. wv_scb_show(ioaddr);
  2886. #endif
  2887. #ifdef DEBUG_CONFIG_TRACE
  2888. printk(KERN_DEBUG "%s: <-wv_82586_start()n", dev->name);
  2889. #endif
  2890. return 0;
  2891. }
  2892. /*------------------------------------------------------------------*/
  2893. /*
  2894.  * This routine does a standard configuration of the WaveLAN
  2895.  * controller (i82586).
  2896.  *
  2897.  * This routine is a violent hack. We use the first free transmit block
  2898.  * to make our configuration. In the buffer area, we create the three
  2899.  * configuration commands (linked). We make the previous NOP point to
  2900.  * the beginning of the buffer instead of the tx command. After, we go
  2901.  * as usual to the NOP command.
  2902.  * Note that only the last command (mc_set) will generate an interrupt.
  2903.  *
  2904.  * (called by wv_hw_reset(), wv_82586_reconfig(), wavelan_packet_xmit())
  2905.  */
  2906. static void wv_82586_config(device * dev)
  2907. {
  2908. net_local *lp = (net_local *) dev->priv;
  2909. unsigned long ioaddr = dev->base_addr;
  2910. unsigned short txblock;
  2911. unsigned short txpred;
  2912. unsigned short tx_addr;
  2913. unsigned short nop_addr;
  2914. unsigned short tbd_addr;
  2915. unsigned short cfg_addr;
  2916. unsigned short ias_addr;
  2917. unsigned short mcs_addr;
  2918. ac_tx_t tx;
  2919. ac_nop_t nop;
  2920. ac_cfg_t cfg; /* Configure action */
  2921. ac_ias_t ias; /* IA-setup action */
  2922. ac_mcs_t mcs; /* Multicast setup */
  2923. struct dev_mc_list *dmi;
  2924. #ifdef DEBUG_CONFIG_TRACE
  2925. printk(KERN_DEBUG "%s: ->wv_82586_config()n", dev->name);
  2926. #endif
  2927. /* Check nothing bad has happened */
  2928. if (lp->tx_n_in_use == (NTXBLOCKS - 1)) {
  2929. #ifdef DEBUG_CONFIG_ERROR
  2930. printk(KERN_INFO "%s: wv_82586_config(): Tx queue full.n",
  2931.        dev->name);
  2932. #endif
  2933. return;
  2934. }
  2935. /* Calculate addresses of next block and previous block. */
  2936. txblock = lp->tx_first_free;
  2937. txpred = txblock - TXBLOCKZ;
  2938. if (txpred < OFFSET_CU)
  2939. txpred += NTXBLOCKS * TXBLOCKZ;
  2940. lp->tx_first_free += TXBLOCKZ;
  2941. if (lp->tx_first_free >= OFFSET_CU + NTXBLOCKS * TXBLOCKZ)
  2942. lp->tx_first_free -= NTXBLOCKS * TXBLOCKZ;
  2943. lp->tx_n_in_use++;
  2944. /* Calculate addresses of the different parts of the block. */
  2945. tx_addr = txblock;
  2946. nop_addr = tx_addr + sizeof(tx);
  2947. tbd_addr = nop_addr + sizeof(nop);
  2948. cfg_addr = tbd_addr + sizeof(tbd_t); /* beginning of the buffer */
  2949. ias_addr = cfg_addr + sizeof(cfg);
  2950. mcs_addr = ias_addr + sizeof(ias);
  2951. /*
  2952.  * Transmit command
  2953.  */
  2954. tx.tx_h.ac_status = 0xFFFF; /* Fake completion value */
  2955. obram_write(ioaddr, toff(ac_tx_t, tx_addr, tx_h.ac_status),
  2956.     (unsigned char *) &tx.tx_h.ac_status,
  2957.     sizeof(tx.tx_h.ac_status));
  2958. /*
  2959.  * NOP command
  2960.  */
  2961. nop.nop_h.ac_status = 0;
  2962. obram_write(ioaddr, toff(ac_nop_t, nop_addr, nop_h.ac_status),
  2963.     (unsigned char *) &nop.nop_h.ac_status,
  2964.     sizeof(nop.nop_h.ac_status));
  2965. nop.nop_h.ac_link = nop_addr;
  2966. obram_write(ioaddr, toff(ac_nop_t, nop_addr, nop_h.ac_link),
  2967.     (unsigned char *) &nop.nop_h.ac_link,
  2968.     sizeof(nop.nop_h.ac_link));
  2969. /* Create a configure action. */
  2970. memset(&cfg, 0x00, sizeof(cfg));
  2971. /*
  2972.  * For Linux we invert AC_CFG_ALOC() so as to conform
  2973.  * to the way that net packets reach us from above.
  2974.  * (See also ac_tx_t.)
  2975.  *
  2976.  * Updated from Wavelan Manual WCIN085B
  2977.  */
  2978. cfg.cfg_byte_cnt =
  2979.     AC_CFG_BYTE_CNT(sizeof(ac_cfg_t) - sizeof(ach_t));
  2980. cfg.cfg_fifolim = AC_CFG_FIFOLIM(4);
  2981. cfg.cfg_byte8 = AC_CFG_SAV_BF(1) | AC_CFG_SRDY(0);
  2982. cfg.cfg_byte9 = AC_CFG_ELPBCK(0) |
  2983.     AC_CFG_ILPBCK(0) |
  2984.     AC_CFG_PRELEN(AC_CFG_PLEN_2) |
  2985.     AC_CFG_ALOC(1) | AC_CFG_ADDRLEN(WAVELAN_ADDR_SIZE);
  2986. cfg.cfg_byte10 = AC_CFG_BOFMET(1) |
  2987.     AC_CFG_ACR(6) | AC_CFG_LINPRIO(0);
  2988. cfg.cfg_ifs = 0x20;
  2989. cfg.cfg_slotl = 0x0C;
  2990. cfg.cfg_byte13 = AC_CFG_RETRYNUM(15) | AC_CFG_SLTTMHI(0);
  2991. cfg.cfg_byte14 = AC_CFG_FLGPAD(0) |
  2992.     AC_CFG_BTSTF(0) |
  2993.     AC_CFG_CRC16(0) |
  2994.     AC_CFG_NCRC(0) |
  2995.     AC_CFG_TNCRS(1) |
  2996.     AC_CFG_MANCH(0) |
  2997.     AC_CFG_BCDIS(0) | AC_CFG_PRM(lp->promiscuous);
  2998. cfg.cfg_byte15 = AC_CFG_ICDS(0) |
  2999.     AC_CFG_CDTF(0) | AC_CFG_ICSS(0) | AC_CFG_CSTF(0);
  3000. /*
  3001.   cfg.cfg_min_frm_len = AC_CFG_MNFRM(64);
  3002. */
  3003. cfg.cfg_min_frm_len = AC_CFG_MNFRM(8);
  3004. cfg.cfg_h.ac_command = (AC_CFLD_CMD & acmd_configure);
  3005. cfg.cfg_h.ac_link = ias_addr;
  3006. obram_write(ioaddr, cfg_addr, (unsigned char *) &cfg, sizeof(cfg));
  3007. /* Set up the MAC address */
  3008. memset(&ias, 0x00, sizeof(ias));
  3009. ias.ias_h.ac_command = (AC_CFLD_CMD & acmd_ia_setup);
  3010. ias.ias_h.ac_link = mcs_addr;
  3011. memcpy(&ias.ias_addr[0], (unsigned char *) &dev->dev_addr[0],
  3012.        sizeof(ias.ias_addr));
  3013. obram_write(ioaddr, ias_addr, (unsigned char *) &ias, sizeof(ias));
  3014. /* Initialize adapter's Ethernet multicast addresses */
  3015. memset(&mcs, 0x00, sizeof(mcs));
  3016. mcs.mcs_h.ac_command = AC_CFLD_I | (AC_CFLD_CMD & acmd_mc_setup);
  3017. mcs.mcs_h.ac_link = nop_addr;
  3018. mcs.mcs_cnt = WAVELAN_ADDR_SIZE * lp->mc_count;
  3019. obram_write(ioaddr, mcs_addr, (unsigned char *) &mcs, sizeof(mcs));
  3020. /* Any address to set? */
  3021. if (lp->mc_count) {
  3022. for (dmi = dev->mc_list; dmi; dmi = dmi->next)
  3023. outsw(PIOP1(ioaddr), (u16 *) dmi->dmi_addr,
  3024.       WAVELAN_ADDR_SIZE >> 1);
  3025. #ifdef DEBUG_CONFIG_INFO
  3026. printk(KERN_DEBUG
  3027.        "%s: wv_82586_config(): set %d multicast addresses:n",
  3028.        dev->name, lp->mc_count);
  3029. for (dmi = dev->mc_list; dmi; dmi = dmi->next)
  3030. printk(KERN_DEBUG
  3031.        " %02x:%02x:%02x:%02x:%02x:%02xn",
  3032.        dmi->dmi_addr[0], dmi->dmi_addr[1],
  3033.        dmi->dmi_addr[2], dmi->dmi_addr[3],
  3034.        dmi->dmi_addr[4], dmi->dmi_addr[5]);
  3035. #endif
  3036. }
  3037. /*
  3038.  * Overwrite the predecessor NOP link
  3039.  * so that it points to the configure action.
  3040.  */
  3041. nop_addr = txpred + sizeof(tx);
  3042. nop.nop_h.ac_status = 0;
  3043. obram_write(ioaddr, toff(ac_nop_t, nop_addr, nop_h.ac_status),
  3044.     (unsigned char *) &nop.nop_h.ac_status,
  3045.     sizeof(nop.nop_h.ac_status));
  3046. nop.nop_h.ac_link = cfg_addr;
  3047. obram_write(ioaddr, toff(ac_nop_t, nop_addr, nop_h.ac_link),
  3048.     (unsigned char *) &nop.nop_h.ac_link,
  3049.     sizeof(nop.nop_h.ac_link));
  3050. /* Job done, clear the flag */
  3051. lp->reconfig_82586 = 0;
  3052. if (lp->tx_first_in_use == I82586NULL)
  3053. lp->tx_first_in_use = txblock;
  3054. if (lp->tx_n_in_use == (NTXBLOCKS - 1))
  3055. netif_stop_queue(dev);
  3056. #ifdef DEBUG_CONFIG_TRACE
  3057. printk(KERN_DEBUG "%s: <-wv_82586_config()n", dev->name);
  3058. #endif
  3059. }
  3060. /*------------------------------------------------------------------*/
  3061. /*
  3062.  * This routine, called by wavelan_close(), gracefully stops the 
  3063.  * WaveLAN controller (i82586).
  3064.  * (called by wavelan_close())
  3065.  */
  3066. static inline void wv_82586_stop(device * dev)
  3067. {
  3068. net_local *lp = (net_local *) dev->priv;
  3069. unsigned long ioaddr = dev->base_addr;
  3070. u16 scb_cmd;
  3071. #ifdef DEBUG_CONFIG_TRACE
  3072. printk(KERN_DEBUG "%s: ->wv_82586_stop()n", dev->name);
  3073. #endif
  3074. /* Suspend both command unit and receive unit. */
  3075. scb_cmd =
  3076.     (SCB_CMD_CUC & SCB_CMD_CUC_SUS) | (SCB_CMD_RUC &
  3077.        SCB_CMD_RUC_SUS);
  3078. obram_write(ioaddr, scboff(OFFSET_SCB, scb_command),
  3079.     (unsigned char *) &scb_cmd, sizeof(scb_cmd));
  3080. set_chan_attn(ioaddr, lp->hacr);
  3081. /* No more interrupts */
  3082. wv_ints_off(dev);
  3083. #ifdef DEBUG_CONFIG_TRACE
  3084. printk(KERN_DEBUG "%s: <-wv_82586_stop()n", dev->name);
  3085. #endif
  3086. }
  3087. /*------------------------------------------------------------------*/
  3088. /*
  3089.  * Totally reset the WaveLAN and restart it.
  3090.  * Performs the following actions:
  3091.  * 1. A power reset (reset DMA)
  3092.  * 2. Initialize the radio modem (using wv_mmc_init)
  3093.  * 3. Reset & Configure LAN controller (using wv_82586_start)
  3094.  * 4. Start the LAN controller's command unit
  3095.  * 5. Start the LAN controller's receive unit
  3096.  * (called by wavelan_interrupt(), wavelan_watchdog() & wavelan_open())
  3097.  */
  3098. static int wv_hw_reset(device * dev)
  3099. {
  3100. net_local *lp = (net_local *) dev->priv;
  3101. unsigned long ioaddr = dev->base_addr;
  3102. #ifdef DEBUG_CONFIG_TRACE
  3103. printk(KERN_DEBUG "%s: ->wv_hw_reset(dev=0x%x)n", dev->name,
  3104.        (unsigned int) dev);
  3105. #endif
  3106. /* Increase the number of resets done. */
  3107. lp->nresets++;
  3108. wv_hacr_reset(ioaddr);
  3109. lp->hacr = HACR_DEFAULT;
  3110. if ((wv_mmc_init(dev) < 0) || (wv_82586_start(dev) < 0))
  3111. return -1;
  3112. /* Enable the card to send interrupts. */
  3113. wv_ints_on(dev);
  3114. /* Start card functions */
  3115. if (wv_cu_start(dev) < 0)
  3116. return -1;
  3117. /* Setup the controller and parameters */
  3118. wv_82586_config(dev);
  3119. /* Finish configuration with the receive unit */
  3120. if (wv_ru_start(dev) < 0)
  3121. return -1;
  3122. #ifdef DEBUG_CONFIG_TRACE
  3123. printk(KERN_DEBUG "%s: <-wv_hw_reset()n", dev->name);
  3124. #endif
  3125. return 0;
  3126. }
  3127. /*------------------------------------------------------------------*/
  3128. /*
  3129.  * Check if there is a WaveLAN at the specific base address.
  3130.  * As a side effect, this reads the MAC address.
  3131.  * (called in wavelan_probe() and init_module())
  3132.  */
  3133. static int wv_check_ioaddr(unsigned long ioaddr, u8 * mac)
  3134. {
  3135. int i; /* Loop counter */
  3136. /* Check if the base address if available. */
  3137. if (check_region(ioaddr, sizeof(ha_t)))
  3138. return -EADDRINUSE; /* ioaddr already used */
  3139. /* Reset host interface */
  3140. wv_hacr_reset(ioaddr);
  3141. /* Read the MAC address from the parameter storage area. */
  3142. psa_read(ioaddr, HACR_DEFAULT, psaoff(0, psa_univ_mac_addr),
  3143.  mac, 6);
  3144. /*
  3145.  * Check the first three octets of the address for the manufacturer's code.
  3146.  * Note: if this can't find your WaveLAN card, you've got a
  3147.  * non-NCR/AT&T/Lucent ISA card.  See wavelan.p.h for detail on
  3148.  * how to configure your card.
  3149.  */
  3150. for (i = 0; i < (sizeof(MAC_ADDRESSES) / sizeof(char) / 3); i++)
  3151. if ((mac[0] == MAC_ADDRESSES[i][0]) &&
  3152.     (mac[1] == MAC_ADDRESSES[i][1]) &&
  3153.     (mac[2] == MAC_ADDRESSES[i][2]))
  3154. return 0;
  3155. #ifdef DEBUG_CONFIG_INFO
  3156. printk(KERN_WARNING
  3157.        "WaveLAN (0x%3X): your MAC address might be %02X:%02X:%02X.n",
  3158.        ioaddr, mac[0], mac[1], mac[2]);
  3159. #endif
  3160. return -ENODEV;
  3161. }
  3162. /************************ INTERRUPT HANDLING ************************/
  3163. /*
  3164.  * This function is the interrupt handler for the WaveLAN card. This
  3165.  * routine will be called whenever: 
  3166.  */
  3167. static void wavelan_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  3168. {
  3169. device *dev;
  3170. unsigned long ioaddr;
  3171. net_local *lp;
  3172. u16 hasr;
  3173. u16 status;
  3174. u16 ack_cmd;
  3175. dev = dev_id;
  3176. #ifdef DEBUG_INTERRUPT_TRACE
  3177. printk(KERN_DEBUG "%s: ->wavelan_interrupt()n", dev->name);
  3178. #endif
  3179. lp = (net_local *) dev->priv;
  3180. ioaddr = dev->base_addr;
  3181. #ifdef DEBUG_INTERRUPT_INFO
  3182. /* Check state of our spinlock */
  3183. if(spin_is_locked(&lp->spinlock))
  3184. printk(KERN_DEBUG
  3185.        "%s: wavelan_interrupt(): spinlock is already locked !!!n",
  3186.        dev->name);
  3187. #endif
  3188. /* Prevent reentrancy. We need to do that because we may have
  3189.  * multiple interrupt handler running concurrently.
  3190.  * It is safe because wv_splhi() disables interrupts before acquiring
  3191.  * the spinlock. */
  3192. spin_lock(&lp->spinlock);
  3193. /* Check modem interrupt */
  3194. if ((hasr = hasr_read(ioaddr)) & HASR_MMC_INTR) {
  3195. u8 dce_status;
  3196. /*
  3197.  * Interrupt from the modem management controller.
  3198.  * This will clear it -- ignored for now.
  3199.  */
  3200. mmc_read(ioaddr, mmroff(0, mmr_dce_status), &dce_status,
  3201.  sizeof(dce_status));
  3202. #ifdef DEBUG_INTERRUPT_ERROR
  3203. printk(KERN_INFO
  3204.        "%s: wavelan_interrupt(): unexpected mmc interrupt: status 0x%04x.n",
  3205.        dev->name, dce_status);
  3206. #endif
  3207. }
  3208. /* Check if not controller interrupt */
  3209. if ((hasr & HASR_82586_INTR) == 0) {
  3210. #ifdef DEBUG_INTERRUPT_ERROR
  3211. printk(KERN_INFO
  3212.        "%s: wavelan_interrupt(): interrupt not coming from i82586n",
  3213.        dev->name);
  3214. #endif
  3215. spin_unlock (&lp->spinlock);
  3216. return;
  3217. }
  3218. /* Read interrupt data. */
  3219. obram_read(ioaddr, scboff(OFFSET_SCB, scb_status),
  3220.    (unsigned char *) &status, sizeof(status));
  3221. /*
  3222.  * Acknowledge the interrupt(s).
  3223.  */
  3224. ack_cmd = status & SCB_ST_INT;
  3225. obram_write(ioaddr, scboff(OFFSET_SCB, scb_command),
  3226.     (unsigned char *) &ack_cmd, sizeof(ack_cmd));
  3227. set_chan_attn(ioaddr, lp->hacr);
  3228. #ifdef DEBUG_INTERRUPT_INFO
  3229. printk(KERN_DEBUG "%s: wavelan_interrupt(): status 0x%04x.n",
  3230.        dev->name, status);
  3231. #endif
  3232. /* Command completed. */
  3233. if ((status & SCB_ST_CX) == SCB_ST_CX) {
  3234. #ifdef DEBUG_INTERRUPT_INFO
  3235. printk(KERN_DEBUG
  3236.        "%s: wavelan_interrupt(): command completed.n",
  3237.        dev->name);
  3238. #endif
  3239. wv_complete(dev, ioaddr, lp);
  3240. }
  3241. /* Frame received. */
  3242. if ((status & SCB_ST_FR) == SCB_ST_FR) {
  3243. #ifdef DEBUG_INTERRUPT_INFO
  3244. printk(KERN_DEBUG
  3245.        "%s: wavelan_interrupt(): received packet.n",
  3246.        dev->name);
  3247. #endif
  3248. wv_receive(dev);
  3249. }
  3250. /* Check the state of the command unit. */
  3251. if (((status & SCB_ST_CNA) == SCB_ST_CNA) ||
  3252.     (((status & SCB_ST_CUS) != SCB_ST_CUS_ACTV) &&
  3253.      (netif_running(dev)))) {
  3254. #ifdef DEBUG_INTERRUPT_ERROR
  3255. printk(KERN_INFO
  3256.        "%s: wavelan_interrupt(): CU inactive -- restartingn",
  3257.        dev->name);
  3258. #endif
  3259. wv_hw_reset(dev);
  3260. }
  3261. /* Check the state of the command unit. */
  3262. if (((status & SCB_ST_RNR) == SCB_ST_RNR) ||
  3263.     (((status & SCB_ST_RUS) != SCB_ST_RUS_RDY) &&
  3264.      (netif_running(dev)))) {
  3265. #ifdef DEBUG_INTERRUPT_ERROR
  3266. printk(KERN_INFO
  3267.        "%s: wavelan_interrupt(): RU not ready -- restartingn",
  3268.        dev->name);
  3269. #endif
  3270. wv_hw_reset(dev);
  3271. }
  3272. /* Release spinlock */
  3273. spin_unlock (&lp->spinlock);
  3274. #ifdef DEBUG_INTERRUPT_TRACE
  3275. printk(KERN_DEBUG "%s: <-wavelan_interrupt()n", dev->name);
  3276. #endif
  3277. }
  3278. /*------------------------------------------------------------------*/
  3279. /*
  3280.  * Watchdog: when we start a transmission, a timer is set for us in the
  3281.  * kernel.  If the transmission completes, this timer is disabled. If
  3282.  * the timer expires, we are called and we try to unlock the hardware.
  3283.  */
  3284. static void wavelan_watchdog(device * dev)
  3285. {
  3286. net_local * lp = (net_local *)dev->priv;
  3287. u_long ioaddr = dev->base_addr;
  3288. unsigned long flags;
  3289. unsigned int nreaped;
  3290. #ifdef DEBUG_INTERRUPT_TRACE
  3291. printk(KERN_DEBUG "%s: ->wavelan_watchdog()n", dev->name);
  3292. #endif
  3293. #ifdef DEBUG_INTERRUPT_ERROR
  3294. printk(KERN_INFO "%s: wavelan_watchdog: watchdog timer expiredn",
  3295.        dev->name);
  3296. #endif
  3297. /* Check that we came here for something */
  3298. if (lp->tx_n_in_use <= 0) {
  3299. return;
  3300. }
  3301. wv_splhi(lp, &flags);
  3302. /* Try to see if some buffers are not free (in case we missed
  3303.  * an interrupt */
  3304. nreaped = wv_complete(dev, ioaddr, lp);
  3305. #ifdef DEBUG_INTERRUPT_INFO
  3306. printk(KERN_DEBUG
  3307.        "%s: wavelan_watchdog(): %d reaped, %d remain.n",
  3308.        dev->name, nreaped, lp->tx_n_in_use);
  3309. #endif
  3310. #ifdef DEBUG_PSA_SHOW
  3311. {
  3312. psa_t psa;
  3313. psa_read(dev, 0, (unsigned char *) &psa, sizeof(psa));
  3314. wv_psa_show(&psa);
  3315. }
  3316. #endif
  3317. #ifdef DEBUG_MMC_SHOW
  3318. wv_mmc_show(dev);
  3319. #endif
  3320. #ifdef DEBUG_I82586_SHOW
  3321. wv_cu_show(dev);
  3322. #endif
  3323. /* If no buffer has been freed */
  3324. if (nreaped == 0) {
  3325. #ifdef DEBUG_INTERRUPT_ERROR
  3326. printk(KERN_INFO
  3327.        "%s: wavelan_watchdog(): cleanup failed, trying resetn",
  3328.        dev->name);
  3329. #endif
  3330. wv_hw_reset(dev);
  3331. }
  3332. /* At this point, we should have some free Tx buffer ;-) */
  3333. if (lp->tx_n_in_use < NTXBLOCKS - 1)
  3334. netif_wake_queue(dev);
  3335. wv_splx(lp, &flags);
  3336. #ifdef DEBUG_INTERRUPT_TRACE
  3337. printk(KERN_DEBUG "%s: <-wavelan_watchdog()n", dev->name);
  3338. #endif
  3339. }
  3340. /********************* CONFIGURATION CALLBACKS *********************/
  3341. /*
  3342.  * Here are the functions called by the Linux networking code (NET3)
  3343.  * for initialization, configuration and deinstallations of the 
  3344.  * WaveLAN ISA hardware.
  3345.  */
  3346. /*------------------------------------------------------------------*/
  3347. /*
  3348.  * Configure and start up the WaveLAN PCMCIA adaptor.
  3349.  * Called by NET3 when it "opens" the device.
  3350.  */
  3351. static int wavelan_open(device * dev)
  3352. {
  3353. net_local * lp = (net_local *)dev->priv;
  3354. unsigned long flags;
  3355. #ifdef DEBUG_CALLBACK_TRACE
  3356. printk(KERN_DEBUG "%s: ->wavelan_open(dev=0x%x)n", dev->name,
  3357.        (unsigned int) dev);
  3358. #endif
  3359. /* Check irq */
  3360. if (dev->irq == 0) {
  3361. #ifdef DEBUG_CONFIG_ERROR
  3362. printk(KERN_WARNING "%s: wavelan_open(): no IRQn",
  3363.        dev->name);
  3364. #endif
  3365. return -ENXIO;
  3366. }
  3367. if (request_irq(dev->irq, &wavelan_interrupt, 0, "WaveLAN", dev) != 0) 
  3368. {
  3369. #ifdef DEBUG_CONFIG_ERROR
  3370. printk(KERN_WARNING "%s: wavelan_open(): invalid IRQn",
  3371.        dev->name);
  3372. #endif
  3373. return -EAGAIN;
  3374. }
  3375. wv_splhi(lp, &flags);
  3376. if (wv_hw_reset(dev) != -1) {
  3377. netif_start_queue(dev);
  3378. } else {
  3379. free_irq(dev->irq, dev);
  3380. #ifdef DEBUG_CONFIG_ERROR
  3381. printk(KERN_INFO
  3382.        "%s: wavelan_open(): impossible to start the cardn",
  3383.        dev->name);
  3384. #endif
  3385. wv_splx(lp, &flags);
  3386. return -EAGAIN;
  3387. }
  3388. wv_splx(lp, &flags);
  3389. #ifdef DEBUG_CALLBACK_TRACE
  3390. printk(KERN_DEBUG "%s: <-wavelan_open()n", dev->name);
  3391. #endif
  3392. return 0;
  3393. }
  3394. /*------------------------------------------------------------------*/
  3395. /*
  3396.  * Shut down the WaveLAN ISA card.
  3397.  * Called by NET3 when it "closes" the device.
  3398.  */
  3399. static int wavelan_close(device * dev)
  3400. {
  3401. net_local *lp = (net_local *) dev->priv;
  3402. unsigned long flags;
  3403. #ifdef DEBUG_CALLBACK_TRACE
  3404. printk(KERN_DEBUG "%s: ->wavelan_close(dev=0x%x)n", dev->name,
  3405.        (unsigned int) dev);
  3406. #endif
  3407. netif_stop_queue(dev);
  3408. /*
  3409.  * Flush the Tx and disable Rx.
  3410.  */
  3411. wv_splhi(lp, &flags);
  3412. wv_82586_stop(dev);
  3413. wv_splx(lp, &flags);
  3414. free_irq(dev->irq, dev);
  3415. #ifdef DEBUG_CALLBACK_TRACE
  3416. printk(KERN_DEBUG "%s: <-wavelan_close()n", dev->name);
  3417. #endif
  3418. return 0;
  3419. }
  3420. /*------------------------------------------------------------------*/
  3421. /*
  3422.  * Probe an I/O address, and if the WaveLAN is there configure the
  3423.  * device structure
  3424.  * (called by wavelan_probe() and via init_module()).
  3425.  */
  3426. static int __init wavelan_config(device * dev)
  3427. {
  3428. unsigned long ioaddr = dev->base_addr;
  3429. u8 irq_mask;
  3430. int irq;
  3431. net_local *lp;
  3432. #ifdef DEBUG_CALLBACK_TRACE
  3433. printk(KERN_DEBUG "%s: ->wavelan_config(dev=0x%x, ioaddr=0x%lx)n",
  3434.        dev->name, (unsigned int) dev, ioaddr);
  3435. #endif
  3436. /* Check IRQ argument on command line. */
  3437. if (dev->irq != 0) {
  3438. irq_mask = wv_irq_to_psa(dev->irq);
  3439. if (irq_mask == 0) {
  3440. #ifdef DEBUG_CONFIG_ERROR
  3441. printk(KERN_WARNING
  3442.        "%s: wavelan_config(): invalid IRQ %d ignored.n",
  3443.        dev->name, dev->irq);
  3444. #endif
  3445. dev->irq = 0;
  3446. } else {
  3447. #ifdef DEBUG_CONFIG_INFO
  3448. printk(KERN_DEBUG
  3449.        "%s: wavelan_config(): changing IRQ to %dn",
  3450.        dev->name, dev->irq);
  3451. #endif
  3452. psa_write(ioaddr, HACR_DEFAULT,
  3453.   psaoff(0, psa_int_req_no), &irq_mask, 1);
  3454. /* update the Wavelan checksum */
  3455. update_psa_checksum(dev, ioaddr, HACR_DEFAULT);
  3456. wv_hacr_reset(ioaddr);
  3457. }
  3458. }
  3459. psa_read(ioaddr, HACR_DEFAULT, psaoff(0, psa_int_req_no),
  3460.  &irq_mask, 1);
  3461. if ((irq = wv_psa_to_irq(irq_mask)) == -1) {
  3462. #ifdef DEBUG_CONFIG_ERROR
  3463. printk(KERN_INFO
  3464.        "%s: wavelan_config(): could not wavelan_map_irq(%d).n",
  3465.        dev->name, irq_mask);
  3466. #endif
  3467. return -EAGAIN;
  3468. }
  3469. dev->irq = irq;
  3470. if (!request_region(ioaddr, sizeof(ha_t), "wavelan"))
  3471. return -EBUSY;
  3472. dev->mem_start = 0x0000;
  3473. dev->mem_end = 0x0000;
  3474. dev->if_port = 0;
  3475. /* Initialize device structures */
  3476. dev->priv = kmalloc(sizeof(net_local), GFP_KERNEL);
  3477. if (dev->priv == NULL) {
  3478. release_region(ioaddr, sizeof(ha_t));
  3479. return -ENOMEM;
  3480. }
  3481. memset(dev->priv, 0x00, sizeof(net_local));
  3482. lp = (net_local *) dev->priv;
  3483. /* Back link to the device structure. */
  3484. lp->dev = dev;
  3485. /* Add the device at the beginning of the linked list. */
  3486. lp->next = wavelan_list;
  3487. wavelan_list = lp;
  3488. lp->hacr = HACR_DEFAULT;
  3489. /* Multicast stuff */
  3490. lp->promiscuous = 0;
  3491. lp->mc_count = 0;
  3492. /* Init spinlock */
  3493. spin_lock_init(&lp->spinlock);
  3494. /*
  3495.  * Fill in the fields of the device structure
  3496.  * with generic Ethernet values.
  3497.  */
  3498. ether_setup(dev);
  3499. SET_MODULE_OWNER(dev);
  3500. dev->open = wavelan_open;
  3501. dev->stop = wavelan_close;
  3502. dev->hard_start_xmit = wavelan_packet_xmit;
  3503. dev->get_stats = wavelan_get_stats;
  3504. dev->set_multicast_list = &wavelan_set_multicast_list;
  3505.         dev->tx_timeout = &wavelan_watchdog;
  3506.         dev->watchdog_timeo = WATCHDOG_JIFFIES;
  3507. #ifdef SET_MAC_ADDRESS
  3508. dev->set_mac_address = &wavelan_set_mac_address;
  3509. #endif /* SET_MAC_ADDRESS */
  3510. #ifdef WIRELESS_EXT /* if wireless extension exists in the kernel */
  3511. dev->do_ioctl = wavelan_ioctl;
  3512. dev->get_wireless_stats = wavelan_get_wireless_stats;
  3513. #endif
  3514. dev->mtu = WAVELAN_MTU;
  3515. /* Display nice information. */
  3516. wv_init_info(dev);
  3517. #ifdef DEBUG_CALLBACK_TRACE
  3518. printk(KERN_DEBUG "%s: <-wavelan_config()n", dev->name);
  3519. #endif
  3520. return 0;
  3521. }
  3522. /*------------------------------------------------------------------*/
  3523. /*
  3524.  * Check for a network adaptor of this type.  Return '0' iff one 
  3525.  * exists.  There seem to be different interpretations of
  3526.  * the initial value of dev->base_addr.
  3527.  * We follow the example in drivers/net/ne.c.
  3528.  * (called in "Space.c")
  3529.  */
  3530. int __init wavelan_probe(device * dev)
  3531. {
  3532. short base_addr;
  3533. mac_addr mac; /* MAC address (check existence of WaveLAN) */
  3534. int i;
  3535. int r;
  3536. #ifdef DEBUG_CALLBACK_TRACE
  3537. printk(KERN_DEBUG
  3538.        "%s: ->wavelan_probe(dev=0x%x (base_addr=0x%x))n",
  3539.        dev->name, (unsigned int) dev,
  3540.        (unsigned int) dev->base_addr);
  3541. #endif
  3542. #ifdef STRUCT_CHECK
  3543. if (wv_struct_check() != (char *) NULL) {
  3544. printk(KERN_WARNING
  3545.        "%s: wavelan_probe(): structure/compiler botch: "%s"n",
  3546.        dev->name, wv_struct_check());
  3547. return -ENODEV;
  3548. }
  3549. #endif /* STRUCT_CHECK */
  3550. /* Check the value of the command line parameter for base address. */
  3551. base_addr = dev->base_addr;
  3552. /* Don't probe at all. */
  3553. if (base_addr < 0) {
  3554. #ifdef DEBUG_CONFIG_ERROR
  3555. printk(KERN_WARNING
  3556.        "%s: wavelan_probe(): invalid base addressn",
  3557.        dev->name);
  3558. #endif
  3559. return -ENXIO;
  3560. }
  3561. /* Check a single specified location. */
  3562. if (base_addr > 0x100) {
  3563. /* Check if there is something at this base address */
  3564. if ((r = wv_check_ioaddr(base_addr, mac)) == 0) {
  3565. memcpy(dev->dev_addr, mac, 6); /* Copy MAC address. */
  3566. r = wavelan_config(dev);
  3567. }
  3568. #ifdef DEBUG_CONFIG_INFO
  3569. if (r != 0)
  3570. printk(KERN_DEBUG
  3571.        "%s: wavelan_probe(): no device at specified base address (0x%X) or address already in usen",
  3572.        dev->name, base_addr);
  3573. #endif
  3574. #ifdef DEBUG_CALLBACK_TRACE
  3575. printk(KERN_DEBUG "%s: <-wavelan_probe()n", dev->name);
  3576. #endif
  3577. return r;
  3578. }
  3579. /* Scan all possible addresses of the WaveLAN hardware. */
  3580. for (i = 0; i < NELS(iobase); i++) {
  3581. /* Check whether there is something at this base address. */
  3582. if (wv_check_ioaddr(iobase[i], mac) == 0) {
  3583. dev->base_addr = iobase[i]; /* Copy base address. */
  3584. memcpy(dev->dev_addr, mac, 6); /* Copy MAC address. */
  3585. if (wavelan_config(dev) == 0) {
  3586. #ifdef DEBUG_CALLBACK_TRACE
  3587. printk(KERN_DEBUG
  3588.        "%s: <-wavelan_probe()n",
  3589.        dev->name);
  3590. #endif
  3591. return 0;
  3592. }
  3593. }
  3594. }
  3595. /* We may have touched base_addr.  Another driver may not like it. */
  3596. dev->base_addr = base_addr;
  3597. #ifdef DEBUG_CONFIG_INFO
  3598. printk(KERN_DEBUG "%s: wavelan_probe(): no device foundn",
  3599.        dev->name);
  3600. #endif
  3601. return -ENODEV;
  3602. }
  3603. /****************************** MODULE ******************************/
  3604. /*
  3605.  * Module entry point: insertion and removal
  3606.  */
  3607. #ifdef MODULE
  3608. /*------------------------------------------------------------------*/
  3609. /*
  3610.  * Insertion of the module
  3611.  * I'm now quite proud of the multi-device support.
  3612.  */
  3613. int init_module(void)
  3614. {
  3615. mac_addr mac; /* MAC address (check WaveLAN existence) */
  3616. int ret = -EIO; /* Return error if no cards found */
  3617. int i;
  3618. #ifdef DEBUG_MODULE_TRACE
  3619. printk(KERN_DEBUG "-> init_module()n");
  3620. #endif
  3621. /* If probing is asked */
  3622. if (io[0] == 0) {
  3623. #ifdef DEBUG_CONFIG_ERROR
  3624. printk(KERN_WARNING
  3625.        "WaveLAN init_module(): doing device probing (bad !)n");
  3626. printk(KERN_WARNING
  3627.        "Specify base addresses while loading module to correct the problemn");
  3628. #endif
  3629. /* Copy the basic set of address to be probed. */
  3630. for (i = 0; i < NELS(iobase); i++)
  3631. io[i] = iobase[i];
  3632. }
  3633. /* Loop on all possible base addresses. */
  3634. i = -1;
  3635. while ((io[++i] != 0) && (i < NELS(io))) {
  3636. /* Check if there is something at this base address. */
  3637. if (wv_check_ioaddr(io[i], mac) == 0) {
  3638. device *dev;
  3639. /* Create device and set basic arguments. */
  3640. dev =
  3641.     kmalloc(sizeof(struct net_device), GFP_KERNEL);
  3642. if (dev == NULL) {
  3643. ret = -ENOMEM;
  3644. break;
  3645. }
  3646. memset(dev, 0x00, sizeof(struct net_device));
  3647. memcpy(dev->name, name[i], IFNAMSIZ); /* Copy name */
  3648. dev->base_addr = io[i];
  3649. dev->irq = irq[i];
  3650. dev->init = &wavelan_config;
  3651. memcpy(dev->dev_addr, mac, 6); /* Copy MAC address. */
  3652. /* Try to create the device. */
  3653. if (register_netdev(dev) != 0) {
  3654. /* Deallocate everything. */
  3655. /* Note: if dev->priv is mallocated, there is no way to fail. */
  3656. kfree(dev);
  3657. } else {
  3658. /* If at least one device OK, we do not fail */
  3659. ret = 0;
  3660. }
  3661. } /* if there is something at the address */
  3662. } /* Loop on all addresses. */
  3663. #ifdef DEBUG_CONFIG_ERROR
  3664. if (wavelan_list == (net_local *) NULL)
  3665. printk(KERN_WARNING
  3666.        "WaveLAN init_module(): no device foundn");
  3667. #endif
  3668. #ifdef DEBUG_MODULE_TRACE
  3669. printk(KERN_DEBUG "<- init_module()n");
  3670. #endif
  3671. return ret;
  3672. }
  3673. /*------------------------------------------------------------------*/
  3674. /*
  3675.  * Removal of the module
  3676.  */
  3677. void cleanup_module(void)
  3678. {
  3679. #ifdef DEBUG_MODULE_TRACE
  3680. printk(KERN_DEBUG "-> cleanup_module()n");
  3681. #endif
  3682. /* Loop on all devices and release them. */
  3683. while (wavelan_list != (net_local *) NULL) {
  3684. device *dev = wavelan_list->dev;
  3685. #ifdef DEBUG_CONFIG_INFO
  3686. printk(KERN_DEBUG
  3687.        "%s: cleanup_module(): removing device at 0x%xn",
  3688.        dev->name, (unsigned int) dev);
  3689. #endif
  3690. /* Release the ioport region. */
  3691. release_region(dev->base_addr, sizeof(ha_t));
  3692. /* Definitely remove the device. */
  3693. unregister_netdev(dev);
  3694. /* Unlink the device. */
  3695. wavelan_list = wavelan_list->next;
  3696. /* Free pieces. */
  3697. kfree(dev->priv);
  3698. kfree(dev);
  3699. }
  3700. #ifdef DEBUG_MODULE_TRACE
  3701. printk(KERN_DEBUG "<- cleanup_module()n");
  3702. #endif
  3703. }
  3704. #endif /* MODULE */
  3705. MODULE_LICENSE("GPL");
  3706. /*
  3707.  * This software may only be used and distributed
  3708.  * according to the terms of the GNU General Public License.
  3709.  *
  3710.  * This software was developed as a component of the
  3711.  * Linux operating system.
  3712.  * It is based on other device drivers and information
  3713.  * either written or supplied by:
  3714.  * Ajay Bakre (bakre@paul.rutgers.edu),
  3715.  * Donald Becker (becker@scyld.com),
  3716.  * Loeke Brederveld (Loeke.Brederveld@Utrecht.NCR.com),
  3717.  * Anders Klemets (klemets@it.kth.se),
  3718.  * Vladimir V. Kolpakov (w@stier.koenig.ru),
  3719.  * Marc Meertens (Marc.Meertens@Utrecht.NCR.com),
  3720.  * Pauline Middelink (middelin@polyware.iaf.nl),
  3721.  * Robert Morris (rtm@das.harvard.edu),
  3722.  * Jean Tourrilhes (jt@hplb.hpl.hp.com),
  3723.  * Girish Welling (welling@paul.rutgers.edu),
  3724.  *
  3725.  * Thanks go also to:
  3726.  * James Ashton (jaa101@syseng.anu.edu.au),
  3727.  * Alan Cox (alan@redhat.com),
  3728.  * Allan Creighton (allanc@cs.usyd.edu.au),
  3729.  * Matthew Geier (matthew@cs.usyd.edu.au),
  3730.  * Remo di Giovanni (remo@cs.usyd.edu.au),
  3731.  * Eckhard Grah (grah@wrcs1.urz.uni-wuppertal.de),
  3732.  * Vipul Gupta (vgupta@cs.binghamton.edu),
  3733.  * Mark Hagan (mhagan@wtcpost.daytonoh.NCR.COM),
  3734.  * Tim Nicholson (tim@cs.usyd.edu.au),
  3735.  * Ian Parkin (ian@cs.usyd.edu.au),
  3736.  * John Rosenberg (johnr@cs.usyd.edu.au),
  3737.  * George Rossi (george@phm.gov.au),
  3738.  * Arthur Scott (arthur@cs.usyd.edu.au),
  3739.  * Peter Storey,
  3740.  * for their assistance and advice.
  3741.  *
  3742.  * Please send bug reports, updates, comments to:
  3743.  *
  3744.  * Bruce Janson                                    Email:  bruce@cs.usyd.edu.au
  3745.  * Basser Department of Computer Science           Phone:  +61-2-9351-3423
  3746.  * University of Sydney, N.S.W., 2006, AUSTRALIA   Fax:    +61-2-9351-3838
  3747.  */