home *** CD-ROM | disk | FTP | other *** search
/ ftp.urbanrage.com / 2015-02-07.ftp.urbanrage.com.tar / ftp.urbanrage.com / pub / pearpc / pearpc-verbose11-rtl8139.patch < prev    next >
Text File  |  2004-05-23  |  12KB  |  431 lines

  1. diff -urN pearpc/src/io/prom/promdt.cc pearpc-verbose11/src/io/prom/promdt.cc
  2. --- pearpc/src/io/prom/promdt.cc    2004-05-23 19:34:24.000000000 -0500
  3. +++ pearpc-verbose11/src/io/prom/promdt.cc    2004-05-24 08:51:02.000000000 -0500
  4. @@ -34,6 +34,9 @@
  5.  
  6.  #include "info.h"
  7.  
  8. +#include "configparser.h"
  9. +#include "io/rtl8139/rtl8139.h"
  10. +
  11.  PromNode *gPromRoot;
  12.  AVLTree *gPromPackages;
  13.  AVLTree *gPromInstances;
  14. @@ -1371,6 +1374,8 @@
  15.      /*
  16.       *    Eth0
  17.       */
  18. +    /* should be switched to if (gCon...(3C90X_KEY_INSTALLED) */
  19. +    if (!gConfig->getConfigInt(RTL8139_KEY_INSTALLED)) {
  20.  #if 1
  21.      PromNode *eth0 = new PromNode("pci10b7,9200@4");
  22.      bridge->addNode(eth0);
  23. @@ -1406,7 +1411,9 @@
  24.      };
  25.      eth0->addProp(new PromPropMemory("assigned-addresses", ð0aa, sizeof eth0aa));
  26.  #endif
  27. +    }
  28.  
  29. +    if (gConfig->getConfigInt(RTL8139_KEY_INSTALLED)) {
  30.      /*
  31.       *    Eth1
  32.       */
  33. @@ -1443,6 +1450,7 @@
  34.      0x00,0x00,0x01,0x00,
  35.      };
  36.      eth1->addProp(new PromPropMemory("assigned-addresses", ð1aa, sizeof eth1aa));
  37. +    }
  38.  
  39.      /*
  40.       *    USB
  41. diff -urN pearpc/src/io/rtl8139/rtl8139.cc pearpc-verbose11/src/io/rtl8139/rtl8139.cc
  42. --- pearpc/src/io/rtl8139/rtl8139.cc    2004-05-24 07:13:33.000000000 -0500
  43. +++ pearpc-verbose11/src/io/rtl8139/rtl8139.cc    2004-05-24 08:51:28.000000000 -0500
  44. @@ -45,6 +45,8 @@
  45.  #include "rtl8139.h"
  46.  
  47.  #define MAX_PACKET_SIZE        6000
  48. +#define MAX_PACKETS        128
  49. +
  50.  
  51.  enum RxHeaderBits {
  52.      Rx_ROK =  1<<0, // recieve okay
  53. @@ -129,6 +131,10 @@
  54.      uint8  PHY2 PACKED; // 0x80
  55.  };
  56.  
  57. +struct Packet {
  58. +    uint16    size;
  59. +    byte    packet[MAX_PACKET_SIZE];
  60. +};
  61.  
  62.  // IEEE 802.3 MAC, Ethernet-II
  63.  struct EthFrameII {
  64. @@ -189,25 +195,6 @@
  65.      }
  66.  }
  67.  
  68. -#if 0
  69. -static void dumpClientMem(uint32 addr, uint16 len)
  70. -{
  71. -    byte *p;
  72. -    if (ppc_direct_physical_memory_handle(addr, p) != PPC_MMU_OK) return;
  73. -    if (mVerbose) {
  74. -        dumpMem(p, len);
  75. -    }
  76. -}
  77. -
  78. -static int compareMACs(byte a[6], byte b[6])
  79. -{
  80. -    for (uint i=0; i<6; i++) {
  81. -        if (a[i] != b[i]) return a[i] - b[i];
  82. -    }
  83. -    return 0;
  84. -}
  85. -#endif
  86. -
  87.  /*
  88.   *
  89.   */
  90. @@ -225,10 +212,12 @@
  91.      uint        mRxPacketSize;
  92.      int        mRingBufferSize;
  93.      bool         mGoodBSA;
  94. -    int        mPackets;
  95.      enet_iface_t    mENetIf;
  96.      sys_mutex    mLock;
  97.      int        mVerbose;
  98. +    byte        mHead;
  99. +    byte        mTail;
  100. +    Packet        mPackets[MAX_PACKETS];
  101.  
  102.  
  103.  void PCIReset()
  104. @@ -245,7 +234,7 @@
  105.  
  106.      mConfig[0x0e] = 0x00;    // header-type (single-function PCI device)
  107.  
  108. -    mConfig[0x3c] = IO_PIC_IRQ_ETHERNET1;    // interrupt line
  109. +    mConfig[0x3c] = IO_PIC_IRQ_ETHERNET0;    // interrupt line
  110.      mConfig[0x3d] = 1;    // interrupt pin (default is 1)
  111.      mConfig[0x3e] = 5;    // MinGnt (default is 5 = 0x05 = 0101b)
  112.      mConfig[0x3f] = 48;    // MaxLat (default is 48 = 0x30 = 110000b)
  113. @@ -271,8 +260,9 @@
  114.      memset(&mRegisters, 0, sizeof mRegisters);
  115.      mIntStatus = 0;
  116.      mRingBufferSize = 8192;
  117. -    mPackets = 0;
  118. -    mGoodBSA = 0;
  119. +    mHead = 0;
  120. +    mTail = 0;
  121. +    mGoodBSA = false;
  122.      mRxEnabled = false;
  123.      mTxEnabled = false;
  124.      mUpStalled = false;
  125. @@ -292,6 +282,8 @@
  126.      mRegisters.CommandRegister = 0x01;
  127.      mRegisters.TxConfiguration = 0x63000000; // rtl8139
  128.      mRegisters.MediaStatus = 0x90;
  129. +    mRegisters.CBA = 0;
  130. +    mRegisters.CAPR = 0xfff0;
  131.  
  132.      memset(mEEPROM, 0, sizeof mEEPROM);
  133.      mEEPROM[EEPROM_DeviceID] =        0x8139; //0x9200;
  134. @@ -353,11 +345,11 @@
  135.  
  136.  void TxPacket(uint32 address, uint32 size)
  137.  {
  138. -    byte *    ppc_addr;
  139. -    byte    pbuf[MAX_PACKET_SIZE];
  140. -    byte *    p;
  141. -    uint32    crc;
  142. -    uint32    psize;
  143. +    byte*    ppc_addr;
  144. +    byte     pbuf[MAX_PACKET_SIZE];
  145. +    byte*    p;
  146. +    uint32 crc;
  147. +    uint32 psize;
  148.      uint     w;
  149.  
  150.      p = pbuf;
  151. @@ -401,7 +393,7 @@
  152.  
  153.  public:
  154.  rtl8139_NIC(enet_iface_t &aENetIf)
  155. -: PCI_Device("rtl8139 Network interface card", 0x1, 0xd)
  156. +: PCI_Device("rtl8139 Network interface card", 0x1, 0xc)
  157.  {
  158.      int e;
  159.      if ((e = sys_create_mutex(&mLock))) throw IOException(e);
  160. @@ -410,6 +402,37 @@
  161.      totalReset();
  162.  }
  163.  
  164. +void transferPacket(bool raiseIntr)
  165. +{
  166. +    byte*        addr;
  167. +    byte*           base;
  168. +
  169. +    if (ppc_direct_physical_memory_handle(mRegisters.RxBufferStartAddr, base) == PPC_MMU_OK) {
  170. +        addr = base + mRegisters.CBA;
  171. +        if ((mRegisters.CBA) > mRingBufferSize) {
  172. +            if (mVerbose) IO_RTL8139_TRACE("client ring buffer wrap around [%d]\n", raiseIntr);
  173. +            addr = base;
  174. +            mRegisters.CBA = 0;
  175. +            mRegisters.CAPR = 0xfff0;
  176. +//            mRegisters.CommandRegister |= 1;
  177. +            return;
  178. +        }
  179. +        memcpy(addr, mPackets[mTail].packet, mPackets[mTail].size);
  180. +        if (mVerbose) IO_RTL8139_TRACE("wrote %04x bytes to the ring buffer\n", mPackets[mTail].size);
  181. +        mRegisters.EarlyRxByteCount = mPackets[mTail].size;
  182. +        mRegisters.EarlyRxStatus = 8;
  183. +        mRegisters.CBA += mPackets[mTail].size;
  184. +        mRegisters.CommandRegister &= 0xfe; // RxBuffer has data
  185. +        mTail = (mTail+1) % MAX_PACKETS;
  186. +        if (raiseIntr) {
  187. +            mIntStatus |= 1;
  188. +            maybeRaiseIntr();
  189. +        }
  190. +    } else {
  191. +        IO_RTL8139_ERR("ppc_direct_physical_memory_handle called failed in transferPacket\n");
  192. +    }
  193. +}
  194. +
  195.  void verbose(int level)
  196.  {
  197.      mVerbose = level;
  198. @@ -465,9 +488,10 @@
  199.          case 0x48:
  200.              if (mVerbose) IO_RTL8139_TRACE("read Timer = %08x\n", data);
  201.              break;
  202. -        case 0x37:
  203. +        case 0x37: {
  204.              if (mVerbose) IO_RTL8139_TRACE("read Command Register = %02x\n", data);
  205.              break;
  206. +        }
  207.          default:
  208.              if (mVerbose) IO_RTL8139_TRACE("read reg %04x (size %d) = %08x\n", port, size, data);
  209.              break;
  210. @@ -556,18 +580,29 @@
  211.              mRegisters.CBA = 0;
  212.              mRegisters.CAPR = 0xfff0;
  213.              mRegisters.CommandRegister |= 1;
  214. -            mPackets = 0;
  215.              mGoodBSA = true;
  216. +            if (mTail != mHead) {
  217. +                transferPacket(true);
  218. +            }
  219.              break;
  220.          }
  221.          case 0x38: {
  222.              if (mVerbose) IO_RTL8139_TRACE("update to CAPR: CAPR %04x, CBA %04x\n", data, mRegisters.CBA);
  223.              mRegisters.CAPR = data;
  224. -            mPackets--;
  225. -            if (mPackets < 1) {
  226. -                mPackets = 0;
  227. -                //mRegisters.CBA = mRegisters.CAPR;
  228. -                mRegisters.CommandRegister |= 1; // buffer is empty again
  229. +            if (mRegisters.CAPR > mRingBufferSize) { //client knows about wrap, so wrap
  230. +                mIntStatus |= 1; // fake send
  231. +                maybeRaiseIntr();
  232. +                /*
  233. +                mRegisters.CAPR = 0xfff0;
  234. +                mRegisters.CommandRegister |= 1;
  235. +                mRegisters.CBA = 0;
  236. +                */
  237. +            } else {
  238. +                if (mTail != mHead) {
  239. +                    transferPacket(false);
  240. +                } else {
  241. +                    mRegisters.CommandRegister |= 1;
  242. +                }
  243.              }
  244.              break;
  245.          }
  246. @@ -578,6 +613,7 @@
  247.              case 0x0800: mRingBufferSize = 16384; break;
  248.              case 0x1000: mRingBufferSize = 32768; break;
  249.              case 0x1800: mRingBufferSize = 65536; break;
  250. +            default: mRingBufferSize = 8192;
  251.              };
  252.              if (mVerbose) IO_RTL8139_TRACE("RingBuffer Size: %08x\n", mRingBufferSize);
  253.              break;
  254. @@ -601,14 +637,11 @@
  255.  
  256.  void handlePacket()
  257.  {
  258. -    int        err;
  259. -    byte*        addr;
  260.      uint16        header;
  261.      uint16        psize;
  262. -    byte*        base;
  263. +    byte        tmp;
  264.      byte        broadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  265.  
  266. -    sys_lock_mutex(mLock);
  267.      mRxPacketSize = read(mENetIf.fd, mRxPacket, sizeof mRxPacket);
  268.      if (!mGoodBSA) {
  269.          mRxPacketSize = 0;
  270. @@ -617,67 +650,49 @@
  271.          if (mVerbose > 1) {
  272.              dumpMem(mRxPacket, mRxPacketSize);
  273.          }
  274. -        // should really do a crc check and all that good stuff
  275. -        if (ppc_direct_physical_memory_handle(mRegisters.RxBufferStartAddr, addr) == PPC_MMU_OK) {
  276. -            header = 0;
  277. -            if (mRxPacketSize < 64) {
  278. -                for ( ; mRxPacketSize < 60; mRxPacketSize++) {
  279. -                    mRxPacket[mRxPacketSize] = 0;
  280. -                }
  281. -                //header |= Rx_RUNT; // set runt status
  282. -            }
  283. -            /* pad to a 4 byte boundary */
  284. -            for (int i = 4-(mRxPacketSize % 4); i != 0; i--) {
  285. -                mRxPacket[mRxPacketSize++] = 0;
  286. -            }
  287. -            if (memcmp(addr, (byte*)&mRegisters, 6) == 0) {
  288. -                //    if (mVerbose) IO_RTL8139_TRACE("Physical Address Match\n");
  289. -                header |= Rx_PAM;
  290. -            }
  291. -            if (memcmp(addr, broadcast, 6) == 0) {
  292. -                header |= Rx_BAR;
  293. -            }
  294. -            // check crc?
  295. -            header |= Rx_ROK;
  296. -#if 0
  297. -            uint32 crc = ether_crc(mRxPacketSize, mRxPacket);
  298. -            mRxPacket[mRxPacketSize+0] = crc;
  299. -            mRxPacket[mRxPacketSize+1] = crc>>8;
  300. -            mRxPacket[mRxPacketSize+2] = crc>>16;
  301. -            mRxPacket[mRxPacketSize+3] = crc>>24;
  302. -            mRxPacketSize += 4;
  303. -#endif
  304. -            psize = mRxPacketSize;
  305. -            base = addr;
  306. -            addr += mRegisters.CBA;
  307. -            if ((addr - base) > mRingBufferSize) {
  308. -                if (mVerbose) IO_RTL8139_TRACE("RING BUFFER WRAPPED\n");
  309. -                // wrapped should check how to handle wrap
  310. -                addr = base;
  311. -                mRegisters.CBA = 0;
  312. +        header = 0;
  313. +        if (mRxPacketSize < 64) {
  314. +            for ( ; mRxPacketSize < 60; mRxPacketSize++) {
  315. +                mRxPacket[mRxPacketSize] = 0;
  316.              }
  317. -            addr[0] = header;
  318. -            addr[1] = header>>8;
  319. -            addr[2] = psize;
  320. -            addr[3] = psize>>8;
  321. -            
  322. -            memcpy(addr+4, mRxPacket, mRxPacketSize);
  323. -            err = memcmp(addr+4, mRxPacket, mRxPacketSize);
  324. -            if (err) {
  325. -                IO_RTL8139_WARN("memcpy of rx packet to rx buffer failed\n");
  326. +            //header |= Rx_RUNT; // set runt status
  327. +        }
  328. +        /* pad to a 4 byte boundary */
  329. +        for (int i = 4-(mRxPacketSize % 4); i != 0; i--) {
  330. +            mRxPacket[mRxPacketSize++] = 0;
  331. +        }
  332. +        if (memcmp((byte*)&(mRxPacket[0]), (byte*)&(mRegisters.id0), 6) == 0) {
  333. +            //    if (mVerbose) IO_RTL8139_TRACE("Physical Address Match\n");
  334. +            header |= Rx_PAM;
  335. +        }
  336. +        if (memcmp((byte*)&(mRxPacket[0]), broadcast, 6) == 0) {
  337. +            header |= Rx_BAR;
  338. +        }
  339. +        // check crc?
  340. +        header |= Rx_ROK;
  341. +        psize = mRxPacketSize;
  342. +        mPackets[mHead].packet[0] = header;
  343. +        mPackets[mHead].packet[1] = header>>8;
  344. +        mPackets[mHead].packet[2] = psize;
  345. +        mPackets[mHead].packet[3] = psize>>8;
  346. +        memcpy(&(mPackets[mHead].packet[4]), mRxPacket, mRxPacketSize);
  347. +        mPackets[mHead].size = mRxPacketSize+4;
  348. +        if (mHead == mTail) { /* first recent packet buffer */
  349. +            mHead = (mHead+1) % MAX_PACKETS;
  350. +        } else {
  351. +            tmp = mHead;
  352. +            mHead = (mHead+1) % MAX_PACKETS;
  353. +            if (mHead == mTail) {
  354. +                mHead = tmp; // reset it back 
  355. +                IO_RTL8139_WARN("Internal Buffer wrapped around\n");
  356.              }
  357. -            if (mVerbose) IO_RTL8139_TRACE("wrote %04x bytes to the ring buffer\n", mRxPacketSize+4);
  358. -            mIntStatus |= 1;
  359. -            mRegisters.EarlyRxStatus = 8;
  360. -            mRegisters.EarlyRxByteCount = mRxPacketSize+4;
  361. -            mRegisters.CBA += mRxPacketSize+4;
  362. -            mRegisters.CommandRegister &= 0xfe; // RxBuffer has data
  363. -            mPackets++;
  364. -            maybeRaiseIntr();
  365. -            mRxPacketSize = 0; // reset packet stuff
  366. +        }
  367. +        if (mRegisters.CommandRegister & 1) { /* no packets in process, kick one out */
  368. +            sys_lock_mutex(mLock);
  369. +            transferPacket(true);
  370. +            sys_unlock_mutex(mLock);
  371.          }
  372.      }
  373. -    sys_unlock_mutex(mLock);
  374.  }
  375.  
  376.  /* new */
  377. @@ -712,15 +727,14 @@
  378.  #include "configparser.h"
  379.  #include "tools/strtools.h"
  380.  
  381. -#define RTL8139_KEY_INSTALLED    "pci_rtl8139_installed"
  382. -#define RTL8139_KEY_MAC    "pci_rtl8139_mac"
  383. -#define RTL8139_KEY_VERBOSE    "pci_rtl8139_verbose"
  384. -
  385.  void rtl8139_init()
  386.  {
  387. +    String tunstr_;
  388. +    char   tun_name[1024];
  389. +
  390.      int verbose = 0;
  391. -    verbose = gConfig->getConfigInt(RTL8139_KEY_VERBOSE); 
  392.  
  393. +    verbose = gConfig->getConfigInt(RTL8139_KEY_VERBOSE); 
  394.      if (gConfig->getConfigInt(RTL8139_KEY_INSTALLED)) {
  395.          byte mac[6];
  396.          mac[0] = 0xde;
  397. @@ -740,9 +754,7 @@
  398.                  if (!bnstr(macstr, v, 16) || (v>255) || ((*macstr != ':') && (i!=5))) {
  399.                      IO_RTL8139_ERR("error in config key %s:"
  400.                      "expected format: XX:XX:XX:XX:XX:XX, "
  401. -                    "where X stands for any digit or the "
  402. -                    "letters a-f, A-F (error at: %s)\n",
  403. -                    RTL8139_KEY_MAC, macstr);
  404. +                    "where X stands for any digit or the letters a-f, A-F (error at: %s)\n",RTL8139_KEY_MAC, macstr);
  405.                  }
  406.                  macstr++;
  407.                  cfgmac[i] = v;
  408. @@ -757,7 +769,7 @@
  409.          } else if (e) {
  410.              IO_RTL8139_ERR("Open enetif failed: %s\n", strerror(e));
  411.              exit(1);
  412. -        }
  413. +                }
  414.          printf("creating RealTek rtl8139 NIC emulation with eth_addr = ");
  415.          for (uint i=0; i<6; i++) {
  416.              if (i<5) {
  417. diff -urN pearpc/src/io/rtl8139/rtl8139.h pearpc-verbose11/src/io/rtl8139/rtl8139.h
  418. --- pearpc/src/io/rtl8139/rtl8139.h    2004-05-24 07:13:33.000000000 -0500
  419. +++ pearpc-verbose11/src/io/rtl8139/rtl8139.h    2004-05-24 08:51:02.000000000 -0500
  420. @@ -22,6 +22,10 @@
  421.  #ifndef __IO_RTL8139_H__
  422.  #define __IO_RTL8139_H__
  423.  
  424. +#define RTL8139_KEY_INSTALLED   "pci_rtl8139_installed"
  425. +#define RTL8139_KEY_MAC         "pci_rtl8139_mac"
  426. +#define RTL8139_KEY_VERBOSE     "pci_rtl8139_verbose"
  427. +
  428.  void rtl8139_init();
  429.  void rtl8139_init_config();
  430.  
  431.