0001
0002
0003
0004
0005
0006 #ifndef BRCMFMAC_SDIO_H
0007 #define BRCMFMAC_SDIO_H
0008
0009 #include <linux/skbuff.h>
0010 #include <linux/firmware.h>
0011 #include "firmware.h"
0012
0013 #define SDIOD_FBR_SIZE 0x100
0014
0015
0016 #define SDIO_FUNC_ENABLE_1 0x02
0017 #define SDIO_FUNC_ENABLE_2 0x04
0018
0019
0020 #define SDIO_FUNC_READY_1 0x02
0021 #define SDIO_FUNC_READY_2 0x04
0022
0023
0024 #define INTR_STATUS_FUNC1 0x2
0025 #define INTR_STATUS_FUNC2 0x4
0026
0027
0028 #define REG_F0_REG_MASK 0x7FF
0029 #define REG_F1_MISC_MASK 0x1FFFF
0030
0031
0032
0033 #define SDIO_CCCR_BRCM_CARDCAP 0xf0
0034 #define SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT BIT(1)
0035 #define SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT BIT(2)
0036 #define SDIO_CCCR_BRCM_CARDCAP_CMD_NODEC BIT(3)
0037
0038
0039 #define SDIO_CCCR_IEN_FUNC0 BIT(0)
0040 #define SDIO_CCCR_IEN_FUNC1 BIT(1)
0041 #define SDIO_CCCR_IEN_FUNC2 BIT(2)
0042
0043 #define SDIO_CCCR_BRCM_CARDCTRL 0xf1
0044 #define SDIO_CCCR_BRCM_CARDCTRL_WLANRESET BIT(1)
0045
0046 #define SDIO_CCCR_BRCM_SEPINT 0xf2
0047 #define SDIO_CCCR_BRCM_SEPINT_MASK BIT(0)
0048 #define SDIO_CCCR_BRCM_SEPINT_OE BIT(1)
0049 #define SDIO_CCCR_BRCM_SEPINT_ACT_HI BIT(2)
0050
0051
0052
0053
0054 #define SBSDIO_SPROM_CS 0x10000
0055
0056 #define SBSDIO_SPROM_INFO 0x10001
0057
0058 #define SBSDIO_SPROM_DATA_LOW 0x10002
0059
0060 #define SBSDIO_SPROM_DATA_HIGH 0x10003
0061
0062 #define SBSDIO_SPROM_ADDR_LOW 0x10004
0063
0064 #define SBSDIO_GPIO_SELECT 0x10005
0065
0066 #define SBSDIO_GPIO_OUT 0x10006
0067
0068 #define SBSDIO_GPIO_EN 0x10007
0069
0070 #define SBSDIO_WATERMARK 0x10008
0071
0072 #define SBSDIO_DEVICE_CTL 0x10009
0073
0074
0075 #define SBSDIO_FUNC1_SBADDRLOW 0x1000A
0076
0077 #define SBSDIO_FUNC1_SBADDRMID 0x1000B
0078
0079 #define SBSDIO_FUNC1_SBADDRHIGH 0x1000C
0080
0081 #define SBSDIO_FUNC1_FRAMECTRL 0x1000D
0082
0083 #define SBSDIO_FUNC1_CHIPCLKCSR 0x1000E
0084
0085 #define SBSDIO_FUNC1_SDIOPULLUP 0x1000F
0086
0087 #define SBSDIO_FUNC1_WFRAMEBCLO 0x10019
0088
0089 #define SBSDIO_FUNC1_WFRAMEBCHI 0x1001A
0090
0091 #define SBSDIO_FUNC1_RFRAMEBCLO 0x1001B
0092
0093 #define SBSDIO_FUNC1_RFRAMEBCHI 0x1001C
0094
0095 #define SBSDIO_FUNC1_MESBUSYCTRL 0x1001D
0096
0097 #define SBSDIO_MESBUSY_RXFIFO_WM_MASK 0x7F
0098 #define SBSDIO_MESBUSY_RXFIFO_WM_SHIFT 0
0099
0100 #define SBSDIO_MESBUSYCTRL_ENAB 0x80
0101 #define SBSDIO_MESBUSYCTRL_ENAB_SHIFT 7
0102
0103
0104 #define SBSDIO_FUNC1_WAKEUPCTRL 0x1001E
0105 #define SBSDIO_FUNC1_WCTRL_ALPWAIT_MASK 0x1
0106 #define SBSDIO_FUNC1_WCTRL_ALPWAIT_SHIFT 0
0107 #define SBSDIO_FUNC1_WCTRL_HTWAIT_MASK 0x2
0108 #define SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT 1
0109 #define SBSDIO_FUNC1_SLEEPCSR 0x1001F
0110 #define SBSDIO_FUNC1_SLEEPCSR_KSO_MASK 0x1
0111 #define SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT 0
0112 #define SBSDIO_FUNC1_SLEEPCSR_KSO_EN 1
0113 #define SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK 0x2
0114 #define SBSDIO_FUNC1_SLEEPCSR_DEVON_SHIFT 1
0115
0116 #define SBSDIO_FUNC1_MISC_REG_START 0x10000
0117 #define SBSDIO_FUNC1_MISC_REG_LIMIT 0x1001F
0118
0119
0120
0121
0122 #define SBSDIO_SB_OFT_ADDR_MASK 0x07FFF
0123 #define SBSDIO_SB_OFT_ADDR_LIMIT 0x08000
0124
0125 #define SBSDIO_SB_ACCESS_2_4B_FLAG 0x08000
0126
0127
0128 #define SBSDIO_SBWINDOW_MASK 0xffff8000
0129
0130 #define SDIOH_READ 0
0131 #define SDIOH_WRITE 1
0132
0133 #define SDIOH_DATA_FIX 0
0134 #define SDIOH_DATA_INC 1
0135
0136
0137 #define SUCCESS 0
0138 #define ERROR 1
0139
0140
0141 #define BRCMF_SDALIGN (1 << 6)
0142
0143
0144 #define BRCMF_WD_POLL msecs_to_jiffies(10)
0145
0146
0147
0148
0149
0150
0151
0152
0153 enum brcmf_sdiod_state {
0154 BRCMF_SDIOD_DOWN,
0155 BRCMF_SDIOD_DATA,
0156 BRCMF_SDIOD_NOMEDIUM
0157 };
0158
0159 struct brcmf_sdreg {
0160 int func;
0161 int offset;
0162 int value;
0163 };
0164
0165 struct brcmf_sdio;
0166 struct brcmf_sdiod_freezer;
0167
0168 struct brcmf_sdio_dev {
0169 struct sdio_func *func1;
0170 struct sdio_func *func2;
0171 u32 sbwad;
0172 struct brcmf_core *cc_core;
0173 struct brcmf_sdio *bus;
0174 struct device *dev;
0175 struct brcmf_bus *bus_if;
0176 struct brcmf_mp_device *settings;
0177 bool oob_irq_requested;
0178 bool sd_irq_requested;
0179 bool irq_en;
0180 spinlock_t irq_en_lock;
0181 bool sg_support;
0182 uint max_request_size;
0183 ushort max_segment_count;
0184 uint max_segment_size;
0185 uint txglomsz;
0186 struct sg_table sgtable;
0187 char fw_name[BRCMF_FW_NAME_LEN];
0188 char nvram_name[BRCMF_FW_NAME_LEN];
0189 bool wowl_enabled;
0190 enum brcmf_sdiod_state state;
0191 struct brcmf_sdiod_freezer *freezer;
0192 };
0193
0194
0195 struct sdpcmd_regs {
0196 u32 corecontrol;
0197 u32 corestatus;
0198 u32 PAD[1];
0199 u32 biststatus;
0200
0201
0202 u16 pcmciamesportaladdr;
0203 u16 PAD[1];
0204 u16 pcmciamesportalmask;
0205 u16 PAD[1];
0206 u16 pcmciawrframebc;
0207 u16 PAD[1];
0208 u16 pcmciaunderflowtimer;
0209 u16 PAD[1];
0210
0211
0212 u32 intstatus;
0213 u32 hostintmask;
0214 u32 intmask;
0215 u32 sbintstatus;
0216 u32 sbintmask;
0217 u32 funcintmask;
0218 u32 PAD[2];
0219 u32 tosbmailbox;
0220 u32 tohostmailbox;
0221 u32 tosbmailboxdata;
0222 u32 tohostmailboxdata;
0223
0224
0225 u32 sdioaccess;
0226 u32 PAD[3];
0227
0228
0229 u8 pcmciaframectrl;
0230 u8 PAD[3];
0231 u8 pcmciawatermark;
0232 u8 PAD[155];
0233
0234
0235 u32 intrcvlazy;
0236 u32 PAD[3];
0237
0238
0239 u32 cmd52rd;
0240 u32 cmd52wr;
0241 u32 cmd53rd;
0242 u32 cmd53wr;
0243 u32 abort;
0244 u32 datacrcerror;
0245 u32 rdoutofsync;
0246 u32 wroutofsync;
0247 u32 writebusy;
0248 u32 readwait;
0249 u32 readterm;
0250 u32 writeterm;
0251 u32 PAD[40];
0252 u32 clockctlstatus;
0253 u32 PAD[7];
0254
0255 u32 PAD[128];
0256
0257
0258 char cis[512];
0259
0260
0261 char pcmciafcr[256];
0262 u16 PAD[55];
0263
0264
0265 u16 backplanecsr;
0266 u16 backplaneaddr0;
0267 u16 backplaneaddr1;
0268 u16 backplaneaddr2;
0269 u16 backplaneaddr3;
0270 u16 backplanedata0;
0271 u16 backplanedata1;
0272 u16 backplanedata2;
0273 u16 backplanedata3;
0274 u16 PAD[31];
0275
0276
0277 u16 spromstatus;
0278 u32 PAD[464];
0279
0280 u16 PAD[0x80];
0281 };
0282
0283
0284 int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev);
0285 void brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev);
0286
0287
0288
0289 #define brcmf_sdiod_func0_rb(sdiodev, addr, r) \
0290 sdio_f0_readb((sdiodev)->func1, (addr), (r))
0291
0292 #define brcmf_sdiod_func0_wb(sdiodev, addr, v, ret) \
0293 sdio_f0_writeb((sdiodev)->func1, (v), (addr), (ret))
0294
0295
0296 #define brcmf_sdiod_readb(sdiodev, addr, r) \
0297 sdio_readb((sdiodev)->func1, (addr), (r))
0298
0299 #define brcmf_sdiod_writeb(sdiodev, addr, v, ret) \
0300 sdio_writeb((sdiodev)->func1, (v), (addr), (ret))
0301
0302 u32 brcmf_sdiod_readl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
0303 void brcmf_sdiod_writel(struct brcmf_sdio_dev *sdiodev, u32 addr, u32 data,
0304 int *ret);
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317 int brcmf_sdiod_send_pkt(struct brcmf_sdio_dev *sdiodev,
0318 struct sk_buff_head *pktq);
0319 int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes);
0320
0321 int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt);
0322 int brcmf_sdiod_recv_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes);
0323 int brcmf_sdiod_recv_chain(struct brcmf_sdio_dev *sdiodev,
0324 struct sk_buff_head *pktq, uint totlen);
0325
0326
0327
0328
0329 #define SDIO_REQ_4BYTE 0x1
0330
0331 #define SDIO_REQ_FIXED 0x2
0332
0333
0334
0335
0336
0337
0338
0339
0340 int brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
0341 u8 *data, uint size);
0342
0343
0344 int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, struct sdio_func *func);
0345
0346 void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev);
0347 void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
0348 enum brcmf_sdiod_state state);
0349 bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev);
0350 void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev);
0351 void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev);
0352 void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev);
0353
0354 int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev);
0355 int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev);
0356
0357 struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev);
0358 void brcmf_sdio_remove(struct brcmf_sdio *bus);
0359 void brcmf_sdio_isr(struct brcmf_sdio *bus, bool in_isr);
0360
0361 void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, bool active);
0362 void brcmf_sdio_wowl_config(struct device *dev, bool enabled);
0363 int brcmf_sdio_sleep(struct brcmf_sdio *bus, bool sleep);
0364 void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus);
0365
0366 #endif