diff options
-rw-r--r-- | drivers/net/wireless/p54/p54spi.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/net/wireless/p54/p54spi.c b/drivers/net/wireless/p54/p54spi.c index f8af09610180..52023127cf37 100644 --- a/drivers/net/wireless/p54/p54spi.c +++ b/drivers/net/wireless/p54/p54spi.c | |||
@@ -395,7 +395,12 @@ static int p54spi_rx(struct p54s_priv *priv) | |||
395 | return 0; | 395 | return 0; |
396 | } | 396 | } |
397 | 397 | ||
398 | skb = dev_alloc_skb(len); | 398 | |
399 | /* Firmware may insert up to 4 padding bytes after the lmac header, | ||
400 | * but it does not amend the size of SPI data transfer. | ||
401 | * Such packets has correct data size in header, thus referencing | ||
402 | * past the end of allocated skb. Reserve extra 4 bytes for this case */ | ||
403 | skb = dev_alloc_skb(len + 4); | ||
399 | if (!skb) { | 404 | if (!skb) { |
400 | dev_err(&priv->spi->dev, "could not alloc skb"); | 405 | dev_err(&priv->spi->dev, "could not alloc skb"); |
401 | return 0; | 406 | return 0; |
@@ -403,6 +408,9 @@ static int p54spi_rx(struct p54s_priv *priv) | |||
403 | 408 | ||
404 | p54spi_spi_read(priv, SPI_ADRS_DMA_DATA, skb_put(skb, len), len); | 409 | p54spi_spi_read(priv, SPI_ADRS_DMA_DATA, skb_put(skb, len), len); |
405 | p54spi_sleep(priv); | 410 | p54spi_sleep(priv); |
411 | /* Put additional bytes to compensate for the possible | ||
412 | * alignment-caused truncation */ | ||
413 | skb_put(skb, 4); | ||
406 | 414 | ||
407 | if (p54_rx(priv->hw, skb) == 0) | 415 | if (p54_rx(priv->hw, skb) == 0) |
408 | dev_kfree_skb(skb); | 416 | dev_kfree_skb(skb); |