int fec512x_miiphy_write(char *devname, uint8 phyAddr, uint8 regAddr, uint16 data);
 int mpc512x_fec_init_phy(struct eth_device *dev, bd_t * bis);
 
+static uchar rx_buff[FEC_MAX_PKT_SIZE];
+static int rx_buff_idx = 0;
+
 /********************************************************************/
 #if (DEBUG & 0x2)
 static void mpc512x_fec_phydump (char *devname)
        fec->eth->op_pause = 0x00010020;
 
        /* Frame length=1518; MII mode */
-       fec->eth->r_cntrl = 0x05ee000c;
+       fec->eth->r_cntrl = 0x05ee0024;
 
        /* Half-duplex, heartbeat disabled */
        fec->eth->x_cntrl = 0x00000000;
        mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
        volatile FEC_RBD *pRbd = &fec->bdBase->rbd[fec->rbdIndex];
        unsigned long ievent;
-       int frame_length, len = 0;
-       uchar buff[FEC_MAX_PKT_SIZE];
+       int frame_length = 0;
 
 #if (DEBUG & 0x1)
        printf ("mpc512x_fec_recv %d Start...\n", fec->rbdIndex);
        }
 
        if (!(pRbd->status & FEC_RBD_EMPTY)) {
-               if ((pRbd->status & FEC_RBD_LAST) &&
-                       !(pRbd->status & FEC_RBD_ERR) &&
+               if (!(pRbd->status & FEC_RBD_ERR) &&
                        ((pRbd->dataLength - 4) > 14)) {
 
                        /*
                         * Get buffer size
                         */
-                       frame_length = pRbd->dataLength - 4;
-
+                       if (pRbd->status & FEC_RBD_LAST)
+                               frame_length = pRbd->dataLength - 4;
+                       else
+                               frame_length = pRbd->dataLength;
 #if (DEBUG & 0x20)
                        {
                                int i;
-                               printf ("recv data hdr:");
+                               printf ("recv data length 0x%08x data hdr: ",
+                                       pRbd->dataLength);
                                for (i = 0; i < 14; i++)
                                        printf ("%x ", *((uint8*)pRbd->dataPointer + i));
                                printf("\n");
                        }
 #endif
-
                        /*
                         *  Fill the buffer and pass it to upper layers
                         */
-                       memcpy (buff, (void*)pRbd->dataPointer, frame_length);
-                       NetReceive ((uchar*)buff, frame_length);
-                       len = frame_length;
+                       memcpy (&rx_buff[rx_buff_idx], (void*)pRbd->dataPointer,
+                               frame_length - rx_buff_idx);
+                       rx_buff_idx = frame_length;
+
+                       if (pRbd->status & FEC_RBD_LAST) {
+                               NetReceive ((uchar*)rx_buff, frame_length);
+                               rx_buff_idx = 0;
+                       }
                }
 
                /*
 
        /* Try to fill Buffer Descriptors */
        fec->eth->r_des_active = 0x01000000;    /* Descriptor polling active */
-       return len;
+       return frame_length;
 }
 
 /********************************************************************/