wifi: iwlwifi: pcie: add gen3 iwl_trans_pcie read/write

Add gen3-specific implementations for iwl_trans_pcie_read/write,
iwl_trans_pcie_read/write_prph and read_config

type=feature
ticket=none

Signed-off-by: Rotem Kerem <rotem.kerem@intel.com>
Change-Id: I98708e8cca260d7077039451948bdfc552575a1e
Reviewed-on: https://gerritwcs.ir.intel.com/c/iwlwifi-stack-dev/+/197019
automatic-review: iil_jenkins iil_jenkins <EC.GER.UNIX.IIL.JENKINS@INTEL.COM>
tested: iil_jenkins iil_jenkins <EC.GER.UNIX.IIL.JENKINS@INTEL.COM>
Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
x-iwlwifi-stack-dev: cc9e2fee571c2ddd7130950df2949ab4c6838790
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
index 33b4930..5fa8fea 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
@@ -439,30 +439,45 @@
 
 void iwl_trans_write8(struct iwl_trans *trans, u32 ofs, u8 val)
 {
-	iwl_trans_pcie_write8(trans, ofs, val);
+	if (trans->mac_cfg->gen3)
+		iwl_trans_pcie_gen3_write8(trans, ofs, val);
+	else
+		iwl_trans_pcie_write8(trans, ofs, val);
 }
 IWL_EXPORT_SYMBOL(iwl_trans_write8);
 
 void iwl_trans_write32(struct iwl_trans *trans, u32 ofs, u32 val)
 {
-	iwl_trans_pcie_write32(trans, ofs, val);
+	if (trans->mac_cfg->gen3)
+		iwl_trans_pcie_gen3_write32(trans, ofs, val);
+	else
+		iwl_trans_pcie_write32(trans, ofs, val);
 }
 IWL_EXPORT_SYMBOL(iwl_trans_write32);
 
 u32 iwl_trans_read32(struct iwl_trans *trans, u32 ofs)
 {
+	if (trans->mac_cfg->gen3)
+		return iwl_trans_pcie_gen3_read32(trans, ofs);
+
 	return iwl_trans_pcie_read32(trans, ofs);
 }
 IWL_EXPORT_SYMBOL(iwl_trans_read32);
 
 u32 iwl_trans_read_prph(struct iwl_trans *trans, u32 ofs)
 {
+	if (trans->mac_cfg->gen3)
+		return iwl_trans_pcie_gen3_read_prph(trans, ofs);
+
 	return iwl_trans_pcie_read_prph(trans, ofs);
 }
 IWL_EXPORT_SYMBOL(iwl_trans_read_prph);
 
 void iwl_trans_write_prph(struct iwl_trans *trans, u32 ofs, u32 val)
 {
+	if (trans->mac_cfg->gen3)
+		return iwl_trans_pcie_gen3_write_prph(trans, ofs, val);
+
 	return iwl_trans_pcie_write_prph(trans, ofs, val);
 }
 IWL_EXPORT_SYMBOL(iwl_trans_write_prph);
@@ -580,6 +595,9 @@
 int iwl_trans_read_config32(struct iwl_trans *trans, u32 ofs,
 			    u32 *val)
 {
+	if (trans->mac_cfg->gen3)
+		return iwl_trans_pcie_gen3_read_config32(trans, ofs, val);
+
 	return iwl_trans_pcie_read_config32(trans, ofs, val);
 }
 IWL_EXPORT_SYMBOL(iwl_trans_read_config32);
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/gen3/trans.h b/drivers/net/wireless/intel/iwlwifi/pcie/gen3/trans.h
index d712cca..0171d31 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/gen3/trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/gen3/trans.h
@@ -55,4 +55,47 @@
 	spin_unlock(&trans_pcie->reg_lock);
 }
 
+static inline void
+iwl_trans_pcie_gen3_write8(struct iwl_trans *trans, u32 ofs, u8 val)
+{
+	writeb(val, IWL_GET_PCIE_GEN3(trans)->hw_base + ofs);
+}
+
+static inline void
+iwl_trans_pcie_gen3_write32(struct iwl_trans *trans, u32 ofs, u32 val)
+{
+	writel(val, IWL_GET_PCIE_GEN3(trans)->hw_base + ofs);
+}
+
+static inline u32
+iwl_trans_pcie_gen3_read32(struct iwl_trans *trans, u32 ofs)
+{
+	return readl(IWL_GET_PCIE_GEN3(trans)->hw_base + ofs);
+}
+
+#define IWL_PRPH_MASK 0x00FFFFFF
+
+static inline u32
+iwl_trans_pcie_gen3_read_prph(struct iwl_trans *trans, u32 reg)
+{
+	iwl_trans_pcie_gen3_write32(trans, HBUS_TARG_PRPH_RADDR,
+				    ((reg & IWL_PRPH_MASK) | (3 << 24)));
+	return iwl_trans_pcie_gen3_read32(trans, HBUS_TARG_PRPH_RDAT);
+}
+
+static inline void
+iwl_trans_pcie_gen3_write_prph(struct iwl_trans *trans, u32 addr, u32 val)
+{
+	iwl_trans_pcie_gen3_write32(trans, HBUS_TARG_PRPH_WADDR,
+				    ((addr & IWL_PRPH_MASK) | (3 << 24)));
+	iwl_trans_pcie_gen3_write32(trans, HBUS_TARG_PRPH_WDAT, val);
+}
+
+static inline int
+iwl_trans_pcie_gen3_read_config32(struct iwl_trans *trans, u32 ofs, u32 *val)
+{
+	return pci_read_config_dword(IWL_GET_PCIE_GEN3(trans)->pci_dev,
+				     ofs, val);
+}
+
 #endif /* __iwl_trans_pcie_gen3_h__ */
diff --git a/versions b/versions
index 9131739..ff3ad4e 100644
--- a/versions
+++ b/versions
@@ -2,4 +2,4 @@
 BACKPORTED_KERNEL_VERSION="(see git)"
 BACKPORTED_KERNEL_NAME="iwlwifi"
 BACKPORTS_BUILD_TSTAMP=__DATE__ \" \" __TIME__
-BACKPORTS_GIT_TRACKED="iwlwifi-stack-public:master:13852:f0a6ea51"
+BACKPORTS_GIT_TRACKED="iwlwifi-stack-public:master:13853:cc9e2fee"