madgemc.c 21 KB

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