Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/ethernet/broadcom/genet/bcmmii.c drivers/net/hyperv/netvsc.c kernel/bpf/hashtab.c Almost entirely overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -984,29 +984,29 @@
|
||||
#define XP_ECC_CNT1_DESC_DED_WIDTH 8
|
||||
#define XP_ECC_CNT1_DESC_SEC_INDEX 0
|
||||
#define XP_ECC_CNT1_DESC_SEC_WIDTH 8
|
||||
#define XP_ECC_IER_DESC_DED_INDEX 0
|
||||
#define XP_ECC_IER_DESC_DED_INDEX 5
|
||||
#define XP_ECC_IER_DESC_DED_WIDTH 1
|
||||
#define XP_ECC_IER_DESC_SEC_INDEX 1
|
||||
#define XP_ECC_IER_DESC_SEC_INDEX 4
|
||||
#define XP_ECC_IER_DESC_SEC_WIDTH 1
|
||||
#define XP_ECC_IER_RX_DED_INDEX 2
|
||||
#define XP_ECC_IER_RX_DED_INDEX 3
|
||||
#define XP_ECC_IER_RX_DED_WIDTH 1
|
||||
#define XP_ECC_IER_RX_SEC_INDEX 3
|
||||
#define XP_ECC_IER_RX_SEC_INDEX 2
|
||||
#define XP_ECC_IER_RX_SEC_WIDTH 1
|
||||
#define XP_ECC_IER_TX_DED_INDEX 4
|
||||
#define XP_ECC_IER_TX_DED_INDEX 1
|
||||
#define XP_ECC_IER_TX_DED_WIDTH 1
|
||||
#define XP_ECC_IER_TX_SEC_INDEX 5
|
||||
#define XP_ECC_IER_TX_SEC_INDEX 0
|
||||
#define XP_ECC_IER_TX_SEC_WIDTH 1
|
||||
#define XP_ECC_ISR_DESC_DED_INDEX 0
|
||||
#define XP_ECC_ISR_DESC_DED_INDEX 5
|
||||
#define XP_ECC_ISR_DESC_DED_WIDTH 1
|
||||
#define XP_ECC_ISR_DESC_SEC_INDEX 1
|
||||
#define XP_ECC_ISR_DESC_SEC_INDEX 4
|
||||
#define XP_ECC_ISR_DESC_SEC_WIDTH 1
|
||||
#define XP_ECC_ISR_RX_DED_INDEX 2
|
||||
#define XP_ECC_ISR_RX_DED_INDEX 3
|
||||
#define XP_ECC_ISR_RX_DED_WIDTH 1
|
||||
#define XP_ECC_ISR_RX_SEC_INDEX 3
|
||||
#define XP_ECC_ISR_RX_SEC_INDEX 2
|
||||
#define XP_ECC_ISR_RX_SEC_WIDTH 1
|
||||
#define XP_ECC_ISR_TX_DED_INDEX 4
|
||||
#define XP_ECC_ISR_TX_DED_INDEX 1
|
||||
#define XP_ECC_ISR_TX_DED_WIDTH 1
|
||||
#define XP_ECC_ISR_TX_SEC_INDEX 5
|
||||
#define XP_ECC_ISR_TX_SEC_INDEX 0
|
||||
#define XP_ECC_ISR_TX_SEC_WIDTH 1
|
||||
#define XP_I2C_MUTEX_BUSY_INDEX 31
|
||||
#define XP_I2C_MUTEX_BUSY_WIDTH 1
|
||||
@@ -1148,8 +1148,8 @@
|
||||
#define RX_PACKET_ATTRIBUTES_CSUM_DONE_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_VLAN_CTAG_INDEX 1
|
||||
#define RX_PACKET_ATTRIBUTES_VLAN_CTAG_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_INCOMPLETE_INDEX 2
|
||||
#define RX_PACKET_ATTRIBUTES_INCOMPLETE_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_LAST_INDEX 2
|
||||
#define RX_PACKET_ATTRIBUTES_LAST_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_INDEX 3
|
||||
#define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_CONTEXT_INDEX 4
|
||||
@@ -1158,6 +1158,8 @@
|
||||
#define RX_PACKET_ATTRIBUTES_RX_TSTAMP_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_RSS_HASH_INDEX 6
|
||||
#define RX_PACKET_ATTRIBUTES_RSS_HASH_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_FIRST_INDEX 7
|
||||
#define RX_PACKET_ATTRIBUTES_FIRST_WIDTH 1
|
||||
|
||||
#define RX_NORMAL_DESC0_OVT_INDEX 0
|
||||
#define RX_NORMAL_DESC0_OVT_WIDTH 16
|
||||
|
@@ -1896,10 +1896,15 @@ static int xgbe_dev_read(struct xgbe_channel *channel)
|
||||
|
||||
/* Get the header length */
|
||||
if (XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, FD)) {
|
||||
XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
|
||||
FIRST, 1);
|
||||
rdata->rx.hdr_len = XGMAC_GET_BITS_LE(rdesc->desc2,
|
||||
RX_NORMAL_DESC2, HL);
|
||||
if (rdata->rx.hdr_len)
|
||||
pdata->ext_stats.rx_split_header_packets++;
|
||||
} else {
|
||||
XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
|
||||
FIRST, 0);
|
||||
}
|
||||
|
||||
/* Get the RSS hash */
|
||||
@@ -1922,19 +1927,16 @@ static int xgbe_dev_read(struct xgbe_channel *channel)
|
||||
}
|
||||
}
|
||||
|
||||
/* Get the packet length */
|
||||
rdata->rx.len = XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, PL);
|
||||
|
||||
if (!XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, LD)) {
|
||||
/* Not all the data has been transferred for this packet */
|
||||
XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
|
||||
INCOMPLETE, 1);
|
||||
/* Not all the data has been transferred for this packet */
|
||||
if (!XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, LD))
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This is the last of the data for this packet */
|
||||
XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
|
||||
INCOMPLETE, 0);
|
||||
LAST, 1);
|
||||
|
||||
/* Get the packet length */
|
||||
rdata->rx.len = XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, PL);
|
||||
|
||||
/* Set checksum done indicator as appropriate */
|
||||
if (netdev->features & NETIF_F_RXCSUM)
|
||||
|
@@ -1972,13 +1972,12 @@ static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata,
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
u8 *packet;
|
||||
unsigned int copy_len;
|
||||
|
||||
skb = napi_alloc_skb(napi, rdata->rx.hdr.dma_len);
|
||||
if (!skb)
|
||||
return NULL;
|
||||
|
||||
/* Start with the header buffer which may contain just the header
|
||||
/* Pull in the header buffer which may contain just the header
|
||||
* or the header plus data
|
||||
*/
|
||||
dma_sync_single_range_for_cpu(pdata->dev, rdata->rx.hdr.dma_base,
|
||||
@@ -1987,30 +1986,49 @@ static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata,
|
||||
|
||||
packet = page_address(rdata->rx.hdr.pa.pages) +
|
||||
rdata->rx.hdr.pa.pages_offset;
|
||||
copy_len = (rdata->rx.hdr_len) ? rdata->rx.hdr_len : len;
|
||||
copy_len = min(rdata->rx.hdr.dma_len, copy_len);
|
||||
skb_copy_to_linear_data(skb, packet, copy_len);
|
||||
skb_put(skb, copy_len);
|
||||
|
||||
len -= copy_len;
|
||||
if (len) {
|
||||
/* Add the remaining data as a frag */
|
||||
dma_sync_single_range_for_cpu(pdata->dev,
|
||||
rdata->rx.buf.dma_base,
|
||||
rdata->rx.buf.dma_off,
|
||||
rdata->rx.buf.dma_len,
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
||||
rdata->rx.buf.pa.pages,
|
||||
rdata->rx.buf.pa.pages_offset,
|
||||
len, rdata->rx.buf.dma_len);
|
||||
rdata->rx.buf.pa.pages = NULL;
|
||||
}
|
||||
skb_copy_to_linear_data(skb, packet, len);
|
||||
skb_put(skb, len);
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
static unsigned int xgbe_rx_buf1_len(struct xgbe_ring_data *rdata,
|
||||
struct xgbe_packet_data *packet)
|
||||
{
|
||||
/* Always zero if not the first descriptor */
|
||||
if (!XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, FIRST))
|
||||
return 0;
|
||||
|
||||
/* First descriptor with split header, return header length */
|
||||
if (rdata->rx.hdr_len)
|
||||
return rdata->rx.hdr_len;
|
||||
|
||||
/* First descriptor but not the last descriptor and no split header,
|
||||
* so the full buffer was used
|
||||
*/
|
||||
if (!XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, LAST))
|
||||
return rdata->rx.hdr.dma_len;
|
||||
|
||||
/* First descriptor and last descriptor and no split header, so
|
||||
* calculate how much of the buffer was used
|
||||
*/
|
||||
return min_t(unsigned int, rdata->rx.hdr.dma_len, rdata->rx.len);
|
||||
}
|
||||
|
||||
static unsigned int xgbe_rx_buf2_len(struct xgbe_ring_data *rdata,
|
||||
struct xgbe_packet_data *packet,
|
||||
unsigned int len)
|
||||
{
|
||||
/* Always the full buffer if not the last descriptor */
|
||||
if (!XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, LAST))
|
||||
return rdata->rx.buf.dma_len;
|
||||
|
||||
/* Last descriptor so calculate how much of the buffer was used
|
||||
* for the last bit of data
|
||||
*/
|
||||
return rdata->rx.len - len;
|
||||
}
|
||||
|
||||
static int xgbe_tx_poll(struct xgbe_channel *channel)
|
||||
{
|
||||
struct xgbe_prv_data *pdata = channel->pdata;
|
||||
@@ -2093,8 +2111,8 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
|
||||
struct napi_struct *napi;
|
||||
struct sk_buff *skb;
|
||||
struct skb_shared_hwtstamps *hwtstamps;
|
||||
unsigned int incomplete, error, context_next, context;
|
||||
unsigned int len, rdesc_len, max_len;
|
||||
unsigned int last, error, context_next, context;
|
||||
unsigned int len, buf1_len, buf2_len, max_len;
|
||||
unsigned int received = 0;
|
||||
int packet_count = 0;
|
||||
|
||||
@@ -2104,7 +2122,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
|
||||
if (!ring)
|
||||
return 0;
|
||||
|
||||
incomplete = 0;
|
||||
last = 0;
|
||||
context_next = 0;
|
||||
|
||||
napi = (pdata->per_channel_irq) ? &channel->napi : &pdata->napi;
|
||||
@@ -2138,9 +2156,8 @@ read_again:
|
||||
received++;
|
||||
ring->cur++;
|
||||
|
||||
incomplete = XGMAC_GET_BITS(packet->attributes,
|
||||
RX_PACKET_ATTRIBUTES,
|
||||
INCOMPLETE);
|
||||
last = XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
|
||||
LAST);
|
||||
context_next = XGMAC_GET_BITS(packet->attributes,
|
||||
RX_PACKET_ATTRIBUTES,
|
||||
CONTEXT_NEXT);
|
||||
@@ -2149,7 +2166,7 @@ read_again:
|
||||
CONTEXT);
|
||||
|
||||
/* Earlier error, just drain the remaining data */
|
||||
if ((incomplete || context_next) && error)
|
||||
if ((!last || context_next) && error)
|
||||
goto read_again;
|
||||
|
||||
if (error || packet->errors) {
|
||||
@@ -2161,16 +2178,22 @@ read_again:
|
||||
}
|
||||
|
||||
if (!context) {
|
||||
/* Length is cumulative, get this descriptor's length */
|
||||
rdesc_len = rdata->rx.len - len;
|
||||
len += rdesc_len;
|
||||
/* Get the data length in the descriptor buffers */
|
||||
buf1_len = xgbe_rx_buf1_len(rdata, packet);
|
||||
len += buf1_len;
|
||||
buf2_len = xgbe_rx_buf2_len(rdata, packet, len);
|
||||
len += buf2_len;
|
||||
|
||||
if (rdesc_len && !skb) {
|
||||
if (!skb) {
|
||||
skb = xgbe_create_skb(pdata, napi, rdata,
|
||||
rdesc_len);
|
||||
if (!skb)
|
||||
buf1_len);
|
||||
if (!skb) {
|
||||
error = 1;
|
||||
} else if (rdesc_len) {
|
||||
goto skip_data;
|
||||
}
|
||||
}
|
||||
|
||||
if (buf2_len) {
|
||||
dma_sync_single_range_for_cpu(pdata->dev,
|
||||
rdata->rx.buf.dma_base,
|
||||
rdata->rx.buf.dma_off,
|
||||
@@ -2180,13 +2203,14 @@ read_again:
|
||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
||||
rdata->rx.buf.pa.pages,
|
||||
rdata->rx.buf.pa.pages_offset,
|
||||
rdesc_len,
|
||||
buf2_len,
|
||||
rdata->rx.buf.dma_len);
|
||||
rdata->rx.buf.pa.pages = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (incomplete || context_next)
|
||||
skip_data:
|
||||
if (!last || context_next)
|
||||
goto read_again;
|
||||
|
||||
if (!skb)
|
||||
@@ -2244,7 +2268,7 @@ next_packet:
|
||||
}
|
||||
|
||||
/* Check if we need to save state before leaving */
|
||||
if (received && (incomplete || context_next)) {
|
||||
if (received && (!last || context_next)) {
|
||||
rdata = XGBE_GET_DESC_DATA(ring, ring->cur);
|
||||
rdata->state_saved = 1;
|
||||
rdata->state.skb = skb;
|
||||
|
Reference in New Issue
Block a user