madgemc.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:22k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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