Module Name: src Committed By: nonaka Date: Tue Mar 14 23:59:26 UTC 2017
Modified Files: src/distrib/sets/lists/base: mi src/external/intel-fw-public: Makefile src/external/intel-fw-public/iwl3160: Makefile src/external/intel-fw-public/iwl7260: Makefile src/external/intel-fw-public/iwl7265: Makefile src/external/intel-fw-public/iwl8000: Makefile src/sys/dev/pci: if_iwm.c if_iwmreg.h if_iwmvar.h Added Files: src/external/intel-fw-public/iwl3160/dist: iwlwifi-3160-17.ucode src/external/intel-fw-public/iwl3168: Makefile src/external/intel-fw-public/iwl3168/dist: LICENSE.iwlwifi-3168-ucode README.iwlwifi-3168-ucode iwlwifi-3168-22.ucode src/external/intel-fw-public/iwl7260/dist: iwlwifi-7260-17.ucode src/external/intel-fw-public/iwl7265/dist: iwlwifi-7265-17.ucode iwlwifi-7265D-22.ucode src/external/intel-fw-public/iwl8000/dist: iwlwifi-8000C-22.ucode src/external/intel-fw-public/iwl8265: Makefile src/external/intel-fw-public/iwl8265/dist: LICENSE.iwlwifi-8265-ucode README.iwlwifi-8265-ucode iwlwifi-8265-22.ucode Removed Files: src/external/intel-fw-public/iwl3160/dist: iwlwifi-3160-16.ucode src/external/intel-fw-public/iwl7260/dist: iwlwifi-7260-16.ucode src/external/intel-fw-public/iwl7265/dist: iwlwifi-7265-16.ucode iwlwifi-7265D-17.ucode src/external/intel-fw-public/iwl8000/dist: iwlwifi-8000C-16.ucode Log Message: iwm(4): update firmware to maintained core release. firmware from https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/linux-firmware.git/tree/?id=4b9559fb0565f582a21a4070a81a3b6a7d77610b To generate a diff of this commit: cvs rdiff -u -r1.1155 -r1.1156 src/distrib/sets/lists/base/mi cvs rdiff -u -r1.10 -r1.11 src/external/intel-fw-public/Makefile cvs rdiff -u -r1.3 -r1.4 src/external/intel-fw-public/iwl3160/Makefile cvs rdiff -u -r1.1 -r0 \ src/external/intel-fw-public/iwl3160/dist/iwlwifi-3160-16.ucode cvs rdiff -u -r0 -r1.1 \ src/external/intel-fw-public/iwl3160/dist/iwlwifi-3160-17.ucode cvs rdiff -u -r0 -r1.1 src/external/intel-fw-public/iwl3168/Makefile cvs rdiff -u -r0 -r1.1 \ src/external/intel-fw-public/iwl3168/dist/LICENSE.iwlwifi-3168-ucode \ src/external/intel-fw-public/iwl3168/dist/README.iwlwifi-3168-ucode \ src/external/intel-fw-public/iwl3168/dist/iwlwifi-3168-22.ucode cvs rdiff -u -r1.3 -r1.4 src/external/intel-fw-public/iwl7260/Makefile cvs rdiff -u -r1.1 -r0 \ src/external/intel-fw-public/iwl7260/dist/iwlwifi-7260-16.ucode cvs rdiff -u -r0 -r1.1 \ src/external/intel-fw-public/iwl7260/dist/iwlwifi-7260-17.ucode cvs rdiff -u -r1.4 -r1.5 src/external/intel-fw-public/iwl7265/Makefile cvs rdiff -u -r1.1 -r0 \ src/external/intel-fw-public/iwl7265/dist/iwlwifi-7265-16.ucode \ src/external/intel-fw-public/iwl7265/dist/iwlwifi-7265D-17.ucode cvs rdiff -u -r0 -r1.1 \ src/external/intel-fw-public/iwl7265/dist/iwlwifi-7265-17.ucode \ src/external/intel-fw-public/iwl7265/dist/iwlwifi-7265D-22.ucode cvs rdiff -u -r1.1 -r1.2 src/external/intel-fw-public/iwl8000/Makefile cvs rdiff -u -r1.1 -r0 \ src/external/intel-fw-public/iwl8000/dist/iwlwifi-8000C-16.ucode cvs rdiff -u -r0 -r1.1 \ src/external/intel-fw-public/iwl8000/dist/iwlwifi-8000C-22.ucode cvs rdiff -u -r0 -r1.1 src/external/intel-fw-public/iwl8265/Makefile cvs rdiff -u -r0 -r1.1 \ src/external/intel-fw-public/iwl8265/dist/LICENSE.iwlwifi-8265-ucode \ src/external/intel-fw-public/iwl8265/dist/README.iwlwifi-8265-ucode \ src/external/intel-fw-public/iwl8265/dist/iwlwifi-8265-22.ucode cvs rdiff -u -r1.70 -r1.71 src/sys/dev/pci/if_iwm.c cvs rdiff -u -r1.5 -r1.6 src/sys/dev/pci/if_iwmreg.h cvs rdiff -u -r1.17 -r1.18 src/sys/dev/pci/if_iwmvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/base/mi diff -u src/distrib/sets/lists/base/mi:1.1155 src/distrib/sets/lists/base/mi:1.1156 --- src/distrib/sets/lists/base/mi:1.1155 Wed Mar 1 03:02:48 2017 +++ src/distrib/sets/lists/base/mi Tue Mar 14 23:59:24 2017 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1155 2017/03/01 03:02:48 kre Exp $ +# $NetBSD: mi,v 1.1156 2017/03/14 23:59:24 nonaka Exp $ # # Note: Don't delete entries from here - mark them as "obsolete" instead, # unless otherwise stated below. @@ -150,22 +150,33 @@ ./libdata/firmware/if_iwi/ipw2200-sniffer.fw base-firmware-root ./libdata/firmware/if_iwm base-firmware-root ./libdata/firmware/if_iwm/LICENSE.iwlwifi-3160-ucode base-firmware-root +./libdata/firmware/if_iwm/LICENSE.iwlwifi-3168-ucode base-firmware-root ./libdata/firmware/if_iwm/LICENSE.iwlwifi-7260-ucode base-firmware-root ./libdata/firmware/if_iwm/LICENSE.iwlwifi-7265-ucode base-firmware-root ./libdata/firmware/if_iwm/LICENSE.iwlwifi-8000-ucode base-firmware-root +./libdata/firmware/if_iwm/LICENSE.iwlwifi-8265-ucode base-firmware-root ./libdata/firmware/if_iwm/README.iwlwifi-3160-ucode base-firmware-root +./libdata/firmware/if_iwm/README.iwlwifi-3168-ucode base-firmware-root ./libdata/firmware/if_iwm/README.iwlwifi-7260-ucode base-firmware-root ./libdata/firmware/if_iwm/README.iwlwifi-7265-ucode base-firmware-root ./libdata/firmware/if_iwm/README.iwlwifi-8000-ucode base-firmware-root -./libdata/firmware/if_iwm/iwlwifi-3160-16.ucode base-firmware-root +./libdata/firmware/if_iwm/README.iwlwifi-8265-ucode base-firmware-root +./libdata/firmware/if_iwm/iwlwifi-3160-16.ucode base-obsolete obsolete +./libdata/firmware/if_iwm/iwlwifi-3160-17.ucode base-firmware-root ./libdata/firmware/if_iwm/iwlwifi-3160-9.ucode base-obsolete obsolete -./libdata/firmware/if_iwm/iwlwifi-7260-16.ucode base-firmware-root +./libdata/firmware/if_iwm/iwlwifi-3168-22.ucode base-firmware-root +./libdata/firmware/if_iwm/iwlwifi-7260-16.ucode base-obsolete obsolete +./libdata/firmware/if_iwm/iwlwifi-7260-17.ucode base-firmware-root ./libdata/firmware/if_iwm/iwlwifi-7260-9.ucode base-obsolete obsolete -./libdata/firmware/if_iwm/iwlwifi-7265-16.ucode base-firmware-root +./libdata/firmware/if_iwm/iwlwifi-7265-16.ucode base-obsolete obsolete +./libdata/firmware/if_iwm/iwlwifi-7265-17.ucode base-firmware-root ./libdata/firmware/if_iwm/iwlwifi-7265-9.ucode base-obsolete obsolete ./libdata/firmware/if_iwm/iwlwifi-7265D-16.ucode base-obsolete obsolete -./libdata/firmware/if_iwm/iwlwifi-7265D-17.ucode base-firmware-root -./libdata/firmware/if_iwm/iwlwifi-8000C-16.ucode base-firmware-root +./libdata/firmware/if_iwm/iwlwifi-7265D-17.ucode base-obsolete obsolete +./libdata/firmware/if_iwm/iwlwifi-7265D-22.ucode base-firmware-root +./libdata/firmware/if_iwm/iwlwifi-8000C-16.ucode base-obsolete obsolete +./libdata/firmware/if_iwm/iwlwifi-8000C-22.ucode base-firmware-root +./libdata/firmware/if_iwm/iwlwifi-8265-22.ucode base-firmware-root ./libdata/firmware/if_iwn base-firmware-root ./libdata/firmware/if_iwn/LICENSE.iwlwifi-100-ucode base-firmware-root ./libdata/firmware/if_iwn/LICENSE.iwlwifi-1000-ucode base-firmware-root Index: src/external/intel-fw-public/Makefile diff -u src/external/intel-fw-public/Makefile:1.10 src/external/intel-fw-public/Makefile:1.11 --- src/external/intel-fw-public/Makefile:1.10 Sun Dec 18 02:18:29 2016 +++ src/external/intel-fw-public/Makefile Tue Mar 14 23:59:24 2017 @@ -1,7 +1,8 @@ -# $NetBSD: Makefile,v 1.10 2016/12/18 02:18:29 nonaka Exp $ +# $NetBSD: Makefile,v 1.11 2017/03/14 23:59:24 nonaka Exp $ -SUBDIR+= ipw3945 iwl100 iwl105 iwl135 iwl1000 iwl2000 iwl2030 iwl3160 \ +SUBDIR+= ipw3945 iwl100 iwl105 iwl135 iwl1000 iwl2000 iwl2030 \ + iwl3160 iwl3168 \ iwl4965 iwl5000 iwl5150 iwl6000 iwl6005 iwl6030 iwl6050 \ - iwl7260 iwl7265 iwl8000 + iwl7260 iwl7265 iwl8000 iwl8265 .include <bsd.subdir.mk> Index: src/external/intel-fw-public/iwl3160/Makefile diff -u src/external/intel-fw-public/iwl3160/Makefile:1.3 src/external/intel-fw-public/iwl3160/Makefile:1.4 --- src/external/intel-fw-public/iwl3160/Makefile:1.3 Sun Dec 18 17:57:38 2016 +++ src/external/intel-fw-public/iwl3160/Makefile Tue Mar 14 23:59:25 2017 @@ -1,9 +1,9 @@ -# $NetBSD: Makefile,v 1.3 2016/12/18 17:57:38 christos Exp $ +# $NetBSD: Makefile,v 1.4 2017/03/14 23:59:25 nonaka Exp $ NOMAN= # define FILES= dist/LICENSE.iwlwifi-3160-ucode dist/README.iwlwifi-3160-ucode \ - dist/iwlwifi-3160-16.ucode + dist/iwlwifi-3160-17.ucode FILESDIR= /libdata/firmware/if_iwm Index: src/external/intel-fw-public/iwl7260/Makefile diff -u src/external/intel-fw-public/iwl7260/Makefile:1.3 src/external/intel-fw-public/iwl7260/Makefile:1.4 --- src/external/intel-fw-public/iwl7260/Makefile:1.3 Sun Dec 18 17:57:38 2016 +++ src/external/intel-fw-public/iwl7260/Makefile Tue Mar 14 23:59:25 2017 @@ -1,9 +1,9 @@ -# $NetBSD: Makefile,v 1.3 2016/12/18 17:57:38 christos Exp $ +# $NetBSD: Makefile,v 1.4 2017/03/14 23:59:25 nonaka Exp $ NOMAN= # define FILES= dist/LICENSE.iwlwifi-7260-ucode dist/README.iwlwifi-7260-ucode \ - dist/iwlwifi-7260-16.ucode + dist/iwlwifi-7260-17.ucode FILESDIR= /libdata/firmware/if_iwm Index: src/external/intel-fw-public/iwl7265/Makefile diff -u src/external/intel-fw-public/iwl7265/Makefile:1.4 src/external/intel-fw-public/iwl7265/Makefile:1.5 --- src/external/intel-fw-public/iwl7265/Makefile:1.4 Fri Jan 13 11:21:47 2017 +++ src/external/intel-fw-public/iwl7265/Makefile Tue Mar 14 23:59:25 2017 @@ -1,9 +1,9 @@ -# $NetBSD: Makefile,v 1.4 2017/01/13 11:21:47 nonaka Exp $ +# $NetBSD: Makefile,v 1.5 2017/03/14 23:59:25 nonaka Exp $ NOMAN= # define FILES= dist/LICENSE.iwlwifi-7265-ucode dist/README.iwlwifi-7265-ucode \ - dist/iwlwifi-7265-16.ucode dist/iwlwifi-7265D-17.ucode + dist/iwlwifi-7265-17.ucode dist/iwlwifi-7265D-22.ucode FILESDIR= /libdata/firmware/if_iwm Index: src/external/intel-fw-public/iwl8000/Makefile diff -u src/external/intel-fw-public/iwl8000/Makefile:1.1 src/external/intel-fw-public/iwl8000/Makefile:1.2 --- src/external/intel-fw-public/iwl8000/Makefile:1.1 Sun Dec 18 02:18:29 2016 +++ src/external/intel-fw-public/iwl8000/Makefile Tue Mar 14 23:59:26 2017 @@ -1,9 +1,9 @@ -# $NetBSD: Makefile,v 1.1 2016/12/18 02:18:29 nonaka Exp $ +# $NetBSD: Makefile,v 1.2 2017/03/14 23:59:26 nonaka Exp $ NOMAN= # define FILES= dist/LICENSE.iwlwifi-8000-ucode dist/README.iwlwifi-8000-ucode \ - dist/iwlwifi-8000C-16.ucode + dist/iwlwifi-8000C-22.ucode FILESDIR= /libdata/firmware/if_iwm Index: src/sys/dev/pci/if_iwm.c diff -u src/sys/dev/pci/if_iwm.c:1.70 src/sys/dev/pci/if_iwm.c:1.71 --- src/sys/dev/pci/if_iwm.c:1.70 Thu Feb 2 10:05:35 2017 +++ src/sys/dev/pci/if_iwm.c Tue Mar 14 23:59:26 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iwm.c,v 1.70 2017/02/02 10:05:35 nonaka Exp $ */ +/* $NetBSD: if_iwm.c,v 1.71 2017/03/14 23:59:26 nonaka Exp $ */ /* OpenBSD: if_iwm.c,v 1.148 2016/11/19 21:07:08 stsp Exp */ #define IEEE80211_NO_HT /* @@ -30,9 +30,9 @@ * * GPL LICENSE SUMMARY * - * Copyright(c) 2007 - 2013 Intel Corporation. All rights reserved. + * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH - * Copyright(c) 2016 Intel Deutschland GmbH + * Copyright(c) 2016 Intel Deutschland GmbH * * This program is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License as @@ -52,15 +52,14 @@ * in the file called COPYING. * * Contact Information: - * Intel Linux Wireless <i...@linux.intel.com> + * Intel Linux Wireless <linuxw...@intel.com> * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 * - * * BSD LICENSE * - * Copyright(c) 2005 - 2013 Intel Corporation. All rights reserved. + * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH - * Copyright(c) 2016 Intel Deutschland GmbH + * Copyright(c) 2016 Intel Deutschland GmbH * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -107,7 +106,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_iwm.c,v 1.70 2017/02/02 10:05:35 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_iwm.c,v 1.71 2017/03/14 23:59:26 nonaka Exp $"); #include <sys/param.h> #include <sys/conf.h> @@ -345,6 +344,8 @@ static int iwm_firmware_load_sect(struct const uint8_t *, uint32_t); static int iwm_firmware_load_chunk(struct iwm_softc *, uint32_t, const uint8_t *, uint32_t); +static int iwm_load_cpu_sections_7000(struct iwm_softc *, + struct iwm_fw_sects *, int , int *); static int iwm_load_firmware_7000(struct iwm_softc *, enum iwm_ucode_type); static int iwm_load_cpu_sections_8000(struct iwm_softc *, struct iwm_fw_sects *, int , int *); @@ -755,6 +756,10 @@ iwm_read_firmware(struct iwm_softc *sc, err = EINVAL; goto parse_out; } + if (tlv_len % sizeof(uint32_t)) { + err = EINVAL; + goto parse_out; + } /* * Apparently there can be many flags, but Linux driver * parses only the first one, and so do we. @@ -780,7 +785,14 @@ iwm_read_firmware(struct iwm_softc *sc, goto parse_out; } num_cpu = le32toh(*(uint32_t *)tlv_data); - if (num_cpu < 1 || num_cpu > 2) { + if (num_cpu == 2) { + fw->fw_sects[IWM_UCODE_TYPE_REGULAR].is_dual_cpus = + true; + fw->fw_sects[IWM_UCODE_TYPE_INIT].is_dual_cpus = + true; + fw->fw_sects[IWM_UCODE_TYPE_WOW].is_dual_cpus = + true; + } else if (num_cpu < 1 || num_cpu > 2) { err = EINVAL; goto parse_out; } @@ -823,35 +835,44 @@ iwm_read_firmware(struct iwm_softc *sc, case IWM_UCODE_TLV_API_CHANGES_SET: { struct iwm_ucode_api *api; + uint32_t idx, bits; + int i; if (tlv_len != sizeof(*api)) { err = EINVAL; goto parse_out; } api = (struct iwm_ucode_api *)tlv_data; - /* Flags may exceed 32 bits in future firmware. */ - if (le32toh(api->api_index) > 0) { + idx = le32toh(api->api_index); + bits = le32toh(api->api_flags); + if (idx >= howmany(IWM_NUM_UCODE_TLV_API, 32)) { err = EINVAL; goto parse_out; } - sc->sc_ucode_api = le32toh(api->api_flags); + for (i = 0; i < 32; i++) { + if (!ISSET(bits, __BIT(i))) + continue; + setbit(sc->sc_ucode_api, i + (32 * idx)); + } break; } case IWM_UCODE_TLV_ENABLED_CAPABILITIES: { struct iwm_ucode_capa *capa; - int idx, i; + uint32_t idx, bits; + int i; if (tlv_len != sizeof(*capa)) { err = EINVAL; goto parse_out; } capa = (struct iwm_ucode_capa *)tlv_data; idx = le32toh(capa->api_index); + bits = le32toh(capa->api_capa); if (idx >= howmany(IWM_NUM_UCODE_TLV_CAPA, 32)) { err = EINVAL; goto parse_out; } for (i = 0; i < 32; i++) { - if (!ISSET(le32toh(capa->api_capa), __BIT(i))) + if (!ISSET(bits, __BIT(i))) continue; setbit(sc->sc_enabled_capa, i + (32 * idx)); } @@ -861,6 +882,7 @@ iwm_read_firmware(struct iwm_softc *sc, case IWM_UCODE_TLV_FW_UNDOCUMENTED1: case IWM_UCODE_TLV_SDIO_ADMA_ADDR: case IWM_UCODE_TLV_FW_GSCAN_CAPA: + case IWM_UCODE_TLV_FW_MEM_SEG: /* ignore, not used by current driver */ break; @@ -872,6 +894,28 @@ iwm_read_firmware(struct iwm_softc *sc, goto parse_out; break; + case IWM_UCODE_TLV_PAGING: { + uint32_t paging_mem_size; + if (tlv_len != sizeof(paging_mem_size)) { + err = EINVAL; + goto parse_out; + } + paging_mem_size = le32toh(*(uint32_t *)tlv_data); + if (paging_mem_size > IWM_MAX_PAGING_IMAGE_SIZE) { + err = EINVAL; + goto parse_out; + } + if (paging_mem_size & (IWM_FW_PAGING_SIZE - 1)) { + err = EINVAL; + goto parse_out; + } + fw->fw_sects[IWM_UCODE_TYPE_REGULAR].paging_mem_size = + paging_mem_size; + fw->fw_sects[IWM_UCODE_TYPE_REGULAR_USNIFFER].paging_mem_size = + paging_mem_size; + break; + } + case IWM_UCODE_TLV_N_SCAN_CHANNELS: if (tlv_len != sizeof(uint32_t)) { err = EINVAL; @@ -2791,6 +2835,232 @@ iwm_ampdu_rx_stop(struct ieee80211com *i #endif static void +iwm_free_fw_paging(struct iwm_softc *sc) +{ + int i; + + if (sc->fw_paging_db[0].fw_paging_block.vaddr == NULL) + return; + + for (i = 0; i < IWM_NUM_OF_FW_PAGING_BLOCKS; i++) { + iwm_dma_contig_free(&sc->fw_paging_db[i].fw_paging_block); + } + + memset(sc->fw_paging_db, 0, sizeof(sc->fw_paging_db)); +} + +static int +iwm_fill_paging_mem(struct iwm_softc *sc, const struct iwm_fw_sects *fws) +{ + int sec_idx, idx; + uint32_t offset = 0; + + /* + * find where is the paging image start point: + * if CPU2 exist and it's in paging format, then the image looks like: + * CPU1 sections (2 or more) + * CPU1_CPU2_SEPARATOR_SECTION delimiter - separate between CPU1 to CPU2 + * CPU2 sections (not paged) + * PAGING_SEPARATOR_SECTION delimiter - separate between CPU2 + * non paged to CPU2 paging sec + * CPU2 paging CSS + * CPU2 paging image (including instruction and data) + */ + for (sec_idx = 0; sec_idx < IWM_UCODE_SECT_MAX; sec_idx++) { + if (fws->fw_sect[sec_idx].fws_devoff == + IWM_PAGING_SEPARATOR_SECTION) { + sec_idx++; + break; + } + } + + /* + * If paging is enabled there should be at least 2 more sections left + * (one for CSS and one for Paging data) + */ + if (sec_idx >= __arraycount(fws->fw_sect) - 1) { + aprint_verbose_dev(sc->sc_dev, + "Paging: Missing CSS and/or paging sections\n"); + iwm_free_fw_paging(sc); + return EINVAL; + } + + /* copy the CSS block to the dram */ + DPRINTF(("%s: Paging: load paging CSS to FW, sec = %d\n", DEVNAME(sc), + sec_idx)); + + memcpy(sc->fw_paging_db[0].fw_paging_block.vaddr, + fws->fw_sect[sec_idx].fws_data, sc->fw_paging_db[0].fw_paging_size); + + DPRINTF(("%s: Paging: copied %d CSS bytes to first block\n", + DEVNAME(sc), sc->fw_paging_db[0].fw_paging_size)); + + sec_idx++; + + /* + * copy the paging blocks to the dram + * loop index start from 1 since that CSS block already copied to dram + * and CSS index is 0. + * loop stop at num_of_paging_blk since that last block is not full. + */ + for (idx = 1; idx < sc->num_of_paging_blk; idx++) { + memcpy(sc->fw_paging_db[idx].fw_paging_block.vaddr, + (const char *)fws->fw_sect[sec_idx].fws_data + offset, + sc->fw_paging_db[idx].fw_paging_size); + + DPRINTF(("%s: Paging: copied %d paging bytes to block %d\n", + DEVNAME(sc), sc->fw_paging_db[idx].fw_paging_size, idx)); + + offset += sc->fw_paging_db[idx].fw_paging_size; + } + + /* copy the last paging block */ + if (sc->num_of_pages_in_last_blk > 0) { + memcpy(sc->fw_paging_db[idx].fw_paging_block.vaddr, + (const char *)fws->fw_sect[sec_idx].fws_data + offset, + IWM_FW_PAGING_SIZE * sc->num_of_pages_in_last_blk); + + DPRINTF(("%s: Paging: copied %d pages in the last block %d\n", + DEVNAME(sc), sc->num_of_pages_in_last_blk, idx)); + } + + return 0; +} + +static int +iwm_alloc_fw_paging_mem(struct iwm_softc *sc, const struct iwm_fw_sects *fws) +{ + int blk_idx = 0; + int error, num_of_pages; + bus_dmamap_t dmap; + + if (sc->fw_paging_db[0].fw_paging_block.vaddr != NULL) { + int i; + /* Device got reset, and we setup firmware paging again */ + for (i = 0; i < sc->num_of_paging_blk + 1; i++) { + dmap = sc->fw_paging_db[i].fw_paging_block.map; + bus_dmamap_sync(sc->sc_dmat, dmap, 0, dmap->dm_mapsize, + BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); + } + return 0; + } + + /* ensure IWM_BLOCK_2_EXP_SIZE is power of 2 of IWM_PAGING_BLOCK_SIZE */ + CTASSERT(__BIT(IWM_BLOCK_2_EXP_SIZE) == IWM_PAGING_BLOCK_SIZE); + + num_of_pages = fws->paging_mem_size / IWM_FW_PAGING_SIZE; + sc->num_of_paging_blk = + howmany(num_of_pages, IWM_NUM_OF_PAGE_PER_GROUP); + sc->num_of_pages_in_last_blk = num_of_pages - + IWM_NUM_OF_PAGE_PER_GROUP * (sc->num_of_paging_blk - 1); + + DPRINTF(("%s: Paging: allocating mem for %d paging blocks, " + "each block holds 8 pages, last block holds %d pages\n", + DEVNAME(sc), sc->num_of_paging_blk, sc->num_of_pages_in_last_blk)); + + /* allocate block of 4Kbytes for paging CSS */ + error = iwm_dma_contig_alloc(sc->sc_dmat, + &sc->fw_paging_db[blk_idx].fw_paging_block, IWM_FW_PAGING_SIZE, + 4096); + if (error) { + /* free all the previous pages since we failed */ + iwm_free_fw_paging(sc); + return ENOMEM; + } + + sc->fw_paging_db[blk_idx].fw_paging_size = IWM_FW_PAGING_SIZE; + + DPRINTF(("%s: Paging: allocated 4K(CSS) bytes for firmware paging.\n", + DEVNAME(sc))); + + /* + * allocate blocks in dram. + * since that CSS allocated in fw_paging_db[0] loop start from index 1 + */ + for (blk_idx = 1; blk_idx < sc->num_of_paging_blk + 1; blk_idx++) { + /* allocate block of IWM_PAGING_BLOCK_SIZE (32K) */ + /* XXX Use iwm_dma_contig_alloc for allocating */ + error = iwm_dma_contig_alloc(sc->sc_dmat, + &sc->fw_paging_db[blk_idx].fw_paging_block, + IWM_PAGING_BLOCK_SIZE, 4096); + if (error) { + /* free all the previous pages since we failed */ + iwm_free_fw_paging(sc); + return ENOMEM; + } + + sc->fw_paging_db[blk_idx].fw_paging_size = + IWM_PAGING_BLOCK_SIZE; + + DPRINTF(("%s: Paging: allocated 32K bytes for firmware " + "paging.\n", DEVNAME(sc))); + } + + return 0; +} + +static int +iwm_save_fw_paging(struct iwm_softc *sc, const struct iwm_fw_sects *fws) +{ + int err; + + err = iwm_alloc_fw_paging_mem(sc, fws); + if (err) + return err; + + return iwm_fill_paging_mem(sc, fws); +} + +static bool +iwm_has_new_tx_api(struct iwm_softc *sc) +{ + /* XXX */ + return false; +} + +/* send paging cmd to FW in case CPU2 has paging image */ +static int +iwm_send_paging_cmd(struct iwm_softc *sc, const struct iwm_fw_sects *fws) +{ + struct iwm_fw_paging_cmd fw_paging_cmd = { + .flags = htole32(IWM_PAGING_CMD_IS_SECURED | + IWM_PAGING_CMD_IS_ENABLED | + (sc->num_of_pages_in_last_blk << + IWM_PAGING_CMD_NUM_OF_PAGES_IN_LAST_GRP_POS)), + .block_size = htole32(IWM_BLOCK_2_EXP_SIZE), + .block_num = htole32(sc->num_of_paging_blk), + }; + size_t size = sizeof(fw_paging_cmd); + int blk_idx; + bus_dmamap_t dmap; + + if (!iwm_has_new_tx_api(sc)) + size -= (sizeof(uint64_t) - sizeof(uint32_t)) * + IWM_NUM_OF_FW_PAGING_BLOCKS; + + /* loop for for all paging blocks + CSS block */ + for (blk_idx = 0; blk_idx < sc->num_of_paging_blk + 1; blk_idx++) { + bus_addr_t dev_phy_addr = + sc->fw_paging_db[blk_idx].fw_paging_block.paddr; + if (iwm_has_new_tx_api(sc)) { + fw_paging_cmd.device_phy_addr.addr64[blk_idx] = + htole64(dev_phy_addr); + } else { + dev_phy_addr = dev_phy_addr >> IWM_PAGE_2_EXP_SIZE; + fw_paging_cmd.device_phy_addr.addr32[blk_idx] = + htole32(dev_phy_addr); + } + dmap = sc->fw_paging_db[blk_idx].fw_paging_block.map, + bus_dmamap_sync(sc->sc_dmat, dmap, 0, dmap->dm_mapsize, + BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); + } + + return iwm_send_cmd_pdu(sc, + iwm_cmd_id(IWM_FW_PAGING_BLOCK_CMD, IWM_ALWAYS_LONG_GROUP, 0), + 0, size, &fw_paging_cmd); +} + +static void iwm_set_hw_address_8000(struct iwm_softc *sc, struct iwm_nvm_data *data, const uint16_t *mac_override, const uint16_t *nvm_hw) { @@ -3115,30 +3385,87 @@ iwm_firmware_load_chunk(struct iwm_softc } static int -iwm_load_firmware_7000(struct iwm_softc *sc, enum iwm_ucode_type ucode_type) +iwm_load_cpu_sections_7000(struct iwm_softc *sc, struct iwm_fw_sects *fws, + int cpu, int *first_ucode_section) { - struct iwm_fw_sects *fws; - int err, i; + int i, err = 0; + uint32_t last_read_idx = 0; void *data; uint32_t dlen; uint32_t offset; - fws = &sc->sc_fw.fw_sects[ucode_type]; - for (i = 0; i < fws->fw_count; i++) { + if (cpu == 1) { + *first_ucode_section = 0; + } else { + (*first_ucode_section)++; + } + + for (i = *first_ucode_section; i < IWM_UCODE_SECT_MAX; i++) { + last_read_idx = i; data = fws->fw_sect[i].fws_data; dlen = fws->fw_sect[i].fws_len; offset = fws->fw_sect[i].fws_devoff; + + /* + * CPU1_CPU2_SEPARATOR_SECTION delimiter - separate between + * CPU1 to CPU2. + * PAGING_SEPARATOR_SECTION delimiter - separate between + * CPU2 non paged to CPU2 paging sec. + */ + if (!data || offset == IWM_CPU1_CPU2_SEPARATOR_SECTION || + offset == IWM_PAGING_SEPARATOR_SECTION) + break; + if (dlen > sc->sc_fwdmasegsz) { err = EFBIG; } else err = iwm_firmware_load_sect(sc, offset, data, dlen); if (err) { - DPRINTF(("%s: could not load firmware chunk %u of %u\n", - DEVNAME(sc), i, fws->fw_count)); + DPRINTF(("%s: could not load firmware chunk %d " + "(error %d)\n", DEVNAME(sc), i, err)); return err; } } + *first_ucode_section = last_read_idx; + + return 0; +} + +static int +iwm_load_firmware_7000(struct iwm_softc *sc, enum iwm_ucode_type ucode_type) +{ + struct iwm_fw_sects *fws; + int err = 0; + int first_ucode_section; + + fws = &sc->sc_fw.fw_sects[ucode_type]; + + DPRINTF(("%s: working with %s CPU\n", DEVNAME(sc), + fws->is_dual_cpus ? "dual" : "single")); + + /* load to FW the binary Secured sections of CPU1 */ + err = iwm_load_cpu_sections_7000(sc, fws, 1, &first_ucode_section); + if (err) + return err; + + if (fws->is_dual_cpus) { + /* set CPU2 header address */ + if (iwm_nic_lock(sc)) { + iwm_write_prph(sc, + IWM_LMPM_SECURE_UCODE_LOAD_CPU2_HDR_ADDR, + IWM_LMPM_SECURE_CPU2_HDR_MEM_SPACE); + iwm_nic_unlock(sc); + } + + /* load to FW the binary sections of CPU2 */ + err = iwm_load_cpu_sections_7000(sc, fws, 2, + &first_ucode_section); + if (err) + return err; + } + + /* release CPU reset */ IWM_WRITE(sc, IWM_CSR_RESET, 0); return 0; @@ -3336,6 +3663,7 @@ iwm_send_phy_cfg_cmd(struct iwm_softc *s static int iwm_load_ucode_wait_alive(struct iwm_softc *sc, enum iwm_ucode_type ucode_type) { + struct iwm_fw_sects *fws; enum iwm_ucode_type old_type = sc->sc_uc_current; int err; @@ -3350,7 +3678,24 @@ iwm_load_ucode_wait_alive(struct iwm_sof return err; } - return iwm_post_alive(sc); + err = iwm_post_alive(sc); + if (err) + return err; + + fws = &sc->sc_fw.fw_sects[ucode_type]; + if (fws->paging_mem_size) { + err = iwm_save_fw_paging(sc, fws); + if (err) + return err; + + err = iwm_send_paging_cmd(sc, fws); + if (err) { + iwm_free_fw_paging(sc); + return err; + } + } + + return 0; } static int @@ -6234,7 +6579,7 @@ iwm_send_update_mcc_cmd(struct iwm_softc memset(&mcc_cmd, 0, sizeof(mcc_cmd)); mcc_cmd.mcc = htole16(alpha2[0] << 8 | alpha2[1]); - if ((sc->sc_ucode_api & IWM_UCODE_TLV_API_WIFI_MCC_UPDATE) || + if (isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_WIFI_MCC_UPDATE) || isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_LAR_MULTI_MCC)) mcc_cmd.source_id = IWM_MCC_SOURCE_GET_CURRENT; else @@ -7112,6 +7457,7 @@ iwm_notif_intr(struct iwm_softc *sc) case IWM_REMOVE_STA: case IWM_TXPATH_FLUSH: case IWM_LQ_CMD: + case IWM_WIDE_ID(IWM_ALWAYS_LONG_GROUP, IWM_FW_PAGING_BLOCK_CMD): case IWM_BT_CONFIG: case IWM_REPLY_THERMAL_MNG_BACKOFF: SYNC_RESP_STRUCT(cresp, pkt); @@ -7181,6 +7527,9 @@ iwm_notif_intr(struct iwm_softc *sc) break; } + case IWM_DEBUG_LOG_MSG: + break; + case IWM_MCAST_FILTER_CMD: break; @@ -7541,7 +7890,7 @@ iwm_attach(device_t parent, device_t sel switch (PCI_PRODUCT(sc->sc_pciid)) { case PCI_PRODUCT_INTEL_WIFI_LINK_3160_1: case PCI_PRODUCT_INTEL_WIFI_LINK_3160_2: - sc->sc_fwname = "iwlwifi-3160-16.ucode"; + sc->sc_fwname = "iwlwifi-3160-17.ucode"; sc->host_interrupt_operation_mode = 1; sc->apmg_wake_up_wa = 1; sc->sc_device_family = IWM_DEVICE_FAMILY_7000; @@ -7549,7 +7898,14 @@ iwm_attach(device_t parent, device_t sel break; case PCI_PRODUCT_INTEL_WIFI_LINK_3165_1: case PCI_PRODUCT_INTEL_WIFI_LINK_3165_2: - sc->sc_fwname = "iwlwifi-7265D-17.ucode"; + sc->sc_fwname = "iwlwifi-7265D-22.ucode"; + sc->host_interrupt_operation_mode = 0; + sc->apmg_wake_up_wa = 1; + sc->sc_device_family = IWM_DEVICE_FAMILY_7000; + sc->sc_fwdmasegsz = IWM_FWDMASEGSZ; + break; + case PCI_PRODUCT_INTEL_WIFI_LINK_3168: + sc->sc_fwname = "iwlwifi-3168-22.ucode"; sc->host_interrupt_operation_mode = 0; sc->apmg_wake_up_wa = 1; sc->sc_device_family = IWM_DEVICE_FAMILY_7000; @@ -7557,7 +7913,7 @@ iwm_attach(device_t parent, device_t sel break; case PCI_PRODUCT_INTEL_WIFI_LINK_7260_1: case PCI_PRODUCT_INTEL_WIFI_LINK_7260_2: - sc->sc_fwname = "iwlwifi-7260-16.ucode"; + sc->sc_fwname = "iwlwifi-7260-17.ucode"; sc->host_interrupt_operation_mode = 1; sc->apmg_wake_up_wa = 1; sc->sc_device_family = IWM_DEVICE_FAMILY_7000; @@ -7567,7 +7923,7 @@ iwm_attach(device_t parent, device_t sel case PCI_PRODUCT_INTEL_WIFI_LINK_7265_2: sc->sc_fwname = (sc->sc_hw_rev & IWM_CSR_HW_REV_TYPE_MSK) == IWM_CSR_HW_REV_TYPE_7265D ? - "iwlwifi-7265D-17.ucode": "iwlwifi-7265-16.ucode"; + "iwlwifi-7265D-22.ucode": "iwlwifi-7265-17.ucode"; sc->host_interrupt_operation_mode = 0; sc->apmg_wake_up_wa = 1; sc->sc_device_family = IWM_DEVICE_FAMILY_7000; @@ -7577,7 +7933,14 @@ iwm_attach(device_t parent, device_t sel case PCI_PRODUCT_INTEL_WIFI_LINK_8260_2: case PCI_PRODUCT_INTEL_WIFI_LINK_4165_1: case PCI_PRODUCT_INTEL_WIFI_LINK_4165_2: - sc->sc_fwname = "iwlwifi-8000C-16.ucode"; + sc->sc_fwname = "iwlwifi-8000C-22.ucode"; + sc->host_interrupt_operation_mode = 0; + sc->apmg_wake_up_wa = 0; + sc->sc_device_family = IWM_DEVICE_FAMILY_8000; + sc->sc_fwdmasegsz = IWM_FWDMASEGSZ_8000; + break; + case PCI_PRODUCT_INTEL_WIFI_LINK_8265: + sc->sc_fwname = "iwlwifi-8265-22.ucode"; sc->host_interrupt_operation_mode = 0; sc->apmg_wake_up_wa = 0; sc->sc_device_family = IWM_DEVICE_FAMILY_8000; Index: src/sys/dev/pci/if_iwmreg.h diff -u src/sys/dev/pci/if_iwmreg.h:1.5 src/sys/dev/pci/if_iwmreg.h:1.6 --- src/sys/dev/pci/if_iwmreg.h:1.5 Fri Jan 13 11:21:47 2017 +++ src/sys/dev/pci/if_iwmreg.h Tue Mar 14 23:59:26 2017 @@ -1,14 +1,20 @@ -/* $NetBSD: if_iwmreg.h,v 1.5 2017/01/13 11:21:47 nonaka Exp $ */ +/* $NetBSD: if_iwmreg.h,v 1.6 2017/03/14 23:59:26 nonaka Exp $ */ /* OpenBSD: if_iwmreg.h,v 1.19 2016/09/20 11:46:09 stsp Exp */ -/****************************************************************************** +/*- + * Based on BSD-licensed source modules in the Linux iwlwifi driver, + * which were used as the reference documentation for this implementation. + * + *********************************************************************** * * This file is provided under a dual BSD/GPLv2 license. When using or * redistributing this file, you may do so under either license. * * GPL LICENSE SUMMARY * - * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. + * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. + * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH + * Copyright(c) 2016 Intel Deutschland GmbH * * This program is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License as @@ -28,12 +34,14 @@ * in the file called COPYING. * * Contact Information: - * Intel Linux Wireless <i...@linux.intel.com> + * Intel Linux Wireless <linuxw...@intel.com> * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 * * BSD LICENSE * * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. + * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH + * Copyright(c) 2016 Intel Deutschland GmbH * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -61,8 +69,7 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - *****************************************************************************/ + */ /* * CSR (control and status registers) @@ -656,12 +663,12 @@ enum iwm_ucode_tlv_flag { * @IWM_NUM_UCODE_TLV_API: number of bits used */ enum iwm_ucode_tlv_api { - IWM_UCODE_TLV_API_FRAGMENTED_SCAN = (1 << 8), - IWM_UCODE_TLV_API_WIFI_MCC_UPDATE = (1 << 9), - IWM_UCODE_TLV_API_WIDE_CMD_HDR = (1 << 14), - IWM_UCODE_TLV_API_LQ_SS_PARAMS = (1 << 18), - IWM_UCODE_TLV_API_EXT_SCAN_PRIORITY = (1 << 24), - IWM_UCODE_TLV_API_TX_POWER_CHAIN = (1 << 27), + IWM_UCODE_TLV_API_FRAGMENTED_SCAN = 8, + IWM_UCODE_TLV_API_WIFI_MCC_UPDATE = 9, + IWM_UCODE_TLV_API_WIDE_CMD_HDR = 14, + IWM_UCODE_TLV_API_LQ_SS_PARAMS = 18, + IWM_UCODE_TLV_API_EXT_SCAN_PRIORITY = 24, + IWM_UCODE_TLV_API_TX_POWER_CHAIN = 27, IWM_NUM_UCODE_TLV_API = 32 }; @@ -946,6 +953,7 @@ enum iwm_ucode_tlv_type { IWM_UCODE_TLV_FW_DBG_TRIGGER = 40, IWM_UCODE_TLV_FW_UNDOCUMENTED1 = 48, /* undocumented TLV */ IWM_UCODE_TLV_FW_GSCAN_CAPA = 50, + IWM_UCODE_TLV_FW_MEM_SEG = 51, }; struct iwm_ucode_tlv { @@ -1757,6 +1765,9 @@ enum { IWM_LQ_CMD = 0x4e, + /* paging block to FW cpu2 */ + IWM_FW_PAGING_BLOCK_CMD = 0x4f, + /* Calibration */ IWM_TEMPERATURE_NOTIFICATION = 0x62, IWM_CALIBRATION_CFG_CMD = 0x65, @@ -2133,6 +2144,48 @@ struct iwm_nvm_access_cmd { uint8_t data[]; } __packed; /* IWM_NVM_ACCESS_CMD_API_S_VER_2 */ +#define IWM_NUM_OF_FW_PAGING_BLOCKS 33 /* 32 for data and 1 block for CSS */ + +/* + * struct iwm_fw_paging_cmd - paging layout + * + * (IWM_FW_PAGING_BLOCK_CMD = 0x4f) + * + * Send to FW the paging layout in the driver. + * + * @flags: various flags for the command + * @block_size: the block size in powers of 2 + * @block_num: number of blocks specified in the command. + * @device_phy_addr: virtual addresses from device side + * 32 bit address for API version 1, 64 bit address for API version 2. +*/ +struct iwm_fw_paging_cmd { + uint32_t flags; + uint32_t block_size; + uint32_t block_num; + union { + uint32_t addr32[IWM_NUM_OF_FW_PAGING_BLOCKS]; + uint64_t addr64[IWM_NUM_OF_FW_PAGING_BLOCKS]; + } device_phy_addr; +} __packed; /* FW_PAGING_BLOCK_CMD_API_S_VER_2 */ + +/* + * Fw items ID's + * + * @IWM_FW_ITEM_ID_PAGING: Address of the pages that the FW will upload + * download + */ +enum iwm_fw_item_id { + IWM_FW_ITEM_ID_PAGING = 3, +}; + +/* + * struct iwm_fw_get_item_cmd - get an item from the fw + */ +struct iwm_fw_get_item_cmd { + uint32_t item_id; +} __packed; /* FW_GET_ITEM_CMD_API_S_VER_1 */ + /** * struct iwm_nvm_access_resp_ver2 - response to IWM_NVM_ACCESS_CMD * @offset: offset in bytes into the section @@ -6508,6 +6561,36 @@ iwm_rx_packet_payload_len(const struct i #define IWM_MIN_DBM -100 #define IWM_MAX_DBM -33 /* realistic guess */ +/* + * Block paging calculations + */ +#define IWM_PAGE_2_EXP_SIZE 12 /* 4K == 2^12 */ +#define IWM_FW_PAGING_SIZE (1 << IWM_PAGE_2_EXP_SIZE) /* page size is 4KB */ +#define IWM_PAGE_PER_GROUP_2_EXP_SIZE 3 +/* 8 pages per group */ +#define IWM_NUM_OF_PAGE_PER_GROUP (1 << IWM_PAGE_PER_GROUP_2_EXP_SIZE) +/* don't change, support only 32KB size */ +#define IWM_PAGING_BLOCK_SIZE (IWM_NUM_OF_PAGE_PER_GROUP * IWM_FW_PAGING_SIZE) +/* 32K == 2^15 */ +#define IWM_BLOCK_2_EXP_SIZE (IWM_PAGE_2_EXP_SIZE + IWM_PAGE_PER_GROUP_2_EXP_SIZE) + +/* + * Image paging calculations + */ +#define IWM_BLOCK_PER_IMAGE_2_EXP_SIZE 5 +/* 2^5 == 32 blocks per image */ +#define IWM_NUM_OF_BLOCK_PER_IMAGE (1 << IWM_BLOCK_PER_IMAGE_2_EXP_SIZE) +/* maximum image size 1024KB */ +#define IWM_MAX_PAGING_IMAGE_SIZE (IWM_NUM_OF_BLOCK_PER_IMAGE * IWM_PAGING_BLOCK_SIZE) + +/* Virtual address signature */ +#define IWM_PAGING_ADDR_SIG 0xAA000000 + +#define IWM_PAGING_CMD_IS_SECURED (1 << 9) +#define IWM_PAGING_CMD_IS_ENABLED (1 << 8) +#define IWM_PAGING_CMD_NUM_OF_PAGES_IN_LAST_GRP_POS 0 +#define IWM_PAGING_TLV_SECURE_MASK 1 + #define IWM_READ(sc, reg) \ bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) Index: src/sys/dev/pci/if_iwmvar.h diff -u src/sys/dev/pci/if_iwmvar.h:1.17 src/sys/dev/pci/if_iwmvar.h:1.18 --- src/sys/dev/pci/if_iwmvar.h:1.17 Thu Feb 2 10:05:35 2017 +++ src/sys/dev/pci/if_iwmvar.h Tue Mar 14 23:59:26 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iwmvar.h,v 1.17 2017/02/02 10:05:35 nonaka Exp $ */ +/* $NetBSD: if_iwmvar.h,v 1.18 2017/03/14 23:59:26 nonaka Exp $ */ /* OpenBSD: if_iwmvar.h,v 1.24 2016/09/21 13:53:18 stsp Exp */ /* @@ -174,6 +174,8 @@ struct iwm_fw_info { } fw_sect[IWM_UCODE_SECT_MAX]; size_t fw_totlen; int fw_count; + int is_dual_cpus; + uint32_t paging_mem_size; } fw_sects[IWM_UCODE_TYPE_MAX]; }; @@ -238,6 +240,16 @@ struct iwm_dma_info { bus_size_t size; }; +/** + * struct iwm_fw_paging + * @fw_paging_block: dma memory info + * @fw_paging_size: page size + */ +struct iwm_fw_paging { + struct iwm_dma_info fw_paging_block; + uint32_t fw_paging_size; +}; + #define IWM_TX_RING_COUNT 256 #define IWM_TX_RING_LOMARK 192 #define IWM_TX_RING_HIMARK 224 @@ -411,7 +423,7 @@ struct iwm_softc { int sc_capaflags; int sc_capa_max_probe_len; int sc_capa_n_scan_channels; - uint32_t sc_ucode_api; + uint8_t sc_ucode_api[howmany(IWM_NUM_UCODE_TLV_API, NBBY)]; uint8_t sc_enabled_capa[howmany(IWM_NUM_UCODE_TLV_CAPA, NBBY)]; char sc_fw_mcc[3]; @@ -475,6 +487,14 @@ struct iwm_softc { * This is due to a HW bug in 7260, 3160 and 7265. */ int apmg_wake_up_wa; + /* + * Paging parameters - All of the parameters should be set by the + * opmode when paging is enabled + */ + struct iwm_fw_paging fw_paging_db[IWM_NUM_OF_FW_PAGING_BLOCKS]; + uint16_t num_of_paging_blk; + uint16_t num_of_pages_in_last_blk; + struct sysctllog *sc_clog; struct bpf_if *sc_drvbpf; Added files: Index: src/external/intel-fw-public/iwl3160/dist/iwlwifi-3160-17.ucode Binary files are different Index: src/external/intel-fw-public/iwl3168/Makefile diff -u /dev/null src/external/intel-fw-public/iwl3168/Makefile:1.1 --- /dev/null Tue Mar 14 23:59:26 2017 +++ src/external/intel-fw-public/iwl3168/Makefile Tue Mar 14 23:59:25 2017 @@ -0,0 +1,10 @@ +# $NetBSD: Makefile,v 1.1 2017/03/14 23:59:25 nonaka Exp $ + +NOMAN= # define + +FILES= dist/LICENSE.iwlwifi-3168-ucode dist/README.iwlwifi-3168-ucode \ + dist/iwlwifi-3168-22.ucode + +FILESDIR= /libdata/firmware/if_iwm + +.include <bsd.files.mk> Index: src/external/intel-fw-public/iwl3168/dist/LICENSE.iwlwifi-3168-ucode diff -u /dev/null src/external/intel-fw-public/iwl3168/dist/LICENSE.iwlwifi-3168-ucode:1.1 --- /dev/null Tue Mar 14 23:59:26 2017 +++ src/external/intel-fw-public/iwl3168/dist/LICENSE.iwlwifi-3168-ucode Tue Mar 14 23:59:25 2017 @@ -0,0 +1,39 @@ +Copyright (c) 2016, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. Index: src/external/intel-fw-public/iwl3168/dist/README.iwlwifi-3168-ucode diff -u /dev/null src/external/intel-fw-public/iwl3168/dist/README.iwlwifi-3168-ucode:1.1 --- /dev/null Tue Mar 14 23:59:26 2017 +++ src/external/intel-fw-public/iwl3168/dist/README.iwlwifi-3168-ucode Tue Mar 14 23:59:25 2017 @@ -0,0 +1,112 @@ +Intel Wireless WiFi Link 3168 AC Adapter +Copyright (C) 2016 Intel Corporation. All rights reserved. + +Microcode Package README.iwlwifi-3168-ucode + +INDEX + +1. OVERVIEW +2. INSTALLATION +3. LICENSE + + +1. OVERVIEW + +The files iwlwifi-3168-22.ucode provided in this package +must be present on your system in order for the Intel Wireless WiFi Link +AGN driver for Linux (iwlwifi) to operate on your system. + +The "-22" in the filename reflects an interface/architecture version number. +It will change only when changes in new uCode releases make the new uCode +incompatible with earlier drivers. + +On adapter initialization, and at varying times during the uptime of +the adapter, the microcode is loaded into the memory on the network +adapter. The microcode provides the low level MAC features including +radio control and high precision timing events (backoff, transmit, +etc.) while also providing varying levels of packet filtering which can +be used to keep the host from having to handle packets that are not of +interest given the current operating mode of the device. + +2. INSTALLATION + +The iwlwifi driver will look for the file iwlwifi-3168-22.ucode +using the kernel's firmware_class infrastructure. +More information can be found under Documentation/firmware_class in kernel +source. In order to function correctly, you need to have this support enabled +in your kernel. When you configure the kernel, you can find this option in +the following location: + + Device Drivers -> + Generic Driver Options -> + Userspace firmware loading support + + +You can determine if your kernel currently has firmware loader support +by looking for the CONFIG_FW_LOADER definition on your kernel's +.config. + +In addition to having the firmware_class support in your kernel, you +must also have a working udev and uevent infrastructure configured. +The steps for installing and configuring udev are very +distribution specific. + +Once you have the firmware loader in place (or if you aren't sure and +you just want to try things to see if it works), you need to install +the microcode file into the appropriate location. + +Where that appropriate location is depends (again) on your system +distribution. You can typically find this location by looking in the +udev scripts of your distro, the default is /lib/firmware. + +Installation of the firmware is simply: + + % cp iwlwifi-3168-22.ucode /lib/firmware + +You can now load the driver (see the INSTALL and README.iwlwifi provided with +the iwlwifi package for information on building and using that driver.) + +3. LICENSE + +The microcode in this package (iwlwifi-3168-22.ucode) is provided +under the terms of the following license (available in the file +LICENSE.iwlwifi-8000-ucode): + +Copyright (c) 2016, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. Index: src/external/intel-fw-public/iwl3168/dist/iwlwifi-3168-22.ucode Binary files are different Index: src/external/intel-fw-public/iwl7260/dist/iwlwifi-7260-17.ucode Binary files are different Index: src/external/intel-fw-public/iwl7265/dist/iwlwifi-7265-17.ucode Binary files are different Index: src/external/intel-fw-public/iwl7265/dist/iwlwifi-7265D-22.ucode Binary files are different Index: src/external/intel-fw-public/iwl8000/dist/iwlwifi-8000C-22.ucode Binary files are different Index: src/external/intel-fw-public/iwl8265/Makefile diff -u /dev/null src/external/intel-fw-public/iwl8265/Makefile:1.1 --- /dev/null Tue Mar 14 23:59:27 2017 +++ src/external/intel-fw-public/iwl8265/Makefile Tue Mar 14 23:59:26 2017 @@ -0,0 +1,10 @@ +# $NetBSD: Makefile,v 1.1 2017/03/14 23:59:26 nonaka Exp $ + +NOMAN= # define + +FILES= dist/LICENSE.iwlwifi-8265-ucode dist/README.iwlwifi-8265-ucode \ + dist/iwlwifi-8265-22.ucode + +FILESDIR= /libdata/firmware/if_iwm + +.include <bsd.files.mk> Index: src/external/intel-fw-public/iwl8265/dist/LICENSE.iwlwifi-8265-ucode diff -u /dev/null src/external/intel-fw-public/iwl8265/dist/LICENSE.iwlwifi-8265-ucode:1.1 --- /dev/null Tue Mar 14 23:59:27 2017 +++ src/external/intel-fw-public/iwl8265/dist/LICENSE.iwlwifi-8265-ucode Tue Mar 14 23:59:26 2017 @@ -0,0 +1,39 @@ +Copyright (c) 2015, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. Index: src/external/intel-fw-public/iwl8265/dist/README.iwlwifi-8265-ucode diff -u /dev/null src/external/intel-fw-public/iwl8265/dist/README.iwlwifi-8265-ucode:1.1 --- /dev/null Tue Mar 14 23:59:27 2017 +++ src/external/intel-fw-public/iwl8265/dist/README.iwlwifi-8265-ucode Tue Mar 14 23:59:26 2017 @@ -0,0 +1,112 @@ +Intel Wireless WiFi Link 8260 AC Adapter +Copyright (C) 2015 Intel Corporation. All rights reserved. + +Microcode Package README.iwlwifi-8265-ucode + +INDEX + +1. OVERVIEW +2. INSTALLATION +3. LICENSE + + +1. OVERVIEW + +The files iwlwifi-8265-22.ucode provided in this package +must be present on your system in order for the Intel Wireless WiFi Link +AGN driver for Linux (iwlwifi) to operate on your system. + +The "-22" in the filename reflects an interface/architecture version number. +It will change only when changes in new uCode releases make the new uCode +incompatible with earlier drivers. + +On adapter initialization, and at varying times during the uptime of +the adapter, the microcode is loaded into the memory on the network +adapter. The microcode provides the low level MAC features including +radio control and high precision timing events (backoff, transmit, +etc.) while also providing varying levels of packet filtering which can +be used to keep the host from having to handle packets that are not of +interest given the current operating mode of the device. + +2. INSTALLATION + +The iwlwifi driver will look for the file iwlwifi-8265-22.ucode +using the kernel's firmware_class infrastructure. +More information can be found under Documentation/firmware_class in kernel +source. In order to function correctly, you need to have this support enabled +in your kernel. When you configure the kernel, you can find this option in +the following location: + + Device Drivers -> + Generic Driver Options -> + Userspace firmware loading support + + +You can determine if your kernel currently has firmware loader support +by looking for the CONFIG_FW_LOADER definition on your kernel's +.config. + +In addition to having the firmware_class support in your kernel, you +must also have a working udev and uevent infrastructure configured. +The steps for installing and configuring udev are very +distribution specific. + +Once you have the firmware loader in place (or if you aren't sure and +you just want to try things to see if it works), you need to install +the microcode file into the appropriate location. + +Where that appropriate location is depends (again) on your system +distribution. You can typically find this location by looking in the +udev scripts of your distro, the default is /lib/firmware. + +Installation of the firmware is simply: + + % cp iwlwifi-8265-22.ucode /lib/firmware + +You can now load the driver (see the INSTALL and README.iwlwifi provided with +the iwlwifi package for information on building and using that driver.) + +3. LICENSE + +The microcode in this package (iwlwifi-8265-22.ucode) is provided +under the terms of the following license (available in the file +LICENSE.iwlwifi-8000-ucode): + +Copyright (c) 2015, Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Intel Corporation nor the names of its suppliers + may be used to endorse or promote products derived from this software + without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Intel Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. Index: src/external/intel-fw-public/iwl8265/dist/iwlwifi-8265-22.ucode Binary files are different