Hi Stefan,

sorry, I'm not sure how I can get the sc_hw_rev value.
Hopefully this is the requested value:

iwx0: hw rev 0x350, fw ver 67.8f59b80b.0

Best regards,
Sven

On 4/9/22 11:35, Stefan Sperling wrote:
On Sat, Apr 09, 2022 at 12:31:09AM +0200, Sven Wolf wrote:
Hi Stefan,

on my device WL_22500_8 0x4df0 this patch doesn't work directly.
I get the error message:
iwx0: could not load firmware, 35
iwx0: failed to load init firmware

Under Linux the firmware iwlwifi-QuZ-a0-hr-b0-67.ucode is loaded for this
device. Also my old patch
(https://marc.info/?l=openbsd-bugs&m=164201744804674&w=2) works with the
firmware for the WL_22500_5 devices.

With this small patch to your patch, wireless is working.

*** 9829,9834 ****
--- 9829,9835 ----
                break;
        case PCI_PRODUCT_INTEL_WL_22500_2:
        case PCI_PRODUCT_INTEL_WL_22500_5:
+       case PCI_PRODUCT_INTEL_WL_22500_8:
                /* These devices should be QuZ only. */
                if (sc->sc_hw_rev != IWX_CSR_HW_REV_TYPE_QUZ) {
                        printf("%s: unsupported AX201 adapter\n", DEVNAME(sc));
***************
*** 9858,9864 ****
                break;
        case PCI_PRODUCT_INTEL_WL_22500_4:
        case PCI_PRODUCT_INTEL_WL_22500_7:
-       case PCI_PRODUCT_INTEL_WL_22500_8:
                if (sc->sc_hw_rev != IWX_CSR_HW_REV_TYPE_QUZ)

Thanks Sven!

What is the value of sc_hw_rev on this 0x4df0 device?

                        sc->sc_fwname = IWX_QU_B_HR_B_FW;
                else
--- 9859,9864 ----


Thanks,
Sven



On 4/8/22 14:40, Stefan Sperling wrote:
On Tue, Jan 11, 2022 at 10:33:39PM +0000, Iraklis Karagkiozoglou wrote:
Hello Stefan,

I tried to port the firmware detection and config values
from iwlwifi.

On iwx_cfg_trans_params and iwx_cfg structs I ported only
the fields iwx_attach was setting based on the iwx_device.

With best regards,
Iraklis Karagkiozoglou

Hi Iraklis,

It took me some time to get back to this, sorry about that.

The new patch below attempts to add support for any AX200/AX201 devices
which have firmware available in fw_update(4). This will hopefully cover
devices which people have reported as not detected and which should
already be working as long as we load the correct firmware image.

This new patch is based on your patch from January.
Thank you very much for doing the initial work on this.

After studying the Linux driver for some time I believe the following
approach could work for us: We only need a table for devices which
require overrides that cannot be detected on PCI vendor/product ID alone.
The rest of the Linux driver's table is not needed. We can simply set
default values based on the PCI vendor/product ID as we have always done.

My AX200 and AX201 devices are still working fine with this.
Tests on more devices would be very welcome, especially ones that are
not yet detected in -current.


diff refs/heads/master refs/heads/iwx-match
blob - df5614f9f6140ba069db8d60e724b1ab36d124a2
blob + 69f489127b1a6898d12f5f5b2683cb7b3558293b
--- share/man/man4/iwx.4
+++ share/man/man4/iwx.4
@@ -84,8 +84,12 @@ which are loaded when an interface is brought up:
   .Pp
   .Bl -tag -width Ds -offset indent -compact
   .It Pa /etc/firmware/iwx-cc-a0-67
-.It Pa /etc/firmware/iwx-QuZ-a0-hr-b0-67
+.It Pa /etc/firmware/iwx-Qu-b0-hr-b0-63
+.It Pa /etc/firmware/iwx-Qu-b0-jf-b0-63
   .It Pa /etc/firmware/iwx-Qu-c0-hr-b0-63
+.It Pa /etc/firmware/iwx-Qu-c0-jf-b0-63
+.It Pa /etc/firmware/iwx-QuZ-a0-hr-b0-67
+.It Pa /etc/firmware/iwx-QuZ-a0-jf-b0-63
   .El
   .Pp
   These firmware files are not free because Intel refuses to grant
blob - 11f582e67321c9782b9cb38e6ce948b465522c94
blob + 9ffa40d1606fc261ed610984b82e0dbcada90340
--- sys/dev/pci/if_iwx.c
+++ sys/dev/pci/if_iwx.c
@@ -491,6 +491,7 @@ int iwx_intr_msix(void *);
   int  iwx_match(struct device *, void *, void *);
   int  iwx_preinit(struct iwx_softc *);
   void iwx_attach_hook(struct device *);
+const struct iwx_device_cfg *iwx_find_device_cfg(struct iwx_softc *);
   void iwx_attach(struct device *, struct device *, void *);
   void iwx_init_task(void *);
   int  iwx_activate(struct device *, int);
@@ -870,7 +871,7 @@ iwx_ctxt_info_init(struct iwx_softc *sc, const struct
        /* size is in DWs */
        ctxt_info->version.size = htole16(sizeof(*ctxt_info) / 4);
-       if (sc->sc_device_family >= IWX_DEVICE_FAMILY_22560)
+       if (sc->sc_device_family >= IWX_DEVICE_FAMILY_AX210)
                rb_size = IWX_CTXT_INFO_RB_SIZE_2K;
        else
                rb_size = IWX_CTXT_INFO_RB_SIZE_4K;
@@ -9392,61 +9393,192 @@ static const struct pci_matchid iwx_devices[] = {
        { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_3 },
        { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_4,},
        { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_5,},
+       { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_6,},
+       { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_7,},
+       { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_8,},
   };
-static const struct pci_matchid iwx_subsystem_id_ax201[] = {
-       { PCI_VENDOR_INTEL,     0x0070 },
-       { PCI_VENDOR_INTEL,     0x0074 },
-       { PCI_VENDOR_INTEL,     0x0078 },
-       { PCI_VENDOR_INTEL,     0x007c },
-       { PCI_VENDOR_INTEL,     0x0310 },
-       { PCI_VENDOR_INTEL,     0x2074 },
-       { PCI_VENDOR_INTEL,     0x4070 },
-       /* TODO: There are more ax201 devices with "main" product ID 0x06f0 */
-};
   int
   iwx_match(struct device *parent, iwx_match_t match __unused, void *aux)
   {
        struct pci_attach_args *pa = aux;
-       pcireg_t subid;
-       pci_vendor_id_t svid;
-       pci_product_id_t spid;
-       int i;
-
-       if (!pci_matchbyid(pa, iwx_devices, nitems(iwx_devices)))
-               return 0;
-
-       /*
-        * Some PCI product IDs are shared among devices which use distinct
-        * chips or firmware. We need to match the subsystem ID as well to
-        * ensure that we have in fact found a supported device.
-        */
-       subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
-       svid = PCI_VENDOR(subid);
-       spid = PCI_PRODUCT(subid);
-
-       switch (PCI_PRODUCT(pa->pa_id)) {
-       case PCI_PRODUCT_INTEL_WL_22500_1: /* AX200 */
-               return 1; /* match any device */
-       case PCI_PRODUCT_INTEL_WL_22500_2: /* AX201 */
-       case PCI_PRODUCT_INTEL_WL_22500_3: /* AX201 */
-       case PCI_PRODUCT_INTEL_WL_22500_4: /* AX201 */
-       case PCI_PRODUCT_INTEL_WL_22500_5: /* AX201 */
-               for (i = 0; i < nitems(iwx_subsystem_id_ax201); i++) {
-                       if (svid == iwx_subsystem_id_ax201[i].pm_vid &&
-                           spid == iwx_subsystem_id_ax201[i].pm_pid)
-                               return 1;
-
-               }
-               break;
-       default:
-               break;
-       }
-
-       return 0;
+       return pci_matchbyid(pa, iwx_devices, nitems(iwx_devices));
   }
+/*
+ * The device info table below contains device-specific config overrides.
+ * The most important parameter derived from this table is the name of the
+ * firmware image to load.
+ *
+ * The Linux iwlwifi driver uses an "old" and a "new" device info table.
+ * The "old" table matches devices based on PCI vendor/product IDs only.
+ * The "new" table extends this with various device parameters derived
+ * from MAC type, RF type, and PCI subdevice ID.
+ *
+ * In iwlwifi "old" and "new" tables share the same array, where "old"
+ * entries contain dummy values for data defined only for "new" entries.
+ * As of 2022, Linux developers are still in the process of moving entries
+ * from "old" to "new" style and it looks like this effort has stalled in
+ * in some work-in-progress state for quite a while. Linux commits moving
+ * entries from "old" to "new" have at times been reverted due to regressions.
+ * Part of this complexity comes from iwlwifi supporting both iwm(4) and iwx(4)
+ * devices in the same driver.
+ *
+ * We try to avoid this mess while still recognizing supported iwx(4) devices
+ * correctly. Our table below contains only "new" entries declared in iwlwifi
+ * with the _IWL_DEV_INFO() macro (with a leading underscore).
+ * Other devices are matched based on PCI vendor/product ID as usual.
+ */
+
+struct iwx_dev_info {
+       uint16_t device;
+       uint16_t subdevice;
+       uint16_t mac_type;
+       uint16_t rf_type;
+       uint8_t mac_step;
+       uint8_t rf_id;
+       uint8_t no_160;
+       uint8_t cores;
+       uint8_t cdb;
+       uint8_t jacket;
+       const struct iwx_device_cfg *cfg;
+};
+
+#define _IWX_DEV_INFO(_device, _subdevice, _mac_type, _mac_step, _rf_type, \
+                     _rf_id, _no_160, _cores, _cdb, _jacket, _cfg) \
+       { .device = (_device), .subdevice = (_subdevice), .cfg = &(_cfg),  \
+         .mac_type = _mac_type, .rf_type = _rf_type,      \
+         .no_160 = _no_160, .cores = _cores, .rf_id = _rf_id,             \
+         .mac_step = _mac_step, .cdb = _cdb, .jacket = _jacket }
+
+/*
+ * When adding entries to this table keep in mind that entries must
+ * be listed in the same order as in the Linux driver. Code walks this
+ * table backwards and uses the first matching entry it finds.
+ * Device firmware must be available in fw_update(8).
+ */
+static const struct iwx_dev_info iwx_dev_info_table[] = {
+       /* Qu with Jf, C step */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP,
+                     IWX_CFG_RF_TYPE_JF1, IWX_CFG_RF_ID_JF1,
+                     IWX_CFG_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY, iwx_9560_qu_c0_jf_b0_cfg), /* 9461_160 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP,
+                     IWX_CFG_RF_TYPE_JF1, IWX_CFG_RF_ID_JF1,
+                     IWX_CFG_NO_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY, iwx_9560_qu_c0_jf_b0_cfg), /* iwl9461 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP,
+                     IWX_CFG_RF_TYPE_JF1, IWX_CFG_RF_ID_JF1_DIV,
+                     IWX_CFG_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY, iwx_9560_qu_c0_jf_b0_cfg), /* 9462_160 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP,
+                     IWX_CFG_RF_TYPE_JF1, IWX_CFG_RF_ID_JF1_DIV,
+                     IWX_CFG_NO_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY, iwx_9560_qu_c0_jf_b0_cfg), /* 9462 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP,
+                     IWX_CFG_RF_TYPE_JF2, IWX_CFG_RF_ID_JF,
+                     IWX_CFG_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY, iwx_9560_qu_c0_jf_b0_cfg), /* 9560_160 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP,
+                     IWX_CFG_RF_TYPE_JF2, IWX_CFG_RF_ID_JF,
+                     IWX_CFG_NO_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY, iwx_9560_qu_c0_jf_b0_cfg), /* 9560 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, 0x1551,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP,
+                     IWX_CFG_RF_TYPE_JF2, IWX_CFG_RF_ID_JF,
+                     IWX_CFG_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY,
+                     iwx_9560_qu_c0_jf_b0_cfg), /* 9560_killer_1550s */
+       _IWX_DEV_INFO(IWX_CFG_ANY, 0x1552,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP,
+                     IWX_CFG_RF_TYPE_JF2, IWX_CFG_RF_ID_JF,
+                     IWX_CFG_NO_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY,
+                     iwx_9560_qu_c0_jf_b0_cfg), /* 9560_killer_1550i */
+
+       /* QuZ with Jf */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QUZ, IWX_CFG_ANY,
+                     IWX_CFG_RF_TYPE_JF2, IWX_CFG_RF_ID_JF,
+                     IWX_CFG_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY, iwx_9560_quz_a0_jf_b0_cfg), /* 9461_160 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QUZ, IWX_CFG_ANY,
+                     IWX_CFG_RF_TYPE_JF2, IWX_CFG_RF_ID_JF,
+                     IWX_CFG_NO_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY, iwx_9560_quz_a0_jf_b0_cfg), /* 9461 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QUZ, IWX_CFG_ANY,
+                     IWX_CFG_RF_TYPE_JF1, IWX_CFG_RF_ID_JF1_DIV,
+                     IWX_CFG_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY, iwx_9560_quz_a0_jf_b0_cfg), /* 9462_160 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QUZ, IWX_CFG_ANY,
+                     IWX_CFG_RF_TYPE_JF1, IWX_CFG_RF_ID_JF1_DIV,
+                     IWX_CFG_NO_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY, iwx_9560_quz_a0_jf_b0_cfg), /* 9462 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, 0x1551,
+                     IWX_CFG_MAC_TYPE_QUZ, IWX_CFG_ANY,
+                     IWX_CFG_RF_TYPE_JF2, IWX_CFG_RF_ID_JF,
+                     IWX_CFG_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY,
+                     iwx_9560_quz_a0_jf_b0_cfg), /* killer_1550s */
+       _IWX_DEV_INFO(IWX_CFG_ANY, 0x1552,
+                     IWX_CFG_MAC_TYPE_QUZ, IWX_CFG_ANY,
+                     IWX_CFG_RF_TYPE_JF2, IWX_CFG_RF_ID_JF,
+                     IWX_CFG_NO_160, IWX_CFG_CORES_BT, IWX_CFG_NO_CDB,
+                     IWX_CFG_ANY,
+                     iwx_9560_quz_a0_jf_b0_cfg), /* 9560_killer_1550i */
+
+       /* Qu with Hr, B step */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_B_STEP,
+                     IWX_CFG_RF_TYPE_HR1, IWX_CFG_ANY,
+                     IWX_CFG_ANY, IWX_CFG_ANY, IWX_CFG_NO_CDB, IWX_CFG_ANY,
+                     iwx_qu_b0_hr1_b0), /* AX101 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_B_STEP,
+                     IWX_CFG_RF_TYPE_HR2, IWX_CFG_ANY,
+                     IWX_CFG_NO_160, IWX_CFG_ANY, IWX_CFG_NO_CDB, IWX_CFG_ANY,
+                     iwx_qu_b0_hr_b0), /* AX203 */
+
+       /* Qu with Hr, C step */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP,
+                     IWX_CFG_RF_TYPE_HR1, IWX_CFG_ANY,
+                     IWX_CFG_ANY, IWX_CFG_ANY, IWX_CFG_NO_CDB, IWX_CFG_ANY,
+                     iwx_qu_c0_hr1_b0), /* AX101 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP,
+                     IWX_CFG_RF_TYPE_HR2, IWX_CFG_ANY,
+                     IWX_CFG_NO_160, IWX_CFG_ANY, IWX_CFG_NO_CDB, IWX_CFG_ANY,
+                     iwx_qu_c0_hr_b0), /* AX203 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QU, IWX_SILICON_C_STEP,
+                     IWX_CFG_RF_TYPE_HR2, IWX_CFG_ANY,
+                     IWX_CFG_160, IWX_CFG_ANY, IWX_CFG_NO_CDB, IWX_CFG_ANY,
+                     iwx_qu_c0_hr_b0), /* AX201 */
+
+       /* QuZ with Hr */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QUZ, IWX_CFG_ANY,
+                     IWX_CFG_RF_TYPE_HR1, IWX_CFG_ANY,
+                     IWX_CFG_ANY, IWX_CFG_ANY, IWX_CFG_NO_CDB, IWX_CFG_ANY,
+                     iwx_quz_a0_hr1_b0), /* AX101 */
+       _IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
+                     IWX_CFG_MAC_TYPE_QUZ, IWX_SILICON_B_STEP,
+                     IWX_CFG_RF_TYPE_HR2, IWX_CFG_ANY,
+                     IWX_CFG_NO_160, IWX_CFG_ANY, IWX_CFG_NO_CDB, IWX_CFG_ANY,
+                     iwx_cfg_quz_a0_hr_b0), /* AX203 */
+};
+
   int
   iwx_preinit(struct iwx_softc *sc)
   {
@@ -9518,6 +9650,77 @@ iwx_attach_hook(struct device *self)
        iwx_preinit(sc);
   }
+const struct iwx_device_cfg *
+iwx_find_device_cfg(struct iwx_softc *sc)
+{
+       pcireg_t sreg;
+       pci_product_id_t sdev_id;
+       uint16_t mac_type, rf_type;
+       uint8_t mac_step, cdb, jacket, rf_id, no_160, cores;
+       int i;
+
+       sreg = pci_conf_read(sc->sc_pct, sc->sc_pcitag, PCI_SUBSYS_ID_REG);
+       sdev_id = PCI_PRODUCT(sreg);
+       mac_type = IWX_CSR_HW_REV_TYPE(sc->sc_hw_rev);
+       mac_step = IWX_CSR_HW_REV_STEP(sc->sc_hw_rev << 2);
+       rf_type = IWX_CSR_HW_RFID_TYPE(sc->sc_hw_rf_id);
+       cdb = IWX_CSR_HW_RFID_IS_CDB(sc->sc_hw_rf_id);
+       jacket = IWX_CSR_HW_RFID_IS_JACKET(sc->sc_hw_rf_id);
+
+       rf_id = IWX_SUBDEVICE_RF_ID(sdev_id);
+       no_160 = IWX_SUBDEVICE_NO_160(sdev_id);
+       cores = IWX_SUBDEVICE_CORES(sdev_id);
+
+       for (i = nitems(iwx_dev_info_table) - 1; i >= 0; i--) {
+                const struct iwx_dev_info *dev_info = &iwx_dev_info_table[i];
+
+               if (dev_info->device != (uint16_t)IWX_CFG_ANY &&
+                   dev_info->device != sc->sc_pid)
+                       continue;
+
+               if (dev_info->subdevice != (uint16_t)IWX_CFG_ANY &&
+                   dev_info->subdevice != sdev_id)
+                       continue;
+
+               if (dev_info->mac_type != (uint16_t)IWX_CFG_ANY &&
+                   dev_info->mac_type != mac_type)
+                       continue;
+
+               if (dev_info->mac_step != (uint8_t)IWX_CFG_ANY &&
+                   dev_info->mac_step != mac_step)
+                       continue;
+
+               if (dev_info->rf_type != (uint16_t)IWX_CFG_ANY &&
+                   dev_info->rf_type != rf_type)
+                       continue;
+
+               if (dev_info->cdb != (uint8_t)IWX_CFG_ANY &&
+                   dev_info->cdb != cdb)
+                       continue;
+
+               if (dev_info->jacket != (uint8_t)IWX_CFG_ANY &&
+                   dev_info->jacket != jacket)
+                       continue;
+
+               if (dev_info->rf_id != (uint8_t)IWX_CFG_ANY &&
+                   dev_info->rf_id != rf_id)
+                       continue;
+
+               if (dev_info->no_160 != (uint8_t)IWX_CFG_ANY &&
+                   dev_info->no_160 != no_160)
+                       continue;
+
+               if (dev_info->cores != (uint8_t)IWX_CFG_ANY &&
+                   dev_info->cores != cores)
+                       continue;
+
+               return dev_info->cfg;
+       }
+
+       return NULL;
+}
+
+
   void
   iwx_attach(struct device *parent, struct device *self, void *aux)
   {
@@ -9528,9 +9731,11 @@ iwx_attach(struct device *parent, struct device *self,
        struct ieee80211com *ic = &sc->sc_ic;
        struct ifnet *ifp = &ic->ic_if;
        const char *intrstr;
+       const struct iwx_device_cfg *cfg;
        int err;
        int txq_i, i, j;
+       sc->sc_pid = pa->pa_id;
        sc->sc_pct = pa->pa_pc;
        sc->sc_pcitag = pa->pa_tag;
        sc->sc_dmat = pa->pa_dmat;
@@ -9600,6 +9805,7 @@ iwx_attach(struct device *parent, struct device *self,
        IWX_WRITE(sc, IWX_CSR_FH_INT_STATUS, ~0);
        sc->sc_hw_rev = IWX_READ(sc, IWX_CSR_HW_REV);
+       sc->sc_hw_rf_id = IWX_READ(sc, IWX_CSR_HW_RF_ID);
        /*
         * In the 8000 HW family the format of the 4 bytes of CSR_HW_REV have
@@ -9612,7 +9818,7 @@ iwx_attach(struct device *parent, struct device *self,
        switch (PCI_PRODUCT(pa->pa_id)) {
        case PCI_PRODUCT_INTEL_WL_22500_1:
-               sc->sc_fwname = "iwx-cc-a0-67";
+               sc->sc_fwname = IWX_CC_A_FW;
                sc->sc_device_family = IWX_DEVICE_FAMILY_22000;
                sc->sc_integrated = 0;
                sc->sc_ltr_delay = IWX_SOC_FLAGS_LTR_APPLY_DELAY_NONE;
@@ -9622,14 +9828,13 @@ iwx_attach(struct device *parent, struct device *self,
                sc->sc_uhb_supported = 0;
                break;
        case PCI_PRODUCT_INTEL_WL_22500_2:
-       case PCI_PRODUCT_INTEL_WL_22500_3:
        case PCI_PRODUCT_INTEL_WL_22500_5:
+               /* These devices should be QuZ only. */
                if (sc->sc_hw_rev != IWX_CSR_HW_REV_TYPE_QUZ) {
                        printf("%s: unsupported AX201 adapter\n", DEVNAME(sc));
                        return;
                }
-
-               sc->sc_fwname = "iwx-QuZ-a0-hr-b0-67";
+               sc->sc_fwname = IWX_QUZ_A_HR_B_FW;
                sc->sc_device_family = IWX_DEVICE_FAMILY_22000;
                sc->sc_integrated = 1;
                sc->sc_ltr_delay = IWX_SOC_FLAGS_LTR_APPLY_DELAY_200;
@@ -9638,8 +9843,27 @@ iwx_attach(struct device *parent, struct device *self,
                sc->sc_tx_with_siso_diversity = 0;
                sc->sc_uhb_supported = 0;
                break;
+       case PCI_PRODUCT_INTEL_WL_22500_3:
+               if (sc->sc_hw_rev != IWX_CSR_HW_REV_TYPE_QUZ)
+                       sc->sc_fwname = IWX_QU_B_HR_B_FW;
+               else
+                       sc->sc_fwname = IWX_QUZ_A_HR_B_FW;
+               sc->sc_device_family = IWX_DEVICE_FAMILY_22000;
+               sc->sc_integrated = 1;
+               sc->sc_ltr_delay = IWX_SOC_FLAGS_LTR_APPLY_DELAY_200;
+               sc->sc_low_latency_xtal = 0;
+               sc->sc_xtal_latency = 500;
+               sc->sc_tx_with_siso_diversity = 0;
+               sc->sc_uhb_supported = 0;
+               break;
        case PCI_PRODUCT_INTEL_WL_22500_4:
-               sc->sc_fwname = "iwx-Qu-c0-hr-b0-63";
+       case PCI_PRODUCT_INTEL_WL_22500_7:
+       case PCI_PRODUCT_INTEL_WL_22500_8:
+               if (sc->sc_hw_rev != IWX_CSR_HW_REV_TYPE_QUZ)
+                       sc->sc_fwname = IWX_QU_B_HR_B_FW;
+               else
+                       sc->sc_fwname = IWX_QUZ_A_HR_B_FW;
+               sc->sc_fwname = IWX_QU_C_HR_B_FW;
                sc->sc_device_family = IWX_DEVICE_FAMILY_22000;
                sc->sc_integrated = 1;
                sc->sc_ltr_delay = IWX_SOC_FLAGS_LTR_APPLY_DELAY_1820;
@@ -9648,11 +9872,31 @@ iwx_attach(struct device *parent, struct device *self,
                sc->sc_tx_with_siso_diversity = 0;
                sc->sc_uhb_supported = 0;
                break;
+       case PCI_PRODUCT_INTEL_WL_22500_6:
+               if (sc->sc_hw_rev != IWX_CSR_HW_REV_TYPE_QUZ)
+                       sc->sc_fwname = IWX_QU_B_HR_B_FW;
+               else
+                       sc->sc_fwname = IWX_QUZ_A_HR_B_FW;
+               sc->sc_device_family = IWX_DEVICE_FAMILY_22000;
+               sc->sc_integrated = 1;
+               sc->sc_ltr_delay = IWX_SOC_FLAGS_LTR_APPLY_DELAY_2500;
+               sc->sc_low_latency_xtal = 1;
+               sc->sc_xtal_latency = 12000;
+               sc->sc_tx_with_siso_diversity = 0;
+               sc->sc_uhb_supported = 0;
+               break;
        default:
                printf("%s: unknown adapter type\n", DEVNAME(sc));
                return;
        }
+       cfg = iwx_find_device_cfg(sc);
+       if (cfg) {
+               sc->sc_fwname = cfg->fw_name;
+               sc->sc_tx_with_siso_diversity = cfg->tx_with_siso_diversity;
+               sc->sc_uhb_supported = cfg->uhb_supported;
+       }
+
        /* Allocate DMA memory for loading firmware. */
        err = iwx_dma_contig_alloc(sc->sc_dmat, &sc->ctxt_info_dma,
            sizeof(struct iwx_context_info), 0);
blob - 1c62d03463cf1efd333be93903ac630586639d3f
blob + aec6da4292bef54f1e51e291fa954663fc3494bf
--- sys/dev/pci/if_iwxreg.h
+++ sys/dev/pci/if_iwxreg.h
@@ -271,6 +271,18 @@ struct iwx_context_info {
    */
   #define IWX_CSR_HW_REV              (0x028)
+/*
+ * RF ID revision info
+ * Bit fields:
+ * 31:24: Reserved (set to 0x0)
+ * 23:12: Type
+ * 11:8:  Step (A - 0x0, B - 0x1, etc)
+ * 7:4:   Dash
+ * 3:0:   Flavor
+ */
+#define IWX_CSR_HW_RF_ID               (0x09c)
+
+
   #define IWX_CSR_GIO_REG              (0x03C)
   /*
@@ -423,10 +435,19 @@ struct iwx_context_info {
   /* HW REV */
   #define IWX_CSR_HW_REV_DASH(_val)          (((_val) & 0x0000003) >> 0)
   #define IWX_CSR_HW_REV_STEP(_val)          (((_val) & 0x000000C) >> 2)
+#define IWX_CSR_HW_REV_TYPE(_val)          (((_val) & 0x000FFF0) >> 4)
   #define IWX_CSR_HW_REV_TYPE_MSK              (0x000FFF0)
   #define IWX_CSR_HW_REV_TYPE_QUZ              (0x0000354)
+/* HW RFID */
+#define IWX_CSR_HW_RFID_FLAVOR(_val)       (((_val) & 0x000000F) >> 0)
+#define IWX_CSR_HW_RFID_DASH(_val)         (((_val) & 0x00000F0) >> 4)
+#define IWX_CSR_HW_RFID_STEP(_val)         (((_val) & 0x0000F00) >> 8)
+#define IWX_CSR_HW_RFID_TYPE(_val)         (((_val) & 0x0FFF000) >> 12)
+#define IWX_CSR_HW_RFID_IS_CDB(_val)       (((_val) & 0x10000000) >> 28)
+#define IWX_CSR_HW_RFID_IS_JACKET(_val)    (((_val) & 0x20000000) >> 29)
+
   /* CSR GIO */
   #define IWX_CSR_GIO_REG_VAL_L0S_DISABLED     (0x00000002)
blob - e78c9fe6fb4327a64e82d72282723a5084d55c05
blob + c7a5050fd3fa615c739043e52ca6d06263120e91
--- sys/dev/pci/if_iwxvar.h
+++ sys/dev/pci/if_iwxvar.h
@@ -451,6 +451,101 @@ struct iwx_ba_task_data {
        uint32_t                stop_tidmask;
   };
+
+/*
+ * Device configuration parameters which cannot be detected based on
+ * PCI vendor/product ID alone.
+ */
+struct iwx_device_cfg {
+       const char *fw_name;
+       int         tx_with_siso_diversity;
+       int         uhb_supported;
+};
+
+/* Firmware listed here must be available in fw_update(8). */
+#define IWX_CC_A_FW            "iwx-cc-a0-67"
+#define IWX_QU_B_HR_B_FW       "iwx-Qu-b0-hr-b0-63"
+#define IWX_QU_B_JF_B_FW       "iwx-Qu-b0-jf-b0-63"
+#define IWX_QU_C_HR_B_FW       "iwx-Qu-c0-hr-b0-63"
+#define IWX_QU_C_JF_B_FW       "iwx-Qu-c0-jf-b0-63"
+#define IWX_QUZ_A_HR_B_FW      "iwx-QuZ-a0-hr-b0-67"
+#define IWX_QUZ_A_JF_B_FW      "iwx-QuZ-a0-jf-b0-63"
+
+const struct iwx_device_cfg iwx_9560_quz_a0_jf_b0_cfg = {
+       .fw_name = IWX_QUZ_A_JF_B_FW,
+};
+
+const struct iwx_device_cfg iwx_9560_qu_c0_jf_b0_cfg = {
+       .fw_name = IWX_QU_C_JF_B_FW,
+};
+
+const struct iwx_device_cfg iwx_qu_b0_hr1_b0 = {
+       .fw_name = IWX_QU_B_HR_B_FW,
+       .tx_with_siso_diversity = true,
+};
+
+const struct iwx_device_cfg iwx_qu_b0_hr_b0 = {
+       .fw_name = IWX_QU_B_HR_B_FW,
+};
+
+const struct iwx_device_cfg iwx_ax201_cfg_qu_hr = {
+       .fw_name = IWX_QU_B_HR_B_FW,
+};
+
+const struct iwx_device_cfg iwx_qu_c0_hr1_b0 = {
+       .fw_name = IWX_QU_C_HR_B_FW,
+       .tx_with_siso_diversity = true,
+};
+
+const struct iwx_device_cfg iwx_qu_c0_hr_b0 = {
+       .fw_name = IWX_QU_C_HR_B_FW,
+};
+
+const struct iwx_device_cfg iwx_ax201_cfg_qu_c0_hr_b0 = {
+       .fw_name = IWX_QU_C_HR_B_FW,
+};
+
+const struct iwx_device_cfg iwx_quz_a0_hr1_b0 = {
+       .fw_name = IWX_QUZ_A_HR_B_FW,
+};
+
+const struct iwx_device_cfg iwx_ax201_cfg_quz_hr = {
+       .fw_name = IWX_QUZ_A_HR_B_FW,
+};
+
+const struct iwx_device_cfg iwx_cfg_quz_a0_hr_b0 = {
+       .fw_name = IWX_QUZ_A_HR_B_FW,
+};
+
+#define IWX_CFG_ANY (~0)
+
+#define IWX_CFG_MAC_TYPE_QU            0x33
+#define IWX_CFG_MAC_TYPE_QUZ           0x35
+#define IWX_CFG_MAC_TYPE_QNJ           0x36
+#define IWX_CFG_MAC_TYPE_SO            0x37
+#define IWX_CFG_MAC_TYPE_SNJ           0x42
+#define IWX_CFG_MAC_TYPE_SOF           0x43
+
+#define IWX_CFG_RF_TYPE_JF2            0x105
+#define IWX_CFG_RF_TYPE_JF1            0x108
+#define IWX_CFG_RF_TYPE_HR2            0x10a
+#define IWX_CFG_RF_TYPE_HR1            0x10c
+
+#define IWX_CFG_RF_ID_JF               0x3
+#define IWX_CFG_RF_ID_JF1              0x6
+#define IWX_CFG_RF_ID_JF1_DIV          0xa
+
+#define IWX_CFG_NO_160                 0x1
+#define IWX_CFG_160                    0x0
+
+#define IWX_CFG_CORES_BT               0x0
+
+#define IWX_CFG_NO_CDB                 0x0
+
+#define IWX_SUBDEVICE_RF_ID(subdevice) ((uint16_t)((subdevice) & 0x00f0) >> 4)
+#define IWX_SUBDEVICE_NO_160(subdevice)        ((uint16_t)((subdevice) & 0x0200) 
>> 9)
+#define IWX_SUBDEVICE_CORES(subdevice) ((uint16_t)((subdevice) & 0x1c00) >> 10)
+
   struct iwx_softc {
        struct device sc_dev;
        struct ieee80211com sc_ic;
@@ -493,6 +588,7 @@ struct iwx_softc {
        bus_space_handle_t sc_sh;
        bus_size_t sc_sz;
        bus_dma_tag_t sc_dmat;
+       pci_product_id_t sc_pid;
        pci_chipset_tag_t sc_pct;
        pcitag_t sc_pcitag;
        const void *sc_ih;
@@ -516,11 +612,12 @@ struct iwx_softc {
   #define IWX_SILICON_A_STEP   0
   #define IWX_SILICON_B_STEP   1
   #define IWX_SILICON_C_STEP   2
-#define IWX_SILICON_D_STEP     3
+#define IWX_SILICON_Z_STEP     0xf
        int sc_hw_id;
+       int sc_hw_rf_id;
        int sc_device_family;
   #define IWX_DEVICE_FAMILY_22000      1
-#define IWX_DEVICE_FAMILY_22560        2
+#define IWX_DEVICE_FAMILY_AX210        2
        struct iwx_dma_info ctxt_info_dma;
        struct iwx_self_init_dram init_dram;
blob - 09b3d43fc6348beb3440a3f1ab108338e20e2047
blob + baaf4b686e10648e76f2b64a06287da4740e5405
--- sys/dev/pci/pcidevs
+++ sys/dev/pci/pcidevs
@@ -5305,6 +5305,7 @@ product INTEL E5_UNICAST  0x3ce8  E5 Unicast
   product INTEL E5_SAD_1               0x3cf4  E5 SAD
   product INTEL E5_BROADCAST   0x3cf5  E5 Broadcast
   product INTEL E5_SAD_2               0x3cf6  E5 SAD
+product INTEL WL_22500_7    0x3df0  Wi-Fi 6 AX201
   product INTEL CORE8G_S_D_HB_2C       0x3e0f  Core 8G Host
   product INTEL CORE8G_H_HB_4C 0x3e10  Core 8G Host
   product INTEL CORE8G_S_W_HB_4C       0x3e18  Core 8G Host
@@ -5462,6 +5463,7 @@ product INTEL 500SERIES_I2C_3     0x43eb  500 Series I2C
   product INTEL 500SERIES_XHCI 0x43ed  500 Series xHCI
   product INTEL 500SERIES_XDCI 0x43ee  500 Series xDCI
   product INTEL 500SERIES_SRAM 0x43ef  500 Series Shared SRAM
+product INTEL WL_22500_6        0x43f0  Wi-Fi 6 AX201
   product INTEL 500SERIES_GSPI_2       0x43fb  500 Series GSPI
   product INTEL 500SERIES_ISH  0x43fc  500 Series ISH
   product INTEL 500SERIES_GSPI_3       0x43fd  500 Series GSPI
@@ -5553,6 +5555,7 @@ product INTEL JSL_I2C_3           0x4deb  Jasper Lake I2C
   product INTEL JSL_XHCI               0x4ded  Jasper Lake xHCI
   product INTEL JSL_XDCI               0x4dee  Jasper Lake xDCI
   product INTEL JSL_SRAM               0x4def  Jasper Lake Shared SRAM
+product INTEL WL_22500_8        0x4df0  Wi-Fi 6 AX201
   product INTEL JSL_SDXC               0x4df8  Jasper Lake SDXC
   product INTEL JSL_LPSS_SPI_2 0x4dfb  Jasper Lake SPI
   product INTEL JSL_DPTF               0x4e03  Jasper Lake DPTF
blob - 881c4b5359c5b720c29f77e3efef41fea949d6a9
blob + 0661edc72358e8e42e190e8b2ded6a528d00b33d
--- sys/dev/pci/pcidevs.h
+++ sys/dev/pci/pcidevs.h
@@ -5310,6 +5310,7 @@
   #define      PCI_PRODUCT_INTEL_E5_SAD_1      0x3cf4          /* E5 SAD */
   #define      PCI_PRODUCT_INTEL_E5_BROADCAST  0x3cf5          /* E5 Broadcast 
*/
   #define      PCI_PRODUCT_INTEL_E5_SAD_2      0x3cf6          /* E5 SAD */
+#define        PCI_PRODUCT_INTEL_WL_22500_7    0x3df0          /* Wi-Fi 6 
AX201 */
   #define      PCI_PRODUCT_INTEL_CORE8G_S_D_HB_2C      0x3e0f          /* Core 
8G Host */
   #define      PCI_PRODUCT_INTEL_CORE8G_H_HB_4C        0x3e10          /* Core 
8G Host */
   #define      PCI_PRODUCT_INTEL_CORE8G_S_W_HB_4C      0x3e18          /* Core 
8G Host */
@@ -5467,6 +5468,7 @@
   #define      PCI_PRODUCT_INTEL_500SERIES_XHCI        0x43ed          /* 500 
Series xHCI */
   #define      PCI_PRODUCT_INTEL_500SERIES_XDCI        0x43ee          /* 500 
Series xDCI */
   #define      PCI_PRODUCT_INTEL_500SERIES_SRAM        0x43ef          /* 500 
Series Shared SRAM */
+#define        PCI_PRODUCT_INTEL_WL_22500_6    0x43f0          /* Wi-Fi 6 
AX201 */
   #define      PCI_PRODUCT_INTEL_500SERIES_GSPI_2      0x43fb          /* 500 
Series GSPI */
   #define      PCI_PRODUCT_INTEL_500SERIES_ISH 0x43fc          /* 500 Series 
ISH */
   #define      PCI_PRODUCT_INTEL_500SERIES_GSPI_3      0x43fd          /* 500 
Series GSPI */
@@ -5558,6 +5560,7 @@
   #define      PCI_PRODUCT_INTEL_JSL_XHCI      0x4ded          /* Jasper Lake 
xHCI */
   #define      PCI_PRODUCT_INTEL_JSL_XDCI      0x4dee          /* Jasper Lake 
xDCI */
   #define      PCI_PRODUCT_INTEL_JSL_SRAM      0x4def          /* Jasper Lake 
Shared SRAM */
+#define        PCI_PRODUCT_INTEL_WL_22500_8    0x4df0          /* Wi-Fi 6 
AX201 */
   #define      PCI_PRODUCT_INTEL_JSL_SDXC      0x4df8          /* Jasper Lake 
SDXC */
   #define      PCI_PRODUCT_INTEL_JSL_LPSS_SPI_2        0x4dfb          /* 
Jasper Lake SPI */
   #define      PCI_PRODUCT_INTEL_JSL_DPTF      0x4e03          /* Jasper Lake 
DPTF */
blob - 01e9fffe27ba09263460b7fe757afd4649518854
blob + ac5542988d279a89b12e9f6acf9a8cf7df6b04af
--- sys/dev/pci/pcidevs_data.h
+++ sys/dev/pci/pcidevs_data.h
@@ -18620,6 +18620,10 @@ static const struct pci_known_product pci_known_produc
            "E5 SAD",
        },
        {
+           PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_7,
+           "Wi-Fi 6 AX201",
+       },
+       {
            PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_CORE8G_S_D_HB_2C,
            "Core 8G Host",
        },
@@ -19248,6 +19252,10 @@ static const struct pci_known_product pci_known_produc
            "500 Series Shared SRAM",
        },
        {
+           PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_6,
+           "Wi-Fi 6 AX201",
+       },
+       {
            PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_500SERIES_GSPI_2,
            "500 Series GSPI",
        },
@@ -19612,6 +19620,10 @@ static const struct pci_known_product pci_known_produc
            "Jasper Lake Shared SRAM",
        },
        {
+           PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_WL_22500_8,
+           "Wi-Fi 6 AX201",
+       },
+       {
            PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_JSL_SDXC,
            "Jasper Lake SDXC",
        },



Reply via email to