staging: brcm80211: remove unused fields from struct si_info
[deliverable/linux.git] / drivers / staging / brcm80211 / brcmfmac / bcmsdh.c
CommitLineData
cf2b4488
HP
1/*
2 * Copyright (c) 2010 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16/* ****************** BCMSDH Interface Functions *************************** */
17
a1c16ed2 18#include <linux/types.h>
c6ac24e9 19#include <linux/netdevice.h>
be1c09f9 20#include <linux/pci_ids.h>
7c6100ee 21#include <linux/sched.h>
cc3cea5a
RV
22#include <defs.h>
23#include <brcm_hw_ids.h>
f97e956a
RV
24#include <brcmu_utils.h>
25#include <brcmu_wifi.h>
cc3cea5a 26#include <soc.h>
cf2b4488 27
cf2b4488
HP
28#include <bcmsdbus.h> /* common SDIO/controller interface */
29#include <sbsdio.h> /* BRCM sdio device core */
30
13f401cb
RV
31#include "dngl_stats.h"
32#include "dhd.h"
cf2b4488
HP
33
34#define SDIOH_API_ACCESS_RETRY_LIMIT 2
35const uint bcmsdh_msglevel = BCMSDH_ERROR_VAL;
36
37struct bcmsdh_info {
38 bool init_success; /* underlying driver successfully attached */
39 void *sdioh; /* handler for sdioh */
66cbd3ab 40 u32 vendevid; /* Target Vendor and Device ID on SD bus */
cf2b4488
HP
41 bool regfail; /* Save status of last
42 reg_read/reg_write call */
66cbd3ab 43 u32 sbwad; /* Save backplane window address */
cf2b4488
HP
44};
45/* local copy of bcm sd handler */
6998d337 46bcmsdh_info_t *l_bcmsdh;
cf2b4488
HP
47
48#if defined(OOB_INTR_ONLY) && defined(HW_OOB)
49extern int sdioh_enable_hw_oob_intr(void *sdioh, bool enable);
50
51void bcmsdh_enable_hw_oob_intr(bcmsdh_info_t *sdh, bool enable)
52{
53 sdioh_enable_hw_oob_intr(sdh->sdioh, enable);
54}
55#endif
56
3c9d4c37 57bcmsdh_info_t *bcmsdh_attach(void *cfghdl, void **regsva, uint irq)
cf2b4488
HP
58{
59 bcmsdh_info_t *bcmsdh;
60
5fcc1fcb 61 bcmsdh = kzalloc(sizeof(bcmsdh_info_t), GFP_ATOMIC);
c74c95cd 62 if (bcmsdh == NULL) {
97e17d0e 63 BCMSDH_ERROR(("bcmsdh_attach: out of memory"));
cf2b4488
HP
64 return NULL;
65 }
cf2b4488
HP
66
67 /* save the handler locally */
68 l_bcmsdh = bcmsdh;
69
3c9d4c37 70 bcmsdh->sdioh = sdioh_attach(cfghdl, irq);
c74c95cd 71 if (!bcmsdh->sdioh) {
8da4a3a0 72 bcmsdh_detach(bcmsdh);
cf2b4488
HP
73 return NULL;
74 }
75
0f0881b0 76 bcmsdh->init_success = true;
cf2b4488 77
66cbd3ab 78 *regsva = (u32 *) SI_ENUM_BASE;
cf2b4488
HP
79
80 /* Report the BAR, to fix if needed */
81 bcmsdh->sbwad = SI_ENUM_BASE;
82 return bcmsdh;
83}
84
8da4a3a0 85int bcmsdh_detach(void *sdh)
cf2b4488
HP
86{
87 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
88
89 if (bcmsdh != NULL) {
90 if (bcmsdh->sdioh) {
8da4a3a0 91 sdioh_detach(bcmsdh->sdioh);
cf2b4488
HP
92 bcmsdh->sdioh = NULL;
93 }
182acb3c 94 kfree(bcmsdh);
cf2b4488
HP
95 }
96
97 l_bcmsdh = NULL;
98 return 0;
99}
100
101int
102bcmsdh_iovar_op(void *sdh, const char *name,
103 void *params, int plen, void *arg, int len, bool set)
104{
105 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
106 return sdioh_iovar_op(bcmsdh->sdioh, name, params, plen, arg, len, set);
107}
108
109bool bcmsdh_intr_query(void *sdh)
110{
111 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
112 SDIOH_API_RC status;
113 bool on;
114
115 ASSERT(bcmsdh);
116 status = sdioh_interrupt_query(bcmsdh->sdioh, &on);
117 if (SDIOH_API_SUCCESS(status))
0965ae88 118 return false;
cf2b4488
HP
119 else
120 return on;
121}
122
123int bcmsdh_intr_enable(void *sdh)
124{
125 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
126 SDIOH_API_RC status;
127 ASSERT(bcmsdh);
128
0f0881b0 129 status = sdioh_interrupt_set(bcmsdh->sdioh, true);
1bc93cec 130 return SDIOH_API_SUCCESS(status) ? 0 : -EIO;
cf2b4488
HP
131}
132
133int bcmsdh_intr_disable(void *sdh)
134{
135 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
136 SDIOH_API_RC status;
137 ASSERT(bcmsdh);
138
0965ae88 139 status = sdioh_interrupt_set(bcmsdh->sdioh, false);
1bc93cec 140 return SDIOH_API_SUCCESS(status) ? 0 : -EIO;
cf2b4488
HP
141}
142
143int bcmsdh_intr_reg(void *sdh, bcmsdh_cb_fn_t fn, void *argh)
144{
145 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
146 SDIOH_API_RC status;
147 ASSERT(bcmsdh);
148
149 status = sdioh_interrupt_register(bcmsdh->sdioh, fn, argh);
1bc93cec 150 return SDIOH_API_SUCCESS(status) ? 0 : -EIO;
cf2b4488
HP
151}
152
153int bcmsdh_intr_dereg(void *sdh)
154{
155 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
156 SDIOH_API_RC status;
157 ASSERT(bcmsdh);
158
159 status = sdioh_interrupt_deregister(bcmsdh->sdioh);
1bc93cec 160 return SDIOH_API_SUCCESS(status) ? 0 : -EIO;
cf2b4488
HP
161}
162
163#if defined(DHD_DEBUG)
164bool bcmsdh_intr_pending(void *sdh)
165{
166 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
167
168 ASSERT(sdh);
169 return sdioh_interrupt_pending(bcmsdh->sdioh);
170}
171#endif
172
173int bcmsdh_devremove_reg(void *sdh, bcmsdh_cb_fn_t fn, void *argh)
174{
175 ASSERT(sdh);
176
177 /* don't support yet */
e10d82d4 178 return -ENOTSUPP;
cf2b4488
HP
179}
180
66cbd3ab 181u8 bcmsdh_cfg_read(void *sdh, uint fnc_num, u32 addr, int *err)
cf2b4488
HP
182{
183 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
184 SDIOH_API_RC status;
185#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
3e26416e 186 s32 retry = 0;
cf2b4488 187#endif
3fd79f7c 188 u8 data = 0;
cf2b4488
HP
189
190 if (!bcmsdh)
191 bcmsdh = l_bcmsdh;
192
193 ASSERT(bcmsdh->init_success);
194
195#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
196 do {
197 if (retry) /* wait for 1 ms till bus get settled down */
7383141b 198 udelay(1000);
cf2b4488
HP
199#endif
200 status =
201 sdioh_cfg_read(bcmsdh->sdioh, fnc_num, addr,
3fd79f7c 202 (u8 *) &data);
cf2b4488
HP
203#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
204 } while (!SDIOH_API_SUCCESS(status)
205 && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT));
206#endif
207 if (err)
b74ac12e 208 *err = (SDIOH_API_SUCCESS(status) ? 0 : -EIO);
cf2b4488 209
3fd79f7c 210 BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, u8data = 0x%x\n",
cf2b4488
HP
211 __func__, fnc_num, addr, data));
212
213 return data;
214}
215
216void
66cbd3ab 217bcmsdh_cfg_write(void *sdh, uint fnc_num, u32 addr, u8 data, int *err)
cf2b4488
HP
218{
219 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
220 SDIOH_API_RC status;
221#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
3e26416e 222 s32 retry = 0;
cf2b4488
HP
223#endif
224
225 if (!bcmsdh)
226 bcmsdh = l_bcmsdh;
227
228 ASSERT(bcmsdh->init_success);
229
230#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
231 do {
232 if (retry) /* wait for 1 ms till bus get settled down */
7383141b 233 udelay(1000);
cf2b4488
HP
234#endif
235 status =
236 sdioh_cfg_write(bcmsdh->sdioh, fnc_num, addr,
3fd79f7c 237 (u8 *) &data);
cf2b4488
HP
238#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
239 } while (!SDIOH_API_SUCCESS(status)
240 && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT));
241#endif
242 if (err)
b74ac12e 243 *err = SDIOH_API_SUCCESS(status) ? 0 : -EIO;
cf2b4488 244
3fd79f7c 245 BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, u8data = 0x%x\n",
cf2b4488
HP
246 __func__, fnc_num, addr, data));
247}
248
66cbd3ab 249u32 bcmsdh_cfg_read_word(void *sdh, uint fnc_num, u32 addr, int *err)
cf2b4488
HP
250{
251 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
252 SDIOH_API_RC status;
66cbd3ab 253 u32 data = 0;
cf2b4488
HP
254
255 if (!bcmsdh)
256 bcmsdh = l_bcmsdh;
257
258 ASSERT(bcmsdh->init_success);
259
260 status =
261 sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL, SDIOH_READ,
262 fnc_num, addr, &data, 4);
263
264 if (err)
b74ac12e 265 *err = (SDIOH_API_SUCCESS(status) ? 0 : -EIO);
cf2b4488 266
66cbd3ab 267 BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, u32data = 0x%x\n",
cf2b4488
HP
268 __func__, fnc_num, addr, data));
269
270 return data;
271}
272
273void
66cbd3ab 274bcmsdh_cfg_write_word(void *sdh, uint fnc_num, u32 addr, u32 data,
cf2b4488
HP
275 int *err)
276{
277 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
278 SDIOH_API_RC status;
279
280 if (!bcmsdh)
281 bcmsdh = l_bcmsdh;
282
283 ASSERT(bcmsdh->init_success);
284
285 status =
286 sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL,
287 SDIOH_WRITE, fnc_num, addr, &data, 4);
288
289 if (err)
b74ac12e 290 *err = (SDIOH_API_SUCCESS(status) ? 0 : -EIO);
cf2b4488 291
66cbd3ab 292 BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, u32data = 0x%x\n",
cf2b4488
HP
293 __func__, fnc_num, addr, data));
294}
295
3fd79f7c 296int bcmsdh_cis_read(void *sdh, uint func, u8 * cis, uint length)
cf2b4488
HP
297{
298 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
299 SDIOH_API_RC status;
300
3fd79f7c
GKH
301 u8 *tmp_buf, *tmp_ptr;
302 u8 *ptr;
cf2b4488
HP
303 bool ascii = func & ~0xf;
304 func &= 0x7;
305
306 if (!bcmsdh)
307 bcmsdh = l_bcmsdh;
308
309 ASSERT(bcmsdh->init_success);
310 ASSERT(cis);
311 ASSERT(length <= SBSDIO_CIS_SIZE_LIMIT);
312
313 status = sdioh_cis_read(bcmsdh->sdioh, func, cis, length);
314
315 if (ascii) {
316 /* Move binary bits to tmp and format them
317 into the provided buffer. */
5fcc1fcb 318 tmp_buf = kmalloc(length, GFP_ATOMIC);
c74c95cd 319 if (tmp_buf == NULL) {
cf2b4488 320 BCMSDH_ERROR(("%s: out of memory\n", __func__));
e10d82d4 321 return -ENOMEM;
cf2b4488 322 }
02160695 323 memcpy(tmp_buf, cis, length);
cf2b4488
HP
324 for (tmp_ptr = tmp_buf, ptr = cis; ptr < (cis + length - 4);
325 tmp_ptr++) {
326 ptr += sprintf((char *)ptr, "%.2x ", *tmp_ptr & 0xff);
327 if ((((tmp_ptr - tmp_buf) + 1) & 0xf) == 0)
328 ptr += sprintf((char *)ptr, "\n");
329 }
182acb3c 330 kfree(tmp_buf);
cf2b4488
HP
331 }
332
1bc93cec 333 return SDIOH_API_SUCCESS(status) ? 0 : -EIO;
cf2b4488
HP
334}
335
66cbd3ab 336static int bcmsdhsdio_set_sbaddr_window(void *sdh, u32 address)
cf2b4488
HP
337{
338 int err = 0;
339 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
340 bcmsdh_cfg_write(bcmsdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRLOW,
341 (address >> 8) & SBSDIO_SBADDRLOW_MASK, &err);
342 if (!err)
343 bcmsdh_cfg_write(bcmsdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRMID,
344 (address >> 16) & SBSDIO_SBADDRMID_MASK, &err);
345 if (!err)
346 bcmsdh_cfg_write(bcmsdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRHIGH,
347 (address >> 24) & SBSDIO_SBADDRHIGH_MASK,
348 &err);
349
350 return err;
351}
352
66cbd3ab 353u32 bcmsdh_reg_read(void *sdh, u32 addr, uint size)
cf2b4488
HP
354{
355 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
356 SDIOH_API_RC status;
66cbd3ab 357 u32 word = 0;
cf2b4488
HP
358 uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK;
359
360 BCMSDH_INFO(("%s:fun = 1, addr = 0x%x, ", __func__, addr));
361
362 if (!bcmsdh)
363 bcmsdh = l_bcmsdh;
364
365 ASSERT(bcmsdh->init_success);
366
367 if (bar0 != bcmsdh->sbwad) {
368 if (bcmsdhsdio_set_sbaddr_window(bcmsdh, bar0))
369 return 0xFFFFFFFF;
370
371 bcmsdh->sbwad = bar0;
372 }
373
374 addr &= SBSDIO_SB_OFT_ADDR_MASK;
375 if (size == 4)
376 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
377
378 status = sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL,
379 SDIOH_READ, SDIO_FUNC_1, addr, &word, size);
380
381 bcmsdh->regfail = !(SDIOH_API_SUCCESS(status));
382
66cbd3ab 383 BCMSDH_INFO(("u32data = 0x%x\n", word));
cf2b4488
HP
384
385 /* if ok, return appropriately masked word */
386 if (SDIOH_API_SUCCESS(status)) {
387 switch (size) {
3fd79f7c 388 case sizeof(u8):
cf2b4488 389 return word & 0xff;
7d4df48e 390 case sizeof(u16):
cf2b4488 391 return word & 0xffff;
66cbd3ab 392 case sizeof(u32):
cf2b4488
HP
393 return word;
394 default:
0f0881b0 395 bcmsdh->regfail = true;
cf2b4488
HP
396
397 }
398 }
399
400 /* otherwise, bad sdio access or invalid size */
401 BCMSDH_ERROR(("%s: error reading addr 0x%04x size %d\n", __func__,
402 addr, size));
403 return 0xFFFFFFFF;
404}
405
66cbd3ab 406u32 bcmsdh_reg_write(void *sdh, u32 addr, uint size, u32 data)
cf2b4488
HP
407{
408 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
409 SDIOH_API_RC status;
410 uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK;
411 int err = 0;
412
413 BCMSDH_INFO(("%s:fun = 1, addr = 0x%x, uint%ddata = 0x%x\n",
414 __func__, addr, size * 8, data));
415
416 if (!bcmsdh)
417 bcmsdh = l_bcmsdh;
418
419 ASSERT(bcmsdh->init_success);
420
421 if (bar0 != bcmsdh->sbwad) {
c74c95cd
JC
422 err = bcmsdhsdio_set_sbaddr_window(bcmsdh, bar0);
423 if (err)
cf2b4488
HP
424 return err;
425
426 bcmsdh->sbwad = bar0;
427 }
428
429 addr &= SBSDIO_SB_OFT_ADDR_MASK;
430 if (size == 4)
431 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
432 status =
433 sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL,
434 SDIOH_WRITE, SDIO_FUNC_1, addr, &data, size);
435 bcmsdh->regfail = !(SDIOH_API_SUCCESS(status));
436
437 if (SDIOH_API_SUCCESS(status))
438 return 0;
439
440 BCMSDH_ERROR(("%s: error writing 0x%08x to addr 0x%04x size %d\n",
441 __func__, data, addr, size));
442 return 0xFFFFFFFF;
443}
444
445bool bcmsdh_regfail(void *sdh)
446{
447 return ((bcmsdh_info_t *) sdh)->regfail;
448}
449
450int
66cbd3ab 451bcmsdh_recv_buf(void *sdh, u32 addr, uint fn, uint flags,
c26b1378 452 u8 *buf, uint nbytes, struct sk_buff *pkt,
cf2b4488
HP
453 bcmsdh_cmplt_fn_t complete, void *handle)
454{
455 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
456 SDIOH_API_RC status;
457 uint incr_fix;
458 uint width;
459 uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK;
460 int err = 0;
461
462 ASSERT(bcmsdh);
463 ASSERT(bcmsdh->init_success);
464
465 BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, size = %d\n",
466 __func__, fn, addr, nbytes));
467
468 /* Async not implemented yet */
469 ASSERT(!(flags & SDIO_REQ_ASYNC));
470 if (flags & SDIO_REQ_ASYNC)
e10d82d4 471 return -ENOTSUPP;
cf2b4488
HP
472
473 if (bar0 != bcmsdh->sbwad) {
c74c95cd
JC
474 err = bcmsdhsdio_set_sbaddr_window(bcmsdh, bar0);
475 if (err)
cf2b4488
HP
476 return err;
477
478 bcmsdh->sbwad = bar0;
479 }
480
481 addr &= SBSDIO_SB_OFT_ADDR_MASK;
482
483 incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC;
484 width = (flags & SDIO_REQ_4BYTE) ? 4 : 2;
485 if (width == 4)
486 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
487
488 status = sdioh_request_buffer(bcmsdh->sdioh, SDIOH_DATA_PIO, incr_fix,
489 SDIOH_READ, fn, addr, width, nbytes, buf,
490 pkt);
491
b74ac12e 492 return SDIOH_API_SUCCESS(status) ? 0 : -EIO;
cf2b4488
HP
493}
494
495int
66cbd3ab 496bcmsdh_send_buf(void *sdh, u32 addr, uint fn, uint flags,
3fd79f7c 497 u8 *buf, uint nbytes, void *pkt,
cf2b4488
HP
498 bcmsdh_cmplt_fn_t complete, void *handle)
499{
500 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
501 SDIOH_API_RC status;
502 uint incr_fix;
503 uint width;
504 uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK;
505 int err = 0;
506
507 ASSERT(bcmsdh);
508 ASSERT(bcmsdh->init_success);
509
510 BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, size = %d\n",
511 __func__, fn, addr, nbytes));
512
513 /* Async not implemented yet */
514 ASSERT(!(flags & SDIO_REQ_ASYNC));
515 if (flags & SDIO_REQ_ASYNC)
e10d82d4 516 return -ENOTSUPP;
cf2b4488
HP
517
518 if (bar0 != bcmsdh->sbwad) {
c74c95cd
JC
519 err = bcmsdhsdio_set_sbaddr_window(bcmsdh, bar0);
520 if (err)
cf2b4488
HP
521 return err;
522
523 bcmsdh->sbwad = bar0;
524 }
525
526 addr &= SBSDIO_SB_OFT_ADDR_MASK;
527
528 incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC;
529 width = (flags & SDIO_REQ_4BYTE) ? 4 : 2;
530 if (width == 4)
531 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
532
533 status = sdioh_request_buffer(bcmsdh->sdioh, SDIOH_DATA_PIO, incr_fix,
534 SDIOH_WRITE, fn, addr, width, nbytes, buf,
535 pkt);
536
1bc93cec 537 return SDIOH_API_SUCCESS(status) ? 0 : -EIO;
cf2b4488
HP
538}
539
66cbd3ab 540int bcmsdh_rwdata(void *sdh, uint rw, u32 addr, u8 *buf, uint nbytes)
cf2b4488
HP
541{
542 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
543 SDIOH_API_RC status;
544
545 ASSERT(bcmsdh);
546 ASSERT(bcmsdh->init_success);
547 ASSERT((addr & SBSDIO_SBWINDOW_MASK) == 0);
548
549 addr &= SBSDIO_SB_OFT_ADDR_MASK;
550 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
551
552 status =
553 sdioh_request_buffer(bcmsdh->sdioh, SDIOH_DATA_PIO, SDIOH_DATA_INC,
554 (rw ? SDIOH_WRITE : SDIOH_READ), SDIO_FUNC_1,
555 addr, 4, nbytes, buf, NULL);
556
1bc93cec 557 return SDIOH_API_SUCCESS(status) ? 0 : -EIO;
cf2b4488
HP
558}
559
560int bcmsdh_abort(void *sdh, uint fn)
561{
562 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
563
564 return sdioh_abort(bcmsdh->sdioh, fn);
565}
566
567int bcmsdh_start(void *sdh, int stage)
568{
569 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
570
571 return sdioh_start(bcmsdh->sdioh, stage);
572}
573
574int bcmsdh_stop(void *sdh)
575{
576 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
577
578 return sdioh_stop(bcmsdh->sdioh);
579}
580
581int bcmsdh_query_device(void *sdh)
582{
583 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
be1c09f9 584 bcmsdh->vendevid = (PCI_VENDOR_ID_BROADCOM << 16) | 0;
cf2b4488
HP
585 return bcmsdh->vendevid;
586}
587
588uint bcmsdh_query_iofnum(void *sdh)
589{
590 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
591
592 if (!bcmsdh)
593 bcmsdh = l_bcmsdh;
594
595 return sdioh_query_iofnum(bcmsdh->sdioh);
596}
597
598int bcmsdh_reset(bcmsdh_info_t *sdh)
599{
600 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
601
602 return sdioh_sdio_reset(bcmsdh->sdioh);
603}
604
605void *bcmsdh_get_sdioh(bcmsdh_info_t *sdh)
606{
607 ASSERT(sdh);
608 return sdh->sdioh;
609}
610
611/* Function to pass device-status bits to DHD. */
66cbd3ab 612u32 bcmsdh_get_dstatus(void *sdh)
cf2b4488
HP
613{
614 return 0;
615}
616
66cbd3ab 617u32 bcmsdh_cur_sbwad(void *sdh)
cf2b4488
HP
618{
619 bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *) sdh;
620
621 if (!bcmsdh)
622 bcmsdh = l_bcmsdh;
623
624 return bcmsdh->sbwad;
625}
626
66cbd3ab 627void bcmsdh_chipinfo(void *sdh, u32 chip, u32 chiprev)
cf2b4488
HP
628{
629 return;
630}
This page took 0.151456 seconds and 5 git commands to generate.