@@ -7,4 +7,80 @@
#define dev_to_sdio_func(d) container_of(d, struct sdio_func, dev)
#endif
+#if LINUX_VERSION_IS_LESS(5,2,0) && \
+ !LINUX_VERSION_IN_RANGE(5,1,15, 5,2,0) && \
+ !LINUX_VERSION_IN_RANGE(4,19,56, 4,20,0)
+
+#include <linux/mmc/card.h>
+#include <linux/mmc/host.h>
+
+/**
+ * sdio_retune_hold_now - start deferring retuning requests till release
+ * @func: SDIO function attached to host
+ *
+ * This function can be called if it's currently a bad time to do
+ * a retune of the SDIO card. Retune requests made during this time
+ * will be held and we'll actually do the retune sometime after the
+ * release.
+ *
+ * This function could be useful if an SDIO card is in a power state
+ * where it can respond to a small subset of commands that doesn't
+ * include the retuning command. Care should be taken when using
+ * this function since (presumably) the retuning request we might be
+ * deferring was made for a good reason.
+ *
+ * This function should be called while the host is claimed.
+ */
+#define sdio_retune_hold_now LINUX_BACKPORT(sdio_retune_hold_now)
+#if LINUX_VERSION_IS_LESS(4,3,0)
+static inline void sdio_retune_hold_now(struct sdio_func *func)
+{
+}
+#else
+static inline void sdio_retune_hold_now(struct sdio_func *func)
+{
+ struct mmc_host *host = func->card->host;
+
+ host->retune_now = 0;
+ host->hold_retune += 1;
+}
+#endif /* < 4.3 */
+
+/**
+ * sdio_retune_release - signal that it's OK to retune now
+ * @func: SDIO function attached to host
+ *
+ * This is the complement to sdio_retune_hold_now(). Calling this
+ * function won't make a retune happen right away but will allow
+ * them to be scheduled normally.
+ *
+ * This function should be called while the host is claimed.
+ */
+#define sdio_retune_release LINUX_BACKPORT(sdio_retune_release)
+#if LINUX_VERSION_IS_LESS(4,3,0)
+static inline void sdio_retune_release(struct sdio_func *func)
+{
+}
+#else
+static inline void sdio_retune_release(struct sdio_func *func)
+{
+ struct mmc_host *host = func->card->host;
+
+ if (host->hold_retune)
+ host->hold_retune -= 1;
+ else
+ WARN_ON(1);
+}
+#endif
+
+#define sdio_retune_crc_disable LINUX_BACKPORT(sdio_retune_crc_disable)
+static inline void sdio_retune_crc_disable(struct sdio_func *func)
+{
+}
+#define sdio_retune_crc_enable LINUX_BACKPORT(sdio_retune_crc_enable)
+static inline void sdio_retune_crc_enable(struct sdio_func *func)
+{
+}
+#endif /* < 5.2 */
+
#endif /* __BACKPORT_MMC_SDIO_FUNC_H */
The brcmfmac driver now uses new sdio_retune*() functions. They are added with kernel 5.2-rc6 and are backported to kernel 4.19.56 and 5.1.15 sdio_retune_hold_now() and sdio_retune_release() should work like in the upstream kernel, the implementation of mmc_retune_release() and mmc_retune_hold() was copied to backports into these functions. On kernel < 4.3 backporting this is not so easy, so just use an empty implementation there. It is not possible to backport sdio_retune_crc_disable() and sdio_retune_crc_enable() because they need an additional member in a structure, just add an empty implementation. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> --- .../backport-include/linux/mmc/sdio_func.h | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+)