mwl8k: disable softirqs when accessing sta_notify_list
[safe/jmp/linux-2.6] / drivers / net / chelsio / mv88x201x.c
index db50342..f7136b2 100644 (file)
@@ -53,7 +53,7 @@ static int led_init(struct cphy *cphy)
         * Writing these bits maps control to another
         * register. mmd(0x1) addr(0x7)
         */
-       mdio_write(cphy, 0x3, 0x8304, 0xdddd);
+       cphy_mdio_write(cphy, MDIO_MMD_PCS, 0x8304, 0xdddd);
        return 0;
 }
 
@@ -62,14 +62,14 @@ static int led_link(struct cphy *cphy, u32 do_enable)
        u32 led = 0;
 #define LINK_ENABLE_BIT 0x1
 
-       mdio_read(cphy, 0x1, 0x7, &led);
+       cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_CTRL2, &led);
 
        if (do_enable & LINK_ENABLE_BIT) {
                led |= LINK_ENABLE_BIT;
-               mdio_write(cphy, 0x1, 0x7, led);
+               cphy_mdio_write(cphy, MDIO_MMD_PMAPMD, MDIO_CTRL2, led);
        } else {
                led &= ~LINK_ENABLE_BIT;
-               mdio_write(cphy, 0x1, 0x7, led);
+               cphy_mdio_write(cphy, MDIO_MMD_PMAPMD, MDIO_CTRL2, led);
        }
        return 0;
 }
@@ -85,29 +85,34 @@ static int mv88x201x_reset(struct cphy *cphy, int wait)
 
 static int mv88x201x_interrupt_enable(struct cphy *cphy)
 {
-       u32 elmer;
-
        /* Enable PHY LASI interrupts. */
-       mdio_write(cphy, 0x1, 0x9002, 0x1);
+       cphy_mdio_write(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_CTRL,
+                       MDIO_PMA_LASI_LSALARM);
 
        /* Enable Marvell interrupts through Elmer0. */
-       t1_tpi_read(cphy->adapter, A_ELMER0_INT_ENABLE, &elmer);
-       elmer |= ELMER0_GP_BIT6;
-       t1_tpi_write(cphy->adapter, A_ELMER0_INT_ENABLE, elmer);
+       if (t1_is_asic(cphy->adapter)) {
+               u32 elmer;
+
+               t1_tpi_read(cphy->adapter, A_ELMER0_INT_ENABLE, &elmer);
+               elmer |= ELMER0_GP_BIT6;
+               t1_tpi_write(cphy->adapter, A_ELMER0_INT_ENABLE, elmer);
+       }
        return 0;
 }
 
 static int mv88x201x_interrupt_disable(struct cphy *cphy)
 {
-       u32 elmer;
-
        /* Disable PHY LASI interrupts. */
-       mdio_write(cphy, 0x1, 0x9002, 0x0);
+       cphy_mdio_write(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_CTRL, 0x0);
 
        /* Disable Marvell interrupts through Elmer0. */
-       t1_tpi_read(cphy->adapter, A_ELMER0_INT_ENABLE, &elmer);
-       elmer &= ~ELMER0_GP_BIT6;
-       t1_tpi_write(cphy->adapter, A_ELMER0_INT_ENABLE, elmer);
+       if (t1_is_asic(cphy->adapter)) {
+               u32 elmer;
+
+               t1_tpi_read(cphy->adapter, A_ELMER0_INT_ENABLE, &elmer);
+               elmer &= ~ELMER0_GP_BIT6;
+               t1_tpi_write(cphy->adapter, A_ELMER0_INT_ENABLE, elmer);
+       }
        return 0;
 }
 
@@ -118,31 +123,33 @@ static int mv88x201x_interrupt_clear(struct cphy *cphy)
 
 #ifdef MV88x2010_LINK_STATUS_BUGS
        /* Required to read twice before clear takes affect. */
-       mdio_read(cphy, 0x1, 0x9003, &val);
-       mdio_read(cphy, 0x1, 0x9004, &val);
-       mdio_read(cphy, 0x1, 0x9005, &val);
+       cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_RXSTAT, &val);
+       cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_TXSTAT, &val);
+       cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_STAT, &val);
 
        /* Read this register after the others above it else
         * the register doesn't clear correctly.
         */
-       mdio_read(cphy, 0x1, 0x1, &val);
+       cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_STAT1, &val);
 #endif
 
        /* Clear link status. */
