madgemc.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. /*
  2. * madgemc.c: Driver for the Madge Smart 16/4 MC16 MCA token ring card.
  3. *
  4. * Written 2000 by Adam Fritzler
  5. *
  6. * This software may be used and distributed according to the terms
  7. * of the GNU General Public License, incorporated herein by reference.
  8. *
  9. * This driver module supports the following cards:
  10. * - Madge Smart 16/4 Ringnode MC16
  11. * - Madge Smart 16/4 Ringnode MC32 (??)
  12. *
  13. * Maintainer(s):
  14. * AF Adam Fritzler mid@auk.cx
  15. *
  16. * Modification History:
  17. * 16-Jan-00 AF Created
  18. *
  19. */
  20. static const char version[] = "madgemc.c: v0.91 23/01/2000 by Adam Fritzler\n";
  21. #include <linux/module.h>
  22. #include <linux/mca-legacy.h>
  23. #include <linux/kernel.h>
  24. #include <linux/errno.h>
  25. #include <linux/pci.h>
  26. #include <linux/init.h>
  27. #include <linux/netdevice.h>
  28. #include <linux/trdevice.h>
  29. #include <asm/system.h>
  30. #include <asm/io.h>
  31. #include <asm/irq.h>
  32. #include "tms380tr.h"
  33. #include "madgemc.h" /* Madge-specific constants */
  34. #define MADGEMC_IO_EXTENT 32
  35. #define MADGEMC_SIF_OFFSET 0x08
  36. struct madgemc_card {
  37. struct net_device *dev;
  38. /*
  39. * These are read from the BIA ROM.
  40. */
  41. unsigned int manid;
  42. unsigned int cardtype;
  43. unsigned int cardrev;
  44. unsigned int ramsize;
  45. /*
  46. * These are read from the MCA POS registers.
  47. */
  48. unsigned int burstmode:2;
  49. unsigned int fairness:1; /* 0 = Fair, 1 = Unfair */
  50. unsigned int arblevel:4;
  51. unsigned int ringspeed:2; /* 0 = 4mb, 1 = 16, 2 = Auto/none */
  52. unsigned int cabletype:1; /* 0 = RJ45, 1 = DB9 */
  53. struct madgemc_card *next;
  54. };
  55. static struct madgemc_card *madgemc_card_list;
  56. static int madgemc_open(struct net_device *dev);
  57. static int madgemc_close(struct net_device *dev);
  58. static int madgemc_chipset_init(struct net_device *dev);
  59. static void madgemc_read_rom(struct madgemc_card *card);
  60. static unsigned short madgemc_setnselout_pins(struct net_device *dev);
  61. static void madgemc_setcabletype(struct net_device *dev, int type);
  62. static int madgemc_mcaproc(char *buf, int slot, void *d);
  63. static void madgemc_setregpage(struct net_device *dev, int page);
  64. static void madgemc_setsifsel(struct net_device *dev, int val);
  65. static void madgemc_setint(struct net_device *dev, int val);
  66. static irqreturn_t madgemc_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  67. /*
  68. * These work around paging, however they don't guarentee you're on the
  69. * right page.
  70. */
  71. #define SIFREADB(reg) (inb(dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
  72. #define SIFWRITEB(val, reg) (outb(val, dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
  73. #define SIFREADW(reg) (inw(dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
  74. #define SIFWRITEW(val, reg) (outw(val, dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
  75. /*
  76. * Read a byte-length value from the register.
  77. */
  78. static unsigned short madgemc_sifreadb(struct net_device *dev, unsigned short reg)
  79. {
  80. unsigned short ret;
  81. if (reg<0x8)
  82. ret = SIFREADB(reg);
  83. else {
  84. madgemc_setregpage(dev, 1);
  85. ret = SIFREADB(reg);
  86. madgemc_setregpage(dev, 0);
  87. }
  88. return ret;
  89. }
  90. /*
  91. * Write a byte-length value to a register.
  92. */
  93. static void madgemc_sifwriteb(struct net_device *dev, unsigned short val, unsigned short reg)
  94. {
  95. if (reg<0x8)
  96. SIFWRITEB(val, reg);
  97. else {
  98. madgemc_setregpage(dev, 1);
  99. SIFWRITEB(val, reg);
  100. madgemc_setregpage(dev, 0);
  101. }
  102. return;
  103. }
  104. /*
  105. * Read a word-length value from a register
  106. */
  107. static unsigned short madgemc_sifreadw(struct net_device *dev, unsigned short reg)
  108. {
  109. unsigned short ret;
  110. if (reg<0x8)
  111. ret = SIFREADW(reg);
  112. else {
  113. madgemc_setregpage(dev, 1);
  114. ret = SIFREADW(reg);
  115. madgemc_setregpage(dev, 0);
  116. }
  117. return ret;
  118. }
  119. /*
  120. * Write a word-length value to a register.
  121. */
  122. static void madgemc_sifwritew(struct net_device *dev, unsigned short val, unsigned short reg)
  123. {
  124. if (reg<0x8)
  125. SIFWRITEW(val, reg);
  126. else {
  127. madgemc_setregpage(dev, 1);
  128. SIFWRITEW(val, reg);
  129. madgemc_setregpage(dev, 0);
  130. }
  131. return;
  132. }
  133. static int __init madgemc_probe(void)
  134. {
  135. static int versionprinted;
  136. struct net_device *dev;
  137. struct net_local *tp;
  138. struct madgemc_card *card;
  139. int i,slot = 0;
  140. __u8 posreg[4];
  141. if (!MCA_bus)
  142. return -1;
  143. while (slot != MCA_NOTFOUND) {
  144. /*
  145. * Currently we only support the MC16/32 (MCA ID 002d)
  146. */
  147. slot = mca_find_unused_adapter(0x002d, slot);
  148. if (slot == MCA_NOTFOUND)
  149. break;
  150. /*
  151. * If we get here, we have an adapter.
  152. */
  153. if (versionprinted++ == 0)
  154. printk("%s", version);
  155. dev = alloc_trdev(sizeof(struct net_local));
  156. if (dev == NULL) {
  157. printk("madgemc: unable to allocate dev space\n");
  158. if (madgemc_card_list)
  159. return 0;
  160. return -1;
  161. }
  162. SET_MODULE_OWNER(dev);
  163. dev->dma = 0;
  164. /*
  165. * Fetch MCA config registers
  166. */
  167. for(i=0;i<4;i++)
  168. posreg[i] = mca_read_stored_pos(slot, i+2);
  169. card = kmalloc(sizeof(struct madgemc_card), GFP_KERNEL);
  170. if (card==NULL) {
  171. printk("madgemc: unable to allocate card struct\n");
  172. free_netdev(dev);
  173. if (madgemc_card_list)
  174. return 0;
  175. return -1;
  176. }
  177. card->dev = dev;
  178. /*
  179. * Parse configuration information. This all comes
  180. * directly from the publicly available @002d.ADF.
  181. * Get it from Madge or your local ADF library.
  182. */
  183. /*
  184. * Base address
  185. */
  186. dev->base_addr = 0x0a20 +
  187. ((posreg[2] & MC16_POS2_ADDR2)?0x0400:0) +
  188. ((posreg[0] & MC16_POS0_ADDR1)?0x1000:0) +
  189. ((posreg[3] & MC16_POS3_ADDR3)?0x2000:0);
  190. /*
  191. * Interrupt line
  192. */
  193. switch(posreg[0] >> 6) { /* upper two bits */
  194. case 0x1: dev->irq = 3; break;
  195. case 0x2: dev->irq = 9; break; /* IRQ 2 = IRQ 9 */
  196. case 0x3: dev->irq = 10; break;
  197. default: dev->irq = 0; break;
  198. }
  199. if (dev->irq == 0) {
  200. printk("%s: invalid IRQ\n", dev->name);
  201. goto getout1;
  202. }
  203. if (!request_region(dev->base_addr, MADGEMC_IO_EXTENT,
  204. "madgemc")) {
  205. printk(KERN_INFO "madgemc: unable to setup Smart MC in slot %d because of I/O base conflict at 0x%04lx\n", slot, dev->base_addr);
  206. dev->base_addr += MADGEMC_SIF_OFFSET;
  207. goto getout1;
  208. }
  209. dev->base_addr += MADGEMC_SIF_OFFSET;
  210. /*
  211. * Arbitration Level
  212. */
  213. card->arblevel = ((posreg[0] >> 1) & 0x7) + 8;
  214. /*
  215. * Burst mode and Fairness
  216. */
  217. card->burstmode = ((posreg[2] >> 6) & 0x3);
  218. card->fairness = ((posreg[2] >> 4) & 0x1);
  219. /*
  220. * Ring Speed
  221. */
  222. if ((posreg[1] >> 2)&0x1)
  223. card->ringspeed = 2; /* not selected */
  224. else if ((posreg[2] >> 5) & 0x1)
  225. card->ringspeed = 1; /* 16Mb */
  226. else
  227. card->ringspeed = 0; /* 4Mb */
  228. /*
  229. * Cable type
  230. */
  231. if ((posreg[1] >> 6)&0x1)
  232. card->cabletype = 1; /* STP/DB9 */
  233. else
  234. card->cabletype = 0; /* UTP/RJ-45 */
  235. /*
  236. * ROM Info. This requires us to actually twiddle
  237. * bits on the card, so we must ensure above that
  238. * the base address is free of conflict (request_region above).
  239. */
  240. madgemc_read_rom(card);
  241. if (card->manid != 0x4d) { /* something went wrong */
  242. printk(KERN_INFO "%s: Madge MC ROM read failed (unknown manufacturer ID %02x)\n", dev->name, card->manid);
  243. goto getout;
  244. }
  245. if ((card->cardtype != 0x08) && (card->cardtype != 0x0d)) {
  246. printk(KERN_INFO "%s: Madge MC ROM read failed (unknown card ID %02x)\n", dev->name, card->cardtype);
  247. goto getout;
  248. }
  249. /* All cards except Rev 0 and 1 MC16's have 256kb of RAM */
  250. if ((card->cardtype == 0x08) && (card->cardrev <= 0x01))
  251. card->ramsize = 128;
  252. else
  253. card->ramsize = 256;
  254. printk("%s: %s Rev %d at 0x%04lx IRQ %d\n",
  255. dev->name,
  256. (card->cardtype == 0x08)?MADGEMC16_CARDNAME:
  257. MADGEMC32_CARDNAME, card->cardrev,
  258. dev->base_addr, dev->irq);
  259. if (card->cardtype == 0x0d)
  260. printk("%s: Warning: MC32 support is experimental and highly untested\n", dev->name);
  261. if (card->ringspeed==2) { /* Unknown */
  262. printk("%s: Warning: Ring speed not set in POS -- Please run the reference disk and set it!\n", dev->name);
  263. card->ringspeed = 1; /* default to 16mb */
  264. }
  265. printk("%s: RAM Size: %dKB\n", dev->name, card->ramsize);
  266. printk("%s: Ring Speed: %dMb/sec on %s\n", dev->name,
  267. (card->ringspeed)?16:4,
  268. card->cabletype?"STP/DB9":"UTP/RJ-45");
  269. printk("%s: Arbitration Level: %d\n", dev->name,
  270. card->arblevel);
  271. printk("%s: Burst Mode: ", dev->name);
  272. switch(card->burstmode) {
  273. case 0: printk("Cycle steal"); break;
  274. case 1: printk("Limited burst"); break;
  275. case 2: printk("Delayed release"); break;
  276. case 3: printk("Immediate release"); break;
  277. }
  278. printk(" (%s)\n", (card->fairness)?"Unfair":"Fair");
  279. /*
  280. * Enable SIF before we assign the interrupt handler,
  281. * just in case we get spurious interrupts that need
  282. * handling.
  283. */
  284. outb(0, dev->base_addr + MC_CONTROL_REG0); /* sanity */
  285. madgemc_setsifsel(dev, 1);
  286. if (request_irq(dev->irq, madgemc_interrupt, SA_SHIRQ,
  287. "madgemc", dev))
  288. goto getout;
  289. madgemc_chipset_init(dev); /* enables interrupts! */
  290. madgemc_setcabletype(dev, card->cabletype);
  291. /* Setup MCA structures */
  292. mca_set_adapter_name(slot, (card->cardtype == 0x08)?MADGEMC16_CARDNAME:MADGEMC32_CARDNAME);
  293. mca_set_adapter_procfn(slot, madgemc_mcaproc, dev);
  294. mca_mark_as_used(slot);
  295. printk("%s: Ring Station Address: ", dev->name);
  296. printk("%2.2x", dev->dev_addr[0]);
  297. for (i = 1; i < 6; i++)
  298. printk(":%2.2x", dev->dev_addr[i]);
  299. printk("\n");
  300. /* XXX is ISA_MAX_ADDRESS correct here? */
  301. if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL)) {
  302. printk("%s: unable to get memory for dev->priv.\n",
  303. dev->name);
  304. release_region(dev->base_addr-MADGEMC_SIF_OFFSET,
  305. MADGEMC_IO_EXTENT);
  306. kfree(card);
  307. tmsdev_term(dev);
  308. free_netdev(dev);
  309. if (madgemc_card_list)
  310. return 0;
  311. return -1;
  312. }
  313. tp = netdev_priv(dev);
  314. /*
  315. * The MC16 is physically a 32bit card. However, Madge
  316. * insists on calling it 16bit, so I'll assume here that
  317. * they know what they're talking about. Cut off DMA
  318. * at 16mb.
  319. */
  320. tp->setnselout = madgemc_setnselout_pins;
  321. tp->sifwriteb = madgemc_sifwriteb;
  322. tp->sifreadb = madgemc_sifreadb;
  323. tp->sifwritew = madgemc_sifwritew;
  324. tp->sifreadw = madgemc_sifreadw;
  325. tp->DataRate = (card->ringspeed)?SPEED_16:SPEED_4;
  326. memcpy(tp->ProductID, "Madge MCA 16/4 ", PROD_ID_SIZE + 1);
  327. dev->open = madgemc_open;
  328. dev->stop = madgemc_close;
  329. if (register_netdev(dev) == 0) {
  330. /* Enlist in the card list */
  331. card->next = madgemc_card_list;
  332. madgemc_card_list = card;
  333. slot++;
  334. continue; /* successful, try to find another */
  335. }
  336. free_irq(dev->irq, dev);
  337. getout:
  338. release_region(dev->base_addr-MADGEMC_SIF_OFFSET,
  339. MADGEMC_IO_EXTENT);
  340. getout1:
  341. kfree(card);
  342. free_netdev(dev);
  343. slot++;
  344. }
  345. if (madgemc_card_list)
  346. return 0;
  347. return -1;
  348. }
  349. /*
  350. * Handle interrupts generated by the card
  351. *
  352. * The MicroChannel Madge cards need slightly more handling
  353. * after an interrupt than other TMS380 cards do.
  354. *
  355. * First we must make sure it was this card that generated the
  356. * interrupt (since interrupt sharing is allowed). Then,
  357. * because we're using level-triggered interrupts (as is
  358. * standard on MCA), we must toggle the interrupt line
  359. * on the card in order to claim and acknowledge the interrupt.
  360. * Once that is done, the interrupt should be handlable in
  361. * the normal tms380tr_interrupt() routine.
  362. *
  363. * There's two ways we can check to see if the interrupt is ours,
  364. * both with their own disadvantages...
  365. *
  366. * 1) Read in the SIFSTS register from the TMS controller. This
  367. * is guarenteed to be accurate, however, there's a fairly
  368. * large performance penalty for doing so: the Madge chips
  369. * must request the register from the Eagle, the Eagle must
  370. * read them from its internal bus, and then take the route
  371. * back out again, for a 16bit read.
  372. *
  373. * 2) Use the MC_CONTROL_REG0_SINTR bit from the Madge ASICs.
  374. * The major disadvantage here is that the accuracy of the
  375. * bit is in question. However, it cuts out the extra read
  376. * cycles it takes to read the Eagle's SIF, as its only an
  377. * 8bit read, and theoretically the Madge bit is directly
  378. * connected to the interrupt latch coming out of the Eagle
  379. * hardware (that statement is not verified).
  380. *
  381. * I can't determine which of these methods has the best win. For now,
  382. * we make a compromise. Use the Madge way for the first interrupt,
  383. * which should be the fast-path, and then once we hit the first
  384. * interrupt, keep on trying using the SIF method until we've
  385. * exhausted all contiguous interrupts.
  386. *
  387. */
  388. static irqreturn_t madgemc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  389. {
  390. int pending,reg1;
  391. struct net_device *dev;
  392. if (!dev_id) {
  393. printk("madgemc_interrupt: was not passed a dev_id!\n");
  394. return IRQ_NONE;
  395. }
  396. dev = (struct net_device *)dev_id;
  397. /* Make sure its really us. -- the Madge way */
  398. pending = inb(dev->base_addr + MC_CONTROL_REG0);
  399. if (!(pending & MC_CONTROL_REG0_SINTR))
  400. return IRQ_NONE; /* not our interrupt */
  401. /*
  402. * Since we're level-triggered, we may miss the rising edge
  403. * of the next interrupt while we're off handling this one,
  404. * so keep checking until the SIF verifies that it has nothing
  405. * left for us to do.
  406. */
  407. pending = STS_SYSTEM_IRQ;
  408. do {
  409. if (pending & STS_SYSTEM_IRQ) {
  410. /* Toggle the interrupt to reset the latch on card */
  411. reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
  412. outb(reg1 ^ MC_CONTROL_REG1_SINTEN,
  413. dev->base_addr + MC_CONTROL_REG1);
  414. outb(reg1, dev->base_addr + MC_CONTROL_REG1);
  415. /* Continue handling as normal */
  416. tms380tr_interrupt(irq, dev_id, regs);
  417. pending = SIFREADW(SIFSTS); /* restart - the SIF way */
  418. } else
  419. return IRQ_HANDLED;
  420. } while (1);
  421. return IRQ_HANDLED; /* not reachable */
  422. }
  423. /*
  424. * Set the card to the prefered ring speed.
  425. *
  426. * Unlike newer cards, the MC16/32 have their speed selection
  427. * circuit connected to the Madge ASICs and not to the TMS380
  428. * NSELOUT pins. Set the ASIC bits correctly here, and return
  429. * zero to leave the TMS NSELOUT bits unaffected.
  430. *
  431. */
  432. unsigned short madgemc_setnselout_pins(struct net_device *dev)
  433. {
  434. unsigned char reg1;
  435. struct net_local *tp = netdev_priv(dev);
  436. reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
  437. if(tp->DataRate == SPEED_16)
  438. reg1 |= MC_CONTROL_REG1_SPEED_SEL; /* add for 16mb */
  439. else if (reg1 & MC_CONTROL_REG1_SPEED_SEL)
  440. reg1 ^= MC_CONTROL_REG1_SPEED_SEL; /* remove for 4mb */
  441. outb(reg1, dev->base_addr + MC_CONTROL_REG1);
  442. return 0; /* no change */
  443. }
  444. /*
  445. * Set the register page. This equates to the SRSX line
  446. * on the TMS380Cx6.
  447. *
  448. * Register selection is normally done via three contiguous
  449. * bits. However, some boards (such as the MC16/32) use only
  450. * two bits, plus a separate bit in the glue chip. This
  451. * sets the SRSX bit (the top bit). See page 4-17 in the
  452. * Yellow Book for which registers are affected.
  453. *
  454. */
  455. static void madgemc_setregpage(struct net_device *dev, int page)
  456. {
  457. static int reg1;
  458. reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
  459. if ((page == 0) && (reg1 & MC_CONTROL_REG1_SRSX)) {
  460. outb(reg1 ^ MC_CONTROL_REG1_SRSX,
  461. dev->base_addr + MC_CONTROL_REG1);
  462. }
  463. else if (page == 1) {
  464. outb(reg1 | MC_CONTROL_REG1_SRSX,
  465. dev->base_addr + MC_CONTROL_REG1);
  466. }
  467. reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
  468. return;
  469. }
  470. /*
  471. * The SIF registers are not mapped into register space by default
  472. * Set this to 1 to map them, 0 to map the BIA ROM.
  473. *
  474. */
  475. static void madgemc_setsifsel(struct net_device *dev, int val)
  476. {
  477. unsigned int reg0;
  478. reg0 = inb(dev->base_addr + MC_CONTROL_REG0);
  479. if ((val == 0) && (reg0 & MC_CONTROL_REG0_SIFSEL)) {
  480. outb(reg0 ^ MC_CONTROL_REG0_SIFSEL,
  481. dev->base_addr + MC_CONTROL_REG0);
  482. } else if (val == 1) {
  483. outb(reg0 | MC_CONTROL_REG0_SIFSEL,
  484. dev->base_addr + MC_CONTROL_REG0);
  485. }
  486. reg0 = inb(dev->base_addr + MC_CONTROL_REG0);
  487. return;
  488. }
  489. /*
  490. * Enable SIF interrupts
  491. *
  492. * This does not enable interrupts in the SIF, but rather
  493. * enables SIF interrupts to be passed onto the host.
  494. *
  495. */
  496. static void madgemc_setint(struct net_device *dev, int val)
  497. {
  498. unsigned int reg1;
  499. reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
  500. if ((val == 0) && (reg1 & MC_CONTROL_REG1_SINTEN)) {
  501. outb(reg1 ^ MC_CONTROL_REG1_SINTEN,
  502. dev->base_addr + MC_CONTROL_REG1);
  503. } else if (val == 1) {
  504. outb(reg1 | MC_CONTROL_REG1_SINTEN,
  505. dev->base_addr + MC_CONTROL_REG1);
  506. }
  507. return;
  508. }
  509. /*
  510. * Cable type is set via control register 7. Bit zero high
  511. * for UTP, low for STP.
  512. */
  513. static void madgemc_setcabletype(struct net_device *dev, int type)
  514. {
  515. outb((type==0)?MC_CONTROL_REG7_CABLEUTP:MC_CONTROL_REG7_CABLESTP,
  516. dev->base_addr + MC_CONTROL_REG7);
  517. }
  518. /*
  519. * Enable the functions of the Madge chipset needed for
  520. * full working order.
  521. */
  522. static int madgemc_chipset_init(struct net_device *dev)
  523. {
  524. outb(0, dev->base_addr + MC_CONTROL_REG1); /* pull SRESET low */
  525. tms380tr_wait(100); /* wait for card to reset */
  526. /* bring back into normal operating mode */
  527. outb(MC_CONTROL_REG1_NSRESET, dev->base_addr + MC_CONTROL_REG1);
  528. /* map SIF registers */
  529. madgemc_setsifsel(dev, 1);
  530. /* enable SIF interrupts */
  531. madgemc_setint(dev, 1);
  532. return 0;
  533. }
  534. /*
  535. * Disable the board, and put back into power-up state.
  536. */
  537. static void madgemc_chipset_close(struct net_device *dev)
  538. {
  539. /* disable interrupts */
  540. madgemc_setint(dev, 0);
  541. /* unmap SIF registers */
  542. madgemc_setsifsel(dev, 0);
  543. return;
  544. }
  545. /*
  546. * Read the card type (MC16 or MC32) from the card.
  547. *
  548. * The configuration registers are stored in two separate
  549. * pages. Pages are flipped by clearing bit 3 of CONTROL_REG0 (PAGE)
  550. * for page zero, or setting bit 3 for page one.
  551. *
  552. * Page zero contains the following data:
  553. * Byte 0: Manufacturer ID (0x4D -- ASCII "M")
  554. * Byte 1: Card type:
  555. * 0x08 for MC16
  556. * 0x0D for MC32
  557. * Byte 2: Card revision
  558. * Byte 3: Mirror of POS config register 0
  559. * Byte 4: Mirror of POS 1
  560. * Byte 5: Mirror of POS 2
  561. *
  562. * Page one contains the following data:
  563. * Byte 0: Unused
  564. * Byte 1-6: BIA, MSB to LSB.
  565. *
  566. * Note that to read the BIA, we must unmap the SIF registers
  567. * by clearing bit 2 of CONTROL_REG0 (SIFSEL), as the data
  568. * will reside in the same logical location. For this reason,
  569. * _never_ read the BIA while the Eagle processor is running!
  570. * The SIF will be completely inaccessible until the BIA operation
  571. * is complete.
  572. *
  573. */
  574. static void madgemc_read_rom(struct madgemc_card *card)
  575. {
  576. unsigned long ioaddr;
  577. unsigned char reg0, reg1, tmpreg0, i;
  578. ioaddr = card->dev->base_addr;
  579. reg0 = inb(ioaddr + MC_CONTROL_REG0);
  580. reg1 = inb(ioaddr + MC_CONTROL_REG1);
  581. /* Switch to page zero and unmap SIF */
  582. tmpreg0 = reg0 & ~(MC_CONTROL_REG0_PAGE + MC_CONTROL_REG0_SIFSEL);
  583. outb(tmpreg0, ioaddr + MC_CONTROL_REG0);
  584. card->manid = inb(ioaddr + MC_ROM_MANUFACTURERID);
  585. card->cardtype = inb(ioaddr + MC_ROM_ADAPTERID);
  586. card->cardrev = inb(ioaddr + MC_ROM_REVISION);
  587. /* Switch to rom page one */
  588. outb(tmpreg0 | MC_CONTROL_REG0_PAGE, ioaddr + MC_CONTROL_REG0);
  589. /* Read BIA */
  590. card->dev->addr_len = 6;
  591. for (i = 0; i < 6; i++)
  592. card->dev->dev_addr[i] = inb(ioaddr + MC_ROM_BIA_START + i);
  593. /* Restore original register values */
  594. outb(reg0, ioaddr + MC_CONTROL_REG0);
  595. outb(reg1, ioaddr + MC_CONTROL_REG1);
  596. return;
  597. }
  598. static int madgemc_open(struct net_device *dev)
  599. {
  600. /*
  601. * Go ahead and reinitialize the chipset again, just to
  602. * make sure we didn't get left in a bad state.
  603. */
  604. madgemc_chipset_init(dev);
  605. tms380tr_open(dev);
  606. return 0;
  607. }
  608. static int madgemc_close(struct net_device *dev)
  609. {
  610. tms380tr_close(dev);
  611. madgemc_chipset_close(dev);
  612. return 0;
  613. }
  614. /*
  615. * Give some details available from /proc/mca/slotX
  616. */
  617. static int madgemc_mcaproc(char *buf, int slot, void *d)
  618. {
  619. struct net_device *dev = (struct net_device *)d;
  620. struct madgemc_card *curcard = madgemc_card_list;
  621. int len = 0;
  622. while (curcard) { /* search for card struct */
  623. if (curcard->dev == dev)
  624. break;
  625. curcard = curcard->next;
  626. }
  627. len += sprintf(buf+len, "-------\n");
  628. if (curcard) {
  629. struct net_local *tp = netdev_priv(dev);
  630. int i;
  631. len += sprintf(buf+len, "Card Revision: %d\n", curcard->cardrev);
  632. len += sprintf(buf+len, "RAM Size: %dkb\n", curcard->ramsize);
  633. len += sprintf(buf+len, "Cable type: %s\n", (curcard->cabletype)?"STP/DB9":"UTP/RJ-45");
  634. len += sprintf(buf+len, "Configured ring speed: %dMb/sec\n", (curcard->ringspeed)?16:4);
  635. len += sprintf(buf+len, "Running ring speed: %dMb/sec\n", (tp->DataRate==SPEED_16)?16:4);
  636. len += sprintf(buf+len, "Device: %s\n", dev->name);
  637. len += sprintf(buf+len, "IO Port: 0x%04lx\n", dev->base_addr);
  638. len += sprintf(buf+len, "IRQ: %d\n", dev->irq);
  639. len += sprintf(buf+len, "Arbitration Level: %d\n", curcard->arblevel);
  640. len += sprintf(buf+len, "Burst Mode: ");
  641. switch(curcard->burstmode) {
  642. case 0: len += sprintf(buf+len, "Cycle steal"); break;
  643. case 1: len += sprintf(buf+len, "Limited burst"); break;
  644. case 2: len += sprintf(buf+len, "Delayed release"); break;
  645. case 3: len += sprintf(buf+len, "Immediate release"); break;
  646. }
  647. len += sprintf(buf+len, " (%s)\n", (curcard->fairness)?"Unfair":"Fair");
  648. len += sprintf(buf+len, "Ring Station Address: ");
  649. len += sprintf(buf+len, "%2.2x", dev->dev_addr[0]);
  650. for (i = 1; i < 6; i++)
  651. len += sprintf(buf+len, " %2.2x", dev->dev_addr[i]);
  652. len += sprintf(buf+len, "\n");
  653. } else
  654. len += sprintf(buf+len, "Card not configured\n");
  655. return len;
  656. }
  657. static void __exit madgemc_exit(void)
  658. {
  659. struct net_device *dev;
  660. struct madgemc_card *this_card;
  661. while (madgemc_card_list) {
  662. dev = madgemc_card_list->dev;
  663. unregister_netdev(dev);
  664. release_region(dev->base_addr-MADGEMC_SIF_OFFSET, MADGEMC_IO_EXTENT);
  665. free_irq(dev->irq, dev);
  666. tmsdev_term(dev);
  667. free_netdev(dev);
  668. this_card = madgemc_card_list;
  669. madgemc_card_list = this_card->next;
  670. kfree(this_card);
  671. }
  672. }
  673. module_init(madgemc_probe);
  674. module_exit(madgemc_exit);
  675. MODULE_LICENSE("GPL");