madgemc.c 21 KB

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