net: fec_mxc: Fix DM driver issue in recv
When using ethernet DM driver, the recv interface has a change with non-DM interface, that driver needs to set the packet pointer and provide it to upper layer to process. In fec driver, the fecmxc_recv functions does not handle the packet pointer parameter. This may cause crash in upper layer processing because the packet pointer is not set. This patch allocates a buffer for the packet pointer and free it through free_pkt interface. Signed-off-by: Ye Li <ye.li@nxp.com> Reviewed-by: Peng Fan <peng.fan@nxp.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
0a85f024c5
commit
07763ac928
@ -807,7 +807,16 @@ static int fec_recv(struct eth_device *dev)
|
||||
uint16_t bd_status;
|
||||
ulong addr, size, end;
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_DM_ETH
|
||||
*packetp = memalign(ARCH_DMA_MINALIGN, FEC_MAX_PKT_SIZE);
|
||||
if (*packetp == 0) {
|
||||
printf("%s: error allocating packetp\n", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
#else
|
||||
ALLOC_CACHE_ALIGN_BUFFER(uchar, buff, FEC_MAX_PKT_SIZE);
|
||||
#endif
|
||||
|
||||
/* Check if any critical events have happened */
|
||||
ievent = readl(&fec->eth->ievent);
|
||||
@ -883,8 +892,13 @@ static int fec_recv(struct eth_device *dev)
|
||||
#ifdef CONFIG_FEC_MXC_SWAP_PACKET
|
||||
swap_packet((uint32_t *)addr, frame_length);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DM_ETH
|
||||
memcpy(*packetp, (char *)addr, frame_length);
|
||||
#else
|
||||
memcpy(buff, (char *)addr, frame_length);
|
||||
net_process_received_packet(buff, frame_length);
|
||||
#endif
|
||||
len = frame_length;
|
||||
} else {
|
||||
if (bd_status & FEC_RBD_ERR)
|
||||
@ -1202,10 +1216,19 @@ static int fecmxc_read_rom_hwaddr(struct udevice *dev)
|
||||
return fec_get_hwaddr(priv->dev_id, pdata->enetaddr);
|
||||
}
|
||||
|
||||
static int fecmxc_free_pkt(struct udevice *dev, uchar *packet, int length)
|
||||
{
|
||||
if (packet)
|
||||
free(packet);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct eth_ops fecmxc_ops = {
|
||||
.start = fecmxc_init,
|
||||
.send = fecmxc_send,
|
||||
.recv = fecmxc_recv,
|
||||
.free_pkt = fecmxc_free_pkt,
|
||||
.stop = fecmxc_halt,
|
||||
.write_hwaddr = fecmxc_set_hwaddr,
|
||||
.read_rom_hwaddr = fecmxc_read_rom_hwaddr,
|
||||
|
Loading…
Reference in New Issue
Block a user