Changeset 35621


Ignore:
Timestamp:
2013-02-16T15:38:17+01:00 (5 years ago)
Author:
hauke
Message:

brcm47xx: bgmac: fix unaligned accesses to network headers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/brcm47xx/patches-3.6/760-bgmac-fixes.patch

    r35574 r35621  
    11--- a/drivers/net/ethernet/broadcom/bgmac.c 
    22+++ b/drivers/net/ethernet/broadcom/bgmac.c 
    3 @@ -761,6 +761,26 @@ static void bgmac_cmdcfg_maskset(struct 
     3@@ -301,8 +301,9 @@ static int bgmac_dma_rx_read(struct bgma 
     4                        bgmac_err(bgmac, "Found poisoned packet at slot %d, DMA issue!\n", 
     5                                  ring->start); 
     6                } else { 
     7-                       new_skb = netdev_alloc_skb(bgmac->net_dev, len); 
     8+                       new_skb = netdev_alloc_skb(bgmac->net_dev, len + 2); 
     9                        if (new_skb) { 
     10+                               skb_reserve(new_skb, 2); 
     11                                skb_put(new_skb, len); 
     12                                skb_copy_from_linear_data_offset(skb, BGMAC_RX_FRAME_OFFSET, 
     13                                                                 new_skb->data, 
     14@@ -535,7 +536,7 @@ static void bgmac_dma_init(struct bgmac 
     15  * PHY ops 
     16  **************************************************/ 
     17  
     18-u16 bgmac_phy_read(struct bgmac *bgmac, u8 phyaddr, u8 reg) 
     19+static u16 bgmac_phy_read(struct bgmac *bgmac, u8 phyaddr, u8 reg) 
     20 { 
     21        struct bcma_device *core; 
     22        u16 phy_access_addr; 
     23@@ -584,7 +585,7 @@ u16 bgmac_phy_read(struct bgmac *bgmac, 
     24 } 
     25  
     26 /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphywr */ 
     27-void bgmac_phy_write(struct bgmac *bgmac, u8 phyaddr, u8 reg, u16 value) 
     28+static int bgmac_phy_write(struct bgmac *bgmac, u8 phyaddr, u8 reg, u16 value) 
     29 { 
     30        struct bcma_device *core; 
     31        u16 phy_access_addr; 
     32@@ -617,9 +618,13 @@ void bgmac_phy_write(struct bgmac *bgmac 
     33        tmp |= value; 
     34        bcma_write32(core, phy_access_addr, tmp); 
     35  
     36-       if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000)) 
     37+       if (!bgmac_wait_value(core, phy_access_addr, BGMAC_PA_START, 0, 1000)) { 
     38                bgmac_err(bgmac, "Writing to PHY %d register 0x%X failed\n", 
     39                          phyaddr, reg); 
     40+               return -ETIMEDOUT; 
     41+       } 
     42+ 
     43+       return 0; 
     44 } 
     45  
     46 /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipphyforce */ 
     47@@ -761,6 +766,26 @@ static void bgmac_cmdcfg_maskset(struct 
    448        udelay(2); 
    549 } 
     
    2872 static void bgmac_chip_stats_update(struct bgmac *bgmac) 
    2973 { 
    30 @@ -889,8 +909,10 @@ static void bgmac_chip_reset(struct bgma 
     74@@ -889,8 +914,10 @@ static void bgmac_chip_reset(struct bgma 
    3175                        sw_type = et_swtype; 
    3276                } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == 9) { 
     
    4185                bcma_chipco_chipctl_maskset(cc, 1, 
    4286                                            ~(BGMAC_CHIPCTL_1_IF_TYPE_MASK | 
    43 @@ -948,6 +970,7 @@ static void bgmac_chip_intrs_on(struct b 
     87@@ -948,6 +975,7 @@ static void bgmac_chip_intrs_on(struct b 
    4488 static void bgmac_chip_intrs_off(struct bgmac *bgmac) 
    4589 { 
     
    4993  
    5094 /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_enable */ 
    51 @@ -1004,8 +1027,6 @@ static void bgmac_enable(struct bgmac *b 
     95@@ -1004,8 +1032,6 @@ static void bgmac_enable(struct bgmac *b 
    5296 static void bgmac_chip_init(struct bgmac *bgmac, bool full_init) 
    5397 { 
     
    58102  
    59103        /* 1 interrupt per received frame */ 
    60 @@ -1014,21 +1035,14 @@ static void bgmac_chip_init(struct bgmac 
     104@@ -1014,21 +1040,14 @@ static void bgmac_chip_init(struct bgmac 
    61105        /* Enable 802.3x tx flow control (honor received PAUSE frames) */ 
    62106        bgmac_cmdcfg_maskset(bgmac, ~BGMAC_CMDCFG_RPI, 0, true); 
     
    84128        bgmac_write(bgmac, BGMAC_RXMAX_LENGTH, 32 + ETHER_MAX_LEN); 
    85129  
    86 @@ -1160,6 +1174,19 @@ static netdev_tx_t bgmac_start_xmit(stru 
     130@@ -1160,6 +1179,19 @@ static netdev_tx_t bgmac_start_xmit(stru 
    87131        return bgmac_dma_tx_add(bgmac, ring, skb); 
    88132 } 
     
    104148 { 
    105149        struct bgmac *bgmac = netdev_priv(net_dev); 
    106 @@ -1190,7 +1217,9 @@ static const struct net_device_ops bgmac 
     150@@ -1190,7 +1222,9 @@ static const struct net_device_ops bgmac 
    107151        .ndo_open               = bgmac_open, 
    108152        .ndo_stop               = bgmac_stop, 
     
    115159 }; 
    116160  
    117 @@ -1290,6 +1319,12 @@ static int bgmac_probe(struct bcma_devic 
     161@@ -1290,6 +1324,12 @@ static int bgmac_probe(struct bcma_devic 
    118162                return -ENOTSUPP; 
    119163        } 
     
    139183  
    140184 #define BGMAC_SPEED_10                         0x0001 
     185@@ -450,7 +450,4 @@ static inline void bgmac_set(struct bgma 
     186        bgmac_maskset(bgmac, offset, ~0, set); 
     187 } 
     188  
     189-u16 bgmac_phy_read(struct bgmac *bgmac, u8 phyaddr, u8 reg); 
     190-void bgmac_phy_write(struct bgmac *bgmac, u8 phyaddr, u8 reg, u16 value); 
     191- 
     192 #endif /* _BGMAC_H */ 
Note: See TracChangeset for help on using the changeset viewer.