Changeset 33498


Ignore:
Timestamp:
2012-09-20T22:27:18+02:00 (5 years ago)
Author:
nbd
Message:

cns3xxx: fix ethernet packet alignment issues (hw has an alignment requirement of 64), fix skb fragment chaining

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/cns3xxx/patches-3.3/410-ethernet_fix_jumbo_frame.patch

    r33491 r33498  
    11--- a/drivers/net/ethernet/cavium/cns3xxx_eth.c 
    22+++ b/drivers/net/ethernet/cavium/cns3xxx_eth.c 
    3 @@ -26,15 +26,18 @@ 
     3@@ -26,15 +26,21 @@ 
    44  
    55 #define DRV_NAME "cns3xxx_eth" 
     
    1717-#define CNS3XXX_MAX_MTU (1536) 
    1818+ 
    19 +#define SKB_HEAD_ALIGN (((PAGE_SIZE - NET_SKB_PAD) % SMP_CACHE_BYTES) + NET_SKB_PAD + NET_IP_ALIGN) 
     19+#define RX_BUFFER_ALIGN 64 
     20+#define RX_BUFFER_ALIGN_MASK (~(RX_BUFFER_ALIGN - 1)) 
     21+ 
     22+#define SKB_HEAD_ALIGN (((PAGE_SIZE - NET_SKB_PAD) % RX_BUFFER_ALIGN) + NET_SKB_PAD + NET_IP_ALIGN) 
    2023+#define RX_SEGMENT_ALLOC_SIZE 4096 
    2124+#define RX_SEGMENT_BUFSIZE (SKB_WITH_OVERHEAD(RX_SEGMENT_ALLOC_SIZE)) 
    22 +#define RX_SEGMENT_MRU ((RX_SEGMENT_BUFSIZE - SKB_HEAD_ALIGN)) 
     25+#define RX_SEGMENT_MRU (((RX_SEGMENT_BUFSIZE - SKB_HEAD_ALIGN) & RX_BUFFER_ALIGN_MASK) - NET_IP_ALIGN) 
    2326+#define MAX_MTU        9500 
    2427  
    2528 #define NAPI_WEIGHT 64 
    2629  
    27 @@ -266,7 +269,7 @@ struct _rx_ring { 
     30@@ -266,7 +272,7 @@ struct _rx_ring { 
    2831        struct rx_desc *desc; 
    2932        dma_addr_t phys_addr; 
     
    3437        u32 cur_index; 
    3538        u32 alloc_index; 
    36 @@ -280,6 +283,8 @@ struct sw { 
     39@@ -280,6 +286,8 @@ struct sw { 
    3740        struct cns3xxx_plat_info *plat; 
    3841        struct _tx_ring *tx_ring; 
     
    4346  
    4447 struct port { 
    45 @@ -500,37 +505,35 @@ static void cns3xxx_alloc_rx_buf(struct  
     48@@ -500,37 +508,35 @@ static void cns3xxx_alloc_rx_buf(struct  
    4649        struct _rx_ring *rx_ring = sw->rx_ring; 
    4750        unsigned int i = rx_ring->alloc_index; 
     
    97100                        desc++; 
    98101                } 
    99 @@ -588,49 +591,78 @@ static int eth_poll(struct napi_struct * 
     102@@ -588,49 +594,79 @@ static int eth_poll(struct napi_struct * 
    100103  
    101104        while (desc->cown) { 
     
    140143+                       if (sw->frag_first == sw->frag_last) 
    141144+                               skb_frag_add_head(sw->frag_first, skb); 
    142 +                       sw->frag_last->next = skb; 
     145+                       else 
     146+                               sw->frag_last->next = skb; 
    143147+                       sw->frag_first->len += skb->len; 
    144148+                       sw->frag_first->data_len += skb->len; 
     
    202206                        i = 0; 
    203207                        desc = &(rx_ring)->desc[i]; 
    204 @@ -671,12 +703,6 @@ static int eth_xmit(struct sk_buff *skb, 
     208@@ -671,12 +707,6 @@ static int eth_xmit(struct sk_buff *skb, 
    205209        if (pmap == 8) 
    206210                pmap = (1 << 4); 
     
    215219  
    216220        if ((tx_ring->num_used + nr_frags) >= TX_DESCS) { 
    217 @@ -701,8 +727,7 @@ static int eth_xmit(struct sk_buff *skb, 
     221@@ -701,8 +731,7 @@ static int eth_xmit(struct sk_buff *skb, 
    218222  
    219223                len = skb->len; 
     
    225229                tx_desc->sdp = phys; 
    226230                tx_desc->pmap = pmap; 
    227 @@ -849,24 +874,24 @@ static int init_rings(struct sw *sw) 
     231@@ -849,24 +878,24 @@ static int init_rings(struct sw *sw) 
    228232        /* Setup RX buffers */ 
    229233        for (i = 0; i < RX_DESCS; i++) { 
     
    261265                desc->cown = 0; 
    262266        } 
    263 @@ -905,12 +930,13 @@ static void destroy_rings(struct sw *sw) 
     267@@ -905,12 +934,13 @@ static void destroy_rings(struct sw *sw) 
    264268                        struct _rx_ring *rx_ring = sw->rx_ring; 
    265269                        struct rx_desc *desc = &(rx_ring)->desc[i]; 
     
    281285                dma_pool_free(rx_dma_pool, sw->rx_ring->desc, sw->rx_ring->phys_addr); 
    282286                dma_pool_destroy(rx_dma_pool); 
    283 @@ -1085,13 +1111,22 @@ static int eth_set_mac(struct net_device 
     287@@ -1085,13 +1115,22 @@ static int eth_set_mac(struct net_device 
    284288        return 0; 
    285289 } 
     
    305309        .ndo_validate_addr = eth_validate_addr, 
    306310 }; 
    307 @@ -1124,6 +1159,10 @@ static int __devinit eth_init_one(struct 
     311@@ -1124,6 +1163,10 @@ static int __devinit eth_init_one(struct 
    308312                goto err_free; 
    309313        } 
Note: See TracChangeset for help on using the changeset viewer.