Changeset 2998


Ignore:
Timestamp:
2006-01-16T22:10:50+01:00 (12 years ago)
Author:
nbd
Message:

update b44 driver for brcm-2.4 and 2.6, fix #214

Location:
trunk/openwrt/target/linux
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/openwrt/target/linux/brcm-2.4/patches/008-b44_bcm47xx_support.patch

    r2950 r2998  
    11diff -urN linux.old/drivers/net/b44.c linux.dev/drivers/net/b44.c 
    2 --- linux.old/drivers/net/b44.c 2006-01-12 17:27:45.920623500 +0100 
    3 +++ linux.dev/drivers/net/b44.c 2006-01-13 13:29:18.782391750 +0100 
     2--- linux.old/drivers/net/b44.c 2006-01-16 21:10:55.873911750 +0100 
     3+++ linux.dev/drivers/net/b44.c 2006-01-16 21:16:02.041046000 +0100 
    44@@ -1,7 +1,9 @@ 
    55 /* b44.c: Broadcom 4400 device driver. 
     
    183183        if (err) 
    184184                return err; 
    185 @@ -405,6 +490,18 @@ 
     185@@ -405,6 +490,24 @@ 
    186186 { 
    187187        u32 val; 
     
    189189+       char *s; 
    190190+ 
    191 +       if ((s = nvram_get("boardnum")) && (s != NULL) && \ 
    192 +                       !strncmp(s, "2", 1) && \ 
    193 +                       (__b44_readphy(bp, 0, MII_BMCR, &val) != 0) && \ 
    194 +                       (val & BMCR_ISOLATE) && \ 
     191+#ifdef CONFIG_BCM947XX 
     192+       /* 
     193+        * workaround for bad hardware design in Linksys WAP54G v1.0 
     194+        * see https://dev.openwrt.org/ticket/146 
     195+        * check and reset bit "isolate" 
     196+        */ 
     197+       if ((bp->pdev->device == PCI_DEVICE_ID_BCM4713) && 
     198+                       (atoi(nvram_get("boardnum")) == 2) && 
     199+                       (__b44_readphy(bp, 0, MII_BMCR, &val) == 0) &&  
     200+                       (val & BMCR_ISOLATE) && 
    195201+                       (__b44_writephy(bp, 0, MII_BMCR, val & ~BMCR_ISOLATE) != 0)) { 
    196202+               printk(KERN_WARNING PFX "PHY: cannot reset MII transceiver isolate bit.\n"); 
    197203+       } 
    198 +        
     204+#endif 
    199205+       if (bp->phy_addr == B44_PHY_ADDR_NO_PHY) 
    200206+               return 0; 
     
    202208        if ((err = b44_readphy(bp, B44_MII_ALEDCTRL, &val)) != 0) 
    203209                goto out; 
    204 @@ -498,6 +595,19 @@ 
     210@@ -498,6 +601,19 @@ 
    205211 { 
    206212        u32 bmsr, aux; 
     
    222228            !b44_readphy(bp, B44_MII_AUXCTRL, &aux) && 
    223229            (bmsr != 0xffff)) { 
    224 @@ -1092,6 +1202,8 @@ 
     230@@ -1092,6 +1208,8 @@ 
    225231 /* bp->lock is held. */ 
    226232 static void b44_chip_reset(struct b44 *bp) 
     
    231237                bw32(B44_RCV_LAZY, 0); 
    232238                bw32(B44_ENET_CTRL, ENET_CTRL_DISABLE); 
    233 @@ -1105,9 +1217,10 @@ 
     239@@ -1105,9 +1223,10 @@ 
    234240                bw32(B44_DMARX_CTRL, 0); 
    235241                bp->rx_prod = bp->rx_cons = 0; 
     
    245251  
    246252        ssb_core_reset(bp); 
    247 @@ -1115,6 +1228,11 @@ 
     253@@ -1115,6 +1234,11 @@ 
    248254        b44_clear_stats(bp); 
    249255  
     
    257263                             (0x0d & MDIO_CTRL_MAXF_MASK))); 
    258264        br32(B44_MDIO_CTRL); 
    259 @@ -1628,7 +1746,7 @@ 
     265@@ -1628,7 +1752,7 @@ 
    260266                u32 mii_regval; 
    261267  
     
    266272  
    267273                data->val_out = mii_regval; 
    268 @@ -1641,7 +1759,7 @@ 
     274@@ -1641,7 +1765,7 @@ 
    269275                        return -EPERM; 
    270276  
     
    275281  
    276282                return err; 
    277 @@ -1668,21 +1786,52 @@ 
     283@@ -1668,21 +1792,52 @@ 
    278284 static int __devinit b44_get_invariants(struct b44 *bp) 
    279285 { 
     
    286292-       if (err) 
    287293-               goto out; 
    288 - 
     294+       if (bp->pdev->device == PCI_DEVICE_ID_BCM4713) { 
     295+               /*  
     296+                * BCM47xx boards don't have a EEPROM. The MAC is stored in 
     297+                * a NVRAM area somewhere in the flash memory. 
     298+                */ 
     299+               sprintf(buf, "et%dmacaddr", b44_4713_instance); 
     300+               if (nvram_get(buf)) { 
     301+                       e_aton(nvram_get(buf), bp->dev->dev_addr); 
     302+               } else { 
     303+                       /* 
     304+                        * Getting the MAC out of NVRAM failed. To make it work 
     305+                        * here, we simply rely on the bootloader to write the 
     306+                        * MAC into the CAM. 
     307+                        */ 
     308+                       spin_lock_irqsave(&bp->lock, flags); 
     309+                       __b44_cam_read(bp, bp->dev->dev_addr, 0); 
     310+                       spin_unlock_irqrestore(&bp->lock, flags); 
     311+               } 
     312  
    289313-       bp->dev->dev_addr[0] = eeprom[79]; 
    290314-       bp->dev->dev_addr[1] = eeprom[78]; 
     
    293317-       bp->dev->dev_addr[4] = eeprom[83]; 
    294318-       bp->dev->dev_addr[5] = eeprom[82]; 
    295 - 
     319  
    296320-       bp->phy_addr = eeprom[90] & 0x1f; 
    297321-       bp->mdc_port = (eeprom[90] >> 14) & 0x1; 
    298 +       if (bp->pdev->device == PCI_DEVICE_ID_BCM4713) { 
    299 +#ifdef CONFIG_BCM947XX 
    300 +               sprintf(buf, "et%dmacaddr", instance - 1); 
    301 +               e_aton(nvram_get(buf), bp->dev->dev_addr); 
    302 + 
    303 +               sprintf(buf, "et%dphyaddr", instance - 1); 
    304 +               bp->phy_addr = B44_PHY_ADDR_NO_PHY; 
    305 +#else 
    306 +               /* 
    307 +                * BCM47xx boards don't have a EEPROM. The MAC is stored in 
    308 +                * a NVRAM area somewhere in the flash memory. As we don't 
    309 +                * know the location and/or the format of the NVRAM area 
    310 +                * here, we simply rely on the bootloader to write the 
    311 +                * MAC into the CAM. 
    312 +                */ 
    313 +               spin_lock_irqsave(&bp->lock, flags); 
    314 +               __b44_cam_read(bp, bp->dev->dev_addr, 0); 
    315 +               spin_unlock_irqrestore(&bp->lock, flags); 
    316 + 
    317322+               /* 
    318323+                * BCM47xx boards don't have a PHY. Usually there is a switch 
     
    320325+                */ 
    321326+               bp->phy_addr = B44_PHY_ADDR_NO_PHY; 
    322 +#endif 
    323327+               bp->dma_offset = 0; 
    324328+       } else { 
     
    341345        /* With this, plus the rx_header prepended to the data by the 
    342346         * hardware, we'll land the ethernet header on a 2-byte boundary. 
    343 @@ -1692,13 +1841,12 @@ 
     347@@ -1692,13 +1847,12 @@ 
    344348        bp->imask = IMASK_DEF; 
    345349  
     
    357361  
    358362 static int __devinit b44_init_one(struct pci_dev *pdev, 
    359 @@ -1710,6 +1858,10 @@ 
     363@@ -1710,6 +1864,10 @@ 
    360364        struct b44 *bp; 
    361365        int err, i; 
     
    368372                printk(KERN_INFO "%s", version); 
    369373  
    370 @@ -1819,11 +1971,17 @@ 
     374@@ -1819,11 +1977,17 @@ 
    371375  
    372376        pci_save_state(bp->pdev, bp->pci_cfg_state); 
     
    388392 err_out_iounmap: 
    389393diff -urN linux.old/drivers/net/b44.h linux.dev/drivers/net/b44.h 
    390 --- linux.old/drivers/net/b44.h 2006-01-12 17:26:13.234831000 +0100 
    391 +++ linux.dev/drivers/net/b44.h 2006-01-12 17:22:01.043070000 +0100 
     394--- linux.old/drivers/net/b44.h 2006-01-16 21:10:55.881912250 +0100 
     395+++ linux.dev/drivers/net/b44.h 2006-01-16 21:02:38.018249750 +0100 
    392396@@ -229,8 +229,6 @@ 
    393397 #define  SBIPSFLAG_IMASK4      0x3f000000 /* Which sbflags --> mips interrupt 4 */ 
     
    409413  * which probes HW values.  Must have same relative layout as HW 
    410414diff -urN linux.old/include/linux/pci_ids.h linux.dev/include/linux/pci_ids.h 
    411 --- linux.old/include/linux/pci_ids.h   2006-01-12 17:26:13.250832000 +0100 
    412 +++ linux.dev/include/linux/pci_ids.h   2006-01-12 17:22:01.071071750 +0100 
    413 @@ -1735,6 +1735,7 @@ 
     415--- linux.old/include/linux/pci_ids.h   2006-01-16 21:10:55.901913500 +0100 
     416+++ linux.dev/include/linux/pci_ids.h   2006-01-16 21:02:38.034250750 +0100 
     417@@ -1741,6 +1741,7 @@ 
    414418 #define PCI_DEVICE_ID_TIGON3_5901_2    0x170e 
    415419 #define PCI_DEVICE_ID_BCM4401          0x4401 
  • trunk/openwrt/target/linux/brcm-2.6/patches/004-b44_bcm47xx_support.patch

    r2953 r2998  
    11diff -urN linux.old/drivers/net/b44.c linux.dev/drivers/net/b44.c 
    2 --- linux.old/drivers/net/b44.c 2006-01-12 01:44:42.548326000 +0100 
    3 +++ linux.dev/drivers/net/b44.c 2006-01-13 17:30:08.283122500 +0100 
     2--- linux.old/drivers/net/b44.c 2006-01-16 20:35:09.203794500 +0100 
     3+++ linux.dev/drivers/net/b44.c 2006-01-16 20:40:29.023782000 +0100 
    44@@ -1,7 +1,9 @@ 
    55-/* b44.c: Broadcom 4400 device driver. 
     
    9494 } 
    9595  
    96 @@ -313,14 +334,14 @@ 
     96@@ -277,6 +298,30 @@ 
     97                == SBTMSLOW_CLOCK); 
     98 } 
     99  
     100+#ifdef CONFIG_BCM947XX 
     101+static inline void __b44_cam_read(struct b44 *bp, unsigned char *data, int index) 
     102+{ 
     103+       u32 val; 
     104+ 
     105+       bw32(bp, B44_CAM_CTRL, (CAM_CTRL_READ | 
     106+                           (index << CAM_CTRL_INDEX_SHIFT))); 
     107+ 
     108+       b44_wait_bit(bp, B44_CAM_CTRL, CAM_CTRL_BUSY, 100, 1); 
     109+ 
     110+       val = br32(bp, B44_CAM_DATA_LO); 
     111+ 
     112+       data[2] = (val >> 24) & 0xFF; 
     113+       data[3] = (val >> 16) & 0xFF; 
     114+       data[4] = (val >> 8) & 0xFF; 
     115+       data[5] = (val >> 0) & 0xFF; 
     116+ 
     117+       val = br32(bp, B44_CAM_DATA_HI); 
     118+ 
     119+       data[0] = (val >> 8) & 0xFF; 
     120+       data[1] = (val >> 0) & 0xFF; 
     121+} 
     122+#endif 
     123+ 
     124 static void __b44_cam_write(struct b44 *bp, unsigned char *data, int index) 
     125 { 
     126        u32 val; 
     127@@ -313,14 +358,14 @@ 
    97128        bw32(bp, B44_IMASK, bp->imask); 
    98129 } 
     
    111142                             (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT))); 
    112143        err = b44_wait_bit(bp, B44_EMAC_ISTAT, EMAC_INT_MII, 100, 0); 
    113 @@ -329,18 +350,34 @@ 
     144@@ -329,18 +374,34 @@ 
    114145        return err; 
    115146 } 
     
    148179 /* FIXME FIXME: phy_id is ignored, bp->phy_addr use is unconditional 
    149180  * due to code existing before miilib use was added to this driver. 
    150 @@ -369,6 +406,8 @@ 
     181@@ -369,6 +430,8 @@ 
    151182        u32 val; 
    152183        int err; 
     
    157188        if (err) 
    158189                return err; 
    159 @@ -439,6 +478,18 @@ 
     190@@ -439,6 +502,22 @@ 
    160191        u32 val; 
    161192        int err; 
    162193  
    163194+#ifdef CONFIG_BCM947XX 
    164 +       char *s; 
    165 +       if ((s = nvram_get("boardnum")) && (s != NULL) && \ 
    166 +                       !strncmp(s, "2", 1) && \ 
    167 +                       (__b44_readphy(bp, 0, MII_BMCR, &val) != 0) && \ 
    168 +                       (val & BMCR_ISOLATE) && \ 
     195+       /* 
     196+        * workaround for bad hardware design in Linksys WAP54G v1.0 
     197+        * see https://dev.openwrt.org/ticket/146 
     198+        * check and reset bit "isolate" 
     199+        */ 
     200+       if ((bp->pdev->device == PCI_DEVICE_ID_BCM4713) && 
     201+                       (atoi(nvram_get("boardnum")) == 2) && 
     202+                       (__b44_readphy(bp, 0, MII_BMCR, &val) == 0) &&  
     203+                       (val & BMCR_ISOLATE) && 
    169204+                       (__b44_writephy(bp, 0, MII_BMCR, val & ~BMCR_ISOLATE) != 0)) { 
    170205+               printk(KERN_WARNING PFX "PHY: cannot reset MII transceiver isolate bit.\n"); 
     
    176211                goto out; 
    177212        if ((err = b44_writephy(bp, B44_MII_ALEDCTRL, 
    178 @@ -534,6 +585,19 @@ 
     213@@ -534,6 +613,19 @@ 
    179214 { 
    180215        u32 bmsr, aux; 
     
    196231            !b44_readphy(bp, B44_MII_AUXCTRL, &aux) && 
    197232            (bmsr != 0xffff)) { 
    198 @@ -1281,9 +1345,10 @@ 
     233@@ -1281,9 +1373,10 @@ 
    199234                bw32(bp, B44_DMARX_CTRL, 0); 
    200235                bp->rx_prod = bp->rx_cons = 0; 
     
    210245  
    211246        ssb_core_reset(bp); 
    212 @@ -1291,8 +1356,14 @@ 
     247@@ -1291,8 +1384,14 @@ 
    213248        b44_clear_stats(bp); 
    214249  
     
    226261  
    227262        if (!(br32(bp, B44_DEVCTRL) & DEVCTRL_IPP)) { 
    228 @@ -1834,18 +1905,297 @@ 
     263@@ -1834,18 +1933,297 @@ 
    229264        .get_perm_addr          = ethtool_op_get_perm_addr, 
    230265 }; 
     
    528563        return err; 
    529564 } 
    530 @@ -1865,22 +2215,43 @@ 
     565@@ -1865,22 +2243,54 @@ 
    531566 static int __devinit b44_get_invariants(struct b44 *bp) 
    532567 { 
    533568        u8 eeprom[128]; 
    534569-       int err; 
    535 +       u8 buf[32]; 
    536 +       int err = 0; 
    537   
     570- 
    538571-       err = b44_read_eeprom(bp, &eeprom[0]); 
    539572-       if (err) 
     
    547580-       bp->dev->dev_addr[5] = eeprom[82]; 
    548581-       memcpy(bp->dev->perm_addr, bp->dev->dev_addr, bp->dev->addr_len); 
    549 - 
     582+       u8 buf[32]; 
     583+       int err = 0; 
     584  
    550585-       bp->phy_addr = eeprom[90] & 0x1f; 
    551586+#ifdef CONFIG_BCM947XX 
     
    556591+                */ 
    557592+               sprintf(buf, "et%dmacaddr", b44_4713_instance); 
    558 +               e_aton(nvram_get(buf), bp->dev->dev_addr); 
     593+               if (nvram_get(buf)) { 
     594+                       e_aton(nvram_get(buf), bp->dev->dev_addr); 
     595+               } else { 
     596+                       /* 
     597+                        * Getting the MAC out of NVRAM failed. To make it work 
     598+                        * here, we simply rely on the bootloader to write the 
     599+                        * MAC into the CAM. 
     600+                        */ 
     601+                       spin_lock_irqsave(&bp->lock, flags); 
     602+                       __b44_cam_read(bp, bp->dev->dev_addr, 0); 
     603+                       spin_unlock_irqrestore(&bp->lock, flags); 
     604+               } 
    559605  
    560606+               /*  
     
    586632         * hardware, we'll land the ethernet header on a 2-byte boundary. 
    587633         */ 
    588 @@ -1889,11 +2260,7 @@ 
     634@@ -1889,11 +2299,7 @@ 
    589635        bp->imask = IMASK_DEF; 
    590636  
     
    598644        return err; 
    599645 } 
    600 @@ -2032,11 +2399,17 @@ 
     646@@ -2032,11 +2438,17 @@ 
    601647  
    602648        pci_save_state(bp->pdev); 
     
    618664 err_out_iounmap: 
    619665diff -urN linux.old/drivers/net/b44.h linux.dev/drivers/net/b44.h 
    620 --- linux.old/drivers/net/b44.h 2006-01-12 01:44:42.548326000 +0100 
    621 +++ linux.dev/drivers/net/b44.h 2006-01-12 02:55:06.290783500 +0100 
     666--- linux.old/drivers/net/b44.h 2006-01-16 20:35:09.255797750 +0100 
     667+++ linux.dev/drivers/net/b44.h 2006-01-16 20:30:30.566380750 +0100 
    622668@@ -292,6 +292,10 @@ 
    623669 #define SSB_PCI_MASK1          0xfc000000 
Note: See TracChangeset for help on using the changeset viewer.