mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +00:00
stmmac: fix automatic PAD/FCS stripping
For Simple Ethernet frames (802.2 and 802.3) the GMAC Core never strips pad and fcs. This means the ACS has no effect on IPv4/6 frames. The FL bits, in the RDES0, include the FCS so the driver has to remove it in SW. For 802.3 frame format with LLC or LLC-SNAP, when set the ACS bit, the HW strips both PAD and FCS. The FL bits, in the RDES0, actually represents the frame length already stripped. This patch fixes this logic within the device driver that erroneously removed 4byte from 802.3 frames already stripped corrupting the payload. Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ca09c97601
commit
3eeb29972b
@ -108,6 +108,7 @@ enum rx_frame_status { /* IPC status */
|
||||
good_frame = 0,
|
||||
discard_frame = 1,
|
||||
csum_none = 2,
|
||||
llc_snap = 4,
|
||||
};
|
||||
|
||||
enum tx_dma_irq_status {
|
||||
|
@ -93,7 +93,7 @@ enum inter_frame_gap {
|
||||
#define GMAC_CONTROL_IPC 0x00000400 /* Checksum Offload */
|
||||
#define GMAC_CONTROL_DR 0x00000200 /* Disable Retry */
|
||||
#define GMAC_CONTROL_LUD 0x00000100 /* Link up/down */
|
||||
#define GMAC_CONTROL_ACS 0x00000080 /* Automatic Pad Stripping */
|
||||
#define GMAC_CONTROL_ACS 0x00000080 /* Automatic Pad/FCS Stripping */
|
||||
#define GMAC_CONTROL_DC 0x00000010 /* Deferral Check */
|
||||
#define GMAC_CONTROL_TE 0x00000008 /* Transmitter Enable */
|
||||
#define GMAC_CONTROL_RE 0x00000004 /* Receiver Enable */
|
||||
|
@ -123,7 +123,7 @@ static int enh_desc_coe_rdes0(int ipc_err, int type, int payload_err)
|
||||
*/
|
||||
if (status == 0x0) {
|
||||
CHIP_DBG(KERN_INFO "RX Des0 status: IEEE 802.3 Type frame.\n");
|
||||
ret = good_frame;
|
||||
ret = llc_snap;
|
||||
} else if (status == 0x4) {
|
||||
CHIP_DBG(KERN_INFO "RX Des0 status: IPv4/6 No CSUM errorS.\n");
|
||||
ret = good_frame;
|
||||
|
@ -1216,9 +1216,13 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
|
||||
priv->dev->stats.rx_errors++;
|
||||
else {
|
||||
struct sk_buff *skb;
|
||||
/* Length should omit the CRC */
|
||||
int frame_len = priv->hw->desc->get_rx_frame_len(p) - 4;
|
||||
int frame_len;
|
||||
|
||||
frame_len = priv->hw->desc->get_rx_frame_len(p);
|
||||
/* ACS is set; GMAC core strips PAD/FCS for IEEE 802.3
|
||||
* Type frames (LLC/LLC-SNAP) */
|
||||
if (unlikely(status != llc_snap))
|
||||
frame_len -= ETH_FCS_LEN;
|
||||
#ifdef STMMAC_RX_DEBUG
|
||||
if (frame_len > ETH_FRAME_LEN)
|
||||
pr_debug("\tRX frame size %d, COE status: %d\n",
|
||||
|
Loading…
Reference in New Issue
Block a user