-       mdio_read(cphy, 0x1, 0x1, &val);
+       cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_STAT1, &val);
        /* Clear PHY LASI interrupts. */
-       mdio_read(cphy, 0x1, 0x9005, &val);
+       cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_STAT, &val);
 
 #ifdef MV88x2010_LINK_STATUS_BUGS
        /* Do it again. */
-       mdio_read(cphy, 0x1, 0x9003, &val);
-       mdio_read(cphy, 0x1, 0x9004, &val);
+       cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_RXSTAT, &val);
+       cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_TXSTAT, &val);
 #endif
 
        /* Clear Marvell interrupts through Elmer0. */
-       t1_tpi_read(cphy->adapter, A_ELMER0_INT_CAUSE, &elmer);
-       elmer |= ELMER0_GP_BIT6;
-       t1_tpi_write(cphy->adapter, A_ELMER0_INT_CAUSE, elmer);
+       if (t1_is_asic(cphy->adapter)) {
+               t1_tpi_read(cphy->adapter, A_ELMER0_INT_CAUSE, &elmer);
+               elmer |= ELMER0_GP_BIT6;
+               t1_tpi_write(cphy->adapter, A_ELMER0_INT_CAUSE, elmer);
+       }
        return 0;
 }
 
@@ -166,13 +173,12 @@ static int mv88x201x_get_link_status(struct cphy *cphy, int *link_ok,
                                     int *speed, int *duplex, int *fc)
 {
        u32 val = 0;
-#define LINK_STATUS_BIT 0x4
 
        if (link_ok) {
                /* Read link status. */
-               mdio_read(cphy, 0x1, 0x1, &val);
-               val &= LINK_STATUS_BIT;
-               *link_ok = (val == LINK_STATUS_BIT);
+               cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_STAT1, &val);
+               val &= MDIO_STAT1_LSTATUS;
+               *link_ok = (val == MDIO_STAT1_LSTATUS);
                /* Turn on/off Link LED */
                led_link(cphy, *link_ok);
        }
@@ -199,26 +205,28 @@ static struct cphy_ops mv88x201x_ops = {
        .interrupt_handler = mv88x201x_interrupt_handler,
        .get_link_status   = mv88x201x_get_link_status,
        .set_loopback      = mv88x201x_set_loopback,
+       .mmds              = (MDIO_DEVS_PMAPMD | MDIO_DEVS_PCS |
+                             MDIO_DEVS_PHYXS | MDIO_DEVS_WIS),
 };
 
-static struct cphy *mv88x201x_phy_create(adapter_t *adapter, int phy_addr,
-                                        struct mdio_ops *mdio_ops)
+static struct cphy *mv88x201x_phy_create(struct net_device *dev, int phy_addr,
+                                        const struct mdio_ops *mdio_ops)
 {
        u32 val;
-       struct cphy *cphy = kmalloc(sizeof(*cphy), GFP_KERNEL);
+       struct cphy *cphy = kzalloc(sizeof(*cphy), GFP_KERNEL);
 
        if (!cphy)
                return NULL;
-       memset(cphy, 0, sizeof(*cphy));
-       cphy_init(cphy, adapter, phy_addr, &mv88x201x_ops, mdio_ops);
+
+       cphy_init(cphy, dev, phy_addr, &mv88x201x_ops, mdio_ops);
 
        /* Commands the PHY to enable XFP's clock. */
-       mdio_read(cphy, 0x3, 0x8300, &val);
-       mdio_write(cphy, 0x3, 0x8300, val | 1);
+       cphy_mdio_read(cphy, MDIO_MMD_PCS, 0x8300, &val);
+       cphy_mdio_write(cphy, MDIO_MMD_PCS, 0x8300, val | 1);
 
        /* Clear link status. Required because of a bug in the PHY.  */
-       mdio_read(cphy, 0x1, 0x8, &val);
-       mdio_read(cphy, 0x3, 0x8, &val);
+       cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_STAT2, &val);
+       cphy_mdio_read(cphy, MDIO_MMD_PCS, MDIO_STAT2, &val);
 
        /* Allows for Link,Ack LED turn on/off */
        led_init(cphy);
@@ -246,7 +254,7 @@ static int mv88x201x_phy_reset(adapter_t *adapter)
        return 0;
 }
 
-struct gphy t1_mv88x201x_ops = {
-       mv88x201x_phy_create,
-       mv88x201x_phy_reset
+const struct gphy t1_mv88x201x_ops = {
+       .create = mv88x201x_phy_create,
+       .reset = mv88x201x_phy_reset
 };