svn commit: r330168 - stable/11/sys/dev/iwm
Eitan Adler
eadler at FreeBSD.org
Thu Mar 1 05:45:23 UTC 2018
Author: eadler
Date: Thu Mar 1 05:45:22 2018
New Revision: 330168
URL: https://svnweb.freebsd.org/changeset/base/330168
Log:
MFC r313315,r313316:
[iwm] Get rid of some gratuitous constant renaming wrt. Linux iwlwifi.
* IWM_UCODE_SECT_MAX -> IWM_UCODE_SECTION_MAX
* IWM_UCODE_TYPE_* -> IWM_UCODE_* (except for IWM_UCODE_TYPE_MAX which
stays).
[iwm] Store paging_mem_size field in firmware image information struct.
Modified:
stable/11/sys/dev/iwm/if_iwm.c
stable/11/sys/dev/iwm/if_iwmreg.h
stable/11/sys/dev/iwm/if_iwmvar.h
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/dev/iwm/if_iwm.c
==============================================================================
--- stable/11/sys/dev/iwm/if_iwm.c Thu Mar 1 05:44:16 2018 (r330167)
+++ stable/11/sys/dev/iwm/if_iwm.c Thu Mar 1 05:45:22 2018 (r330168)
@@ -490,7 +490,7 @@ iwm_firmware_store_section(struct iwm_softc *sc,
return EINVAL;
fws = &sc->sc_fw.fw_sects[type];
- if (fws->fw_count >= IWM_UCODE_SECT_MAX)
+ if (fws->fw_count >= IWM_UCODE_SECTION_MAX)
return EINVAL;
fwone = &fws->fw_sect[fws->fw_count];
@@ -554,11 +554,13 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode
enum iwm_ucode_tlv_type tlv_type;
const struct firmware *fwp;
const uint8_t *data;
+ uint32_t usniffer_img;
+ uint32_t paging_mem_size;
int error = 0;
size_t len;
if (fw->fw_status == IWM_FW_STATUS_DONE &&
- ucode_type != IWM_UCODE_TYPE_INIT)
+ ucode_type != IWM_UCODE_INIT)
return 0;
while (fw->fw_status == IWM_FW_STATUS_INPROGRESS)
@@ -716,9 +718,9 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode
}
case IWM_UCODE_TLV_SEC_RT:
if ((error = iwm_firmware_store_section(sc,
- IWM_UCODE_TYPE_REGULAR, tlv_data, tlv_len)) != 0) {
+ IWM_UCODE_REGULAR, tlv_data, tlv_len)) != 0) {
device_printf(sc->sc_dev,
- "%s: IWM_UCODE_TYPE_REGULAR: iwm_firmware_store_section() failed; %d\n",
+ "%s: IWM_UCODE_REGULAR: iwm_firmware_store_section() failed; %d\n",
__func__,
error);
goto parse_out;
@@ -726,9 +728,9 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode
break;
case IWM_UCODE_TLV_SEC_INIT:
if ((error = iwm_firmware_store_section(sc,
- IWM_UCODE_TYPE_INIT, tlv_data, tlv_len)) != 0) {
+ IWM_UCODE_INIT, tlv_data, tlv_len)) != 0) {
device_printf(sc->sc_dev,
- "%s: IWM_UCODE_TYPE_INIT: iwm_firmware_store_section() failed; %d\n",
+ "%s: IWM_UCODE_INIT: iwm_firmware_store_section() failed; %d\n",
__func__,
error);
goto parse_out;
@@ -736,9 +738,9 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode
break;
case IWM_UCODE_TLV_SEC_WOWLAN:
if ((error = iwm_firmware_store_section(sc,
- IWM_UCODE_TYPE_WOW, tlv_data, tlv_len)) != 0) {
+ IWM_UCODE_WOWLAN, tlv_data, tlv_len)) != 0) {
device_printf(sc->sc_dev,
- "%s: IWM_UCODE_TYPE_WOW: iwm_firmware_store_section() failed; %d\n",
+ "%s: IWM_UCODE_WOWLAN: iwm_firmware_store_section() failed; %d\n",
__func__,
error);
goto parse_out;
@@ -829,11 +831,43 @@ iwm_read_firmware(struct iwm_softc *sc, enum iwm_ucode
case IWM_UCODE_TLV_SEC_RT_USNIFFER:
if ((error = iwm_firmware_store_section(sc,
- IWM_UCODE_TYPE_REGULAR_USNIFFER, tlv_data,
+ IWM_UCODE_REGULAR_USNIFFER, tlv_data,
tlv_len)) != 0)
goto parse_out;
break;
+ case IWM_UCODE_TLV_PAGING:
+ if (tlv_len != sizeof(uint32_t)) {
+ error = EINVAL;
+ goto parse_out;
+ }
+ paging_mem_size = le32toh(*(const uint32_t *)tlv_data);
+
+ IWM_DPRINTF(sc, IWM_DEBUG_FIRMWARE_TLV,
+ "%s: Paging: paging enabled (size = %u bytes)\n",
+ __func__, paging_mem_size);
+ if (paging_mem_size > IWM_MAX_PAGING_IMAGE_SIZE) {
+ device_printf(sc->sc_dev,
+ "%s: Paging: driver supports up to %u bytes for paging image\n",
+ __func__, IWM_MAX_PAGING_IMAGE_SIZE);
+ error = EINVAL;
+ goto out;
+ }
+ if (paging_mem_size & (IWM_FW_PAGING_SIZE - 1)) {
+ device_printf(sc->sc_dev,
+ "%s: Paging: image isn't multiple %u\n",
+ __func__, IWM_FW_PAGING_SIZE);
+ error = EINVAL;
+ goto out;
+ }
+
+ sc->sc_fw.fw_sects[IWM_UCODE_REGULAR].paging_mem_size =
+ paging_mem_size;
+ usniffer_img = IWM_UCODE_REGULAR_USNIFFER;
+ sc->sc_fw.fw_sects[usniffer_img].paging_mem_size =
+ paging_mem_size;
+ break;
+
case IWM_UCODE_TLV_N_SCAN_CHANNELS:
if (tlv_len != sizeof(uint32_t)) {
error = EINVAL;
@@ -2492,7 +2526,7 @@ iwm_load_cpu_sections_8000(struct iwm_softc *sc, struc
(*first_ucode_section)++;
}
- for (i = *first_ucode_section; i < IWM_UCODE_SECT_MAX; i++) {
+ for (i = *first_ucode_section; i < IWM_UCODE_SECTION_MAX; i++) {
last_read_idx = i;
data = fws->fw_sect[i].fws_data;
dlen = fws->fw_sect[i].fws_len;
@@ -2764,7 +2798,7 @@ iwm_run_init_mvm_ucode(struct iwm_softc *sc, int justn
sc->sc_init_complete = 0;
if ((error = iwm_mvm_load_ucode_wait_alive(sc,
- IWM_UCODE_TYPE_INIT)) != 0) {
+ IWM_UCODE_INIT)) != 0) {
device_printf(sc->sc_dev, "failed to load init firmware\n");
return error;
}
@@ -4680,7 +4714,7 @@ iwm_init_hw(struct iwm_softc *sc)
}
/* omstart, this time with the regular firmware */
- error = iwm_mvm_load_ucode_wait_alive(sc, IWM_UCODE_TYPE_REGULAR);
+ error = iwm_mvm_load_ucode_wait_alive(sc, IWM_UCODE_REGULAR);
if (error) {
device_printf(sc->sc_dev, "could not load firmware\n");
goto error;
Modified: stable/11/sys/dev/iwm/if_iwmreg.h
==============================================================================
--- stable/11/sys/dev/iwm/if_iwmreg.h Thu Mar 1 05:44:16 2018 (r330167)
+++ stable/11/sys/dev/iwm/if_iwmreg.h Thu Mar 1 05:45:22 2018 (r330168)
@@ -888,6 +888,28 @@ struct iwm_fw_cipher_scheme {
uint8_t hw_cipher;
} __packed;
+/*
+ * 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)
+
/**
* struct iwm_fw_cscheme_list - a cipher scheme list
* @size: a number of entries
Modified: stable/11/sys/dev/iwm/if_iwmvar.h
==============================================================================
--- stable/11/sys/dev/iwm/if_iwmvar.h Thu Mar 1 05:44:16 2018 (r330167)
+++ stable/11/sys/dev/iwm/if_iwmvar.h Thu Mar 1 05:45:22 2018 (r330168)
@@ -137,7 +137,7 @@ struct iwm_tx_radiotap_header {
(1 << IEEE80211_RADIOTAP_CHANNEL))
-#define IWM_UCODE_SECT_MAX 16
+#define IWM_UCODE_SECTION_MAX 16
#define IWM_FWDMASEGSZ (192*1024)
#define IWM_FWDMASEGSZ_8000 (320*1024)
/* sanity check value */
@@ -152,11 +152,21 @@ struct iwm_tx_radiotap_header {
#define IWM_FW_STATUS_INPROGRESS 1
#define IWM_FW_STATUS_DONE 2
+/**
+ * enum iwm_ucode_type
+ *
+ * The type of ucode.
+ *
+ * @IWM_UCODE_REGULAR: Normal runtime ucode
+ * @IWM_UCODE_INIT: Initial ucode
+ * @IWM_UCODE_WOWLAN: Wake on Wireless enabled ucode
+ * @IWM_UCODE_REGULAR_USNIFFER: Normal runtime ucode when using usniffer image
+ */
enum iwm_ucode_type {
- IWM_UCODE_TYPE_REGULAR,
- IWM_UCODE_TYPE_INIT,
- IWM_UCODE_TYPE_WOW,
- IWM_UCODE_TYPE_REGULAR_USNIFFER,
+ IWM_UCODE_REGULAR,
+ IWM_UCODE_INIT,
+ IWM_UCODE_WOWLAN,
+ IWM_UCODE_REGULAR_USNIFFER,
IWM_UCODE_TYPE_MAX
};
@@ -169,8 +179,9 @@ struct iwm_fw_info {
const void *fws_data;
uint32_t fws_len;
uint32_t fws_devoff;
- } fw_sect[IWM_UCODE_SECT_MAX];
+ } fw_sect[IWM_UCODE_SECTION_MAX];
int fw_count;
+ uint32_t paging_mem_size;
} fw_sects[IWM_UCODE_TYPE_MAX];
uint32_t phy_config;
More information about the svn-src-stable-11
mailing list