de4x5.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:174k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. ** When autonegotiation is working, the ANS part searches the SROM for
  2. ** the highest common speed (TP) link that both can run and if that can
  3. ** be full duplex. That infoblock is executed and then the link speed set.
  4. **
  5. ** Only _10Mb and _100Mb are tested here.
  6. */
  7. static int
  8. dc2114x_autoconf(struct net_device *dev)
  9. {
  10.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  11.     u_long iobase = dev->base_addr;
  12.     s32 cr, anlpa, ana, cap, irqs, irq_mask, imr, omr, slnk, sr, sts;
  13.     int next_tick = DE4X5_AUTOSENSE_MS;
  14.     switch (lp->media) {
  15.     case INIT:
  16.         if (lp->timeout < 0) {
  17.     DISABLE_IRQs;
  18.     lp->tx_enable = FALSE;
  19.     lp->linkOK = 0;
  20.             lp->timeout = -1;
  21.     de4x5_save_skbs(dev);            /* Save non transmitted skb's */
  22.     if (lp->params.autosense & ~AUTO) {
  23. srom_map_media(dev);         /* Fixed media requested      */
  24. if (lp->media != lp->params.autosense) {
  25.     lp->tcount++;
  26.     lp->media = INIT;
  27.     return next_tick;
  28. }
  29. lp->media = INIT;
  30.     }
  31. }
  32. if ((next_tick = de4x5_reset_phy(dev)) < 0) {
  33.     next_tick &= ~TIMER_CB;
  34. } else {
  35.     if (lp->autosense == _100Mb) {
  36. lp->media = _100Mb;
  37.     } else if (lp->autosense == _10Mb) {
  38. lp->media = _10Mb;
  39.     } else if (lp->autosense == TP) {
  40. lp->media = TP;
  41.     } else if (lp->autosense == BNC) {
  42. lp->media = BNC;
  43.     } else if (lp->autosense == AUI) {
  44. lp->media = AUI;
  45.     } else {
  46. lp->media = SPD_DET;
  47. if ((lp->infoblock_media == ANS) && 
  48.                     ((sr=is_anc_capable(dev)) & MII_SR_ANC)) {
  49.     ana = (((sr >> 6) & MII_ANA_TAF) | MII_ANA_CSMA);
  50.     ana &= (lp->fdx ? ~0 : ~MII_ANA_FDAM);
  51.     mii_wr(ana, MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
  52.     lp->media = ANS;
  53. }
  54.     }
  55.     lp->local_state = 0;
  56.     next_tick = dc2114x_autoconf(dev);
  57.         }
  58. break;
  59.     case ANS:
  60. switch (lp->local_state) {
  61. case 0:
  62.     if (lp->timeout < 0) {
  63. mii_wr(MII_CR_ASSE | MII_CR_RAN, MII_CR, lp->phy[lp->active].addr, DE4X5_MII);
  64.     }
  65.     cr = test_mii_reg(dev, MII_CR, MII_CR_RAN, FALSE, 500);
  66.     if (cr < 0) {
  67. next_tick = cr & ~TIMER_CB;
  68.     } else {
  69. if (cr) {
  70.     lp->local_state = 0;
  71.     lp->media = SPD_DET;
  72. } else {
  73.     lp->local_state++;
  74. }
  75. next_tick = dc2114x_autoconf(dev);
  76.     }
  77.     break;
  78.     
  79. case 1:
  80.     if ((sr=test_mii_reg(dev, MII_SR, MII_SR_ASSC, TRUE, 2000)) < 0) {
  81. next_tick = sr & ~TIMER_CB;
  82.     } else {
  83. lp->media = SPD_DET;
  84. lp->local_state = 0;
  85. if (sr) {                         /* Success! */
  86.     lp->tmp = MII_SR_ASSC;
  87.     anlpa = mii_rd(MII_ANLPA, lp->phy[lp->active].addr, DE4X5_MII);
  88.     ana = mii_rd(MII_ANA, lp->phy[lp->active].addr, DE4X5_MII);
  89.     if (!(anlpa & MII_ANLPA_RF) && 
  90.  (cap = anlpa & MII_ANLPA_TAF & ana)) {
  91. if (cap & MII_ANA_100M) {
  92.     lp->fdx = ((ana & anlpa & MII_ANA_FDAM & MII_ANA_100M) ? TRUE : FALSE);
  93.     lp->media = _100Mb;
  94. } else if (cap & MII_ANA_10M) {
  95.     lp->fdx = ((ana & anlpa & MII_ANA_FDAM & MII_ANA_10M) ? TRUE : FALSE);
  96.     lp->media = _10Mb;
  97. }
  98.     }
  99. }                       /* Auto Negotiation failed to finish */
  100. next_tick = dc2114x_autoconf(dev);
  101.     }                           /* Auto Negotiation failed to start  */
  102.     break;
  103. }
  104. break;
  105.     case AUI:
  106. if (!lp->tx_enable) {
  107.     if (lp->timeout < 0) {
  108. omr = inl(DE4X5_OMR);   /* Set up half duplex for AUI        */
  109. outl(omr & ~OMR_FDX, DE4X5_OMR);
  110.     }
  111.     irqs = 0;
  112.     irq_mask = 0;
  113.     sts = test_media(dev,irqs, irq_mask, 0, 0, 0, 1000);
  114.     if (sts < 0) {
  115. next_tick = sts & ~TIMER_CB;
  116.     } else {
  117. if (!(inl(DE4X5_SISR) & SISR_SRA) && (lp->autosense == AUTO)) {
  118.     lp->media = BNC;
  119.     next_tick = dc2114x_autoconf(dev);
  120. } else {
  121.     lp->local_state = 1;
  122.     de4x5_init_connection(dev);
  123. }
  124.     }
  125. } else if (!lp->linkOK && (lp->autosense == AUTO)) {
  126.     lp->media = AUI_SUSPECT;
  127.     next_tick = 3000;
  128. }
  129. break;
  130.     case AUI_SUSPECT:
  131. next_tick = de4x5_suspect_state(dev, 1000, AUI, ping_media, dc2114x_autoconf);
  132. break;
  133.     case BNC:
  134. switch (lp->local_state) {
  135. case 0:
  136.     if (lp->timeout < 0) {
  137. omr = inl(DE4X5_OMR);          /* Set up half duplex for BNC */
  138. outl(omr & ~OMR_FDX, DE4X5_OMR);
  139.     }
  140.     irqs = 0;
  141.     irq_mask = 0;
  142.     sts = test_media(dev,irqs, irq_mask, 0, 0, 0, 1000);
  143.     if (sts < 0) {
  144. next_tick = sts & ~TIMER_CB;
  145.     } else {
  146. lp->local_state++;             /* Ensure media connected */
  147. next_tick = dc2114x_autoconf(dev);
  148.     }
  149.     break;
  150.     
  151. case 1:
  152.     if (!lp->tx_enable) {
  153. if ((sts = ping_media(dev, 3000)) < 0) {
  154.     next_tick = sts & ~TIMER_CB;
  155. } else {
  156.     if (sts) {
  157. lp->local_state = 0;
  158. lp->tcount++;
  159. lp->media = INIT;
  160.     } else {
  161. de4x5_init_connection(dev);
  162.     }
  163. }
  164.     } else if (!lp->linkOK && (lp->autosense == AUTO)) {
  165. lp->media = BNC_SUSPECT;
  166. next_tick = 3000;
  167.     }
  168.     break;
  169. }
  170. break;
  171.     case BNC_SUSPECT:
  172. next_tick = de4x5_suspect_state(dev, 1000, BNC, ping_media, dc2114x_autoconf);
  173. break;
  174.     case SPD_DET:                              /* Choose 10Mb/s or 100Mb/s */
  175.   if (srom_map_media(dev) < 0) {
  176.       lp->tcount++;
  177.       lp->media = INIT;
  178.       return next_tick;
  179.   }
  180.   if (lp->media == _100Mb) {
  181.       if ((slnk = test_for_100Mb(dev, 6500)) < 0) {
  182.   lp->media = SPD_DET;
  183.   return  (slnk & ~TIMER_CB);
  184.       }
  185.   } else {
  186.       if (wait_for_link(dev) < 0) {
  187.   lp->media = SPD_DET;
  188.   return PDET_LINK_WAIT;
  189.       }
  190.   }
  191.   if (lp->media == ANS) {           /* Do MII parallel detection */
  192.       if (is_spd_100(dev)) {
  193.   lp->media = _100Mb;
  194.       } else {
  195.   lp->media = _10Mb;
  196.       }
  197.       next_tick = dc2114x_autoconf(dev);
  198.   } else if (((lp->media == _100Mb) && is_100_up(dev)) ||
  199.      (((lp->media == _10Mb) || (lp->media == TP) ||
  200.        (lp->media == BNC)   || (lp->media == AUI)) && 
  201.       is_10_up(dev))) {
  202.       next_tick = dc2114x_autoconf(dev);
  203.   } else {
  204.       lp->tcount++;
  205.       lp->media = INIT;
  206.   }
  207.   break;
  208.     case _10Mb:
  209.         next_tick = 3000;
  210. if (!lp->tx_enable) {
  211.     SET_10Mb;
  212.     de4x5_init_connection(dev);
  213. } else {
  214.     if (!lp->linkOK && (lp->autosense == AUTO)) {
  215. if (!is_10_up(dev) || (!lp->useSROM && is_spd_100(dev))) {
  216.     lp->media = INIT;
  217.     lp->tcount++;
  218.     next_tick = DE4X5_AUTOSENSE_MS;
  219. }
  220.     }
  221. }
  222. break;
  223.     case _100Mb:
  224.         next_tick = 3000;
  225. if (!lp->tx_enable) {
  226.     SET_100Mb;
  227.     de4x5_init_connection(dev);
  228. } else {
  229.     if (!lp->linkOK && (lp->autosense == AUTO)) {
  230. if (!is_100_up(dev) || (!lp->useSROM && !is_spd_100(dev))) {
  231.     lp->media = INIT;
  232.     lp->tcount++;
  233.     next_tick = DE4X5_AUTOSENSE_MS;
  234. }
  235.     }
  236. }
  237. break;
  238.     default:
  239. lp->tcount++;
  240. printk("Huh?: media:%02xn", lp->media);
  241. lp->media = INIT;
  242. break;
  243.     }
  244.     
  245.     return next_tick;
  246. }
  247. static int
  248. srom_autoconf(struct net_device *dev)
  249. {
  250.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  251.     return lp->infoleaf_fn(dev);
  252. }
  253. /*
  254. ** This mapping keeps the original media codes and FDX flag unchanged.
  255. ** While it isn't strictly necessary, it helps me for the moment...
  256. ** The early return avoids a media state / SROM media space clash.
  257. */
  258. static int
  259. srom_map_media(struct net_device *dev)
  260. {
  261.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  262.     lp->fdx = 0;
  263.     if (lp->infoblock_media == lp->media) 
  264.       return 0;
  265.     switch(lp->infoblock_media) {
  266.       case SROM_10BASETF:
  267. if (!lp->params.fdx) return -1;
  268. lp->fdx = TRUE;
  269.       case SROM_10BASET:
  270. if (lp->params.fdx && !lp->fdx) return -1;
  271. if ((lp->chipset == DC21140) || ((lp->chipset & ~0x00ff) == DC2114x)) {
  272.     lp->media = _10Mb;
  273. } else {
  274.     lp->media = TP;
  275. }
  276. break;
  277.       case SROM_10BASE2:
  278. lp->media = BNC;
  279. break;
  280.       case SROM_10BASE5:
  281. lp->media = AUI;
  282. break;
  283.       case SROM_100BASETF:
  284.         if (!lp->params.fdx) return -1;
  285. lp->fdx = TRUE;
  286.       case SROM_100BASET:
  287. if (lp->params.fdx && !lp->fdx) return -1;
  288. lp->media = _100Mb;
  289. break;
  290.       case SROM_100BASET4:
  291. lp->media = _100Mb;
  292. break;
  293.       case SROM_100BASEFF:
  294. if (!lp->params.fdx) return -1;
  295. lp->fdx = TRUE;
  296.       case SROM_100BASEF: 
  297. if (lp->params.fdx && !lp->fdx) return -1;
  298. lp->media = _100Mb;
  299. break;
  300.       case ANS:
  301. lp->media = ANS;
  302. lp->fdx = lp->params.fdx;
  303. break;
  304.       default: 
  305. printk("%s: Bad media code [%d] detected in SROM!n", dev->name, 
  306.                                                   lp->infoblock_media);
  307. return -1;
  308. break;
  309.     }
  310.     return 0;
  311. }
  312. static void
  313. de4x5_init_connection(struct net_device *dev)
  314. {
  315.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  316.     u_long iobase = dev->base_addr;
  317.     u_long flags = 0;
  318.     if (lp->media != lp->c_media) {
  319.         de4x5_dbg_media(dev);
  320. lp->c_media = lp->media;          /* Stop scrolling media messages */
  321.     }
  322.     spin_lock_irqsave(&lp->lock, flags);
  323.     de4x5_rst_desc_ring(dev);
  324.     de4x5_setup_intr(dev);
  325.     lp->tx_enable = YES;
  326.     spin_unlock_irqrestore(&lp->lock, flags);
  327.     outl(POLL_DEMAND, DE4X5_TPD);
  328.     netif_wake_queue(dev);
  329.     return;
  330. }
  331. /*
  332. ** General PHY reset function. Some MII devices don't reset correctly
  333. ** since their MII address pins can float at voltages that are dependent
  334. ** on the signal pin use. Do a double reset to ensure a reset.
  335. */
  336. static int
  337. de4x5_reset_phy(struct net_device *dev)
  338. {
  339.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  340.     u_long iobase = dev->base_addr;
  341.     int next_tick = 0;
  342.     if ((lp->useSROM) || (lp->phy[lp->active].id)) {
  343. if (lp->timeout < 0) {
  344.     if (lp->useSROM) {
  345. if (lp->phy[lp->active].rst) {
  346.     srom_exec(dev, lp->phy[lp->active].rst);
  347.     srom_exec(dev, lp->phy[lp->active].rst);
  348. } else if (lp->rst) {          /* Type 5 infoblock reset */
  349.     srom_exec(dev, lp->rst);
  350.     srom_exec(dev, lp->rst);
  351. }
  352.     } else {
  353. PHY_HARD_RESET;
  354.     }
  355.     if (lp->useMII) {
  356.         mii_wr(MII_CR_RST, MII_CR, lp->phy[lp->active].addr, DE4X5_MII);
  357.             }
  358.         }
  359. if (lp->useMII) {
  360.     next_tick = test_mii_reg(dev, MII_CR, MII_CR_RST, FALSE, 500);
  361. }
  362.     } else if (lp->chipset == DC21140) {
  363. PHY_HARD_RESET;
  364.     }
  365.     return next_tick;
  366. }
  367. static int
  368. test_media(struct net_device *dev, s32 irqs, s32 irq_mask, s32 csr13, s32 csr14, s32 csr15, s32 msec)
  369. {
  370.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  371.     u_long iobase = dev->base_addr;
  372.     s32 sts, csr12;
  373.     
  374.     if (lp->timeout < 0) {
  375. lp->timeout = msec/100;
  376. if (!lp->useSROM) {      /* Already done if by SROM, else dc2104[01] */
  377.     reset_init_sia(dev, csr13, csr14, csr15);
  378. }
  379. /* set up the interrupt mask */
  380. outl(irq_mask, DE4X5_IMR);
  381. /* clear all pending interrupts */
  382. sts = inl(DE4X5_STS);
  383. outl(sts, DE4X5_STS);
  384. /* clear csr12 NRA and SRA bits */
  385. if ((lp->chipset == DC21041) || lp->useSROM) {
  386.     csr12 = inl(DE4X5_SISR);
  387.     outl(csr12, DE4X5_SISR);
  388. }
  389.     }
  390.     
  391.     sts = inl(DE4X5_STS) & ~TIMER_CB;
  392.     
  393.     if (!(sts & irqs) && --lp->timeout) {
  394. sts = 100 | TIMER_CB;
  395.     } else {
  396. lp->timeout = -1;
  397.     }
  398.     
  399.     return sts;
  400. }
  401. static int
  402. test_tp(struct net_device *dev, s32 msec)
  403. {
  404.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  405.     u_long iobase = dev->base_addr;
  406.     int sisr;
  407.     
  408.     if (lp->timeout < 0) {
  409. lp->timeout = msec/100;
  410.     }
  411.     
  412.     sisr = (inl(DE4X5_SISR) & ~TIMER_CB) & (SISR_LKF | SISR_NCR);
  413.     if (sisr && --lp->timeout) {
  414. sisr = 100 | TIMER_CB;
  415.     } else {
  416. lp->timeout = -1;
  417.     }
  418.     
  419.     return sisr;
  420. }
  421. /*
  422. ** Samples the 100Mb Link State Signal. The sample interval is important
  423. ** because too fast a rate can give erroneous results and confuse the
  424. ** speed sense algorithm.
  425. */
  426. #define SAMPLE_INTERVAL 500  /* ms */
  427. #define SAMPLE_DELAY    2000 /* ms */
  428. static int
  429. test_for_100Mb(struct net_device *dev, int msec)
  430. {
  431.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  432.     int gep = 0, ret = ((lp->chipset & ~0x00ff)==DC2114x? -1 :GEP_SLNK);
  433.     if (lp->timeout < 0) {
  434. if ((msec/SAMPLE_INTERVAL) <= 0) return 0;
  435. if (msec > SAMPLE_DELAY) {
  436.     lp->timeout = (msec - SAMPLE_DELAY)/SAMPLE_INTERVAL;
  437.     gep = SAMPLE_DELAY | TIMER_CB;
  438.     return gep;
  439. } else {
  440.     lp->timeout = msec/SAMPLE_INTERVAL;
  441. }
  442.     }
  443.     
  444.     if (lp->phy[lp->active].id || lp->useSROM) {
  445. gep = is_100_up(dev) | is_spd_100(dev);
  446.     } else {
  447. gep = (~gep_rd(dev) & (GEP_SLNK | GEP_LNP));
  448.     }
  449.     if (!(gep & ret) && --lp->timeout) {
  450. gep = SAMPLE_INTERVAL | TIMER_CB;
  451.     } else {
  452. lp->timeout = -1;
  453.     }
  454.     
  455.     return gep;
  456. }
  457. static int
  458. wait_for_link(struct net_device *dev)
  459. {
  460.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  461.     if (lp->timeout < 0) {
  462. lp->timeout = 1;
  463.     }
  464.     
  465.     if (lp->timeout--) {
  466. return TIMER_CB;
  467.     } else {
  468. lp->timeout = -1;
  469.     }
  470.     
  471.     return 0;
  472. }
  473. /*
  474. **
  475. **
  476. */
  477. static int
  478. test_mii_reg(struct net_device *dev, int reg, int mask, int pol, long msec)
  479. {
  480.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  481.     int test;
  482.     u_long iobase = dev->base_addr;
  483.     
  484.     if (lp->timeout < 0) {
  485. lp->timeout = msec/100;
  486.     }
  487.     
  488.     if (pol) pol = ~0;
  489.     reg = mii_rd((u_char)reg, lp->phy[lp->active].addr, DE4X5_MII) & mask;
  490.     test = (reg ^ pol) & mask;
  491.     
  492.     if (test && --lp->timeout) {
  493. reg = 100 | TIMER_CB;
  494.     } else {
  495. lp->timeout = -1;
  496.     }
  497.     
  498.     return reg;
  499. }
  500. static int
  501. is_spd_100(struct net_device *dev)
  502. {
  503.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  504.     u_long iobase = dev->base_addr;
  505.     int spd;
  506.     
  507.     if (lp->useMII) {
  508. spd = mii_rd(lp->phy[lp->active].spd.reg, lp->phy[lp->active].addr, DE4X5_MII);
  509. spd = ~(spd ^ lp->phy[lp->active].spd.value);
  510. spd &= lp->phy[lp->active].spd.mask;
  511.     } else if (!lp->useSROM) {                      /* de500-xa */
  512. spd = ((~gep_rd(dev)) & GEP_SLNK);
  513.     } else {
  514. if ((lp->ibn == 2) || !lp->asBitValid)
  515.     return ((lp->chipset == DC21143)?(~inl(DE4X5_SISR)&SISR_LS100):0);
  516. spd = (lp->asBitValid & (lp->asPolarity ^ (gep_rd(dev) & lp->asBit))) |
  517.           (lp->linkOK & ~lp->asBitValid);
  518.     }
  519.     
  520.     return spd;
  521. }
  522. static int
  523. is_100_up(struct net_device *dev)
  524. {
  525.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  526.     u_long iobase = dev->base_addr;
  527.     
  528.     if (lp->useMII) {
  529. /* Double read for sticky bits & temporary drops */
  530. mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII);
  531. return (mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII) & MII_SR_LKS);
  532.     } else if (!lp->useSROM) {                       /* de500-xa */
  533. return ((~gep_rd(dev)) & GEP_SLNK);
  534.     } else {
  535. if ((lp->ibn == 2) || !lp->asBitValid)
  536.     return ((lp->chipset == DC21143)?(~inl(DE4X5_SISR)&SISR_LS100):0);
  537.         return ((lp->asBitValid&(lp->asPolarity^(gep_rd(dev)&lp->asBit))) |
  538. (lp->linkOK & ~lp->asBitValid));
  539.     }
  540. }
  541. static int
  542. is_10_up(struct net_device *dev)
  543. {
  544.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  545.     u_long iobase = dev->base_addr;
  546.     
  547.     if (lp->useMII) {
  548. /* Double read for sticky bits & temporary drops */
  549. mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII);
  550. return (mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII) & MII_SR_LKS);
  551.     } else if (!lp->useSROM) {                       /* de500-xa */
  552. return ((~gep_rd(dev)) & GEP_LNP);
  553.     } else {
  554. if ((lp->ibn == 2) || !lp->asBitValid)
  555.     return (((lp->chipset & ~0x00ff) == DC2114x) ?
  556.     (~inl(DE4X5_SISR)&SISR_LS10):
  557.     0);
  558. return ((lp->asBitValid&(lp->asPolarity^(gep_rd(dev)&lp->asBit))) |
  559. (lp->linkOK & ~lp->asBitValid));
  560.     }
  561. }
  562. static int
  563. is_anc_capable(struct net_device *dev)
  564. {
  565.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  566.     u_long iobase = dev->base_addr;
  567.     
  568.     if (lp->phy[lp->active].id && (!lp->useSROM || lp->useMII)) {
  569. return (mii_rd(MII_SR, lp->phy[lp->active].addr, DE4X5_MII));
  570.     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
  571. return (inl(DE4X5_SISR) & SISR_LPN) >> 12;
  572.     } else {
  573. return 0;
  574.     }
  575. }
  576. /*
  577. ** Send a packet onto the media and watch for send errors that indicate the
  578. ** media is bad or unconnected.
  579. */
  580. static int
  581. ping_media(struct net_device *dev, int msec)
  582. {
  583.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  584.     u_long iobase = dev->base_addr;
  585.     int sisr;
  586.     
  587.     if (lp->timeout < 0) {
  588. lp->timeout = msec/100;
  589. lp->tmp = lp->tx_new;                /* Remember the ring position */
  590. load_packet(dev, lp->frame, TD_LS | TD_FS | sizeof(lp->frame), (struct sk_buff *)1);
  591. lp->tx_new = (++lp->tx_new) % lp->txRingSize;
  592. outl(POLL_DEMAND, DE4X5_TPD);
  593.     }
  594.     
  595.     sisr = inl(DE4X5_SISR);
  596.     if ((!(sisr & SISR_NCR)) && 
  597. ((s32)le32_to_cpu(lp->tx_ring[lp->tmp].status) < 0) && 
  598.  (--lp->timeout)) {
  599. sisr = 100 | TIMER_CB;
  600.     } else {
  601. if ((!(sisr & SISR_NCR)) && 
  602.     !(le32_to_cpu(lp->tx_ring[lp->tmp].status) & (T_OWN | TD_ES)) &&
  603.     lp->timeout) {
  604.     sisr = 0;
  605. } else {
  606.     sisr = 1;
  607. }
  608. lp->timeout = -1;
  609.     }
  610.     
  611.     return sisr;
  612. }
  613. /*
  614. ** This function does 2 things: on Intels it kmalloc's another buffer to
  615. ** replace the one about to be passed up. On Alpha's it kmallocs a buffer
  616. ** into which the packet is copied.
  617. */
  618. static struct sk_buff *
  619. de4x5_alloc_rx_buff(struct net_device *dev, int index, int len)
  620. {
  621.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  622.     struct sk_buff *p;
  623. #if !defined(__alpha__) && !defined(__powerpc__) && !defined(__sparc_v9__) && !defined(DE4X5_DO_MEMCPY)
  624.     struct sk_buff *ret;
  625.     u_long i=0, tmp;
  626.     p = dev_alloc_skb(IEEE802_3_SZ + DE4X5_ALIGN + 2);
  627.     if (!p) return NULL;
  628.     p->dev = dev;
  629.     tmp = virt_to_bus(p->data);
  630.     i = ((tmp + DE4X5_ALIGN) & ~DE4X5_ALIGN) - tmp;
  631.     skb_reserve(p, i);
  632.     lp->rx_ring[index].buf = cpu_to_le32(tmp + i);
  633.     ret = lp->rx_skb[index];
  634.     lp->rx_skb[index] = p;
  635.     if ((u_long) ret > 1) {
  636. skb_put(ret, len);
  637.     }
  638.     return ret;
  639. #else
  640.     if (lp->state != OPEN) return (struct sk_buff *)1; /* Fake out the open */
  641.     p = dev_alloc_skb(len + 2);
  642.     if (!p) return NULL;
  643.     p->dev = dev;
  644.     skb_reserve(p, 2);                                /* Align */
  645.     if (index < lp->rx_old) {                          /* Wrapped buffer */
  646. short tlen = (lp->rxRingSize - lp->rx_old) * RX_BUFF_SZ;
  647. memcpy(skb_put(p,tlen),lp->rx_bufs + lp->rx_old * RX_BUFF_SZ,tlen);
  648. memcpy(skb_put(p,len-tlen),lp->rx_bufs,len-tlen);
  649.     } else {                                           /* Linear buffer */
  650. memcpy(skb_put(p,len),lp->rx_bufs + lp->rx_old * RX_BUFF_SZ,len);
  651.     }
  652.     
  653.     return p;
  654. #endif
  655. }
  656. static void
  657. de4x5_free_rx_buffs(struct net_device *dev)
  658. {
  659.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  660.     int i;
  661.     for (i=0; i<lp->rxRingSize; i++) {
  662. if ((u_long) lp->rx_skb[i] > 1) {
  663.     dev_kfree_skb(lp->rx_skb[i]);
  664. }
  665. lp->rx_ring[i].status = 0;
  666. lp->rx_skb[i] = (struct sk_buff *)1;    /* Dummy entry */
  667.     }
  668.     return;
  669. }
  670. static void
  671. de4x5_free_tx_buffs(struct net_device *dev)
  672. {
  673.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  674.     int i;
  675.     for (i=0; i<lp->txRingSize; i++) {
  676. if (lp->tx_skb[i])
  677.     de4x5_free_tx_buff(lp, i);
  678. lp->tx_ring[i].status = 0;
  679.     }
  680.     /* Unload the locally queued packets */
  681.     while (lp->cache.skb) {
  682. dev_kfree_skb(de4x5_get_cache(dev));
  683.     }
  684.     return;
  685. }
  686. /*
  687. ** When a user pulls a connection, the DECchip can end up in a
  688. ** 'running - waiting for end of transmission' state. This means that we
  689. ** have to perform a chip soft reset to ensure that we can synchronize
  690. ** the hardware and software and make any media probes using a loopback
  691. ** packet meaningful.
  692. */
  693. static void
  694. de4x5_save_skbs(struct net_device *dev)
  695. {
  696.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  697.     u_long iobase = dev->base_addr;
  698.     s32 omr;
  699.     if (!lp->cache.save_cnt) {
  700. STOP_DE4X5;
  701. de4x5_tx(dev);                          /* Flush any sent skb's */
  702. de4x5_free_tx_buffs(dev);
  703. de4x5_cache_state(dev, DE4X5_SAVE_STATE);
  704. de4x5_sw_reset(dev);
  705. de4x5_cache_state(dev, DE4X5_RESTORE_STATE);
  706. lp->cache.save_cnt++;
  707. START_DE4X5;
  708.     }
  709.     return;
  710. }
  711. static void
  712. de4x5_rst_desc_ring(struct net_device *dev)
  713. {
  714.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  715.     u_long iobase = dev->base_addr;
  716.     int i;
  717.     s32 omr;
  718.     if (lp->cache.save_cnt) {
  719. STOP_DE4X5;
  720. outl(lp->dma_rings, DE4X5_RRBA);
  721. outl(lp->dma_rings + NUM_RX_DESC * sizeof(struct de4x5_desc),
  722.      DE4X5_TRBA);
  723.     
  724. lp->rx_new = lp->rx_old = 0;
  725. lp->tx_new = lp->tx_old = 0;
  726.     
  727. for (i = 0; i < lp->rxRingSize; i++) {
  728.     lp->rx_ring[i].status = cpu_to_le32(R_OWN);
  729. }
  730.     
  731. for (i = 0; i < lp->txRingSize; i++) {
  732.     lp->tx_ring[i].status = cpu_to_le32(0);
  733. }
  734.     
  735. barrier();
  736. lp->cache.save_cnt--;
  737. START_DE4X5;
  738.     }
  739.         
  740.     return;
  741. }
  742. static void
  743. de4x5_cache_state(struct net_device *dev, int flag)
  744. {
  745.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  746.     u_long iobase = dev->base_addr;
  747.     switch(flag) {
  748.       case DE4X5_SAVE_STATE:
  749. lp->cache.csr0 = inl(DE4X5_BMR);
  750. lp->cache.csr6 = (inl(DE4X5_OMR) & ~(OMR_ST | OMR_SR));
  751. lp->cache.csr7 = inl(DE4X5_IMR);
  752. break;
  753.       case DE4X5_RESTORE_STATE:
  754. outl(lp->cache.csr0, DE4X5_BMR);
  755. outl(lp->cache.csr6, DE4X5_OMR);
  756. outl(lp->cache.csr7, DE4X5_IMR);
  757. if (lp->chipset == DC21140) {
  758.     gep_wr(lp->cache.gepc, dev);
  759.     gep_wr(lp->cache.gep, dev);
  760. } else {
  761.     reset_init_sia(dev, lp->cache.csr13, lp->cache.csr14, 
  762.                                       lp->cache.csr15);
  763. }
  764. break;
  765.     }
  766.     return;
  767. }
  768. static void
  769. de4x5_put_cache(struct net_device *dev, struct sk_buff *skb)
  770. {
  771.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  772.     struct sk_buff *p;
  773.     if (lp->cache.skb) {
  774. for (p=lp->cache.skb; p->next; p=p->next);
  775. p->next = skb;
  776.     } else {
  777. lp->cache.skb = skb;
  778.     }
  779.     skb->next = NULL;
  780.     return;
  781. }
  782. static void
  783. de4x5_putb_cache(struct net_device *dev, struct sk_buff *skb)
  784. {
  785.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  786.     struct sk_buff *p = lp->cache.skb;
  787.     lp->cache.skb = skb;
  788.     skb->next = p;
  789.     return;
  790. }
  791. static struct sk_buff *
  792. de4x5_get_cache(struct net_device *dev)
  793. {
  794.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  795.     struct sk_buff *p = lp->cache.skb;
  796.     if (p) {
  797. lp->cache.skb = p->next;
  798. p->next = NULL;
  799.     }
  800.     return p;
  801. }
  802. /*
  803. ** Check the Auto Negotiation State. Return OK when a link pass interrupt
  804. ** is received and the auto-negotiation status is NWAY OK.
  805. */
  806. static int
  807. test_ans(struct net_device *dev, s32 irqs, s32 irq_mask, s32 msec)
  808. {
  809.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  810.     u_long iobase = dev->base_addr;
  811.     s32 sts, ans;
  812.     
  813.     if (lp->timeout < 0) {
  814. lp->timeout = msec/100;
  815. outl(irq_mask, DE4X5_IMR);
  816. /* clear all pending interrupts */
  817. sts = inl(DE4X5_STS);
  818. outl(sts, DE4X5_STS);
  819.     }
  820.     
  821.     ans = inl(DE4X5_SISR) & SISR_ANS;
  822.     sts = inl(DE4X5_STS) & ~TIMER_CB;
  823.     
  824.     if (!(sts & irqs) && (ans ^ ANS_NWOK) && --lp->timeout) {
  825. sts = 100 | TIMER_CB;
  826.     } else {
  827. lp->timeout = -1;
  828.     }
  829.     
  830.     return sts;
  831. }
  832. static void
  833. de4x5_setup_intr(struct net_device *dev)
  834. {
  835.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  836.     u_long iobase = dev->base_addr;
  837.     s32 imr, sts;
  838.     
  839.     if (inl(DE4X5_OMR) & OMR_SR) {   /* Only unmask if TX/RX is enabled */
  840. imr = 0;
  841. UNMASK_IRQs;
  842. sts = inl(DE4X5_STS);        /* Reset any pending (stale) interrupts */
  843. outl(sts, DE4X5_STS);
  844. ENABLE_IRQs;
  845.     }
  846.     
  847.     return;
  848. }
  849. /*
  850. **
  851. */
  852. static void
  853. reset_init_sia(struct net_device *dev, s32 csr13, s32 csr14, s32 csr15)
  854. {
  855.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  856.     u_long iobase = dev->base_addr;
  857.     RESET_SIA;
  858.     if (lp->useSROM) {
  859. if (lp->ibn == 3) {
  860.     srom_exec(dev, lp->phy[lp->active].rst);
  861.     srom_exec(dev, lp->phy[lp->active].gep);
  862.     outl(1, DE4X5_SICR);
  863.     return;
  864. } else {
  865.     csr15 = lp->cache.csr15;
  866.     csr14 = lp->cache.csr14;
  867.     csr13 = lp->cache.csr13;
  868.     outl(csr15 | lp->cache.gepc, DE4X5_SIGR);
  869.     outl(csr15 | lp->cache.gep, DE4X5_SIGR);
  870. }
  871.     } else {
  872. outl(csr15, DE4X5_SIGR);
  873.     }
  874.     outl(csr14, DE4X5_STRR);
  875.     outl(csr13, DE4X5_SICR);
  876.     mdelay(10);
  877.     return;
  878. }
  879. /*
  880. ** Create a loopback ethernet packet
  881. */
  882. static void
  883. create_packet(struct net_device *dev, char *frame, int len)
  884. {
  885.     int i;
  886.     char *buf = frame;
  887.     
  888.     for (i=0; i<ETH_ALEN; i++) {             /* Use this source address */
  889. *buf++ = dev->dev_addr[i];
  890.     }
  891.     for (i=0; i<ETH_ALEN; i++) {             /* Use this destination address */
  892. *buf++ = dev->dev_addr[i];
  893.     }
  894.     
  895.     *buf++ = 0;                              /* Packet length (2 bytes) */
  896.     *buf++ = 1;
  897.     
  898.     return;
  899. }
  900. /*
  901. ** Look for a particular board name in the EISA configuration space
  902. */
  903. static int
  904. EISA_signature(char *name, s32 eisa_id)
  905. {
  906.     static c_char *signatures[] = DE4X5_SIGNATURE;
  907.     char ManCode[DE4X5_STRLEN];
  908.     union {
  909. s32 ID;
  910. char Id[4];
  911.     } Eisa;
  912.     int i, status = 0, siglen = sizeof(signatures)/sizeof(c_char *);
  913.     
  914.     *name = '';
  915.     Eisa.ID = inl(eisa_id);
  916.     
  917.     ManCode[0]=(((Eisa.Id[0]>>2)&0x1f)+0x40);
  918.     ManCode[1]=(((Eisa.Id[1]&0xe0)>>5)+((Eisa.Id[0]&0x03)<<3)+0x40);
  919.     ManCode[2]=(((Eisa.Id[2]>>4)&0x0f)+0x30);
  920.     ManCode[3]=((Eisa.Id[2]&0x0f)+0x30);
  921.     ManCode[4]=(((Eisa.Id[3]>>4)&0x0f)+0x30);
  922.     ManCode[5]='';
  923.     
  924.     for (i=0;i<siglen;i++) {
  925. if (strstr(ManCode, signatures[i]) != NULL) {
  926.     strcpy(name,ManCode);
  927.     status = 1;
  928.     break;
  929. }
  930.     }
  931.     
  932.     return status;                         /* return the device name string */
  933. }
  934. /*
  935. ** Look for a particular board name in the PCI configuration space
  936. */
  937. static int
  938. PCI_signature(char *name, struct de4x5_bus_type *lp)
  939. {
  940.     static c_char *de4x5_signatures[] = DE4X5_SIGNATURE;
  941.     int i, status = 0, siglen = sizeof(de4x5_signatures)/sizeof(c_char *);
  942.     
  943.     if (lp->chipset == DC21040) {
  944. strcpy(name, "DE434/5");
  945. return status;
  946.     } else {                           /* Search for a DEC name in the SROM */
  947. int i = *((char *)&lp->srom + 19) * 3;
  948. strncpy(name, (char *)&lp->srom + 26 + i, 8);
  949.     }
  950.     name[8] = '';
  951.     for (i=0; i<siglen; i++) {
  952. if (strstr(name,de4x5_signatures[i])!=NULL) break;
  953.     }
  954.     if (i == siglen) {
  955. if (dec_only) {
  956.     *name = '';
  957. } else {                        /* Use chip name to avoid confusion */
  958.     strcpy(name, (((lp->chipset == DC21040) ? "DC21040" :
  959.    ((lp->chipset == DC21041) ? "DC21041" :
  960.     ((lp->chipset == DC21140) ? "DC21140" :
  961.      ((lp->chipset == DC21142) ? "DC21142" :
  962.       ((lp->chipset == DC21143) ? "DC21143" : "UNKNOWN"
  963.      )))))));
  964. }
  965. if (lp->chipset != DC21041) {
  966.     useSROM = TRUE;             /* card is not recognisably DEC */
  967. }
  968.     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
  969. useSROM = TRUE;
  970.     }
  971.     
  972.     return status;
  973. }
  974. /*
  975. ** Set up the Ethernet PROM counter to the start of the Ethernet address on
  976. ** the DC21040, else  read the SROM for the other chips.
  977. ** The SROM may not be present in a multi-MAC card, so first read the
  978. ** MAC address and check for a bad address. If there is a bad one then exit
  979. ** immediately with the prior srom contents intact (the h/w address will
  980. ** be fixed up later).
  981. */
  982. static void
  983. DevicePresent(u_long aprom_addr)
  984. {
  985.     int i, j=0;
  986.     struct de4x5_bus_type *lp = &bus;
  987.     
  988.     if (lp->chipset == DC21040) {
  989. if (lp->bus == EISA) {
  990.     enet_addr_rst(aprom_addr); /* Reset Ethernet Address ROM Pointer */
  991. } else {
  992.     outl(0, aprom_addr);       /* Reset Ethernet Address ROM Pointer */
  993. }
  994.     } else {                           /* Read new srom */
  995. u_short tmp, *p = (short *)((char *)&lp->srom + SROM_HWADD);
  996. for (i=0; i<(ETH_ALEN>>1); i++) {
  997.     tmp = srom_rd(aprom_addr, (SROM_HWADD>>1) + i);
  998.     *p = le16_to_cpu(tmp);
  999.     j += *p++;
  1000. }
  1001. if ((j == 0) || (j == 0x2fffd)) {
  1002.     return;
  1003. }
  1004. p=(short *)&lp->srom;
  1005. for (i=0; i<(sizeof(struct de4x5_srom)>>1); i++) {
  1006.     tmp = srom_rd(aprom_addr, i);
  1007.     *p++ = le16_to_cpu(tmp);
  1008. }
  1009. de4x5_dbg_srom((struct de4x5_srom *)&lp->srom);
  1010.     }
  1011.     
  1012.     return;
  1013. }
  1014. /*
  1015. ** Since the write on the Enet PROM register doesn't seem to reset the PROM
  1016. ** pointer correctly (at least on my DE425 EISA card), this routine should do
  1017. ** it...from depca.c.
  1018. */
  1019. static void
  1020. enet_addr_rst(u_long aprom_addr)
  1021. {
  1022.     union {
  1023. struct {
  1024.     u32 a;
  1025.     u32 b;
  1026. } llsig;
  1027. char Sig[sizeof(u32) << 1];
  1028.     } dev;
  1029.     short sigLength=0;
  1030.     s8 data;
  1031.     int i, j;
  1032.     
  1033.     dev.llsig.a = ETH_PROM_SIG;
  1034.     dev.llsig.b = ETH_PROM_SIG;
  1035.     sigLength = sizeof(u32) << 1;
  1036.     
  1037.     for (i=0,j=0;j<sigLength && i<PROBE_LENGTH+sigLength-1;i++) {
  1038. data = inb(aprom_addr);
  1039. if (dev.Sig[j] == data) {    /* track signature */
  1040.     j++;
  1041. } else {                     /* lost signature; begin search again */
  1042.     if (data == dev.Sig[0]) {  /* rare case.... */
  1043. j=1;
  1044.     } else {
  1045. j=0;
  1046.     }
  1047. }
  1048.     }
  1049.     
  1050.     return;
  1051. }
  1052. /*
  1053. ** For the bad status case and no SROM, then add one to the previous
  1054. ** address. However, need to add one backwards in case we have 0xff
  1055. ** as one or more of the bytes. Only the last 3 bytes should be checked
  1056. ** as the first three are invariant - assigned to an organisation.
  1057. */
  1058. static int
  1059. get_hw_addr(struct net_device *dev)
  1060. {
  1061.     u_long iobase = dev->base_addr;
  1062.     int broken, i, k, tmp, status = 0;
  1063.     u_short j,chksum;
  1064.     struct de4x5_bus_type *lp = &bus;
  1065.     broken = de4x5_bad_srom(lp);
  1066.     for (i=0,k=0,j=0;j<3;j++) {
  1067. k <<= 1;
  1068. if (k > 0xffff) k-=0xffff;
  1069. if (lp->bus == PCI) {
  1070.     if (lp->chipset == DC21040) {
  1071. while ((tmp = inl(DE4X5_APROM)) < 0);
  1072. k += (u_char) tmp;
  1073. dev->dev_addr[i++] = (u_char) tmp;
  1074. while ((tmp = inl(DE4X5_APROM)) < 0);
  1075. k += (u_short) (tmp << 8);
  1076. dev->dev_addr[i++] = (u_char) tmp;
  1077.     } else if (!broken) {
  1078. dev->dev_addr[i] = (u_char) lp->srom.ieee_addr[i]; i++;
  1079. dev->dev_addr[i] = (u_char) lp->srom.ieee_addr[i]; i++;
  1080.     } else if ((broken == SMC) || (broken == ACCTON)) {
  1081. dev->dev_addr[i] = *((u_char *)&lp->srom + i); i++;
  1082. dev->dev_addr[i] = *((u_char *)&lp->srom + i); i++;
  1083.     }
  1084. } else {
  1085.     k += (u_char) (tmp = inb(EISA_APROM));
  1086.     dev->dev_addr[i++] = (u_char) tmp;
  1087.     k += (u_short) ((tmp = inb(EISA_APROM)) << 8);
  1088.     dev->dev_addr[i++] = (u_char) tmp;
  1089. }
  1090. if (k > 0xffff) k-=0xffff;
  1091.     }
  1092.     if (k == 0xffff) k=0;
  1093.     
  1094.     if (lp->bus == PCI) {
  1095. if (lp->chipset == DC21040) {
  1096.     while ((tmp = inl(DE4X5_APROM)) < 0);
  1097.     chksum = (u_char) tmp;
  1098.     while ((tmp = inl(DE4X5_APROM)) < 0);
  1099.     chksum |= (u_short) (tmp << 8);
  1100.     if ((k != chksum) && (dec_only)) status = -1;
  1101. }
  1102.     } else {
  1103. chksum = (u_char) inb(EISA_APROM);
  1104. chksum |= (u_short) (inb(EISA_APROM) << 8);
  1105. if ((k != chksum) && (dec_only)) status = -1;
  1106.     }
  1107.     /* If possible, try to fix a broken card - SMC only so far */
  1108.     srom_repair(dev, broken);
  1109. #ifdef CONFIG_PPC
  1110.     /* 
  1111.     ** If the address starts with 00 a0, we have to bit-reverse
  1112.     ** each byte of the address.
  1113.     */
  1114.     if ( (ppc_md.ppc_machine & _MACH_Pmac) &&
  1115.  (dev->dev_addr[0] == 0) &&
  1116.  (dev->dev_addr[1] == 0xa0) )
  1117.     {
  1118.     for (i = 0; i < ETH_ALEN; ++i)
  1119.     {
  1120.     int x = dev->dev_addr[i];
  1121.     x = ((x & 0xf) << 4) + ((x & 0xf0) >> 4);
  1122.     x = ((x & 0x33) << 2) + ((x & 0xcc) >> 2);
  1123.     dev->dev_addr[i] = ((x & 0x55) << 1) + ((x & 0xaa) >> 1);
  1124.     }
  1125.     }
  1126. #endif /* CONFIG_PPC */
  1127.     /* Test for a bad enet address */
  1128.     status = test_bad_enet(dev, status);
  1129.     return status;
  1130. }
  1131. /*
  1132. ** Test for enet addresses in the first 32 bytes. The built-in strncmp
  1133. ** didn't seem to work here...?
  1134. */
  1135. static int
  1136. de4x5_bad_srom(struct de4x5_bus_type *lp)
  1137. {
  1138.     int i, status = 0;
  1139.     for (i=0; i<sizeof(enet_det)/ETH_ALEN; i++) {
  1140. if (!de4x5_strncmp((char *)&lp->srom, (char *)&enet_det[i], 3) &&
  1141.     !de4x5_strncmp((char *)&lp->srom+0x10, (char *)&enet_det[i], 3)) {
  1142.     if (i == 0) {
  1143. status = SMC;
  1144.     } else if (i == 1) {
  1145. status = ACCTON;
  1146.     }
  1147.     break;
  1148. }
  1149.     }
  1150.     return status;
  1151. }
  1152. static int
  1153. de4x5_strncmp(char *a, char *b, int n)
  1154. {
  1155.     int ret=0;
  1156.     for (;n && !ret;n--) {
  1157. ret = *a++ - *b++;
  1158.     }
  1159.     return ret;
  1160. }
  1161. static void
  1162. srom_repair(struct net_device *dev, int card)
  1163. {
  1164.     struct de4x5_bus_type *lp = &bus;
  1165.     switch(card) {
  1166.       case SMC:
  1167. memset((char *)&bus.srom, 0, sizeof(struct de4x5_srom));
  1168. memcpy(lp->srom.ieee_addr, (char *)dev->dev_addr, ETH_ALEN);
  1169. memcpy(lp->srom.info, (char *)&srom_repair_info[SMC-1], 100);
  1170. useSROM = TRUE;
  1171. break;
  1172.     }
  1173.     return;
  1174. }
  1175. /*
  1176. ** Assume that the irq's do not follow the PCI spec - this is seems
  1177. ** to be true so far (2 for 2).
  1178. */
  1179. static int
  1180. test_bad_enet(struct net_device *dev, int status)
  1181. {
  1182.     struct de4x5_bus_type *lp = &bus;
  1183.     int i, tmp;
  1184.     for (tmp=0,i=0; i<ETH_ALEN; i++) tmp += (u_char)dev->dev_addr[i];
  1185.     if ((tmp == 0) || (tmp == 0x5fa)) {
  1186. if ((lp->chipset == last.chipset) && 
  1187.     (lp->bus_num == last.bus) && (lp->bus_num > 0)) {
  1188.     for (i=0; i<ETH_ALEN; i++) dev->dev_addr[i] = last.addr[i];
  1189.     for (i=ETH_ALEN-1; i>2; --i) {
  1190. dev->dev_addr[i] += 1;
  1191. if (dev->dev_addr[i] != 0) break;
  1192.     }
  1193.     for (i=0; i<ETH_ALEN; i++) last.addr[i] = dev->dev_addr[i];
  1194.     if (!an_exception(lp)) {
  1195. dev->irq = last.irq;
  1196.     }
  1197.     status = 0;
  1198. }
  1199.     } else if (!status) {
  1200. last.chipset = lp->chipset;
  1201. last.bus = lp->bus_num;
  1202. last.irq = dev->irq;
  1203. for (i=0; i<ETH_ALEN; i++) last.addr[i] = dev->dev_addr[i];
  1204.     }
  1205.     return status;
  1206. }
  1207. /*
  1208. ** List of board exceptions with correctly wired IRQs
  1209. */
  1210. static int
  1211. an_exception(struct de4x5_bus_type *lp)
  1212. {
  1213.     if ((*(u_short *)lp->srom.sub_vendor_id == 0x00c0) && 
  1214. (*(u_short *)lp->srom.sub_system_id == 0x95e0)) {
  1215. return -1;
  1216.     }
  1217.     return 0;
  1218. }
  1219. /*
  1220. ** SROM Read
  1221. */
  1222. static short
  1223. srom_rd(u_long addr, u_char offset)
  1224. {
  1225.     sendto_srom(SROM_RD | SROM_SR, addr);
  1226.     
  1227.     srom_latch(SROM_RD | SROM_SR | DT_CS, addr);
  1228.     srom_command(SROM_RD | SROM_SR | DT_IN | DT_CS, addr);
  1229.     srom_address(SROM_RD | SROM_SR | DT_CS, addr, offset);
  1230.     
  1231.     return srom_data(SROM_RD | SROM_SR | DT_CS, addr);
  1232. }
  1233. static void
  1234. srom_latch(u_int command, u_long addr)
  1235. {
  1236.     sendto_srom(command, addr);
  1237.     sendto_srom(command | DT_CLK, addr);
  1238.     sendto_srom(command, addr);
  1239.     
  1240.     return;
  1241. }
  1242. static void
  1243. srom_command(u_int command, u_long addr)
  1244. {
  1245.     srom_latch(command, addr);
  1246.     srom_latch(command, addr);
  1247.     srom_latch((command & 0x0000ff00) | DT_CS, addr);
  1248.     
  1249.     return;
  1250. }
  1251. static void
  1252. srom_address(u_int command, u_long addr, u_char offset)
  1253. {
  1254.     int i, a;
  1255.     
  1256.     a = offset << 2;
  1257.     for (i=0; i<6; i++, a <<= 1) {
  1258. srom_latch(command | ((a & 0x80) ? DT_IN : 0), addr);
  1259.     }
  1260.     udelay(1);
  1261.     
  1262.     i = (getfrom_srom(addr) >> 3) & 0x01;
  1263.     
  1264.     return;
  1265. }
  1266. static short
  1267. srom_data(u_int command, u_long addr)
  1268. {
  1269.     int i;
  1270.     short word = 0;
  1271.     s32 tmp;
  1272.     
  1273.     for (i=0; i<16; i++) {
  1274. sendto_srom(command  | DT_CLK, addr);
  1275. tmp = getfrom_srom(addr);
  1276. sendto_srom(command, addr);
  1277. word = (word << 1) | ((tmp >> 3) & 0x01);
  1278.     }
  1279.     
  1280.     sendto_srom(command & 0x0000ff00, addr);
  1281.     
  1282.     return word;
  1283. }
  1284. /*
  1285. static void
  1286. srom_busy(u_int command, u_long addr)
  1287. {
  1288.    sendto_srom((command & 0x0000ff00) | DT_CS, addr);
  1289.    
  1290.    while (!((getfrom_srom(addr) >> 3) & 0x01)) {
  1291.        mdelay(1);
  1292.    }
  1293.    
  1294.    sendto_srom(command & 0x0000ff00, addr);
  1295.    
  1296.    return;
  1297. }
  1298. */
  1299. static void
  1300. sendto_srom(u_int command, u_long addr)
  1301. {
  1302.     outl(command, addr);
  1303.     udelay(1);
  1304.     
  1305.     return;
  1306. }
  1307. static int
  1308. getfrom_srom(u_long addr)
  1309. {
  1310.     s32 tmp;
  1311.     
  1312.     tmp = inl(addr);
  1313.     udelay(1);
  1314.     
  1315.     return tmp;
  1316. }
  1317. static int
  1318. srom_infoleaf_info(struct net_device *dev)
  1319. {
  1320.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1321.     int i, count;
  1322.     u_char *p;
  1323.     /* Find the infoleaf decoder function that matches this chipset */
  1324.     for (i=0; i<INFOLEAF_SIZE; i++) {
  1325. if (lp->chipset == infoleaf_array[i].chipset) break;
  1326.     }
  1327.     if (i == INFOLEAF_SIZE) {
  1328. lp->useSROM = FALSE;
  1329. printk("%s: Cannot find correct chipset for SROM decoding!n", 
  1330.                                                           dev->name);
  1331. return -ENXIO;
  1332.     }
  1333.     lp->infoleaf_fn = infoleaf_array[i].fn;
  1334.     /* Find the information offset that this function should use */
  1335.     count = *((u_char *)&lp->srom + 19);
  1336.     p  = (u_char *)&lp->srom + 26;
  1337.     if (count > 1) {
  1338. for (i=count; i; --i, p+=3) {
  1339.     if (lp->device == *p) break;
  1340. }
  1341. if (i == 0) {
  1342.     lp->useSROM = FALSE;
  1343.     printk("%s: Cannot find correct PCI device [%d] for SROM decoding!n", 
  1344.                                                dev->name, lp->device);
  1345.     return -ENXIO;
  1346. }
  1347.     }
  1348.     lp->infoleaf_offset = TWIDDLE(p+1);
  1349.     return 0;
  1350. }
  1351. /*
  1352. ** This routine loads any type 1 or 3 MII info into the mii device
  1353. ** struct and executes any type 5 code to reset PHY devices for this
  1354. ** controller.
  1355. ** The info for the MII devices will be valid since the index used
  1356. ** will follow the discovery process from MII address 1-31 then 0.
  1357. */
  1358. static void
  1359. srom_init(struct net_device *dev)
  1360. {
  1361.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1362.     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
  1363.     u_char count;
  1364.     p+=2;
  1365.     if (lp->chipset == DC21140) {
  1366. lp->cache.gepc = (*p++ | GEP_CTRL);
  1367. gep_wr(lp->cache.gepc, dev);
  1368.     }
  1369.     /* Block count */
  1370.     count = *p++;
  1371.     /* Jump the infoblocks to find types */
  1372.     for (;count; --count) {
  1373. if (*p < 128) {
  1374.     p += COMPACT_LEN;
  1375. } else if (*(p+1) == 5) {
  1376.     type5_infoblock(dev, 1, p);
  1377.     p += ((*p & BLOCK_LEN) + 1);
  1378. } else if (*(p+1) == 4) {
  1379.     p += ((*p & BLOCK_LEN) + 1);
  1380. } else if (*(p+1) == 3) {
  1381.     type3_infoblock(dev, 1, p);
  1382.     p += ((*p & BLOCK_LEN) + 1);
  1383. } else if (*(p+1) == 2) {
  1384.     p += ((*p & BLOCK_LEN) + 1);
  1385. } else if (*(p+1) == 1) {
  1386.     type1_infoblock(dev, 1, p);
  1387.     p += ((*p & BLOCK_LEN) + 1);
  1388. } else {
  1389.     p += ((*p & BLOCK_LEN) + 1);
  1390. }
  1391.     }
  1392.     return;
  1393. }
  1394. /*
  1395. ** A generic routine that writes GEP control, data and reset information
  1396. ** to the GEP register (21140) or csr15 GEP portion (2114[23]).
  1397. */
  1398. static void
  1399. srom_exec(struct net_device *dev, u_char *p)
  1400. {
  1401.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1402.     u_long iobase = dev->base_addr;
  1403.     u_char count = (p ? *p++ : 0);
  1404.     u_short *w = (u_short *)p;
  1405.     if (((lp->ibn != 1) && (lp->ibn != 3) && (lp->ibn != 5)) || !count) return;
  1406.     if (lp->chipset != DC21140) RESET_SIA;
  1407.  
  1408.     while (count--) {
  1409. gep_wr(((lp->chipset==DC21140) && (lp->ibn!=5) ? 
  1410.                                    *p++ : TWIDDLE(w++)), dev);
  1411. mdelay(2);                          /* 2ms per action */
  1412.     }
  1413.     if (lp->chipset != DC21140) {
  1414. outl(lp->cache.csr14, DE4X5_STRR);
  1415. outl(lp->cache.csr13, DE4X5_SICR);
  1416.     }
  1417.     return;
  1418. }
  1419. /*
  1420. ** Basically this function is a NOP since it will never be called,
  1421. ** unless I implement the DC21041 SROM functions. There's no need
  1422. ** since the existing code will be satisfactory for all boards.
  1423. */
  1424. static int 
  1425. dc21041_infoleaf(struct net_device *dev)
  1426. {
  1427.     return DE4X5_AUTOSENSE_MS;
  1428. }
  1429. static int 
  1430. dc21140_infoleaf(struct net_device *dev)
  1431. {
  1432.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1433.     u_char count = 0;
  1434.     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
  1435.     int next_tick = DE4X5_AUTOSENSE_MS;
  1436.     /* Read the connection type */
  1437.     p+=2;
  1438.     /* GEP control */
  1439.     lp->cache.gepc = (*p++ | GEP_CTRL);
  1440.     /* Block count */
  1441.     count = *p++;
  1442.     /* Recursively figure out the info blocks */
  1443.     if (*p < 128) {
  1444. next_tick = dc_infoblock[COMPACT](dev, count, p);
  1445.     } else {
  1446. next_tick = dc_infoblock[*(p+1)](dev, count, p);
  1447.     }
  1448.     if (lp->tcount == count) {
  1449. lp->media = NC;
  1450.         if (lp->media != lp->c_media) {
  1451.     de4x5_dbg_media(dev);
  1452.     lp->c_media = lp->media;
  1453. }
  1454. lp->media = INIT;
  1455. lp->tcount = 0;
  1456. lp->tx_enable = FALSE;
  1457.     }
  1458.     return next_tick & ~TIMER_CB;
  1459. }
  1460. static int 
  1461. dc21142_infoleaf(struct net_device *dev)
  1462. {
  1463.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1464.     u_char count = 0;
  1465.     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
  1466.     int next_tick = DE4X5_AUTOSENSE_MS;
  1467.     /* Read the connection type */
  1468.     p+=2;
  1469.     /* Block count */
  1470.     count = *p++;
  1471.     /* Recursively figure out the info blocks */
  1472.     if (*p < 128) {
  1473. next_tick = dc_infoblock[COMPACT](dev, count, p);
  1474.     } else {
  1475. next_tick = dc_infoblock[*(p+1)](dev, count, p);
  1476.     }
  1477.     if (lp->tcount == count) {
  1478. lp->media = NC;
  1479.         if (lp->media != lp->c_media) {
  1480.     de4x5_dbg_media(dev);
  1481.     lp->c_media = lp->media;
  1482. }
  1483. lp->media = INIT;
  1484. lp->tcount = 0;
  1485. lp->tx_enable = FALSE;
  1486.     }
  1487.     return next_tick & ~TIMER_CB;
  1488. }
  1489. static int 
  1490. dc21143_infoleaf(struct net_device *dev)
  1491. {
  1492.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1493.     u_char count = 0;
  1494.     u_char *p = (u_char *)&lp->srom + lp->infoleaf_offset;
  1495.     int next_tick = DE4X5_AUTOSENSE_MS;
  1496.     /* Read the connection type */
  1497.     p+=2;
  1498.     /* Block count */
  1499.     count = *p++;
  1500.     /* Recursively figure out the info blocks */
  1501.     if (*p < 128) {
  1502. next_tick = dc_infoblock[COMPACT](dev, count, p);
  1503.     } else {
  1504. next_tick = dc_infoblock[*(p+1)](dev, count, p);
  1505.     }
  1506.     if (lp->tcount == count) {
  1507. lp->media = NC;
  1508.         if (lp->media != lp->c_media) {
  1509.     de4x5_dbg_media(dev);
  1510.     lp->c_media = lp->media;
  1511. }
  1512. lp->media = INIT;
  1513. lp->tcount = 0;
  1514. lp->tx_enable = FALSE;
  1515.     }
  1516.     return next_tick & ~TIMER_CB;
  1517. }
  1518. /*
  1519. ** The compact infoblock is only designed for DC21140[A] chips, so
  1520. ** we'll reuse the dc21140m_autoconf function. Non MII media only.
  1521. */
  1522. static int 
  1523. compact_infoblock(struct net_device *dev, u_char count, u_char *p)
  1524. {
  1525.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1526.     u_char flags, csr6;
  1527.     /* Recursively figure out the info blocks */
  1528.     if (--count > lp->tcount) {
  1529. if (*(p+COMPACT_LEN) < 128) {
  1530.     return dc_infoblock[COMPACT](dev, count, p+COMPACT_LEN);
  1531. } else {
  1532.     return dc_infoblock[*(p+COMPACT_LEN+1)](dev, count, p+COMPACT_LEN);
  1533. }
  1534.     }
  1535.     if ((lp->media == INIT) && (lp->timeout < 0)) {
  1536.         lp->ibn = COMPACT;
  1537.         lp->active = 0;
  1538. gep_wr(lp->cache.gepc, dev);
  1539. lp->infoblock_media = (*p++) & COMPACT_MC;
  1540. lp->cache.gep = *p++;
  1541. csr6 = *p++;
  1542. flags = *p++;
  1543. lp->asBitValid = (flags & 0x80) ? 0 : -1;
  1544. lp->defMedium = (flags & 0x40) ? -1 : 0;
  1545. lp->asBit = 1 << ((csr6 >> 1) & 0x07);
  1546. lp->asPolarity = ((csr6 & 0x80) ? -1 : 0) & lp->asBit;
  1547. lp->infoblock_csr6 = OMR_DEF | ((csr6 & 0x71) << 18);
  1548. lp->useMII = FALSE;
  1549. de4x5_switch_mac_port(dev);
  1550.     }
  1551.     return dc21140m_autoconf(dev);
  1552. }
  1553. /*
  1554. ** This block describes non MII media for the DC21140[A] only.
  1555. */
  1556. static int 
  1557. type0_infoblock(struct net_device *dev, u_char count, u_char *p)
  1558. {
  1559.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1560.     u_char flags, csr6, len = (*p & BLOCK_LEN)+1;
  1561.     /* Recursively figure out the info blocks */
  1562.     if (--count > lp->tcount) {
  1563. if (*(p+len) < 128) {
  1564.     return dc_infoblock[COMPACT](dev, count, p+len);
  1565. } else {
  1566.     return dc_infoblock[*(p+len+1)](dev, count, p+len);
  1567. }
  1568.     }
  1569.     if ((lp->media == INIT) && (lp->timeout < 0)) {
  1570.         lp->ibn = 0;
  1571.         lp->active = 0;
  1572.         gep_wr(lp->cache.gepc, dev);
  1573. p+=2;
  1574. lp->infoblock_media = (*p++) & BLOCK0_MC;
  1575. lp->cache.gep = *p++;
  1576. csr6 = *p++;
  1577. flags = *p++;
  1578. lp->asBitValid = (flags & 0x80) ? 0 : -1;
  1579. lp->defMedium = (flags & 0x40) ? -1 : 0;
  1580. lp->asBit = 1 << ((csr6 >> 1) & 0x07);
  1581. lp->asPolarity = ((csr6 & 0x80) ? -1 : 0) & lp->asBit;
  1582. lp->infoblock_csr6 = OMR_DEF | ((csr6 & 0x71) << 18);
  1583. lp->useMII = FALSE;
  1584. de4x5_switch_mac_port(dev);
  1585.     }
  1586.     return dc21140m_autoconf(dev);
  1587. }
  1588. /* These functions are under construction! */
  1589. static int 
  1590. type1_infoblock(struct net_device *dev, u_char count, u_char *p)
  1591. {
  1592.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1593.     u_char len = (*p & BLOCK_LEN)+1;
  1594.     /* Recursively figure out the info blocks */
  1595.     if (--count > lp->tcount) {
  1596. if (*(p+len) < 128) {
  1597.     return dc_infoblock[COMPACT](dev, count, p+len);
  1598. } else {
  1599.     return dc_infoblock[*(p+len+1)](dev, count, p+len);
  1600. }
  1601.     }
  1602.     p += 2;
  1603.     if (lp->state == INITIALISED) {
  1604.         lp->ibn = 1;
  1605. lp->active = *p++;
  1606. lp->phy[lp->active].gep = (*p ? p : 0); p += (*p + 1);
  1607. lp->phy[lp->active].rst = (*p ? p : 0); p += (*p + 1);
  1608. lp->phy[lp->active].mc  = TWIDDLE(p); p += 2;
  1609. lp->phy[lp->active].ana = TWIDDLE(p); p += 2;
  1610. lp->phy[lp->active].fdx = TWIDDLE(p); p += 2;
  1611. lp->phy[lp->active].ttm = TWIDDLE(p);
  1612. return 0;
  1613.     } else if ((lp->media == INIT) && (lp->timeout < 0)) {
  1614.         lp->ibn = 1;
  1615.         lp->active = *p;
  1616. lp->infoblock_csr6 = OMR_MII_100;
  1617. lp->useMII = TRUE;
  1618. lp->infoblock_media = ANS;
  1619. de4x5_switch_mac_port(dev);
  1620.     }
  1621.     return dc21140m_autoconf(dev);
  1622. }
  1623. static int 
  1624. type2_infoblock(struct net_device *dev, u_char count, u_char *p)
  1625. {
  1626.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1627.     u_char len = (*p & BLOCK_LEN)+1;
  1628.     /* Recursively figure out the info blocks */
  1629.     if (--count > lp->tcount) {
  1630. if (*(p+len) < 128) {
  1631.     return dc_infoblock[COMPACT](dev, count, p+len);
  1632. } else {
  1633.     return dc_infoblock[*(p+len+1)](dev, count, p+len);
  1634. }
  1635.     }
  1636.     if ((lp->media == INIT) && (lp->timeout < 0)) {
  1637.         lp->ibn = 2;
  1638.         lp->active = 0;
  1639. p += 2;
  1640. lp->infoblock_media = (*p) & MEDIA_CODE;
  1641.         if ((*p++) & EXT_FIELD) {
  1642.     lp->cache.csr13 = TWIDDLE(p); p += 2;
  1643.     lp->cache.csr14 = TWIDDLE(p); p += 2;
  1644.     lp->cache.csr15 = TWIDDLE(p); p += 2;
  1645. } else {
  1646.     lp->cache.csr13 = CSR13;
  1647.     lp->cache.csr14 = CSR14;
  1648.     lp->cache.csr15 = CSR15;
  1649. }
  1650.         lp->cache.gepc = ((s32)(TWIDDLE(p)) << 16); p += 2;
  1651.         lp->cache.gep  = ((s32)(TWIDDLE(p)) << 16);
  1652. lp->infoblock_csr6 = OMR_SIA;
  1653. lp->useMII = FALSE;
  1654. de4x5_switch_mac_port(dev);
  1655.     }
  1656.     return dc2114x_autoconf(dev);
  1657. }
  1658. static int 
  1659. type3_infoblock(struct net_device *dev, u_char count, u_char *p)
  1660. {
  1661.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1662.     u_char len = (*p & BLOCK_LEN)+1;
  1663.     /* Recursively figure out the info blocks */
  1664.     if (--count > lp->tcount) {
  1665. if (*(p+len) < 128) {
  1666.     return dc_infoblock[COMPACT](dev, count, p+len);
  1667. } else {
  1668.     return dc_infoblock[*(p+len+1)](dev, count, p+len);
  1669. }
  1670.     }
  1671.     p += 2;
  1672.     if (lp->state == INITIALISED) {
  1673.         lp->ibn = 3;
  1674.         lp->active = *p++;
  1675. if (MOTO_SROM_BUG) lp->active = 0;
  1676. lp->phy[lp->active].gep = (*p ? p : 0); p += (2 * (*p) + 1);
  1677. lp->phy[lp->active].rst = (*p ? p : 0); p += (2 * (*p) + 1);
  1678. lp->phy[lp->active].mc  = TWIDDLE(p); p += 2;
  1679. lp->phy[lp->active].ana = TWIDDLE(p); p += 2;
  1680. lp->phy[lp->active].fdx = TWIDDLE(p); p += 2;
  1681. lp->phy[lp->active].ttm = TWIDDLE(p); p += 2;
  1682. lp->phy[lp->active].mci = *p;
  1683. return 0;
  1684.     } else if ((lp->media == INIT) && (lp->timeout < 0)) {
  1685.         lp->ibn = 3;
  1686. lp->active = *p;
  1687. if (MOTO_SROM_BUG) lp->active = 0;
  1688. lp->infoblock_csr6 = OMR_MII_100;
  1689. lp->useMII = TRUE;
  1690. lp->infoblock_media = ANS;
  1691. de4x5_switch_mac_port(dev);
  1692.     }
  1693.     return dc2114x_autoconf(dev);
  1694. }
  1695. static int 
  1696. type4_infoblock(struct net_device *dev, u_char count, u_char *p)
  1697. {
  1698.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1699.     u_char flags, csr6, len = (*p & BLOCK_LEN)+1;
  1700.     /* Recursively figure out the info blocks */
  1701.     if (--count > lp->tcount) {
  1702. if (*(p+len) < 128) {
  1703.     return dc_infoblock[COMPACT](dev, count, p+len);
  1704. } else {
  1705.     return dc_infoblock[*(p+len+1)](dev, count, p+len);
  1706. }
  1707.     }
  1708.     if ((lp->media == INIT) && (lp->timeout < 0)) {
  1709.         lp->ibn = 4;
  1710.         lp->active = 0;
  1711. p+=2;
  1712. lp->infoblock_media = (*p++) & MEDIA_CODE;
  1713.         lp->cache.csr13 = CSR13;              /* Hard coded defaults */
  1714. lp->cache.csr14 = CSR14;
  1715. lp->cache.csr15 = CSR15;
  1716.         lp->cache.gepc = ((s32)(TWIDDLE(p)) << 16); p += 2;
  1717.         lp->cache.gep  = ((s32)(TWIDDLE(p)) << 16); p += 2;
  1718. csr6 = *p++;
  1719. flags = *p++;
  1720. lp->asBitValid = (flags & 0x80) ? 0 : -1;
  1721. lp->defMedium = (flags & 0x40) ? -1 : 0;
  1722. lp->asBit = 1 << ((csr6 >> 1) & 0x07);
  1723. lp->asPolarity = ((csr6 & 0x80) ? -1 : 0) & lp->asBit;
  1724. lp->infoblock_csr6 = OMR_DEF | ((csr6 & 0x71) << 18);
  1725. lp->useMII = FALSE;
  1726. de4x5_switch_mac_port(dev);
  1727.     }
  1728.     return dc2114x_autoconf(dev);
  1729. }
  1730. /*
  1731. ** This block type provides information for resetting external devices
  1732. ** (chips) through the General Purpose Register.
  1733. */
  1734. static int 
  1735. type5_infoblock(struct net_device *dev, u_char count, u_char *p)
  1736. {
  1737.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1738.     u_char len = (*p & BLOCK_LEN)+1;
  1739.     /* Recursively figure out the info blocks */
  1740.     if (--count > lp->tcount) {
  1741. if (*(p+len) < 128) {
  1742.     return dc_infoblock[COMPACT](dev, count, p+len);
  1743. } else {
  1744.     return dc_infoblock[*(p+len+1)](dev, count, p+len);
  1745. }
  1746.     }
  1747.     /* Must be initializing to run this code */
  1748.     if ((lp->state == INITIALISED) || (lp->media == INIT)) {
  1749. p+=2;
  1750.         lp->rst = p;
  1751.         srom_exec(dev, lp->rst);
  1752.     }
  1753.     return DE4X5_AUTOSENSE_MS;
  1754. }
  1755. /*
  1756. ** MII Read/Write
  1757. */
  1758. static int
  1759. mii_rd(u_char phyreg, u_char phyaddr, u_long ioaddr)
  1760. {
  1761.     mii_wdata(MII_PREAMBLE,  2, ioaddr);   /* Start of 34 bit preamble...    */
  1762.     mii_wdata(MII_PREAMBLE, 32, ioaddr);   /* ...continued                   */
  1763.     mii_wdata(MII_STRD, 4, ioaddr);        /* SFD and Read operation         */
  1764.     mii_address(phyaddr, ioaddr);          /* PHY address to be accessed     */
  1765.     mii_address(phyreg, ioaddr);           /* PHY Register to read           */
  1766.     mii_ta(MII_STRD, ioaddr);              /* Turn around time - 2 MDC       */
  1767.     
  1768.     return mii_rdata(ioaddr);              /* Read data                      */
  1769. }
  1770. static void
  1771. mii_wr(int data, u_char phyreg, u_char phyaddr, u_long ioaddr)
  1772. {
  1773.     mii_wdata(MII_PREAMBLE,  2, ioaddr);   /* Start of 34 bit preamble...    */
  1774.     mii_wdata(MII_PREAMBLE, 32, ioaddr);   /* ...continued                   */
  1775.     mii_wdata(MII_STWR, 4, ioaddr);        /* SFD and Write operation        */
  1776.     mii_address(phyaddr, ioaddr);          /* PHY address to be accessed     */
  1777.     mii_address(phyreg, ioaddr);           /* PHY Register to write          */
  1778.     mii_ta(MII_STWR, ioaddr);              /* Turn around time - 2 MDC       */
  1779.     data = mii_swap(data, 16);             /* Swap data bit ordering         */
  1780.     mii_wdata(data, 16, ioaddr);           /* Write data                     */
  1781.     
  1782.     return;
  1783. }
  1784. static int
  1785. mii_rdata(u_long ioaddr)
  1786. {
  1787.     int i;
  1788.     s32 tmp = 0;
  1789.     
  1790.     for (i=0; i<16; i++) {
  1791. tmp <<= 1;
  1792. tmp |= getfrom_mii(MII_MRD | MII_RD, ioaddr);
  1793.     }
  1794.     
  1795.     return tmp;
  1796. }
  1797. static void
  1798. mii_wdata(int data, int len, u_long ioaddr)
  1799. {
  1800.     int i;
  1801.     
  1802.     for (i=0; i<len; i++) {
  1803. sendto_mii(MII_MWR | MII_WR, data, ioaddr);
  1804. data >>= 1;
  1805.     }
  1806.     
  1807.     return;
  1808. }
  1809. static void
  1810. mii_address(u_char addr, u_long ioaddr)
  1811. {
  1812.     int i;
  1813.     
  1814.     addr = mii_swap(addr, 5);
  1815.     for (i=0; i<5; i++) {
  1816. sendto_mii(MII_MWR | MII_WR, addr, ioaddr);
  1817. addr >>= 1;
  1818.     }
  1819.     
  1820.     return;
  1821. }
  1822. static void
  1823. mii_ta(u_long rw, u_long ioaddr)
  1824. {
  1825.     if (rw == MII_STWR) {
  1826. sendto_mii(MII_MWR | MII_WR, 1, ioaddr);  
  1827. sendto_mii(MII_MWR | MII_WR, 0, ioaddr);  
  1828.     } else {
  1829. getfrom_mii(MII_MRD | MII_RD, ioaddr);        /* Tri-state MDIO */
  1830.     }
  1831.     
  1832.     return;
  1833. }
  1834. static int
  1835. mii_swap(int data, int len)
  1836. {
  1837.     int i, tmp = 0;
  1838.     
  1839.     for (i=0; i<len; i++) {
  1840. tmp <<= 1;
  1841. tmp |= (data & 1);
  1842. data >>= 1;
  1843.     }
  1844.     
  1845.     return tmp;
  1846. }
  1847. static void
  1848. sendto_mii(u32 command, int data, u_long ioaddr)
  1849. {
  1850.     u32 j;
  1851.     
  1852.     j = (data & 1) << 17;
  1853.     outl(command | j, ioaddr);
  1854.     udelay(1);
  1855.     outl(command | MII_MDC | j, ioaddr);
  1856.     udelay(1);
  1857.     
  1858.     return;
  1859. }
  1860. static int
  1861. getfrom_mii(u32 command, u_long ioaddr)
  1862. {
  1863.     outl(command, ioaddr);
  1864.     udelay(1);
  1865.     outl(command | MII_MDC, ioaddr);
  1866.     udelay(1);
  1867.     
  1868.     return ((inl(ioaddr) >> 19) & 1);
  1869. }
  1870. /*
  1871. ** Here's 3 ways to calculate the OUI from the ID registers.
  1872. */
  1873. static int
  1874. mii_get_oui(u_char phyaddr, u_long ioaddr)
  1875. {
  1876. /*
  1877.     union {
  1878. u_short reg;
  1879. u_char breg[2];
  1880.     } a;
  1881.     int i, r2, r3, ret=0;*/
  1882.     int r2, r3;
  1883.     /* Read r2 and r3 */
  1884.     r2 = mii_rd(MII_ID0, phyaddr, ioaddr);
  1885.     r3 = mii_rd(MII_ID1, phyaddr, ioaddr);
  1886.                                                 /* SEEQ and Cypress way * /
  1887.     / * Shuffle r2 and r3 * /
  1888.     a.reg=0;
  1889.     r3 = ((r3>>10)|(r2<<6))&0x0ff;
  1890.     r2 = ((r2>>2)&0x3fff);
  1891.     / * Bit reverse r3 * /
  1892.     for (i=0;i<8;i++) {
  1893. ret<<=1;
  1894. ret |= (r3&1);
  1895. r3>>=1;
  1896.     }
  1897.     / * Bit reverse r2 * /
  1898.     for (i=0;i<16;i++) {
  1899. a.reg<<=1;
  1900. a.reg |= (r2&1);
  1901. r2>>=1;
  1902.     }
  1903.     / * Swap r2 bytes * /
  1904.     i=a.breg[0];
  1905.     a.breg[0]=a.breg[1];
  1906.     a.breg[1]=i;
  1907.     return ((a.reg<<8)|ret); */                 /* SEEQ and Cypress way */
  1908. /*    return ((r2<<6)|(u_int)(r3>>10)); */      /* NATIONAL and BROADCOM way */
  1909.     return r2;                                  /* (I did it) My way */
  1910. }
  1911. /*
  1912. ** The SROM spec forces us to search addresses [1-31 0]. Bummer.
  1913. */
  1914. static int
  1915. mii_get_phy(struct net_device *dev)
  1916. {
  1917.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1918.     u_long iobase = dev->base_addr;
  1919.     int i, j, k, n, limit=sizeof(phy_info)/sizeof(struct phy_table);
  1920.     int id;
  1921.     
  1922.     lp->active = 0;
  1923.     lp->useMII = TRUE;
  1924.     /* Search the MII address space for possible PHY devices */
  1925.     for (n=0, lp->mii_cnt=0, i=1; !((i==1) && (n==1)); i=(++i)%DE4X5_MAX_MII) {
  1926. lp->phy[lp->active].addr = i;
  1927. if (i==0) n++;                             /* Count cycles */
  1928. while (de4x5_reset_phy(dev)<0) udelay(100);/* Wait for reset */
  1929. id = mii_get_oui(i, DE4X5_MII); 
  1930. if ((id == 0) || (id == 65535)) continue;  /* Valid ID? */
  1931. for (j=0; j<limit; j++) {                  /* Search PHY table */
  1932.     if (id != phy_info[j].id) continue;    /* ID match? */
  1933.     for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++);
  1934.     if (k < DE4X5_MAX_PHY) {
  1935. memcpy((char *)&lp->phy[k],
  1936.        (char *)&phy_info[j], sizeof(struct phy_table));
  1937. lp->phy[k].addr = i;
  1938. lp->mii_cnt++;
  1939. lp->active++;
  1940.     } else {
  1941. goto purgatory;                    /* Stop the search */
  1942.     }
  1943.     break;
  1944. }
  1945. if ((j == limit) && (i < DE4X5_MAX_MII)) {
  1946.     for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++);
  1947.     lp->phy[k].addr = i;
  1948.     lp->phy[k].id = id;
  1949.     lp->phy[k].spd.reg = GENERIC_REG;      /* ANLPA register         */
  1950.     lp->phy[k].spd.mask = GENERIC_MASK;    /* 100Mb/s technologies   */
  1951.     lp->phy[k].spd.value = GENERIC_VALUE;  /* TX & T4, H/F Duplex    */
  1952.     lp->mii_cnt++;
  1953.     lp->active++;
  1954.     printk("%s: Using generic MII device control. If the board doesn't operate, nplease mail the following dump to the author:n", dev->name);
  1955.     j = de4x5_debug;
  1956.     de4x5_debug |= DEBUG_MII;
  1957.     de4x5_dbg_mii(dev, k);
  1958.     de4x5_debug = j;
  1959.     printk("n");
  1960. }
  1961.     }
  1962.   purgatory:
  1963.     lp->active = 0;
  1964.     if (lp->phy[0].id) {                           /* Reset the PHY devices */
  1965. for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++) { /*For each PHY*/
  1966.     mii_wr(MII_CR_RST, MII_CR, lp->phy[k].addr, DE4X5_MII);
  1967.     while (mii_rd(MII_CR, lp->phy[k].addr, DE4X5_MII) & MII_CR_RST);
  1968.     
  1969.     de4x5_dbg_mii(dev, k);
  1970. }
  1971.     }
  1972.     if (!lp->mii_cnt) lp->useMII = FALSE;
  1973.     return lp->mii_cnt;
  1974. }
  1975. static char *
  1976. build_setup_frame(struct net_device *dev, int mode)
  1977. {
  1978.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  1979.     int i;
  1980.     char *pa = lp->setup_frame;
  1981.     
  1982.     /* Initialise the setup frame */
  1983.     if (mode == ALL) {
  1984. memset(lp->setup_frame, 0, SETUP_FRAME_LEN);
  1985.     }
  1986.     
  1987.     if (lp->setup_f == HASH_PERF) {
  1988. for (pa=lp->setup_frame+IMPERF_PA_OFFSET, i=0; i<ETH_ALEN; i++) {
  1989.     *(pa + i) = dev->dev_addr[i];                 /* Host address */
  1990.     if (i & 0x01) pa += 2;
  1991. }
  1992. *(lp->setup_frame + (HASH_TABLE_LEN >> 3) - 3) = 0x80;
  1993.     } else {
  1994. for (i=0; i<ETH_ALEN; i++) { /* Host address */
  1995.     *(pa + (i&1)) = dev->dev_addr[i];
  1996.     if (i & 0x01) pa += 4;
  1997. }
  1998. for (i=0; i<ETH_ALEN; i++) { /* Broadcast address */
  1999.     *(pa + (i&1)) = (char) 0xff;
  2000.     if (i & 0x01) pa += 4;
  2001. }
  2002.     }
  2003.     
  2004.     return pa;                     /* Points to the next entry */
  2005. }
  2006. static void
  2007. enable_ast(struct net_device *dev, u32 time_out)
  2008. {
  2009.     timeout(dev, (void *)&de4x5_ast, (u_long)dev, time_out);
  2010.     
  2011.     return;
  2012. }
  2013. static void
  2014. disable_ast(struct net_device *dev)
  2015. {
  2016.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  2017.     
  2018.     del_timer(&lp->timer);
  2019.     
  2020.     return;
  2021. }
  2022. static long
  2023. de4x5_switch_mac_port(struct net_device *dev)
  2024. {
  2025.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  2026.     u_long iobase = dev->base_addr;
  2027.     s32 omr;
  2028.     STOP_DE4X5;
  2029.     /* Assert the OMR_PS bit in CSR6 */
  2030.     omr = (inl(DE4X5_OMR) & ~(OMR_PS | OMR_HBD | OMR_TTM | OMR_PCS | OMR_SCR |
  2031.                                              OMR_FDX));
  2032.     omr |= lp->infoblock_csr6;
  2033.     if (omr & OMR_PS) omr |= OMR_HBD;
  2034.     outl(omr, DE4X5_OMR);
  2035.     
  2036.     /* Soft Reset */
  2037.     RESET_DE4X5;
  2038.     
  2039.     /* Restore the GEP - especially for COMPACT and Type 0 Infoblocks */
  2040.     if (lp->chipset == DC21140) {
  2041. gep_wr(lp->cache.gepc, dev);
  2042. gep_wr(lp->cache.gep, dev);
  2043.     } else if ((lp->chipset & ~0x0ff) == DC2114x) {
  2044. reset_init_sia(dev, lp->cache.csr13, lp->cache.csr14, lp->cache.csr15);
  2045.     }
  2046.     /* Restore CSR6 */
  2047.     outl(omr, DE4X5_OMR);
  2048.     /* Reset CSR8 */
  2049.     inl(DE4X5_MFC);
  2050.     return omr;
  2051. }
  2052. static void
  2053. gep_wr(s32 data, struct net_device *dev)
  2054. {
  2055.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  2056.     u_long iobase = dev->base_addr;
  2057.     if (lp->chipset == DC21140) {
  2058. outl(data, DE4X5_GEP);
  2059.     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
  2060. outl((data<<16) | lp->cache.csr15, DE4X5_SIGR);
  2061.     }
  2062.     return;
  2063. }
  2064. static int
  2065. gep_rd(struct net_device *dev)
  2066. {
  2067.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  2068.     u_long iobase = dev->base_addr;
  2069.     if (lp->chipset == DC21140) {
  2070. return inl(DE4X5_GEP);
  2071.     } else if ((lp->chipset & ~0x00ff) == DC2114x) {
  2072. return (inl(DE4X5_SIGR) & 0x000fffff);
  2073.     }
  2074.     return 0;
  2075. }
  2076. static void
  2077. timeout(struct net_device *dev, void (*fn)(u_long data), u_long data, u_long msec)
  2078. {
  2079.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  2080.     int dt;
  2081.     
  2082.     /* First, cancel any pending timer events */
  2083.     del_timer(&lp->timer);
  2084.     
  2085.     /* Convert msec to ticks */
  2086.     dt = (msec * HZ) / 1000;
  2087.     if (dt==0) dt=1;
  2088.     
  2089.     /* Set up timer */
  2090.     lp->timer.expires = jiffies + dt;
  2091.     lp->timer.function = fn;
  2092.     lp->timer.data = data;
  2093.     add_timer(&lp->timer);
  2094.     
  2095.     return;
  2096. }
  2097. static void
  2098. yawn(struct net_device *dev, int state)
  2099. {
  2100.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  2101.     u_long iobase = dev->base_addr;
  2102.     if ((lp->chipset == DC21040) || (lp->chipset == DC21140)) return;
  2103.     if(lp->bus == EISA) {
  2104. switch(state) {
  2105.   case WAKEUP:
  2106.     outb(WAKEUP, PCI_CFPM);
  2107.     mdelay(10);
  2108.     break;
  2109.   case SNOOZE:
  2110.     outb(SNOOZE, PCI_CFPM);
  2111.     break;
  2112.   case SLEEP:
  2113.     outl(0, DE4X5_SICR);
  2114.     outb(SLEEP, PCI_CFPM);
  2115.     break;
  2116. }
  2117.     } else {
  2118. switch(state) {
  2119.   case WAKEUP:
  2120.     pcibios_write_config_byte(lp->bus_num, lp->device << 3, 
  2121.       PCI_CFDA_PSM, WAKEUP);
  2122.     mdelay(10);
  2123.     break;
  2124.   case SNOOZE:
  2125.     pcibios_write_config_byte(lp->bus_num, lp->device << 3, 
  2126.       PCI_CFDA_PSM, SNOOZE);
  2127.     break;
  2128.   case SLEEP:
  2129.     outl(0, DE4X5_SICR);
  2130.     pcibios_write_config_byte(lp->bus_num, lp->device << 3, 
  2131.       PCI_CFDA_PSM, SLEEP);
  2132.     break;
  2133. }
  2134.     }
  2135.     return;
  2136. }
  2137. static void
  2138. de4x5_parse_params(struct net_device *dev)
  2139. {
  2140.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  2141.     char *p, *q, t;
  2142.     lp->params.fdx = 0;
  2143.     lp->params.autosense = AUTO;
  2144.     if (args == NULL) return;
  2145.     if ((p = strstr(args, dev->name))) {
  2146. if (!(q = strstr(p+strlen(dev->name), "eth"))) q = p + strlen(p);
  2147. t = *q;
  2148. *q = '';
  2149. #if !defined(__sparc_v9__) && !defined(__powerpc__) && !defined(__alpha__)
  2150. if (strstr(p, "force_eisa") || strstr(p, "FORCE_EISA")) forceEISA = 1;
  2151. #endif
  2152. if (strstr(p, "fdx") || strstr(p, "FDX")) lp->params.fdx = 1;
  2153. if (strstr(p, "autosense") || strstr(p, "AUTOSENSE")) {
  2154.     if (strstr(p, "TP")) {
  2155. lp->params.autosense = TP;
  2156.     } else if (strstr(p, "TP_NW")) {
  2157. lp->params.autosense = TP_NW;
  2158.     } else if (strstr(p, "BNC")) {
  2159. lp->params.autosense = BNC;
  2160.     } else if (strstr(p, "AUI")) {
  2161. lp->params.autosense = AUI;
  2162.     } else if (strstr(p, "BNC_AUI")) {
  2163. lp->params.autosense = BNC;
  2164.     } else if (strstr(p, "10Mb")) {
  2165. lp->params.autosense = _10Mb;
  2166.     } else if (strstr(p, "100Mb")) {
  2167. lp->params.autosense = _100Mb;
  2168.     } else if (strstr(p, "AUTO")) {
  2169. lp->params.autosense = AUTO;
  2170.     }
  2171. }
  2172. *q = t;
  2173.     }
  2174.     return;
  2175. }
  2176. static void
  2177. de4x5_dbg_open(struct net_device *dev)
  2178. {
  2179.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  2180.     int i;
  2181.     
  2182.     if (de4x5_debug & DEBUG_OPEN) {
  2183. printk("%s: de4x5 opening with irq %dn",dev->name,dev->irq);
  2184. printk("tphysical address: ");
  2185. for (i=0;i<6;i++) {
  2186.     printk("%2.2x:",(short)dev->dev_addr[i]);
  2187. }
  2188. printk("n");
  2189. printk("Descriptor head addresses:n");
  2190. printk("t0x%8.8lx  0x%8.8lxn",(u_long)lp->rx_ring,(u_long)lp->tx_ring);
  2191. printk("Descriptor addresses:nRX: ");
  2192. for (i=0;i<lp->rxRingSize-1;i++){
  2193.     if (i < 3) {
  2194. printk("0x%8.8lx  ",(u_long)&lp->rx_ring[i].status);
  2195.     }
  2196. }
  2197. printk("...0x%8.8lxn",(u_long)&lp->rx_ring[i].status);
  2198. printk("TX: ");
  2199. for (i=0;i<lp->txRingSize-1;i++){
  2200.     if (i < 3) {
  2201. printk("0x%8.8lx  ", (u_long)&lp->tx_ring[i].status);
  2202.     }
  2203. }
  2204. printk("...0x%8.8lxn", (u_long)&lp->tx_ring[i].status);
  2205. printk("Descriptor buffers:nRX: ");
  2206. for (i=0;i<lp->rxRingSize-1;i++){
  2207.     if (i < 3) {
  2208. printk("0x%8.8x  ",le32_to_cpu(lp->rx_ring[i].buf));
  2209.     }
  2210. }
  2211. printk("...0x%8.8xn",le32_to_cpu(lp->rx_ring[i].buf));
  2212. printk("TX: ");
  2213. for (i=0;i<lp->txRingSize-1;i++){
  2214.     if (i < 3) {
  2215. printk("0x%8.8x  ", le32_to_cpu(lp->tx_ring[i].buf));
  2216.     }
  2217. }
  2218. printk("...0x%8.8xn", le32_to_cpu(lp->tx_ring[i].buf));
  2219. printk("Ring size: nRX: %dnTX: %dn", 
  2220.        (short)lp->rxRingSize, 
  2221.        (short)lp->txRingSize); 
  2222.     }
  2223.     
  2224.     return;
  2225. }
  2226. static void
  2227. de4x5_dbg_mii(struct net_device *dev, int k)
  2228. {
  2229.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  2230.     u_long iobase = dev->base_addr;
  2231.     
  2232.     if (de4x5_debug & DEBUG_MII) {
  2233. printk("nMII device address: %dn", lp->phy[k].addr);
  2234. printk("MII CR:  %xn",mii_rd(MII_CR,lp->phy[k].addr,DE4X5_MII));
  2235. printk("MII SR:  %xn",mii_rd(MII_SR,lp->phy[k].addr,DE4X5_MII));
  2236. printk("MII ID0: %xn",mii_rd(MII_ID0,lp->phy[k].addr,DE4X5_MII));
  2237. printk("MII ID1: %xn",mii_rd(MII_ID1,lp->phy[k].addr,DE4X5_MII));
  2238. if (lp->phy[k].id != BROADCOM_T4) {
  2239.     printk("MII ANA: %xn",mii_rd(0x04,lp->phy[k].addr,DE4X5_MII));
  2240.     printk("MII ANC: %xn",mii_rd(0x05,lp->phy[k].addr,DE4X5_MII));
  2241. }
  2242. printk("MII 16:  %xn",mii_rd(0x10,lp->phy[k].addr,DE4X5_MII));
  2243. if (lp->phy[k].id != BROADCOM_T4) {
  2244.     printk("MII 17:  %xn",mii_rd(0x11,lp->phy[k].addr,DE4X5_MII));
  2245.     printk("MII 18:  %xn",mii_rd(0x12,lp->phy[k].addr,DE4X5_MII));
  2246. } else {
  2247.     printk("MII 20:  %xn",mii_rd(0x14,lp->phy[k].addr,DE4X5_MII));
  2248. }
  2249.     }
  2250.     
  2251.     return;
  2252. }
  2253. static void
  2254. de4x5_dbg_media(struct net_device *dev)
  2255. {
  2256.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  2257.     
  2258.     if (lp->media != lp->c_media) {
  2259. if (de4x5_debug & DEBUG_MEDIA) {
  2260.     printk("%s: media is %s%sn", dev->name,
  2261.    (lp->media == NC  ? "unconnected, link down or incompatible connection" :
  2262.     (lp->media == TP  ? "TP" :
  2263.      (lp->media == ANS ? "TP/Nway" :
  2264.       (lp->media == BNC ? "BNC" : 
  2265.        (lp->media == AUI ? "AUI" : 
  2266. (lp->media == BNC_AUI ? "BNC/AUI" : 
  2267.  (lp->media == EXT_SIA ? "EXT SIA" : 
  2268.   (lp->media == _100Mb  ? "100Mb/s" :
  2269.    (lp->media == _10Mb   ? "10Mb/s" :
  2270.     "???"
  2271.     ))))))))), (lp->fdx?" full duplex.":"."));
  2272. }
  2273. lp->c_media = lp->media;
  2274.     }
  2275.     
  2276.     return;
  2277. }
  2278. static void
  2279. de4x5_dbg_srom(struct de4x5_srom *p)
  2280. {
  2281.     int i;
  2282.     if (de4x5_debug & DEBUG_SROM) {
  2283. printk("Sub-system Vendor ID: %04xn", *((u_short *)p->sub_vendor_id));
  2284. printk("Sub-system ID:        %04xn", *((u_short *)p->sub_system_id));
  2285. printk("ID Block CRC:         %02xn", (u_char)(p->id_block_crc));
  2286. printk("SROM version:         %02xn", (u_char)(p->version));
  2287. printk("# controllers:         %02xn", (u_char)(p->num_controllers));
  2288. printk("Hardware Address:     ");
  2289. for (i=0;i<ETH_ALEN-1;i++) {
  2290.     printk("%02x:", (u_char)*(p->ieee_addr+i));
  2291. }
  2292. printk("%02xn", (u_char)*(p->ieee_addr+i));
  2293. printk("CRC checksum:         %04xn", (u_short)(p->chksum));
  2294. for (i=0; i<64; i++) {
  2295.     printk("%3d %04xn", i<<1, (u_short)*((u_short *)p+i));
  2296. }
  2297.     }
  2298.     return;
  2299. }
  2300. static void
  2301. de4x5_dbg_rx(struct sk_buff *skb, int len)
  2302. {
  2303.     int i, j;
  2304.     if (de4x5_debug & DEBUG_RX) {
  2305. printk("R: %02x:%02x:%02x:%02x:%02x:%02x <- %02x:%02x:%02x:%02x:%02x:%02x len/SAP:%02x%02x [%d]n",
  2306.        (u_char)skb->data[0],
  2307.        (u_char)skb->data[1],
  2308.        (u_char)skb->data[2],
  2309.        (u_char)skb->data[3],
  2310.        (u_char)skb->data[4],
  2311.        (u_char)skb->data[5],
  2312.        (u_char)skb->data[6],
  2313.        (u_char)skb->data[7],
  2314.        (u_char)skb->data[8],
  2315.        (u_char)skb->data[9],
  2316.        (u_char)skb->data[10],
  2317.        (u_char)skb->data[11],
  2318.        (u_char)skb->data[12],
  2319.        (u_char)skb->data[13],
  2320.        len);
  2321. for (j=0; len>0;j+=16, len-=16) {
  2322.   printk("    %03x: ",j);
  2323.   for (i=0; i<16 && i<len; i++) {
  2324.     printk("%02x ",(u_char)skb->data[i+j]);
  2325.   }
  2326.   printk("n");
  2327. }
  2328.     }
  2329.     return;
  2330. }
  2331. /*
  2332. ** Perform IOCTL call functions here. Some are privileged operations and the
  2333. ** effective uid is checked in those cases. In the normal course of events
  2334. ** this function is only used for my testing.
  2335. */
  2336. static int
  2337. de4x5_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
  2338. {
  2339.     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
  2340.     struct de4x5_ioctl *ioc = (struct de4x5_ioctl *) &rq->ifr_data;
  2341.     u_long iobase = dev->base_addr;
  2342.     int i, j, status = 0;
  2343.     s32 omr;
  2344.     union {
  2345. u8  addr[144];
  2346. u16 sval[72];
  2347. u32 lval[36];
  2348.     } tmp;
  2349.     u_long flags = 0;
  2350.     
  2351.     switch(ioc->cmd) {
  2352.     case DE4X5_GET_HWADDR:           /* Get the hardware address */
  2353. ioc->len = ETH_ALEN;
  2354. for (i=0; i<ETH_ALEN; i++) {
  2355.     tmp.addr[i] = dev->dev_addr[i];
  2356. }
  2357. if (copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT;
  2358. break;
  2359.     case DE4X5_SET_HWADDR:           /* Set the hardware address */
  2360. if (!capable(CAP_NET_ADMIN)) return -EPERM;
  2361. if (copy_from_user(tmp.addr, ioc->data, ETH_ALEN)) return -EFAULT;
  2362. if (netif_queue_stopped(dev))
  2363. return -EBUSY;
  2364. netif_stop_queue(dev);
  2365. for (i=0; i<ETH_ALEN; i++) {
  2366.     dev->dev_addr[i] = tmp.addr[i];
  2367. }
  2368. build_setup_frame(dev, PHYS_ADDR_ONLY);
  2369. /* Set up the descriptor and give ownership to the card */
  2370. load_packet(dev, lp->setup_frame, TD_IC | PERFECT_F | TD_SET | 
  2371.                                        SETUP_FRAME_LEN, (struct sk_buff *)1);
  2372. lp->tx_new = (++lp->tx_new) % lp->txRingSize;
  2373. outl(POLL_DEMAND, DE4X5_TPD);                /* Start the TX */
  2374. netif_wake_queue(dev);                      /* Unlock the TX ring */
  2375. break;
  2376.     case DE4X5_SET_PROM:             /* Set Promiscuous Mode */
  2377. if (!capable(CAP_NET_ADMIN)) return -EPERM;
  2378. omr = inl(DE4X5_OMR);
  2379. omr |= OMR_PR;
  2380. outl(omr, DE4X5_OMR);
  2381. dev->flags |= IFF_PROMISC;
  2382. break;
  2383.     case DE4X5_CLR_PROM:             /* Clear Promiscuous Mode */
  2384. if (!capable(CAP_NET_ADMIN)) return -EPERM;
  2385. omr = inl(DE4X5_OMR);
  2386. omr &= ~OMR_PR;
  2387. outl(omr, DE4X5_OMR);
  2388. dev->flags &= ~IFF_PROMISC;
  2389. break;
  2390.     case DE4X5_SAY_BOO:              /* Say "Boo!" to the kernel log file */
  2391. if (!capable(CAP_NET_ADMIN)) return -EPERM;
  2392. printk("%s: Boo!n", dev->name);
  2393. break;
  2394.     case DE4X5_MCA_EN:               /* Enable pass all multicast addressing */
  2395. if (!capable(CAP_NET_ADMIN)) return -EPERM;
  2396. omr = inl(DE4X5_OMR);
  2397. omr |= OMR_PM;
  2398. outl(omr, DE4X5_OMR);
  2399. break;
  2400.     case DE4X5_GET_STATS:            /* Get the driver statistics */
  2401.     {
  2402.         struct pkt_stats statbuf;
  2403. ioc->len = sizeof(statbuf);
  2404. spin_lock_irqsave(&lp->lock, flags);
  2405. memcpy(&statbuf, &lp->pktStats, ioc->len);
  2406. spin_unlock_irqrestore(&lp->lock, flags);
  2407. if (copy_to_user(ioc->data, &statbuf, ioc->len)) 
  2408. return -EFAULT; 
  2409. break;
  2410.     }
  2411.     case DE4X5_CLR_STATS:            /* Zero out the driver statistics */
  2412. if (!capable(CAP_NET_ADMIN)) return -EPERM;
  2413. spin_lock_irqsave(&lp->lock, flags);
  2414. memset(&lp->pktStats, 0, sizeof(lp->pktStats));
  2415. spin_unlock_irqrestore(&lp->lock, flags);
  2416. break;
  2417.     case DE4X5_GET_OMR:              /* Get the OMR Register contents */
  2418. tmp.addr[0] = inl(DE4X5_OMR);
  2419. if (copy_to_user(ioc->data, tmp.addr, 1)) return -EFAULT;
  2420. break;
  2421.     case DE4X5_SET_OMR:              /* Set the OMR Register contents */
  2422. if (!capable(CAP_NET_ADMIN)) return -EPERM;
  2423. if (copy_from_user(tmp.addr, ioc->data, 1)) return -EFAULT;
  2424. outl(tmp.addr[0], DE4X5_OMR);
  2425. break;
  2426.     case DE4X5_GET_REG:              /* Get the DE4X5 Registers */
  2427. j = 0;
  2428. tmp.lval[0] = inl(DE4X5_STS); j+=4;
  2429. tmp.lval[1] = inl(DE4X5_BMR); j+=4;
  2430. tmp.lval[2] = inl(DE4X5_IMR); j+=4;
  2431. tmp.lval[3] = inl(DE4X5_OMR); j+=4;
  2432. tmp.lval[4] = inl(DE4X5_SISR); j+=4;
  2433. tmp.lval[5] = inl(DE4X5_SICR); j+=4;
  2434. tmp.lval[6] = inl(DE4X5_STRR); j+=4;
  2435. tmp.lval[7] = inl(DE4X5_SIGR); j+=4;
  2436. ioc->len = j;
  2437. if (copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT;
  2438. break;
  2439. #define DE4X5_DUMP              0x0f /* Dump the DE4X5 Status */
  2440. /*
  2441.       case DE4X5_DUMP:
  2442. j = 0;
  2443. tmp.addr[j++] = dev->irq;
  2444. for (i=0; i<ETH_ALEN; i++) {
  2445.     tmp.addr[j++] = dev->dev_addr[i];
  2446. }
  2447. tmp.addr[j++] = lp->rxRingSize;
  2448. tmp.lval[j>>2] = (long)lp->rx_ring; j+=4;
  2449. tmp.lval[j>>2] = (long)lp->tx_ring; j+=4;
  2450. for (i=0;i<lp->rxRingSize-1;i++){
  2451.     if (i < 3) {
  2452. tmp.lval[j>>2] = (long)&lp->rx_ring[i].status; j+=4;
  2453.     }
  2454. }
  2455. tmp.lval[j>>2] = (long)&lp->rx_ring[i].status; j+=4;
  2456. for (i=0;i<lp->txRingSize-1;i++){
  2457.     if (i < 3) {
  2458. tmp.lval[j>>2] = (long)&lp->tx_ring[i].status; j+=4;
  2459.     }
  2460. }
  2461. tmp.lval[j>>2] = (long)&lp->tx_ring[i].status; j+=4;
  2462. for (i=0;i<lp->rxRingSize-1;i++){
  2463.     if (i < 3) {
  2464. tmp.lval[j>>2] = (s32)le32_to_cpu(lp->rx_ring[i].buf); j+=4;
  2465.     }
  2466. }
  2467. tmp.lval[j>>2] = (s32)le32_to_cpu(lp->rx_ring[i].buf); j+=4;
  2468. for (i=0;i<lp->txRingSize-1;i++){
  2469.     if (i < 3) {
  2470. tmp.lval[j>>2] = (s32)le32_to_cpu(lp->tx_ring[i].buf); j+=4;
  2471.     }
  2472. }
  2473. tmp.lval[j>>2] = (s32)le32_to_cpu(lp->tx_ring[i].buf); j+=4;
  2474. for (i=0;i<lp->rxRingSize;i++){
  2475.     tmp.lval[j>>2] = le32_to_cpu(lp->rx_ring[i].status); j+=4;
  2476. }
  2477. for (i=0;i<lp->txRingSize;i++){
  2478.     tmp.lval[j>>2] = le32_to_cpu(lp->tx_ring[i].status); j+=4;
  2479. }
  2480. tmp.lval[j>>2] = inl(DE4X5_BMR);  j+=4;
  2481. tmp.lval[j>>2] = inl(DE4X5_TPD);  j+=4;
  2482. tmp.lval[j>>2] = inl(DE4X5_RPD);  j+=4;
  2483. tmp.lval[j>>2] = inl(DE4X5_RRBA); j+=4;
  2484. tmp.lval[j>>2] = inl(DE4X5_TRBA); j+=4;
  2485. tmp.lval[j>>2] = inl(DE4X5_STS);  j+=4;
  2486. tmp.lval[j>>2] = inl(DE4X5_OMR);  j+=4;
  2487. tmp.lval[j>>2] = inl(DE4X5_IMR);  j+=4;
  2488. tmp.lval[j>>2] = lp->chipset; j+=4; 
  2489. if (lp->chipset == DC21140) {
  2490.     tmp.lval[j>>2] = gep_rd(dev);  j+=4;
  2491. } else {
  2492.     tmp.lval[j>>2] = inl(DE4X5_SISR); j+=4;
  2493.     tmp.lval[j>>2] = inl(DE4X5_SICR); j+=4;
  2494.     tmp.lval[j>>2] = inl(DE4X5_STRR); j+=4;
  2495.     tmp.lval[j>>2] = inl(DE4X5_SIGR); j+=4; 
  2496. }
  2497. tmp.lval[j>>2] = lp->phy[lp->active].id; j+=4; 
  2498. if (lp->phy[lp->active].id && (!lp->useSROM || lp->useMII)) {
  2499.     tmp.lval[j>>2] = lp->active; j+=4; 
  2500.     tmp.lval[j>>2]=mii_rd(MII_CR,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
  2501.     tmp.lval[j>>2]=mii_rd(MII_SR,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
  2502.     tmp.lval[j>>2]=mii_rd(MII_ID0,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
  2503.     tmp.lval[j>>2]=mii_rd(MII_ID1,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
  2504.     if (lp->phy[lp->active].id != BROADCOM_T4) {
  2505. tmp.lval[j>>2]=mii_rd(MII_ANA,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
  2506. tmp.lval[j>>2]=mii_rd(MII_ANLPA,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
  2507.     }
  2508.     tmp.lval[j>>2]=mii_rd(0x10,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
  2509.     if (lp->phy[lp->active].id != BROADCOM_T4) {
  2510. tmp.lval[j>>2]=mii_rd(0x11,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
  2511. tmp.lval[j>>2]=mii_rd(0x12,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
  2512.     } else {
  2513. tmp.lval[j>>2]=mii_rd(0x14,lp->phy[lp->active].addr,DE4X5_MII); j+=4;
  2514.     }
  2515. }
  2516. tmp.addr[j++] = lp->txRingSize;
  2517. tmp.addr[j++] = netif_queue_stopped(dev);
  2518. ioc->len = j;
  2519. if (copy_to_user(ioc->data, tmp.addr, ioc->len)) return -EFAULT;
  2520. break;
  2521. */
  2522.     default:
  2523. return -EOPNOTSUPP;
  2524.     }
  2525.     
  2526.     return status;
  2527. }
  2528. #ifdef MODULE
  2529. /*
  2530. ** Note now that module autoprobing is allowed under EISA and PCI. The
  2531. ** IRQ lines will not be auto-detected; instead I'll rely on the BIOSes
  2532. ** to "do the right thing".
  2533. */
  2534. #define LP(a) ((struct de4x5_private *)(a))
  2535. static struct net_device *mdev = NULL;
  2536. static int io=0x0;/* EDIT THIS LINE FOR YOUR CONFIGURATION IF NEEDED        */
  2537. MODULE_PARM(io, "i");
  2538. MODULE_PARM_DESC(io, "de4x5 I/O base address");
  2539. int
  2540. init_module(void)
  2541. {
  2542.     int i, num, status = -EIO;
  2543.     struct net_device *p;
  2544.     num = count_adapters();
  2545.     for (i=0; i<num; i++) {
  2546. if ((p = insert_device(NULL, io, de4x5_probe)) == NULL) 
  2547.     return -ENOMEM;
  2548. if (!mdev) mdev = p;
  2549. if (register_netdev(p) != 0) {
  2550.     struct de4x5_private *lp = (struct de4x5_private *)p->priv;
  2551.     if (lp) {
  2552. release_region(p->base_addr, (lp->bus == PCI ? 
  2553.       DE4X5_PCI_TOTAL_SIZE :
  2554.       DE4X5_EISA_TOTAL_SIZE));
  2555. if (lp->cache.priv) {       /* Private area allocated?   */
  2556.     kfree(lp->cache.priv);  /* Free the private area     */
  2557. }
  2558. if (lp->rx_ring) {
  2559.     pci_free_consistent(lp->pdev, lp->dma_size, lp->rx_ring,
  2560. lp->dma_rings);
  2561. }
  2562.     }
  2563.     kfree(p);
  2564. } else {
  2565.     status = 0;                 /* At least one adapter will work */
  2566.     lastModule = p;
  2567. }
  2568.     }
  2569.     return status;
  2570. }
  2571. void
  2572. cleanup_module(void)
  2573. {
  2574.     while (mdev != NULL) {
  2575. mdev = unlink_modules(mdev);
  2576.     }
  2577.     return;
  2578. }
  2579. static struct net_device *
  2580. unlink_modules(struct net_device *p)
  2581. {
  2582.     struct net_device *next = NULL;
  2583.     if (p->priv) {                          /* Private areas allocated?  */
  2584. struct de4x5_private *lp = (struct de4x5_private *)p->priv;
  2585. next = lp->next_module;
  2586. if (lp->rx_ring) {
  2587. pci_free_consistent(lp->pdev, lp->dma_size, lp->rx_ring,
  2588.     lp->dma_rings);
  2589. }
  2590. release_region(p->base_addr, (lp->bus == PCI ? 
  2591.       DE4X5_PCI_TOTAL_SIZE :
  2592.       DE4X5_EISA_TOTAL_SIZE));
  2593. kfree(lp->cache.priv);              /* Free the private area     */
  2594.     }
  2595.     unregister_netdev(p);
  2596.     kfree(p);                               /* Free the device structure */
  2597.     
  2598.     return next;
  2599. }
  2600. static int
  2601. count_adapters(void)
  2602. {
  2603.     int i, j=0;
  2604.     u_short vendor;
  2605.     u_int class = DE4X5_CLASS_CODE;
  2606.     u_int device;
  2607. #if !defined(__sparc_v9__) && !defined(__powerpc__) && !defined(__alpha__)
  2608.     char name[DE4X5_STRLEN];
  2609.     u_long iobase = 0x1000;
  2610.     for (i=1; i<MAX_EISA_SLOTS; i++, iobase+=EISA_SLOT_INC) {
  2611. if (EISA_signature(name, EISA_ID)) j++;
  2612.     }
  2613. #endif
  2614.     if (!pcibios_present()) return j;
  2615.     for (i=0; (pdev=pci_find_class(class, pdev))!= NULL; i++) {
  2616. vendor = pdev->vendor;
  2617. device = pdev->device << 8;
  2618. if (is_DC21040 || is_DC21041 || is_DC21140 || is_DC2114x) j++;
  2619.     }
  2620.     return j;
  2621. }
  2622. /*
  2623. ** If at end of eth device list and can't use current entry, malloc
  2624. ** one up. If memory could not be allocated, print an error message.
  2625. */
  2626. static struct net_device * __init 
  2627. insert_device(struct net_device *dev, u_long iobase, int (*init)(struct net_device *))
  2628. {
  2629.     struct net_device *new;
  2630.     new = (struct net_device *)kmalloc(sizeof(struct net_device), GFP_KERNEL);
  2631.     if (new == NULL) {
  2632. printk("de4x5.c: Device not initialised, insufficient memoryn");
  2633. return NULL;
  2634.     } else {
  2635. memset((char *)new, 0, sizeof(struct net_device));
  2636. new->base_addr = iobase;       /* assign the io address */
  2637. new->init = init;              /* initialisation routine */
  2638.     }
  2639.     return new;
  2640. }
  2641. #endif /* MODULE */
  2642. /*
  2643.  * Local variables:
  2644.  *
  2645.  * Delete -DMODVERSIONS below if you didn't define this in your kernel
  2646.  *
  2647.  *  compile-command: "gcc -D__KERNEL__ -DMODULE -I/linux/include -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -malign-functions=2 -O2 -m486 -DMODVERSIONS -include /linux/include/linux/modversions.h -c de4x5.c"
  2648.  * End:
  2649.  */