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