* [PATCH net v3 1/2] net: ethoc: Fix early error paths
2016-07-12 23:04 [PATCH net v3 0/2] net: ethoc: Error path and transmit fixes Florian Fainelli
@ 2016-07-12 23:04 ` Florian Fainelli
2016-07-12 23:04 ` [PATCH net v3 2/2] net: ethoc: Correctly pad short packets Florian Fainelli
2016-07-13 6:13 ` [PATCH net v3 0/2] net: ethoc: Error path and transmit fixes David Miller
2 siblings, 0 replies; 4+ messages in thread
From: Florian Fainelli @ 2016-07-12 23:04 UTC (permalink / raw)
To: netdev
Cc: davem, jcmvbkbc, colin.king, tklauser, thierry.reding, andrew,
Florian Fainelli
In case any operation fails before we can successfully go the point
where we would register a MDIO bus, we would be going to an error label
which involves unregistering then freeing this yet to be created MDIO
bus. Update all error paths to go to label free which is the only one
valid until either the clock is enabled, or the MDIO bus is allocated
and registered. This fixes kernel oops observed while trying to
dereference the MDIO bus structure which is not yet allocated.
Fixes: a1702857724f ("net: Add support for the OpenCores 10/100 Mbps Ethernet MAC.")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/net/ethernet/ethoc.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/ethoc.c b/drivers/net/ethernet/ethoc.c
index 4edb98c3c6c7..06ae14a8e946 100644
--- a/drivers/net/ethernet/ethoc.c
+++ b/drivers/net/ethernet/ethoc.c
@@ -1086,7 +1086,7 @@ static int ethoc_probe(struct platform_device *pdev)
if (!priv->iobase) {
dev_err(&pdev->dev, "cannot remap I/O memory space\n");
ret = -ENXIO;
- goto error;
+ goto free;
}
if (netdev->mem_end) {
@@ -1095,7 +1095,7 @@ static int ethoc_probe(struct platform_device *pdev)
if (!priv->membase) {
dev_err(&pdev->dev, "cannot remap memory space\n");
ret = -ENXIO;
- goto error;
+ goto free;
}
} else {
/* Allocate buffer memory */
@@ -1106,7 +1106,7 @@ static int ethoc_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "cannot allocate %dB buffer\n",
buffer_size);
ret = -ENOMEM;
- goto error;
+ goto free;
}
netdev->mem_end = netdev->mem_start + buffer_size;
priv->dma_alloc = buffer_size;
@@ -1120,7 +1120,7 @@ static int ethoc_probe(struct platform_device *pdev)
128, (netdev->mem_end - netdev->mem_start + 1) / ETHOC_BUFSIZ);
if (num_bd < 4) {
ret = -ENODEV;
- goto error;
+ goto free;
}
priv->num_bd = num_bd;
/* num_tx must be a power of two */
@@ -1133,7 +1133,7 @@ static int ethoc_probe(struct platform_device *pdev)
priv->vma = devm_kzalloc(&pdev->dev, num_bd*sizeof(void *), GFP_KERNEL);
if (!priv->vma) {
ret = -ENOMEM;
- goto error;
+ goto free;
}
/* Allow the platform setup code to pass in a MAC address. */
--
2.7.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH net v3 2/2] net: ethoc: Correctly pad short packets
2016-07-12 23:04 [PATCH net v3 0/2] net: ethoc: Error path and transmit fixes Florian Fainelli
2016-07-12 23:04 ` [PATCH net v3 1/2] net: ethoc: Fix early error paths Florian Fainelli
@ 2016-07-12 23:04 ` Florian Fainelli
2016-07-13 6:13 ` [PATCH net v3 0/2] net: ethoc: Error path and transmit fixes David Miller
2 siblings, 0 replies; 4+ messages in thread
From: Florian Fainelli @ 2016-07-12 23:04 UTC (permalink / raw)
To: netdev
Cc: davem, jcmvbkbc, colin.king, tklauser, thierry.reding, andrew,
Florian Fainelli
Even though the hardware can be doing zero padding, we want the SKB to
be going out on the wire with the appropriate size. This fixes packet
truncations observed with e.g: ARP packets.
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
drivers/net/ethernet/ethoc.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/net/ethernet/ethoc.c b/drivers/net/ethernet/ethoc.c
index 06ae14a8e946..4466a1187110 100644
--- a/drivers/net/ethernet/ethoc.c
+++ b/drivers/net/ethernet/ethoc.c
@@ -860,6 +860,11 @@ static netdev_tx_t ethoc_start_xmit(struct sk_buff *skb, struct net_device *dev)
unsigned int entry;
void *dest;
+ if (skb_put_padto(skb, ETHOC_ZLEN)) {
+ dev->stats.tx_errors++;
+ goto out_no_free;
+ }
+
if (unlikely(skb->len > ETHOC_BUFSIZ)) {
dev->stats.tx_errors++;
goto out;
@@ -894,6 +899,7 @@ static netdev_tx_t ethoc_start_xmit(struct sk_buff *skb, struct net_device *dev)
skb_tx_timestamp(skb);
out:
dev_kfree_skb(skb);
+out_no_free:
return NETDEV_TX_OK;
}
--
2.7.4
^ permalink raw reply related [flat|nested] 4+ messages in thread