Changeset 10531


Ignore:
Timestamp:
2008-02-27T23:35:41+01:00 (10 years ago)
Author:
mb
Message:

Fix the roboswitch code for the WRT350N

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/switch/src/switch-core.c

    r6501 r10531  
    140140static int handle_driver_name(void *driver, char *buf, int nr) 
    141141{ 
    142         char *name = ((switch_driver *) driver)->name; 
     142        const char *name = ((switch_driver *) driver)->name; 
    143143        return sprintf(buf, "%s\n", name); 
    144144} 
     
    146146static int handle_driver_version(void *driver, char *buf, int nr) 
    147147{ 
    148         char *version = ((switch_driver *) driver)->version; 
     148        const char *version = ((switch_driver *) driver)->version; 
    149149        strcpy(buf, version); 
    150150        return sprintf(buf, "%s\n", version); 
    151151} 
    152152 
    153 static void add_handler(switch_driver *driver, switch_config *handler, struct proc_dir_entry *parent, int nr) 
     153static void add_handler(switch_driver *driver, const switch_config *handler, struct proc_dir_entry *parent, int nr) 
    154154{ 
    155155        switch_priv *priv = (switch_priv *) driver->data; 
     
    176176} 
    177177 
    178 static inline void add_handlers(switch_driver *driver, switch_config *handlers, struct proc_dir_entry *parent, int nr) 
     178static inline void add_handlers(switch_driver *driver, const switch_config *handlers, struct proc_dir_entry *parent, int nr) 
    179179{ 
    180180        int i; 
     
    409409        new->name = strdup(driver->name); 
    410410        new->interface = strdup(driver->interface); 
    411          
     411 
    412412        if ((ret = do_register(new)) < 0) { 
    413413                kfree(new->name); 
  • trunk/package/switch/src/switch-core.h

    r6501 r10531  
    2121 
    2222typedef struct { 
    23         char *name; 
     23        const char *name; 
    2424        switch_handler read, write; 
    2525} switch_config; 
     
    2727typedef struct { 
    2828        struct list_head list; 
    29         char *name; 
    30         char *version; 
    31         char *interface; 
     29        const char *name; 
     30        const char *version; 
     31        const char *interface; 
    3232        int cpuport; 
    3333        int ports; 
    3434        int vlans; 
    35         switch_config *driver_handlers, *port_handlers, *vlan_handlers; 
     35        const switch_config *driver_handlers, *port_handlers, *vlan_handlers; 
    3636        void *data; 
    3737        void *priv; 
     
    4949extern int switch_print_media(char *buf, int media); 
    5050 
    51 static inline char *strdup(char *str) 
     51static inline char *strdup(const char *str) 
    5252{ 
    5353        char *new = kmalloc(strlen(str) + 1, GFP_KERNEL); 
  • trunk/package/switch/src/switch-robo.c

    r6564 r10531  
    33 * 
    44 * Copyright (C) 2005 Felix Fietkau <nbd@nbd.name> 
     5 * Copyright (C) 2008 Michael Buesch <mb@bu3sch.de> 
    56 * Based on 'robocfg' by Oleg I. Vdovikin 
    67 * 
     
    2930#include <linux/ethtool.h> 
    3031#include <linux/mii.h> 
     32#include <linux/delay.h> 
    3133#include <asm/uaccess.h> 
    3234 
     
    3537 
    3638#define DRIVER_NAME             "bcm53xx" 
    37 #define DRIVER_VERSION  "0.01" 
    38  
    39 #define ROBO_PHY_ADDR   0x1E    /* robo switch phy address */ 
     39#define DRIVER_VERSION          "0.02" 
     40#define PFX                     "roboswitch: " 
     41 
     42#define ROBO_PHY_ADDR           0x1E    /* robo switch phy address */ 
     43#define ROBO_PHY_ADDR_TG3       0x01    /* Tigon3 PHY address */ 
    4044 
    4145/* MII registers */ 
     
    4852#define REG_MII_ADDR_READ       2 
    4953 
     54/* Robo device ID register (in ROBO_MGMT_PAGE) */ 
     55#define ROBO_DEVICE_ID          0x30 
     56#define  ROBO_DEVICE_ID_5325    0x25 /* Faked */ 
     57#define  ROBO_DEVICE_ID_5395    0x95 
     58#define  ROBO_DEVICE_ID_5397    0x97 
     59#define  ROBO_DEVICE_ID_5398    0x98 
     60 
    5061/* Private et.o ioctls */ 
    5162#define SIOCGETCPHYRD           (SIOCDEVPRIVATE + 9) 
    5263#define SIOCSETCPHYWR           (SIOCDEVPRIVATE + 10) 
    5364 
    54 static char *device; 
    55 static int use_et = 0; 
    56 static int is_5350 = 0; 
    57 static struct ifreq ifr; 
    58 static struct net_device *dev; 
    59 static unsigned char port[6] = { 0, 1, 2, 3, 4, 8 }; 
     65 
     66/* Data structure for a Roboswitch device. */ 
     67struct robo_switch { 
     68        char *device;                   /* The device name string (ethX) */ 
     69        u16 devid;                      /* ROBO_DEVICE_ID_53xx */ 
     70        bool use_et; 
     71        bool is_5350; 
     72        u8 phy_addr;                    /* PHY address of the device */ 
     73        struct ifreq ifr; 
     74        struct net_device *dev; 
     75        unsigned char port[6]; 
     76}; 
     77 
     78/* Currently we can only have one device in the system. */ 
     79static struct robo_switch robo; 
     80 
    6081 
    6182static int do_ioctl(int cmd, void *buf) 
     
    6586 
    6687        if (buf != NULL) 
    67                 ifr.ifr_data = (caddr_t) buf; 
     88                robo.ifr.ifr_data = (caddr_t) buf; 
    6889 
    6990        set_fs(KERNEL_DS); 
    70         ret = dev->do_ioctl(dev, &ifr, cmd); 
     91        ret = robo.dev->do_ioctl(robo.dev, &robo.ifr, cmd); 
    7192        set_fs(old_fs); 
    7293 
     
    7697static u16 mdio_read(__u16 phy_id, __u8 reg) 
    7798{ 
    78         if (use_et) { 
     99        if (robo.use_et) { 
    79100                int args[2] = { reg }; 
    80                  
    81                 if (phy_id != ROBO_PHY_ADDR) { 
    82                         printk( 
     101 
     102                if (phy_id != robo.phy_addr) { 
     103                        printk(KERN_ERR PFX 
    83104                                "Access to real 'phy' registers unavaliable.\n" 
    84105                                "Upgrade kernel driver.\n"); 
     
    89110 
    90111                if (do_ioctl(SIOCGETCPHYRD, &args) < 0) { 
    91                         printk("[%s:%d] SIOCGETCPHYRD failed!\n", __FILE__, __LINE__); 
     112                        printk(KERN_ERR PFX 
     113                               "[%s:%d] SIOCGETCPHYRD failed!\n", __FILE__, __LINE__); 
    92114                        return 0xffff; 
    93115                } 
     
    95117                return args[1]; 
    96118        } else { 
    97                 struct mii_ioctl_data *mii = (struct mii_ioctl_data *) &ifr.ifr_data; 
     119                struct mii_ioctl_data *mii = (struct mii_ioctl_data *) &robo.ifr.ifr_data; 
    98120                mii->phy_id = phy_id; 
    99121                mii->reg_num = reg; 
    100122 
    101123                if (do_ioctl(SIOCGMIIREG, NULL) < 0) { 
    102                         printk("[%s:%d] SIOCGMIIREG failed!\n", __FILE__, __LINE__); 
     124                        printk(KERN_ERR PFX 
     125                               "[%s:%d] SIOCGMIIREG failed!\n", __FILE__, __LINE__); 
    103126 
    104127                        return 0xffff; 
     
    111134static void mdio_write(__u16 phy_id, __u8 reg, __u16 val) 
    112135{ 
    113         if (use_et) { 
     136        if (robo.use_et) { 
    114137                int args[2] = { reg, val }; 
    115138 
    116                 if (phy_id != ROBO_PHY_ADDR) { 
    117                         printk( 
     139                if (phy_id != robo.phy_addr) { 
     140                        printk(KERN_ERR PFX 
    118141                                "Access to real 'phy' registers unavaliable.\n" 
    119142                                "Upgrade kernel driver.\n"); 
     
    123146                 
    124147                if (do_ioctl(SIOCSETCPHYWR, args) < 0) { 
    125                         printk("[%s:%d] SIOCGETCPHYWR failed!\n", __FILE__, __LINE__); 
     148                        printk(KERN_ERR PFX 
     149                               "[%s:%d] SIOCGETCPHYWR failed!\n", __FILE__, __LINE__); 
    126150                        return; 
    127151                } 
    128152        } else { 
    129                 struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; 
     153                struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&robo.ifr.ifr_data; 
    130154 
    131155                mii->phy_id = phy_id; 
     
    134158 
    135159                if (do_ioctl(SIOCSMIIREG, NULL) < 0) { 
    136                         printk("[%s:%d] SIOCSMIIREG failed!\n", __FILE__, __LINE__); 
     160                        printk(KERN_ERR PFX 
     161                               "[%s:%d] SIOCSMIIREG failed!\n", __FILE__, __LINE__); 
    137162                        return; 
    138163                } 
     
    145170         
    146171        /* set page number */ 
    147         mdio_write(ROBO_PHY_ADDR, REG_MII_PAGE,  
     172        mdio_write(robo.phy_addr, REG_MII_PAGE,  
    148173                (page << 8) | REG_MII_PAGE_ENABLE); 
    149174         
    150175        /* set register address */ 
    151         mdio_write(ROBO_PHY_ADDR, REG_MII_ADDR,  
     176        mdio_write(robo.phy_addr, REG_MII_ADDR,  
    152177                (reg << 8) | op); 
    153178 
    154179        /* check if operation completed */ 
    155180        while (i--) { 
    156                 if ((mdio_read(ROBO_PHY_ADDR, REG_MII_ADDR) & 3) == 0) 
     181                if ((mdio_read(robo.phy_addr, REG_MII_ADDR) & 3) == 0) 
    157182                        return 0; 
    158183        } 
    159184 
    160         printk("[%s:%d] timeout in robo_reg!\n", __FILE__, __LINE__); 
     185        printk(KERN_ERR PFX "[%s:%d] timeout in robo_reg!\n", __FILE__, __LINE__); 
    161186         
    162187        return 0; 
     
    171196         
    172197        for (i = 0; i < count; i++) 
    173                 val[i] = mdio_read(ROBO_PHY_ADDR, REG_MII_DATA0 + i); 
     198                val[i] = mdio_read(robo.phy_addr, REG_MII_DATA0 + i); 
    174199} 
    175200*/ 
     
    179204        robo_reg(page, reg, REG_MII_ADDR_READ); 
    180205         
    181         return mdio_read(ROBO_PHY_ADDR, REG_MII_DATA0); 
     206        return mdio_read(robo.phy_addr, REG_MII_DATA0); 
    182207} 
    183208 
     
    186211        robo_reg(page, reg, REG_MII_ADDR_READ); 
    187212         
    188         return mdio_read(ROBO_PHY_ADDR, REG_MII_DATA0) + 
    189                 (mdio_read(ROBO_PHY_ADDR, REG_MII_DATA0 + 1) << 16); 
     213        return mdio_read(robo.phy_addr, REG_MII_DATA0) + 
     214                (mdio_read(robo.phy_addr, REG_MII_DATA0 + 1) << 16); 
    190215} 
    191216 
     
    193218{ 
    194219        /* write data */ 
    195         mdio_write(ROBO_PHY_ADDR, REG_MII_DATA0, val16); 
     220        mdio_write(robo.phy_addr, REG_MII_DATA0, val16); 
    196221 
    197222        robo_reg(page, reg, REG_MII_ADDR_WRITE); 
     
    201226{ 
    202227        /* write data */ 
    203         mdio_write(ROBO_PHY_ADDR, REG_MII_DATA0, val32 & 65535); 
    204         mdio_write(ROBO_PHY_ADDR, REG_MII_DATA0 + 1, val32 >> 16); 
     228        mdio_write(robo.phy_addr, REG_MII_DATA0, val32 & 65535); 
     229        mdio_write(robo.phy_addr, REG_MII_DATA0 + 1, val32 >> 16); 
    205230         
    206231        robo_reg(page, reg, REG_MII_ADDR_WRITE); 
     
    218243} 
    219244 
    220  
     245static int robo_switch_enable(void) 
     246{ 
     247        unsigned int i, last_port; 
     248        u16 val; 
     249 
     250        val = robo_read16(ROBO_CTRL_PAGE, ROBO_SWITCH_MODE); 
     251        if (!(val & (1 << 1))) { 
     252                /* Unmanaged mode */ 
     253                val &= ~(1 << 0); 
     254                /* With forwarding */ 
     255                val |= (1 << 1); 
     256                robo_write16(ROBO_CTRL_PAGE, ROBO_SWITCH_MODE, val); 
     257                val = robo_read16(ROBO_CTRL_PAGE, ROBO_SWITCH_MODE); 
     258                if (!(val & (1 << 1))) { 
     259                        printk("Failed to enable switch\n"); 
     260                        return -EBUSY; 
     261                } 
     262 
     263                last_port = (robo.devid == ROBO_DEVICE_ID_5398) ? 
     264                                ROBO_PORT6_CTRL : ROBO_PORT3_CTRL; 
     265                for (i = ROBO_PORT0_CTRL; i < last_port + 1; i++) 
     266                        robo_write16(ROBO_CTRL_PAGE, i, 0); 
     267        } 
     268 
     269        /* WAN port LED */ 
     270        robo_write16(ROBO_CTRL_PAGE, 0x16, 0x1F); 
     271 
     272        return 0; 
     273} 
     274 
     275static void robo_switch_reset(void) 
     276{ 
     277        if ((robo.devid == ROBO_DEVICE_ID_5395) || 
     278            (robo.devid == ROBO_DEVICE_ID_5397) || 
     279            (robo.devid == ROBO_DEVICE_ID_5398)) { 
     280                /* Trigger a software reset. */ 
     281                robo_write16(ROBO_CTRL_PAGE, 0x79, 0x83); 
     282                robo_write16(ROBO_CTRL_PAGE, 0x79, 0); 
     283        } 
     284} 
    221285 
    222286static int robo_probe(char *devname) 
    223287{ 
    224288        __u32 phyid; 
    225  
    226         printk("Probing device %s: ", devname); 
    227         strcpy(ifr.ifr_name, devname); 
    228  
    229         if ((dev = dev_get_by_name(devname)) == NULL) { 
     289        unsigned int i; 
     290        int err; 
     291 
     292        printk(KERN_INFO PFX "Probing device %s: ", devname); 
     293        strcpy(robo.ifr.ifr_name, devname); 
     294 
     295        if ((robo.dev = dev_get_by_name(devname)) == NULL) { 
    230296                printk("No such device\n"); 
    231297                return 1; 
    232298        } 
    233299 
     300        robo.device = devname; 
     301        for (i = 0; i < 5; i++) 
     302                robo.port[i] = i; 
     303        robo.port[5] = 8; 
     304 
    234305        /* try access using MII ioctls - get phy address */ 
    235306        if (do_ioctl(SIOCGMIIPHY, NULL) < 0) { 
    236                 use_et = 1; 
     307                robo.use_et = 1; 
     308                robo.phy_addr = ROBO_PHY_ADDR; 
    237309        } else { 
    238310                /* got phy address check for robo address */ 
    239                 struct mii_ioctl_data *mii = (struct mii_ioctl_data *) &ifr.ifr_data; 
    240                 if (mii->phy_id != ROBO_PHY_ADDR) { 
     311                struct mii_ioctl_data *mii = (struct mii_ioctl_data *) &robo.ifr.ifr_data; 
     312                if ((mii->phy_id != ROBO_PHY_ADDR) && 
     313                    (mii->phy_id != ROBO_PHY_ADDR_TG3)) { 
    241314                        printk("Invalid phy address (%d)\n", mii->phy_id); 
    242315                        return 1; 
    243316                } 
    244         } 
    245  
    246         phyid = mdio_read(ROBO_PHY_ADDR, 0x2) |  
    247                 (mdio_read(ROBO_PHY_ADDR, 0x3) << 16); 
     317                robo.use_et = 0; 
     318                /* The robo has a fixed PHY address that is different from the 
     319                 * Tigon3 PHY address. */ 
     320                robo.phy_addr = ROBO_PHY_ADDR; 
     321        } 
     322 
     323        phyid = mdio_read(robo.phy_addr, 0x2) |  
     324                (mdio_read(robo.phy_addr, 0x3) << 16); 
    248325 
    249326        if (phyid == 0xffffffff || phyid == 0x55210022) { 
     
    251328                return 1; 
    252329        } 
    253          
    254         is_5350 = robo_vlan5350(); 
    255          
     330 
     331        /* Get the device ID */ 
     332        for (i = 0; i < 10; i++) { 
     333                robo.devid = robo_read16(ROBO_MGMT_PAGE, ROBO_DEVICE_ID); 
     334                if (robo.devid) 
     335                        break; 
     336                udelay(10); 
     337        } 
     338        if (!robo.devid) 
     339                robo.devid = ROBO_DEVICE_ID_5325; /* Fake it */ 
     340        robo.is_5350 = robo_vlan5350(); 
     341 
     342        robo_switch_reset(); 
     343        err = robo_switch_enable(); 
     344        if (err) 
     345                return err; 
     346 
    256347        printk("found!\n"); 
    257348        return 0; 
     
    267358        val16 = (nr) /* vlan */ | (0 << 12) /* read */ | (1 << 13) /* enable */; 
    268359         
    269         if (is_5350) { 
     360        if (robo.is_5350) { 
    270361                u32 val32; 
    271362                robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_TABLE_ACCESS_5350, val16); 
     
    333424        /* write config now */ 
    334425        val16 = (nr) /* vlan */ | (1 << 12) /* write */ | (1 << 13) /* enable */; 
    335         if (is_5350) { 
     426        if (robo.is_5350) { 
    336427                robo_write32(ROBO_VLAN_PAGE, ROBO_VLAN_WRITE_5350, 
    337428                        (1 << 20) /* valid */ | (c->untag << 6) | c->port); 
     
    396487 
    397488        /* reset vlans */ 
    398         for (j = 0; j <= (is_5350 ? VLAN_ID_MAX5350 : VLAN_ID_MAX); j++) { 
     489        for (j = 0; j <= ((robo.is_5350) ? VLAN_ID_MAX5350 : VLAN_ID_MAX); j++) { 
    399490                /* write config now */ 
    400491                val16 = (j) /* vlan */ | (1 << 12) /* write */ | (1 << 13) /* enable */; 
    401                 if (is_5350) 
     492                if (robo.is_5350) 
    402493                        robo_write32(ROBO_VLAN_PAGE, ROBO_VLAN_WRITE_5350, 0); 
    403494                else 
    404495                        robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_WRITE, 0); 
    405                 robo_write16(ROBO_VLAN_PAGE, (is_5350 ? ROBO_VLAN_TABLE_ACCESS_5350 : ROBO_VLAN_TABLE_ACCESS), val16); 
     496                robo_write16(ROBO_VLAN_PAGE, robo.is_5350 ? ROBO_VLAN_TABLE_ACCESS_5350 : 
     497                                                            ROBO_VLAN_TABLE_ACCESS, 
     498                             val16); 
    406499        } 
    407500 
    408501        /* reset ports to a known good state */ 
    409502        for (j = 0; j < d->ports; j++) { 
    410                 robo_write16(ROBO_CTRL_PAGE, port[j], 0x0000); 
     503                robo_write16(ROBO_CTRL_PAGE, robo.port[j], 0x0000); 
    411504                robo_write16(ROBO_VLAN_PAGE, ROBO_VLAN_PORT0_DEF_TAG + (j << 1), 0); 
    412505        } 
     
    424517{ 
    425518        int notfound = 1; 
     519        char *device; 
    426520 
    427521        device = strdup("ethX"); 
     
    435529                return -ENODEV; 
    436530        } else { 
    437                 switch_config cfg[] = { 
    438                         {"enable", handle_enable_read, handle_enable_write}, 
    439                         {"enable_vlan", handle_enable_vlan_read, handle_enable_vlan_write}, 
    440                         {"reset", NULL, handle_reset}, 
    441                         {NULL, NULL, NULL} 
     531                static const switch_config cfg[] = { 
     532                        { 
     533                                .name   = "enable", 
     534                                .read   = handle_enable_read, 
     535                                .write  = handle_enable_write 
     536                        }, { 
     537                                .name   = "enable_vlan", 
     538                                .read   = handle_enable_vlan_read, 
     539                                .write  = handle_enable_vlan_write 
     540                        }, { 
     541                                .name   = "reset", 
     542                                .read   = NULL, 
     543                                .write  = handle_reset 
     544                        }, { NULL, }, 
    442545                }; 
    443                 switch_config vlan[] = { 
    444                         {"ports", handle_vlan_port_read, handle_vlan_port_write}, 
    445                         {NULL, NULL, NULL} 
     546                static const switch_config vlan[] = { 
     547                        { 
     548                                .name   = "ports", 
     549                                .read   = handle_vlan_port_read, 
     550                                .write  = handle_vlan_port_write 
     551                        }, { NULL, }, 
    446552                }; 
    447553                switch_driver driver = { 
    448                         name: DRIVER_NAME, 
    449                         version: DRIVER_VERSION, 
    450                         interface: device, 
    451                         cpuport: 5, 
    452                         ports: 6, 
    453                         vlans: 16, 
    454                         driver_handlers: cfg, 
    455                         port_handlers: NULL, 
    456                         vlan_handlers: vlan, 
     554                        .name                   = DRIVER_NAME, 
     555                        .version                = DRIVER_VERSION, 
     556                        .interface              = device, 
     557                        .cpuport                = 5, 
     558                        .ports                  = 6, 
     559                        .vlans                  = 16, 
     560                        .driver_handlers        = cfg, 
     561                        .port_handlers          = NULL, 
     562                        .vlan_handlers          = vlan, 
    457563                }; 
    458564 
     
    464570{ 
    465571        switch_unregister_driver(DRIVER_NAME); 
    466         kfree(device); 
     572        kfree(robo.device); 
    467573} 
    468574 
  • trunk/target/linux/brcm47xx/patches-2.6.23/700-ssb-gigabit-ethernet-driver.patch

    r10521 r10531  
    913913=================================================================== 
    914914--- linux-2.6.23.16.orig/drivers/net/tg3.c      2008-02-22 19:40:57.000000000 +0100 
    915 +++ linux-2.6.23.16/drivers/net/tg3.c   2008-02-23 20:02:58.000000000 +0100 
     915+++ linux-2.6.23.16/drivers/net/tg3.c   2008-02-27 23:18:31.000000000 +0100 
    916916@@ -38,6 +38,7 @@ 
    917917 #include <linux/workqueue.h> 
     
    934934 } 
    935935  
    936 @@ -1988,6 +1990,14 @@ static int tg3_setup_copper_phy(struct t 
     936@@ -623,7 +625,7 @@ static void tg3_switch_clocks(struct tg3 
     937  
     938 #define PHY_BUSY_LOOPS 5000 
     939  
     940-static int tg3_readphy(struct tg3 *tp, int reg, u32 *val) 
     941+static int __tg3_readphy(struct tg3 *tp, unsigned int phy_addr, int reg, u32 *val) 
     942 { 
     943        u32 frame_val; 
     944        unsigned int loops; 
     945@@ -637,7 +639,7 @@ static int tg3_readphy(struct tg3 *tp, i 
     946  
     947        *val = 0x0; 
     948  
     949-       frame_val  = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) & 
     950+       frame_val  = ((phy_addr << MI_COM_PHY_ADDR_SHIFT) & 
     951                      MI_COM_PHY_ADDR_MASK); 
     952        frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) & 
     953                      MI_COM_REG_ADDR_MASK); 
     954@@ -672,7 +674,12 @@ static int tg3_readphy(struct tg3 *tp, i 
     955        return ret; 
     956 } 
     957  
     958-static int tg3_writephy(struct tg3 *tp, int reg, u32 val) 
     959+static int tg3_readphy(struct tg3 *tp, int reg, u32 *val) 
     960+{ 
     961+       return __tg3_readphy(tp, PHY_ADDR, reg, val); 
     962+} 
     963+ 
     964+static int __tg3_writephy(struct tg3 *tp, unsigned int phy_addr, int reg, u32 val) 
     965 { 
     966        u32 frame_val; 
     967        unsigned int loops; 
     968@@ -688,7 +695,7 @@ static int tg3_writephy(struct tg3 *tp,  
     969                udelay(80); 
     970        } 
     971  
     972-       frame_val  = ((PHY_ADDR << MI_COM_PHY_ADDR_SHIFT) & 
     973+       frame_val  = ((phy_addr << MI_COM_PHY_ADDR_SHIFT) & 
     974                      MI_COM_PHY_ADDR_MASK); 
     975        frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) & 
     976                      MI_COM_REG_ADDR_MASK); 
     977@@ -721,6 +728,11 @@ static int tg3_writephy(struct tg3 *tp,  
     978        return ret; 
     979 } 
     980  
     981+static int tg3_writephy(struct tg3 *tp, int reg, u32 val) 
     982+{ 
     983+       return __tg3_writephy(tp, PHY_ADDR, reg, val); 
     984+} 
     985+ 
     986 static void tg3_phy_toggle_automdix(struct tg3 *tp, int enable) 
     987 { 
     988        u32 phy; 
     989@@ -1988,6 +2000,14 @@ static int tg3_setup_copper_phy(struct t 
    937990                tp->link_config.active_duplex = current_duplex; 
    938991        } 
     
    9491002            (tp->link_config.active_duplex == DUPLEX_FULL) && 
    9501003            (tp->link_config.autoneg == AUTONEG_ENABLE)) { 
    951 @@ -4813,6 +4823,11 @@ static int tg3_poll_fw(struct tg3 *tp) 
     1004@@ -4813,6 +4833,11 @@ static int tg3_poll_fw(struct tg3 *tp) 
    9521005        int i; 
    9531006        u32 val; 
     
    9611014                /* Wait up to 20ms for init done. */ 
    9621015                for (i = 0; i < 200; i++) { 
    963 @@ -5040,6 +5055,14 @@ static int tg3_chip_reset(struct tg3 *tp 
     1016@@ -5040,6 +5065,14 @@ static int tg3_chip_reset(struct tg3 *tp 
    9641017                tw32(0x5000, 0x400); 
    9651018        } 
     
    9761029  
    9771030        if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A0) { 
    978 @@ -5308,9 +5331,12 @@ static int tg3_halt_cpu(struct tg3 *tp,  
     1031@@ -5308,9 +5341,12 @@ static int tg3_halt_cpu(struct tg3 *tp,  
    9791032                return -ENODEV; 
    9801033        } 
     
    9921045 } 
    9931046  
    994 @@ -5391,6 +5417,11 @@ static int tg3_load_5701_a0_firmware_fix 
     1047@@ -5391,6 +5427,11 @@ static int tg3_load_5701_a0_firmware_fix 
    9951048        struct fw_info info; 
    9961049        int err, i; 
     
    10041057        info.text_len = TG3_FW_TEXT_LEN; 
    10051058        info.text_data = &tg3FwText[0]; 
    1006 @@ -5949,6 +5980,11 @@ static int tg3_load_tso_firmware(struct  
     1059@@ -5949,6 +5990,11 @@ static int tg3_load_tso_firmware(struct  
    10071060        unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size; 
    10081061        int err, i; 
     
    10161069                return 0; 
    10171070  
    1018 @@ -6850,6 +6886,11 @@ static void tg3_timer(unsigned long __op 
     1071@@ -6850,6 +6896,11 @@ static void tg3_timer(unsigned long __op 
    10191072  
    10201073        spin_lock(&tp->lock); 
     
    10281081                /* All of this garbage is because when using non-tagged 
    10291082                 * IRQ status the mailbox/status_block protocol the chip 
    1030 @@ -8432,6 +8473,11 @@ static int tg3_test_nvram(struct tg3 *tp 
     1083@@ -8432,6 +8483,11 @@ static int tg3_test_nvram(struct tg3 *tp 
    10311084        u32 *buf, csum, magic; 
    10321085        int i, j, err = 0, size; 
     
    10401093                return -EIO; 
    10411094  
    1042 @@ -9571,6 +9617,12 @@ static void __devinit tg3_get_5906_nvram 
     1095@@ -9154,7 +9210,7 @@ static int tg3_ioctl(struct net_device * 
     1096                        return -EAGAIN; 
     1097  
     1098                spin_lock_bh(&tp->lock); 
     1099-               err = tg3_readphy(tp, data->reg_num & 0x1f, &mii_regval); 
     1100+               err = __tg3_readphy(tp, data->phy_id & 0x1f, data->reg_num & 0x1f, &mii_regval); 
     1101                spin_unlock_bh(&tp->lock); 
     1102  
     1103                data->val_out = mii_regval; 
     1104@@ -9173,7 +9229,7 @@ static int tg3_ioctl(struct net_device * 
     1105                        return -EAGAIN; 
     1106  
     1107                spin_lock_bh(&tp->lock); 
     1108-               err = tg3_writephy(tp, data->reg_num & 0x1f, data->val_in); 
     1109+               err = __tg3_writephy(tp, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in); 
     1110                spin_unlock_bh(&tp->lock); 
     1111  
     1112                return err; 
     1113@@ -9571,6 +9627,12 @@ static void __devinit tg3_get_5906_nvram 
    10431114 /* Chips other than 5700/5701 use the NVRAM for fetching info. */ 
    10441115 static void __devinit tg3_nvram_init(struct tg3 *tp) 
     
    10531124             (EEPROM_ADDR_FSM_RESET | 
    10541125              (EEPROM_DEFAULT_CLOCK_PERIOD << 
    1055 @@ -9706,6 +9758,9 @@ static int tg3_nvram_read(struct tg3 *tp 
     1126@@ -9706,6 +9768,9 @@ static int tg3_nvram_read(struct tg3 *tp 
    10561127 { 
    10571128        int ret; 
     
    10631134                return tg3_nvram_read_using_eeprom(tp, offset, val); 
    10641135  
    1065 @@ -9938,6 +9993,9 @@ static int tg3_nvram_write_block(struct  
     1136@@ -9938,6 +10003,9 @@ static int tg3_nvram_write_block(struct  
    10661137 { 
    10671138        int ret; 
     
    10731144                tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl & 
    10741145                       ~GRC_LCLCTRL_GPIO_OUTPUT1); 
    1075 @@ -10804,7 +10862,6 @@ static int __devinit tg3_get_invariants( 
     1146@@ -10804,7 +10872,6 @@ static int __devinit tg3_get_invariants( 
    10761147                tp->write32 = tg3_write_flush_reg32; 
    10771148        } 
     
    10811152            (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)) { 
    10821153                tp->write32_tx_mbox = tg3_write32_tx_mbox; 
    1083 @@ -10840,6 +10897,11 @@ static int __devinit tg3_get_invariants( 
     1154@@ -10840,6 +10907,11 @@ static int __devinit tg3_get_invariants( 
    10841155              GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701))) 
    10851156                tp->tg3_flags |= TG3_FLAG_SRAM_USE_CONFIG; 
     
    10931164         * In particular, the TG3_FLG2_IS_NIC flag must be 
    10941165         * determined before calling tg3_set_power_state() so that 
    1095 @@ -11184,6 +11246,10 @@ static int __devinit tg3_get_device_addr 
     1166@@ -11184,6 +11256,10 @@ static int __devinit tg3_get_device_addr 
    10961167        } 
    10971168  
     
    11041175                if (!tg3_get_default_macaddr_sparc(tp)) 
    11051176                        return 0; 
    1106 @@ -11675,6 +11741,7 @@ static char * __devinit tg3_phy_string(s 
     1177@@ -11675,6 +11751,7 @@ static char * __devinit tg3_phy_string(s 
    11071178        case PHY_ID_BCM5704:    return "5704"; 
    11081179        case PHY_ID_BCM5705:    return "5705"; 
     
    11121183        case PHY_ID_BCM5714:    return "5714"; 
    11131184        case PHY_ID_BCM5780:    return "5780"; 
    1114 @@ -11859,6 +11926,13 @@ static int __devinit tg3_init_one(struct 
     1185@@ -11859,6 +11936,13 @@ static int __devinit tg3_init_one(struct 
    11151186                tp->msg_enable = tg3_debug; 
    11161187        else 
     
    11291200=================================================================== 
    11301201--- linux-2.6.23.16.orig/drivers/net/tg3.h      2008-02-22 19:40:57.000000000 +0100 
    1131 +++ linux-2.6.23.16/drivers/net/tg3.h   2008-02-23 19:35:15.000000000 +0100 
     1202+++ linux-2.6.23.16/drivers/net/tg3.h   2008-02-23 20:56:08.000000000 +0100 
    11321203@@ -2279,6 +2279,10 @@ struct tg3 { 
    11331204 #define TG3_FLG2_PHY_JITTER_BUG                0x20000000 
Note: See TracChangeset for help on using the changeset viewer.