b43: N-PHY: turn radio on/off (rfkill)
[safe/jmp/linux-2.6] / drivers / net / cxgb3 / t3_hw.c
index 505a187..3ab9f51 100644 (file)
@@ -526,6 +526,11 @@ static const struct adapter_info t3_adap_info[] = {
         F_GPIO10_OEN | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL,
         { S_GPIO9 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
         &mi1_mdio_ext_ops, "Chelsio T310" },
+       {1, 0, 0,
+        F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN |
+        F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL,
+        { S_GPIO9 }, SUPPORTED_10000baseT_Full | SUPPORTED_AUI,
+        &mi1_mdio_ext_ops, "Chelsio N320E-G2" },
 };
 
 /*
@@ -552,6 +557,8 @@ static const struct port_type_info port_types[] = {
        { t3_qt2045_phy_prep },
        { t3_ael1006_phy_prep },
        { NULL },
+       { t3_aq100x_phy_prep },
+       { t3_ael2020_phy_prep },
 };
 
 #define VPD_ENTRY(name, len) \
@@ -1255,7 +1262,8 @@ void t3_link_changed(struct adapter *adapter, int port_id)
                lc->fc = fc;
        }
 
-       t3_os_link_changed(adapter, port_id, link_ok, speed, duplex, fc);
+       t3_os_link_changed(adapter, port_id, link_ok && !pi->link_fault,
+                          speed, duplex, fc);
 }
 
 void t3_link_fault(struct adapter *adapter, int port_id)
@@ -1281,6 +1289,11 @@ void t3_link_fault(struct adapter *adapter, int port_id)
                                 A_XGM_INT_STATUS + mac->offset);
        link_fault &= F_LINKFAULTCHANGE;
 
+       link_ok = lc->link_ok;
+       speed = lc->speed;
+       duplex = lc->duplex;
+       fc = lc->fc;
+
        phy->ops->get_link_status(phy, &link_ok, &speed, &duplex, &fc);
 
        if (link_fault) {
@@ -3453,7 +3466,7 @@ static void config_pcie(struct adapter *adap)
                {201, 321, 258, 450, 834, 1602}
        };
 
-       u16 val;
+       u16 val, devid;
        unsigned int log2_width, pldsize;
        unsigned int fst_trn_rx, fst_trn_tx, acklat, rpllmt;
 
@@ -3461,6 +3474,17 @@ static void config_pcie(struct adapter *adap)
                             adap->params.pci.pcie_cap_addr + PCI_EXP_DEVCTL,
                             &val);
        pldsize = (val & PCI_EXP_DEVCTL_PAYLOAD) >> 5;
+
+       pci_read_config_word(adap->pdev, 0x2, &devid);
+       if (devid == 0x37) {
+               pci_write_config_word(adap->pdev,
+                                     adap->params.pci.pcie_cap_addr +
+                                     PCI_EXP_DEVCTL,
+                                     val & ~PCI_EXP_DEVCTL_READRQ &
+                                     ~PCI_EXP_DEVCTL_PAYLOAD);
+               pldsize = 0;
+       }
+
        pci_read_config_word(adap->pdev,
                             adap->params.pci.pcie_cap_addr + PCI_EXP_LNKCTL,
                             &val);
@@ -3669,7 +3693,13 @@ static void mc7_prep(struct adapter *adapter, struct mc7 *mc7,
 
 void mac_prep(struct cmac *mac, struct adapter *adapter, int index)
 {
+       u16 devid;
+
        mac->adapter = adapter;
+       pci_read_config_word(adapter->pdev, 0x2, &devid);
+
+       if (devid == 0x37 && !adapter->params.vpd.xauicfg[1])
+               index = 0;
        mac->offset = (XGMAC0_1_BASE_ADDR - XGMAC0_0_BASE_ADDR) * index;
        mac->nucast = 1;
 
@@ -3866,11 +3896,11 @@ int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai,
                        return -EINVAL;
                }
 
+               p->phy.mdio.dev = adapter->port[i];
                ret = pti->phy_prep(&p->phy, adapter, ai->phy_base_addr + j,
                                    ai->mdio_ops);
                if (ret)
                        return ret;
-               p->phy.mdio.dev = adapter->port[i];
                mac_prep(&p->mac, adapter, j);
 
                /*