Changeset 11896


Ignore:
Timestamp:
2008-07-21T20:20:09+02:00 (8 years ago)
Author:
nbd
Message:

update mvswitch for 2.6.25 and 2.6.26 as well

Location:
trunk/target/linux/generic-2.6
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic-2.6/files-2.6.25/drivers/net/phy/mvswitch.c

    r11410 r11896  
    7979                goto error; 
    8080 
    81         if ((skb->len <= 62) || (skb_headroom(skb) < MV_HEADER_SIZE)) { 
    82                 if (pskb_expand_head(skb, MV_HEADER_SIZE, 0, GFP_ATOMIC)) 
     81        if (skb_cloned(skb) || (skb->len <= 62) || (skb_headroom(skb) < MV_HEADER_SIZE)) { 
     82                if (pskb_expand_head(skb, MV_HEADER_SIZE, (skb->len < 62 ? 62 - skb->len : 0), GFP_ATOMIC)) 
    8383                        goto error_expand; 
    8484                if (skb->len < 62) 
     
    218218 
    219219static int 
     220mvswitch_wait_mask(struct phy_device *pdev, int addr, int reg, u16 mask, u16 val) 
     221{ 
     222        int i = 100; 
     223        u16 r; 
     224 
     225        do { 
     226                r = r16(pdev, addr, reg) & mask; 
     227                if (r == val) 
     228                        return 0; 
     229        } while(--i > 0); 
     230        return -ETIMEDOUT; 
     231} 
     232 
     233static int 
    220234mvswitch_config_init(struct phy_device *pdev) 
    221235{ 
     
    232246        pdev->advertising = ADVERTISED_100baseT_Full; 
    233247        dev->phy_ptr = priv; 
     248        dev->irq = PHY_POLL; 
    234249 
    235250        /* initialize default vlans */ 
     
    243258        msleep(2); /* wait for the status change to settle in */ 
    244259 
    245         /* put the device in reset and set ATU flags */ 
     260        /* put the ATU in reset */ 
     261        w16(pdev, MV_SWITCHREG(ATU_CTRL), MV_ATUCTL_RESET); 
     262 
     263        i = mvswitch_wait_mask(pdev, MV_SWITCHREG(ATU_CTRL), MV_ATUCTL_RESET, 0); 
     264        if (i < 0) { 
     265                printk("%s: Timeout waiting for the switch to reset.\n", dev->name); 
     266                return i; 
     267        } 
     268 
     269        /* set the ATU flags */ 
    246270        w16(pdev, MV_SWITCHREG(ATU_CTRL), 
    247                 MV_ATUCTL_RESET | 
     271                MV_ATUCTL_NO_LEARN | 
    248272                MV_ATUCTL_ATU_1K | 
    249273                MV_ATUCTL_AGETIME(MV_ATUCTL_AGETIME_MIN) /* minimum without disabling ageing */ 
    250274        ); 
    251  
    252         i = 100; /* timeout */ 
    253         do { 
    254                 if (!(r16(pdev, MV_SWITCHREG(ATU_CTRL)) & MV_ATUCTL_RESET)) 
    255                         break; 
    256                 msleep(1); 
    257         } while (--i > 0); 
    258  
    259         if (!i) { 
    260                 printk("%s: Timeout waiting for the switch to reset.\n", dev->name); 
    261                 return -ETIMEDOUT; 
    262         } 
    263275 
    264276        /* initialize the cpu port */ 
     
    289301                /* leave port unconfigured if it's not part of a vlan */ 
    290302                if (!vlmap) 
    291                         break; 
     303                        continue; 
    292304 
    293305                /* add the cpu port to the allowed destinations list */ 
     
    300312                w16(pdev, MV_PORTREG(VLANMAP, i), 
    301313                        MV_PORTVLAN_PORTS(vlmap) | 
    302                         MV_PORTVLAN_ID(pvid) 
     314                        MV_PORTVLAN_ID(i) 
    303315                ); 
    304316 
    305317                /* re-enable port */ 
    306                 w16(pdev, MV_PORTREG(CONTROL, i), MV_PORTCTRL_ENABLED); 
    307         } 
    308  
    309         /* build the target list for the cpu port */ 
    310         for (i = 0; i < MV_PORTS; i++) 
    311                 vlmap |= (1 << i); 
     318                w16(pdev, MV_PORTREG(CONTROL, i), 
     319                        MV_PORTCTRL_ENABLED 
     320                ); 
     321        } 
    312322 
    313323        w16(pdev, MV_PORTREG(VLANMAP, MV_CPUPORT), 
    314                 MV_PORTVLAN_PORTS(vlmap) 
     324                MV_PORTVLAN_ID(MV_CPUPORT) 
    315325        ); 
    316326 
     
    344354 
    345355static int 
    346 mvswitch_read_status(struct phy_device *phydev) 
    347 { 
    348         phydev->speed = SPEED_100; 
    349         phydev->duplex = DUPLEX_FULL; 
    350         phydev->state = PHY_UP; 
     356mvswitch_read_status(struct phy_device *pdev) 
     357{ 
     358        pdev->speed = SPEED_100; 
     359        pdev->duplex = DUPLEX_FULL; 
     360        pdev->state = PHY_UP; 
     361 
     362        /* XXX ugly workaround: we can't force the switch 
     363         * to gracefully handle hosts moving from one port to another, 
     364         * so we have to regularly clear the ATU database */ 
     365 
     366        /* wait for the ATU to become available */ 
     367        mvswitch_wait_mask(pdev, MV_SWITCHREG(ATU_OP), MV_ATUOP_INPROGRESS, 0); 
     368 
     369        /* flush the ATU */ 
     370        w16(pdev, MV_SWITCHREG(ATU_OP), 
     371                MV_ATUOP_INPROGRESS | 
     372                MV_ATUOP_FLUSH_ALL 
     373        ); 
     374 
     375        /* wait for operation to complete */ 
     376        mvswitch_wait_mask(pdev, MV_SWITCHREG(ATU_OP), MV_ATUOP_INPROGRESS, 0); 
     377 
    351378        return 0; 
    352379} 
  • trunk/target/linux/generic-2.6/files-2.6.25/drivers/net/phy/mvswitch.h

    r11410 r11896  
    124124        MV_ATUCTL_NO_LEARN  = (1 << 14), 
    125125        MV_ATUCTL_RESET     = (1 << 15), 
    126 } 
     126}; 
     127 
     128enum { 
     129#define MV_ATUOP_DBNUM(_n)      ((_n) & 0x0f) 
     130 
     131        MV_ATUOP_NOOP       = (0 << 12), 
     132        MV_ATUOP_FLUSH_ALL  = (1 << 12), 
     133        MV_ATUOP_FLUSH_U    = (2 << 12), 
     134        MV_ATUOP_LOAD_DB    = (3 << 12), 
     135        MV_ATUOP_GET_NEXT   = (4 << 12), 
     136        MV_ATUOP_FLUSH_DB   = (5 << 12), 
     137        MV_ATUOP_FLUSH_DB_UU= (6 << 12), 
     138 
     139        MV_ATUOP_INPROGRESS = (1 << 15), 
     140}; 
    127141 
    128142#define MV_IDENT_MASK           0xfff0 
  • trunk/target/linux/generic-2.6/files-2.6.26/drivers/net/phy/mvswitch.c

    r11410 r11896  
    7979                goto error; 
    8080 
    81         if ((skb->len <= 62) || (skb_headroom(skb) < MV_HEADER_SIZE)) { 
    82                 if (pskb_expand_head(skb, MV_HEADER_SIZE, 0, GFP_ATOMIC)) 
     81        if (skb_cloned(skb) || (skb->len <= 62) || (skb_headroom(skb) < MV_HEADER_SIZE)) { 
     82                if (pskb_expand_head(skb, MV_HEADER_SIZE, (skb->len < 62 ? 62 - skb->len : 0), GFP_ATOMIC)) 
    8383                        goto error_expand; 
    8484                if (skb->len < 62) 
     
    218218 
    219219static int 
     220mvswitch_wait_mask(struct phy_device *pdev, int addr, int reg, u16 mask, u16 val) 
     221{ 
     222        int i = 100; 
     223        u16 r; 
     224 
     225        do { 
     226                r = r16(pdev, addr, reg) & mask; 
     227                if (r == val) 
     228                        return 0; 
     229        } while(--i > 0); 
     230        return -ETIMEDOUT; 
     231} 
     232 
     233static int 
    220234mvswitch_config_init(struct phy_device *pdev) 
    221235{ 
     
    232246        pdev->advertising = ADVERTISED_100baseT_Full; 
    233247        dev->phy_ptr = priv; 
     248        dev->irq = PHY_POLL; 
    234249 
    235250        /* initialize default vlans */ 
     
    243258        msleep(2); /* wait for the status change to settle in */ 
    244259 
    245         /* put the device in reset and set ATU flags */ 
     260        /* put the ATU in reset */ 
     261        w16(pdev, MV_SWITCHREG(ATU_CTRL), MV_ATUCTL_RESET); 
     262 
     263        i = mvswitch_wait_mask(pdev, MV_SWITCHREG(ATU_CTRL), MV_ATUCTL_RESET, 0); 
     264        if (i < 0) { 
     265                printk("%s: Timeout waiting for the switch to reset.\n", dev->name); 
     266                return i; 
     267        } 
     268 
     269        /* set the ATU flags */ 
    246270        w16(pdev, MV_SWITCHREG(ATU_CTRL), 
    247                 MV_ATUCTL_RESET | 
     271                MV_ATUCTL_NO_LEARN | 
    248272                MV_ATUCTL_ATU_1K | 
    249273                MV_ATUCTL_AGETIME(MV_ATUCTL_AGETIME_MIN) /* minimum without disabling ageing */ 
    250274        ); 
    251  
    252         i = 100; /* timeout */ 
    253         do { 
    254                 if (!(r16(pdev, MV_SWITCHREG(ATU_CTRL)) & MV_ATUCTL_RESET)) 
    255                         break; 
    256                 msleep(1); 
    257         } while (--i > 0); 
    258  
    259         if (!i) { 
    260                 printk("%s: Timeout waiting for the switch to reset.\n", dev->name); 
    261                 return -ETIMEDOUT; 
    262         } 
    263275 
    264276        /* initialize the cpu port */ 
     
    289301                /* leave port unconfigured if it's not part of a vlan */ 
    290302                if (!vlmap) 
    291                         break; 
     303                        continue; 
    292304 
    293305                /* add the cpu port to the allowed destinations list */ 
     
    300312                w16(pdev, MV_PORTREG(VLANMAP, i), 
    301313                        MV_PORTVLAN_PORTS(vlmap) | 
    302                         MV_PORTVLAN_ID(pvid) 
     314                        MV_PORTVLAN_ID(i) 
    303315                ); 
    304316 
    305317                /* re-enable port */ 
    306                 w16(pdev, MV_PORTREG(CONTROL, i), MV_PORTCTRL_ENABLED); 
    307         } 
    308  
    309         /* build the target list for the cpu port */ 
    310         for (i = 0; i < MV_PORTS; i++) 
    311                 vlmap |= (1 << i); 
     318                w16(pdev, MV_PORTREG(CONTROL, i), 
     319                        MV_PORTCTRL_ENABLED 
     320                ); 
     321        } 
    312322 
    313323        w16(pdev, MV_PORTREG(VLANMAP, MV_CPUPORT), 
    314                 MV_PORTVLAN_PORTS(vlmap) 
     324                MV_PORTVLAN_ID(MV_CPUPORT) 
    315325        ); 
    316326 
     
    344354 
    345355static int 
    346 mvswitch_read_status(struct phy_device *phydev) 
    347 { 
    348         phydev->speed = SPEED_100; 
    349         phydev->duplex = DUPLEX_FULL; 
    350         phydev->state = PHY_UP; 
     356mvswitch_read_status(struct phy_device *pdev) 
     357{ 
     358        pdev->speed = SPEED_100; 
     359        pdev->duplex = DUPLEX_FULL; 
     360        pdev->state = PHY_UP; 
     361 
     362        /* XXX ugly workaround: we can't force the switch 
     363         * to gracefully handle hosts moving from one port to another, 
     364         * so we have to regularly clear the ATU database */ 
     365 
     366        /* wait for the ATU to become available */ 
     367        mvswitch_wait_mask(pdev, MV_SWITCHREG(ATU_OP), MV_ATUOP_INPROGRESS, 0); 
     368 
     369        /* flush the ATU */ 
     370        w16(pdev, MV_SWITCHREG(ATU_OP), 
     371                MV_ATUOP_INPROGRESS | 
     372                MV_ATUOP_FLUSH_ALL 
     373        ); 
     374 
     375        /* wait for operation to complete */ 
     376        mvswitch_wait_mask(pdev, MV_SWITCHREG(ATU_OP), MV_ATUOP_INPROGRESS, 0); 
     377 
    351378        return 0; 
    352379} 
  • trunk/target/linux/generic-2.6/files-2.6.26/drivers/net/phy/mvswitch.h

    r11410 r11896  
    124124        MV_ATUCTL_NO_LEARN  = (1 << 14), 
    125125        MV_ATUCTL_RESET     = (1 << 15), 
    126 } 
     126}; 
     127 
     128enum { 
     129#define MV_ATUOP_DBNUM(_n)      ((_n) & 0x0f) 
     130 
     131        MV_ATUOP_NOOP       = (0 << 12), 
     132        MV_ATUOP_FLUSH_ALL  = (1 << 12), 
     133        MV_ATUOP_FLUSH_U    = (2 << 12), 
     134        MV_ATUOP_LOAD_DB    = (3 << 12), 
     135        MV_ATUOP_GET_NEXT   = (4 << 12), 
     136        MV_ATUOP_FLUSH_DB   = (5 << 12), 
     137        MV_ATUOP_FLUSH_DB_UU= (6 << 12), 
     138 
     139        MV_ATUOP_INPROGRESS = (1 << 15), 
     140}; 
    127141 
    128142#define MV_IDENT_MASK           0xfff0 
Note: See TracChangeset for help on using the changeset viewer.