]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - src/dp8390.c
Bugfixes:
[z.facultad/66.09/etherled.git] / src / dp8390.c
index 946ebc7acb07952643cb15dbf76995f96113a775..30b3fb53468977e1ac9713b84bdb3d47a3809c57 100644 (file)
@@ -139,6 +139,8 @@ static void reset()
  */
 bool netdev_init()
 {
+    byte i;
+
     // Set IOR & IOW as they're active low.
     IOR = 1;
     IOW = 1;
@@ -191,18 +193,11 @@ bool netdev_init()
     write_reg(RSAR0, 0u); // En la dirección 0x0000
     write_reg(RSAR1, 0u);
     write_reg(CR, READ); // Comienza lectura
-    eth_addr_local[0] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
-    eth_addr_local[1] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
-    eth_addr_local[2] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
-    eth_addr_local[3] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
-    eth_addr_local[4] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
-    eth_addr_local[5] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
+    for (i = 0; i < ETH_ADDR_SIZE; ++i)
+    {
+        eth_addr_local[i] = read_reg(RDMA);
+        read_reg(RDMA); // Ignoramos porque viene como un word
+    }
 
     // Abort/ complete DMA operation.
     ABORT_DMA(STOP);
@@ -226,12 +221,8 @@ bool netdev_init()
     write_reg(CURR, RX_PAGE_START + 1);
 
     // Set physical address
-    write_reg(PAR0, eth_addr_local[0]);
-    write_reg(PAR1, eth_addr_local[1]);
-    write_reg(PAR2, eth_addr_local[2]);
-    write_reg(PAR3, eth_addr_local[3]);
-    write_reg(PAR4, eth_addr_local[4]);
-    write_reg(PAR5, eth_addr_local[5]);
+    for (i = 0; i < ETH_ADDR_SIZE; ++i)
+        write_reg(PAR_BASE + i, eth_addr_local[i]);
 
     // Restart RTL8019AS. 
     write_reg(CR, START);
@@ -318,9 +309,6 @@ void netdev_send_end()
  */
 byte netdev_recv_start()
 {
-    // Indicamos que no se leyó el paquete
-    persistent.next_pkt = 0;
-
     // Check if the rx buffer has overflowed.
     if (read_reg(ISR) & OVW)
     {
@@ -378,7 +366,6 @@ byte netdev_recv_start()
         // Check if last packet has been removed from rx buffer.
         if(bnry == current)
         {
-            print(0x0000);
             // Clear packet received interrupt flag.
             write_reg(ISR, PRX | RXE);
             return 0u;
@@ -401,30 +388,26 @@ byte netdev_recv_start()
         buf_hdr.next = read_reg(RDMA);
 
         // Indicamos cual es el próximo paquete para cuando termine
+        // FIXME poner más lindo para que consuma menos memoria
         persistent.next_pkt = buf_hdr.next - 1;
 
-        printb(bnry,         0x03);
-        printb(current,      0x07);
-        printb(buf_hdr.next, 0x0f);
-
         // Retrieve packet data length and subtract CRC bytes.
         buf_hdr.len = read_reg(RDMA) - sizeof(struct buf_hdr_t);
 
         // Si es muy grande, muy chico o hubo error, lo descartamos
         if ((buf_hdr.len < MIN_PACKET_LEN) || (buf_hdr.len > MAX_PACKET_LEN)
                 || ((buf_hdr.status & 0x0F) != RXSOK)
-                || (current = read_reg(RDMA))) // Parte alta del tamaño
+                || read_reg(RDMA)) // Parte alta del tamaño
         {
-            printb(buf_hdr.next,   0x1f);
-            printb(buf_hdr.status, 0x3f);
-            printb(buf_hdr.len,    0x7f);
-            printb(current,        0xff);
+            // Abort/ complete DMA operation.
+            ABORT_DMA(START);
+
+            // Advance boundary pointer to next packet start.
+            write_reg(BNRY, persistent.next_pkt);
+
             return 0;
         }
 
-        // Abort/ complete DMA operation.
-        ABORT_DMA(START);
-
         // Set remote DMA start address registers to packet data.
         write_reg(RSAR0, sizeof(struct buf_hdr_t));
         write_reg(RSAR1, bnry);
@@ -435,7 +418,7 @@ byte netdev_recv_start()
 
         // Initiate DMA transfer of packet data.
         write_reg(CR, READ);
-
+    
         return buf_hdr.len;
     }
     return 0;
@@ -464,10 +447,9 @@ uint16 netdev_recv_word()
 void netdev_recv_end()
 {
     // Abort/ complete DMA operation.
-    ABORT_DMA(STOP);
+    ABORT_DMA(START);
 
     // Advance boundary pointer to next packet start.
-    if (persistent.next_pkt)
-        write_reg(BNRY, persistent.next_pkt);
+    write_reg(BNRY, persistent.next_pkt);
 }