I'm looking for people with one of the following unsupported Intel
wireless chips:

Intel Centrino Wireless-N 2200 (shows up as Wireless-N 2000 in dmesg)
Intel Centrino Wireless-N 135
Intel Centrino Wireless-N 105

If you have one of these, please try the attached diff.  It might give
you a working iwn(4).

Thanks,

Mark


Index: if_iwn.c
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/if_iwn.c,v
retrieving revision 1.128
diff -u -p -r1.128 if_iwn.c
--- if_iwn.c    10 Feb 2014 19:08:58 -0000      1.128
+++ if_iwn.c    10 Feb 2014 21:34:41 -0000
@@ -96,6 +96,12 @@ static const struct pci_matchid iwn_devi
        { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_6235_2 },
        { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_2030_1 },
        { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_2030_2 },
+       { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_2000_1 },
+       { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_2000_2 },
+       { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_135_1 },
+       { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_135_2 },
+       { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_105_1 },
+       { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_105_2 },
 };
 
 int            iwn_match(struct device *, void *, void *);
@@ -364,7 +370,7 @@ iwn_attach(struct device *parent, struct
        printf(": %s", intrstr);
 
        /* Read hardware revision and attach. */
-       sc->hw_type = (IWN_READ(sc, IWN_HW_REV) >> 4) & 0xf;
+       sc->hw_type = (IWN_READ(sc, IWN_HW_REV) >> 4) & 0x1f;
        if (sc->hw_type == IWN_HW_REV_TYPE_4965)
                error = iwn4965_attach(sc, PCI_PRODUCT(pa->pa_id));
        else
@@ -659,6 +665,19 @@ iwn5000_attach(struct iwn_softc *sc, pci
                sc->fwname = "iwn-2030";
                sc->sc_flags |= IWN_FLAG_ADV_BT_COEX;
                break;
+       case IWN_HW_REV_TYPE_2000:
+               sc->limits = &iwn2000_sensitivity_limits;
+               sc->fwname = "iwn-2000";
+               break;
+       case IWN_HW_REV_TYPE_135:
+               sc->limits = &iwn2000_sensitivity_limits;
+               sc->fwname = "iwn-135";
+               sc->sc_flags |= IWN_FLAG_ADV_BT_COEX;
+               break;
+       case IWN_HW_REV_TYPE_105:
+               sc->limits = &iwn2000_sensitivity_limits;
+               sc->fwname = "iwn-105";
+               break;
        default:
                printf(": adapter type %d not supported\n", sc->hw_type);
                return ENOTSUP;
@@ -1537,7 +1556,10 @@ iwn5000_read_eeprom(struct iwn_softc *sc
            hdr.version, hdr.pa_type, letoh16(hdr.volt)));
        sc->calib_ver = hdr.version;
 
-       if (sc->hw_type == IWN_HW_REV_TYPE_2030) {
+       if (sc->hw_type == IWN_HW_REV_TYPE_2030 ||
+           sc->hw_type == IWN_HW_REV_TYPE_2000 ||
+           sc->hw_type == IWN_HW_REV_TYPE_135 ||
+           sc->hw_type == IWN_HW_REV_TYPE_105) {
                sc->eeprom_voltage = letoh16(hdr.volt);
                iwn_read_prom_data(sc, base + IWN5000_EEPROM_TEMP, &val, 2);
                sc->eeprom_temp = letoh16(val);
@@ -2112,7 +2134,10 @@ iwn5000_rx_calib_results(struct iwn_soft
        switch (calib->code) {
        case IWN5000_PHY_CALIB_DC:
                if (sc->hw_type == IWN_HW_REV_TYPE_5150 ||
-                   sc->hw_type == IWN_HW_REV_TYPE_2030)
+                   sc->hw_type == IWN_HW_REV_TYPE_2030 ||
+                   sc->hw_type == IWN_HW_REV_TYPE_2000 ||
+                   sc->hw_type == IWN_HW_REV_TYPE_135 ||
+                   sc->hw_type == IWN_HW_REV_TYPE_105)
                        idx = 0;
                break;
        case IWN5000_PHY_CALIB_LO:
@@ -4181,7 +4206,8 @@ iwn_send_advanced_btcoex(struct iwn_soft
        struct iwn_btcoex_prot btprot;
        int error, i;
 
-       if (sc->hw_type == IWN_HW_REV_TYPE_2030) {
+       if (sc->hw_type == IWN_HW_REV_TYPE_2030 ||
+           sc->hw_type == IWN_HW_REV_TYPE_135) {
                struct iwn2000_btcoex_config btconfig;
 
                memset(&btconfig, 0, sizeof btconfig);
@@ -4284,7 +4310,12 @@ iwn_config(struct iwn_softc *sc)
                            sc->sc_dev.dv_xname);
                        return error;
                }
-       } else if (sc->hw_type == IWN_HW_REV_TYPE_2030) {
+       }
+
+       if (sc->hw_type == IWN_HW_REV_TYPE_2030 ||
+           sc->hw_type == IWN_HW_REV_TYPE_2000 ||
+           sc->hw_type == IWN_HW_REV_TYPE_135 ||
+           sc->hw_type == IWN_HW_REV_TYPE_105) {
                error = iwn2000_temp_offset_calib(sc);
                if (error != 0) {
                        printf("%s: could not set temperature offset\n",
@@ -5783,7 +5814,10 @@ iwn5000_nic_config(struct iwn_softc *sc)
        }
        if (sc->hw_type == IWN_HW_REV_TYPE_6005)
                IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_6050_1X2);
-       if (sc->hw_type == IWN_HW_REV_TYPE_2030)
+       if (sc->hw_type == IWN_HW_REV_TYPE_2030 ||
+           sc->hw_type == IWN_HW_REV_TYPE_2000 ||
+           sc->hw_type == IWN_HW_REV_TYPE_135 ||
+           sc->hw_type == IWN_HW_REV_TYPE_105)
                IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_RADIO_IQ_INVERT);
        return 0;
 }
Index: if_iwnreg.h
===================================================================
RCS file: /home/cvs/src/sys/dev/pci/if_iwnreg.h,v
retrieving revision 1.46
diff -u -p -r1.46 if_iwnreg.h
--- if_iwnreg.h 10 Feb 2014 19:08:58 -0000      1.46
+++ if_iwnreg.h 10 Feb 2014 21:04:55 -0000
@@ -195,7 +195,7 @@
 
 /* Possible flags for register IWN_HW_REV. */
 #define IWN_HW_REV_TYPE_SHIFT  4
-#define IWN_HW_REV_TYPE_MASK   0x000000f0
+#define IWN_HW_REV_TYPE_MASK   0x000001f0
 #define IWN_HW_REV_TYPE_4965   0
 #define IWN_HW_REV_TYPE_5300   2
 #define IWN_HW_REV_TYPE_5350   3
@@ -206,6 +206,10 @@
 #define IWN_HW_REV_TYPE_6050   8
 #define IWN_HW_REV_TYPE_6005   11
 #define IWN_HW_REV_TYPE_2030   12
+#define IWN_HW_REV_TYPE_2000   16
+#define IWN_HW_REV_TYPE_105    17
+#define IWN_HW_REV_TYPE_135    18
+
 
 /* Possible flags for register IWN_GIO_CHICKEN. */
 #define IWN_GIO_CHICKEN_L1A_NO_L0S_RX  (1 << 23)

Reply via email to