Commit 958d104e authored by Arnd Bergmann's avatar Arnd Bergmann Committed by David S. Miller

netcp: fix regression in receive processing

A cleanup patch I did was unfortunately wrong and introduced
multiple serious bugs in the netcp rx processing, as indicated
by these correct gcc warnings:

drivers/net/ethernet/ti/netcp_core.c:776:14: warning: 'buf_ptr' may be used uninitialized in this function [-Wuninitialized]
drivers/net/ethernet/ti/netcp_core.c:687:14: warning: 'ptr' may be used uninitialized in this function [-Wuninitialized]

I have checked the patch once more and found that a call to
get_pkt_info() accidentally got removed in netcp_free_rx_desc_chain,
and netcp_process_one_rx_packet no longer retrieved the correct
buffer length. This patch should fix all the known problems,
but I did not test on real hardware.
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Fixes: 89907779 ("netcp: try to reduce type confusion in descriptors")
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b70183db
...@@ -582,6 +582,7 @@ static void netcp_free_rx_desc_chain(struct netcp_intf *netcp, ...@@ -582,6 +582,7 @@ static void netcp_free_rx_desc_chain(struct netcp_intf *netcp,
unsigned int buf_len, dma_sz = sizeof(*ndesc); unsigned int buf_len, dma_sz = sizeof(*ndesc);
void *buf_ptr; void *buf_ptr;
u32 pad[2]; u32 pad[2];
u32 tmp;
get_words(&dma_desc, 1, &desc->next_desc); get_words(&dma_desc, 1, &desc->next_desc);
...@@ -591,6 +592,7 @@ static void netcp_free_rx_desc_chain(struct netcp_intf *netcp, ...@@ -591,6 +592,7 @@ static void netcp_free_rx_desc_chain(struct netcp_intf *netcp,
dev_err(netcp->ndev_dev, "failed to unmap Rx desc\n"); dev_err(netcp->ndev_dev, "failed to unmap Rx desc\n");
break; break;
} }
get_pkt_info(&dma_buf, &tmp, &dma_desc, ndesc);
get_pad_ptr(&buf_ptr, ndesc); get_pad_ptr(&buf_ptr, ndesc);
dma_unmap_page(netcp->dev, dma_buf, PAGE_SIZE, DMA_FROM_DEVICE); dma_unmap_page(netcp->dev, dma_buf, PAGE_SIZE, DMA_FROM_DEVICE);
__free_page(buf_ptr); __free_page(buf_ptr);
...@@ -637,6 +639,7 @@ static int netcp_process_one_rx_packet(struct netcp_intf *netcp) ...@@ -637,6 +639,7 @@ static int netcp_process_one_rx_packet(struct netcp_intf *netcp)
dma_addr_t dma_desc, dma_buff; dma_addr_t dma_desc, dma_buff;
struct netcp_packet p_info; struct netcp_packet p_info;
struct sk_buff *skb; struct sk_buff *skb;
u32 pad[2];
void *org_buf_ptr; void *org_buf_ptr;
dma_desc = knav_queue_pop(netcp->rx_queue, &dma_sz); dma_desc = knav_queue_pop(netcp->rx_queue, &dma_sz);
...@@ -650,7 +653,8 @@ static int netcp_process_one_rx_packet(struct netcp_intf *netcp) ...@@ -650,7 +653,8 @@ static int netcp_process_one_rx_packet(struct netcp_intf *netcp)
} }
get_pkt_info(&dma_buff, &buf_len, &dma_desc, desc); get_pkt_info(&dma_buff, &buf_len, &dma_desc, desc);
get_pad_ptr(&org_buf_ptr, desc); get_pad_info(&pad[0], &pad[1], &org_buf_len, desc);
org_buf_ptr = (void *)(uintptr_t)(pad[0] + ((u64)pad[1] << 32));
if (unlikely(!org_buf_ptr)) { if (unlikely(!org_buf_ptr)) {
dev_err(netcp->ndev_dev, "NULL bufptr in desc\n"); dev_err(netcp->ndev_dev, "NULL bufptr in desc\n");
...@@ -684,7 +688,7 @@ static int netcp_process_one_rx_packet(struct netcp_intf *netcp) ...@@ -684,7 +688,7 @@ static int netcp_process_one_rx_packet(struct netcp_intf *netcp)
} }
get_pkt_info(&dma_buff, &buf_len, &dma_desc, ndesc); get_pkt_info(&dma_buff, &buf_len, &dma_desc, ndesc);
get_pad_ptr(ptr, ndesc); get_pad_ptr(&ptr, ndesc);
page = ptr; page = ptr;
if (likely(dma_buff && buf_len && page)) { if (likely(dma_buff && buf_len && page)) {
...@@ -773,7 +777,7 @@ static void netcp_free_rx_buf(struct netcp_intf *netcp, int fdq) ...@@ -773,7 +777,7 @@ static void netcp_free_rx_buf(struct netcp_intf *netcp, int fdq)
} }
get_org_pkt_info(&dma, &buf_len, desc); get_org_pkt_info(&dma, &buf_len, desc);
get_pad_ptr(buf_ptr, desc); get_pad_ptr(&buf_ptr, desc);
if (unlikely(!dma)) { if (unlikely(!dma)) {
dev_err(netcp->ndev_dev, "NULL orig_buff in desc\n"); dev_err(netcp->ndev_dev, "NULL orig_buff in desc\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment