diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h index d291d1cbe041f615e18bb33c44946eb880ff0b6b..05a24055ac2f75cb0cb3913b8afaed287856d29d 100644 --- a/drivers/net/ixgbe/ixgbe.h +++ b/drivers/net/ixgbe/ixgbe.h @@ -75,6 +75,8 @@ #define IXGBE_RXBUFFER_128 128 /* Used for packet split */ #define IXGBE_RXBUFFER_256 256 /* Used for packet split */ #define IXGBE_RXBUFFER_2048 2048 +#define IXGBE_RXBUFFER_4096 4096 +#define IXGBE_RXBUFFER_8192 8192 #define IXGBE_MAX_RXBUFFER 16384 /* largest size for a single descriptor */ #define IXGBE_RX_HDR_SIZE IXGBE_RXBUFFER_256 diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index b53f265011730e5b7e480448732c4440567c2cd1..4ab17ab7fbce22ee93587213acff888a8ba450a5 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c @@ -1995,21 +1995,28 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(j)); rscctrl |= IXGBE_RSCCTL_RSCEN; /* - * if packet split is enabled we can only support up - * to max frags + 1 descriptors. + * we must limit the number of descriptors so that the + * total size of max desc * buf_len is not greater + * than 65535 */ - if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) -#if (MAX_SKB_FRAGS < 3) - rscctrl |= IXGBE_RSCCTL_MAXDESC_1; -#elif (MAX_SKB_FRAGS < 7) - rscctrl |= IXGBE_RSCCTL_MAXDESC_4; -#elif (MAX_SKB_FRAGS < 15) + if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) { +#if (MAX_SKB_FRAGS > 16) + rscctrl |= IXGBE_RSCCTL_MAXDESC_16; +#elif (MAX_SKB_FRAGS > 8) rscctrl |= IXGBE_RSCCTL_MAXDESC_8; +#elif (MAX_SKB_FRAGS > 4) + rscctrl |= IXGBE_RSCCTL_MAXDESC_4; #else - rscctrl |= IXGBE_RSCCTL_MAXDESC_16; + rscctrl |= IXGBE_RSCCTL_MAXDESC_1; #endif - else - rscctrl |= IXGBE_RSCCTL_MAXDESC_16; + } else { + if (rx_buf_len < IXGBE_RXBUFFER_4096) + rscctrl |= IXGBE_RSCCTL_MAXDESC_16; + else if (rx_buf_len < IXGBE_RXBUFFER_8192) + rscctrl |= IXGBE_RSCCTL_MAXDESC_8; + else + rscctrl |= IXGBE_RSCCTL_MAXDESC_4; + } IXGBE_WRITE_REG(hw, IXGBE_RSCCTL(j), rscctrl); } /* Disable RSC for ACK packets */