summaryrefslogtreecommitdiff
path: root/sys/dev/sdmmc
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sdmmc')
-rw-r--r--sys/dev/sdmmc/if_bwfm_sdio.c3
-rw-r--r--sys/dev/sdmmc/if_bwfm_sdio.h178
2 files changed, 180 insertions, 1 deletions
diff --git a/sys/dev/sdmmc/if_bwfm_sdio.c b/sys/dev/sdmmc/if_bwfm_sdio.c
index d96285bdb0a..733399aa543 100644
--- a/sys/dev/sdmmc/if_bwfm_sdio.c
+++ b/sys/dev/sdmmc/if_bwfm_sdio.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_bwfm_sdio.c,v 1.1 2017/10/11 17:19:50 patrick Exp $ */
+/* $OpenBSD: if_bwfm_sdio.c,v 1.2 2018/02/07 21:44:09 patrick Exp $ */
/*
* Copyright (c) 2010-2016 Broadcom Corporation
* Copyright (c) 2016,2017 Patrick Wildt <patrick@blueri.se>
@@ -43,6 +43,7 @@
#include <dev/ic/bwfmvar.h>
#include <dev/ic/bwfmreg.h>
+#include <dev/sdmmc/if_bwfm_sdio.h>
#define BWFM_SDIO_CCCR_BRCM_CARDCAP 0xf0
#define BWFM_SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT 0x02
diff --git a/sys/dev/sdmmc/if_bwfm_sdio.h b/sys/dev/sdmmc/if_bwfm_sdio.h
new file mode 100644
index 00000000000..d11495cba3a
--- /dev/null
+++ b/sys/dev/sdmmc/if_bwfm_sdio.h
@@ -0,0 +1,178 @@
+/* $OpenBSD: if_bwfm_sdio.h,v 1.1 2018/02/07 21:44:09 patrick Exp $ */
+/*
+ * Copyright (c) 2010-2016 Broadcom Corporation
+ * Copyright (c) 2018 Patrick Wildt <patrick@blueri.se>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* Registers */
+#define BWFM_SDIO_CCCR_CARDCAP 0xf0
+#define BWFM_SDIO_CCCR_CARDCAP_CMD14_SUPPORT (1 << 1)
+#define BWFM_SDIO_CCCR_CARDCAP_CMD14_EXT (1 << 2)
+#define BWFM_SDIO_CCCR_CARDCAP_CMD_NODEC (1 << 3)
+#define BWFM_SDIO_CCCR_CARDCTRL 0xf1
+#define BWFM_SDIO_CCCR_CARDCTRL_WLANRESET (1 << 1)
+#define BWFM_SDIO_CCCR_SEPINT 0xf2
+#define BWFM_SDIO_CCCR_SEPINT_MASK 0x01
+#define BWFM_SDIO_CCCR_SEPINT_OE (1 << 1)
+#define BWFM_SDIO_CCCR_SEPINT_ACT_HI (1 << 2)
+
+#define BWFM_SDIO_WATERMARK 0x10008
+#define BWFM_SDIO_DEVICE_CTL 0x10009
+#define BWFM_SDIO_DEVICE_CTL_SETBUSY 0x01
+#define BWFM_SDIO_DEVICE_CTL_SPI_INTR_SYNC 0x02
+#define BWFM_SDIO_DEVICE_CTL_CA_INT_ONLY 0x04
+#define BWFM_SDIO_DEVICE_CTL_PADS_ISO 0x08
+#define BWFM_SDIO_DEVICE_CTL_SB_RST_CTL 0x30
+#define BWFM_SDIO_DEVICE_CTL_RST_CORECTL 0x00
+#define BWFM_SDIO_DEVICE_CTL_RST_BPRESET 0x10
+#define BWFM_SDIO_DEVICE_CTL_RST_NOBPRESET 0x20
+#define BWFM_SDIO_FUNC1_SBADDRLOW 0x1000A
+#define BWFM_SDIO_FUNC1_SBADDRMID 0x1000B
+#define BWFM_SDIO_FUNC1_SBADDRHIGH 0x1000C
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR 0x1000E
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_ALP 0x01
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HT 0x02
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_ILP 0x04
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL_REQ 0x08
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL_REQ 0x10
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_FORCE_HW_CLKREQ_OFF 0x20
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL 0x40
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL 0x80
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_CSR_MASK 0x1F
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS \
+ (BWFM_SDIO_FUNC1_CHIPCLKCSR_HT_AVAIL | \
+ BWFM_SDIO_FUNC1_CHIPCLKCSR_ALP_AVAIL)
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) \
+ ((regval) & BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS)
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval) \
+ (((regval) & BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS) == BWFM_SDIO_FUNC1_CHIPCLKCSR_AVBITS)
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPONLY(regval) \
+ (BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) && \
+ !BWFM_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval))
+#define BWFM_SDIO_FUNC1_CHIPCLKCSR_CLKAV(regval, alponly) \
+ (BWFM_SDIO_FUNC1_CHIPCLKCSR_ALPAV(regval) && \
+ (alponly ? 1 : BWFM_SDIO_FUNC1_CHIPCLKCSR_HTAV(regval)))
+#define BWFM_SDIO_FUNC1_SDIOPULLUP 0x1000F
+#define BWFM_SDIO_FUNC1_WAKEUPCTRL 0x1001E
+#define BWFM_SDIO_FUNC1_WAKEUPCTRL_HTWAIT (1 << 1)
+#define BWFM_SDIO_FUNC1_SLEEPCSR 0x1001F
+#define BWFM_SDIO_FUNC1_SLEEPCSR_KSO (1 << 0)
+#define BWFM_SDIO_FUNC1_SLEEPCSR_DEVON (1 << 2)
+
+#define BWFM_SDIO_SB_OFT_ADDR_PAGE 0x08000
+#define BWFM_SDIO_SB_OFT_ADDR_MASK 0x07FFF
+#define BWFM_SDIO_SB_ACCESS_2_4B_FLAG 0x08000
+
+/* Protocol defines */
+#define SDPCM_PROT_VERSION 4
+#define SDPCM_PROT_VERSION_SHIFT 16
+#define SDPCM_SHARED_VERSION 0x0003
+#define SDPCM_SHARED_VERSION_MASK 0x00FF
+#define SDPCM_SHARED_ASSERT_BUILT 0x0100
+#define SDPCM_SHARED_ASSERT 0x0200
+#define SDPCM_SHARED_TRAP 0x0400
+
+#define SDPCMD_INTSTATUS 0x020
+#define SDPCMD_INTSTATUS_SMB_SW0 (1 << 0) /* To SB Mail S/W interrupt 0 */
+#define SDPCMD_INTSTATUS_SMB_SW1 (1 << 1) /* To SB Mail S/W interrupt 1 */
+#define SDPCMD_INTSTATUS_SMB_SW2 (1 << 2) /* To SB Mail S/W interrupt 2 */
+#define SDPCMD_INTSTATUS_SMB_SW3 (1 << 3) /* To SB Mail S/W interrupt 3 */
+#define SDPCMD_INTSTATUS_SMB_SW_MASK 0x0000000f /* To SB Mail S/W interrupts mask */
+#define SDPCMD_INTSTATUS_SMB_SW_SHIFT 0 /* To SB Mail S/W interrupts shift */
+#define SDPCMD_INTSTATUS_HMB_SW0 (1 << 4) /* To Host Mail S/W interrupt 0 */
+#define SDPCMD_INTSTATUS_HMB_SW1 (1 << 5) /* To Host Mail S/W interrupt 1 */
+#define SDPCMD_INTSTATUS_HMB_SW2 (1 << 6) /* To Host Mail S/W interrupt 2 */
+#define SDPCMD_INTSTATUS_HMB_SW3 (1 << 7) /* To Host Mail S/W interrupt 3 */
+#define SDPCMD_INTSTATUS_HMB_FC_STATE SDPCMD_INTSTATUS_HMB_SW0
+#define SDPCMD_INTSTATUS_HMB_FC_CHANGE SDPCMD_INTSTATUS_HMB_SW1
+#define SDPCMD_INTSTATUS_HMB_FRAME_IND SDPCMD_INTSTATUS_HMB_SW2
+#define SDPCMD_INTSTATUS_HMB_HOST_INT SDPCMD_INTSTATUS_HMB_SW3
+#define SDPCMD_INTSTATUS_HMB_SW_MASK 0x000000f0 /* To Host Mail S/W interrupts mask */
+#define SDPCMD_INTSTATUS_HMB_SW_SHIFT 4 /* To Host Mail S/W interrupts shift */
+#define SDPCMD_INTSTATUS_WR_OOSYNC (1 << 8) /* Write Frame Out Of Sync */
+#define SDPCMD_INTSTATUS_RD_OOSYNC (1 << 9) /* Read Frame Out Of Sync */
+#define SDPCMD_INTSTATUS_PC (1 << 10)/* descriptor error */
+#define SDPCMD_INTSTATUS_PD (1 << 11)/* data error */
+#define SDPCMD_INTSTATUS_DE (1 << 12)/* Descriptor protocol Error */
+#define SDPCMD_INTSTATUS_RU (1 << 13)/* Receive descriptor Underflow */
+#define SDPCMD_INTSTATUS_RO (1 << 14)/* Receive fifo Overflow */
+#define SDPCMD_INTSTATUS_XU (1 << 15)/* Transmit fifo Underflow */
+#define SDPCMD_INTSTATUS_RI (1 << 16)/* Receive Interrupt */
+#define SDPCMD_INTSTATUS_BUSPWR (1 << 17)/* SDIO Bus Power Change (rev 9) */
+#define SDPCMD_INTSTATUS_XMTDATA_AVAIL (1 << 23)/* bits in fifo */
+#define SDPCMD_INTSTATUS_XI (1 << 24)/* Transmit Interrupt */
+#define SDPCMD_INTSTATUS_RF_TERM (1 << 25)/* Read Frame Terminate */
+#define SDPCMD_INTSTATUS_WF_TERM (1 << 26)/* Write Frame Terminate */
+#define SDPCMD_INTSTATUS_PCMCIA_XU (1 << 27)/* PCMCIA Transmit FIFO Underflow */
+#define SDPCMD_INTSTATUS_SBINT (1 << 28)/* sbintstatus Interrupt */
+#define SDPCMD_INTSTATUS_CHIPACTIVE (1 << 29)/* chip from doze to active state */
+#define SDPCMD_INTSTATUS_SRESET (1 << 30)/* CCCR RES interrupt */
+#define SDPCMD_INTSTATUS_IOE2 (1U << 31)/* CCCR IOE2 Bit Changed */
+#define SDPCMD_INTSTATUS_ERRORS (SDPCMD_INTSTATUS_PC | \
+ SDPCMD_INTSTATUS_PD | \
+ SDPCMD_INTSTATUS_DE | \
+ SDPCMD_INTSTATUS_RU | \
+ SDPCMD_INTSTATUS_RO | \
+ SDPCMD_INTSTATUS_XU)
+#define SDPCMD_INTSTATUS_DMA (SDPCMD_INTSTATUS_RI | \
+ SDPCMD_INTSTATUS_XI | \
+ SDPCMD_INTSTATUS_ERRORS)
+#define SDPCMD_HOSTINTMASK 0x024
+#define SDPCMD_INTMASK 0x028
+#define SDPCMD_SBINTSTATUS 0x02c
+#define SDPCMD_SBINTMASK 0x030
+#define SDPCMD_FUNCTINTMASK 0x034
+#define SDPCMD_TOSBMAILBOX 0x040
+#define SDPCMD_TOSBMAILBOX_NAK (1 << 0)
+#define SDPCMD_TOSBMAILBOX_INT_ACK (1 << 1)
+#define SDPCMD_TOSBMAILBOX_USE_OOB (1 << 2)
+#define SDPCMD_TOSBMAILBOX_DEV_INT (1 << 3)
+#define SDPCMD_TOHOSTMAILBOX 0x044
+#define SDPCMD_TOSBMAILBOXDATA 0x048
+#define SDPCMD_TOHOSTMAILBOXDATA 0x04C
+#define SDPCMD_TOHOSTMAILBOXDATA_NAKHANDLED (1 << 0)
+#define SDPCMD_TOHOSTMAILBOXDATA_DEVREADY (1 << 1)
+#define SDPCMD_TOHOSTMAILBOXDATA_FC (1 << 2)
+#define SDPCMD_TOHOSTMAILBOXDATA_FWREADY (1 << 3)
+#define SDPCMD_TOHOSTMAILBOXDATA_FWHALT (1 << 4)
+
+struct bwfm_sdio_hwhdr {
+ uint16_t frmlen;
+ uint16_t cksum;
+};
+
+struct bwfm_sdio_hwexthdr {
+ uint16_t pktlen;
+ uint8_t res0;
+ uint8_t flags;
+ uint16_t res1;
+ uint16_t padlen;
+};
+
+struct bwfm_sdio_swhdr {
+ uint8_t seqnr;
+ uint8_t chanflag; /* channel + flag */
+#define BWFM_SDIO_SWHDR_CHANNEL_CONTROL 0x00
+#define BWFM_SDIO_SWHDR_CHANNEL_EVENT 0x01
+#define BWFM_SDIO_SWHDR_CHANNEL_DATA 0x02
+#define BWFM_SDIO_SWHDR_CHANNEL_GLOM 0x03
+#define BWFM_SDIO_SWHDR_CHANNEL_TEST 0x0F
+#define BWFM_SDIO_SWHDR_CHANNEL_MASK 0x0F
+ uint8_t nextlen;
+ uint8_t dataoff;
+ uint8_t flowctl;
+ uint8_t maxseqnr;
+ uint16_t res0;
+};