madgemc.c 21 KB

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