staging: brcm80211: removed unused code and definitions from fullmac
[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 */
127aa5cf 16/* ****************** SDIO CARD Interface Functions **************************/
cf2b4488 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>
c4daa849 22
cc3cea5a
RV
23#include <defs.h>
24#include <brcm_hw_ids.h>
f97e956a
RV
25#include <brcmu_utils.h>
26#include <brcmu_wifi.h>
cc3cea5a 27#include <soc.h>
c4daa849
RV
28#include "bcmsdbus.h" /* common SDIO/controller interface */
29#include "sbsdio.h" /* BRCM sdio device core */
13f401cb
RV
30#include "dngl_stats.h"
31#include "dhd.h"
cf2b4488
HP
32
33#define SDIOH_API_ACCESS_RETRY_LIMIT 2
621beaff
RV
34
35#define BRCMF_SD_ERROR_VAL 0x0001 /* Error */
36#define BRCMF_SD_INFO_VAL 0x0002 /* Info */
37
38#ifdef BCMDBG
39#define BRCMF_SD_ERROR(x) \
40 do { \
41 if ((brcmf_sdio_msglevel & BRCMF_SD_ERROR_VAL) && \
42 net_ratelimit()) \
43 printk x; \
44 } while (0)
45#define BRCMF_SD_INFO(x) \
46 do { \
47 if ((brcmf_sdio_msglevel & BRCMF_SD_INFO_VAL) && \
48 net_ratelimit()) \
49 printk x; \
50 } while (0)
51#else /* BCMDBG */
52#define BRCMF_SD_ERROR(x)
53#define BRCMF_SD_INFO(x)
54#endif /* BCMDBG */
55
62dd656d 56const uint brcmf_sdio_msglevel = BRCMF_SD_ERROR_VAL;
cf2b4488 57
127aa5cf 58struct brcmf_sdio_card {
cf2b4488
HP
59 bool init_success; /* underlying driver successfully attached */
60 void *sdioh; /* handler for sdioh */
66cbd3ab 61 u32 vendevid; /* Target Vendor and Device ID on SD bus */
cf2b4488
HP
62 bool regfail; /* Save status of last
63 reg_read/reg_write call */
66cbd3ab 64 u32 sbwad; /* Save backplane window address */
cf2b4488
HP
65};
66/* local copy of bcm sd handler */
127aa5cf 67static struct brcmf_sdio_card *l_card;
cf2b4488 68
127aa5cf
RV
69struct brcmf_sdio_card*
70brcmf_sdcard_attach(void *cfghdl, void **regsva, uint irq)
cf2b4488 71{
127aa5cf 72 struct brcmf_sdio_card *card;
cf2b4488 73
127aa5cf 74 card = kzalloc(sizeof(struct brcmf_sdio_card), GFP_ATOMIC);
62dd656d
RV
75 if (card == NULL) {
76 BRCMF_SD_ERROR(("sdcard_attach: out of memory"));
cf2b4488
HP
77 return NULL;
78 }
cf2b4488
HP
79
80 /* save the handler locally */
62dd656d 81 l_card = card;
cf2b4488 82
62dd656d
RV
83 card->sdioh = brcmf_sdioh_attach(cfghdl, irq);
84 if (!card->sdioh) {
85 brcmf_sdcard_detach(card);
cf2b4488
HP
86 return NULL;
87 }
88
62dd656d 89 card->init_success = true;
cf2b4488 90
66cbd3ab 91 *regsva = (u32 *) SI_ENUM_BASE;
cf2b4488
HP
92
93 /* Report the BAR, to fix if needed */
62dd656d
RV
94 card->sbwad = SI_ENUM_BASE;
95 return card;
cf2b4488
HP
96}
97
127aa5cf 98int brcmf_sdcard_detach(struct brcmf_sdio_card *card)
cf2b4488 99{
62dd656d
RV
100 if (card != NULL) {
101 if (card->sdioh) {
102 brcmf_sdioh_detach(card->sdioh);
103 card->sdioh = NULL;
cf2b4488 104 }
62dd656d 105 kfree(card);
cf2b4488
HP
106 }
107
62dd656d 108 l_card = NULL;
cf2b4488
HP
109 return 0;
110}
111
112int
127aa5cf 113brcmf_sdcard_iovar_op(struct brcmf_sdio_card *card, const char *name,
cf2b4488
HP
114 void *params, int plen, void *arg, int len, bool set)
115{
62dd656d 116 return brcmf_sdioh_iovar_op(card->sdioh, name, params, plen, arg,
54ca2969 117 len, set);
cf2b4488
HP
118}
119
127aa5cf 120int brcmf_sdcard_intr_enable(struct brcmf_sdio_card *card)
cf2b4488 121{
62dd656d 122 ASSERT(card);
cf2b4488 123
62dd656d 124 return brcmf_sdioh_interrupt_set(card->sdioh, true);
cf2b4488
HP
125}
126
127aa5cf 127int brcmf_sdcard_intr_disable(struct brcmf_sdio_card *card)
cf2b4488 128{
62dd656d 129 ASSERT(card);
cf2b4488 130
62dd656d 131 return brcmf_sdioh_interrupt_set(card->sdioh, false);
cf2b4488
HP
132}
133
127aa5cf 134int brcmf_sdcard_intr_reg(struct brcmf_sdio_card *card,
63bec49e 135 void (*fn)(void *), void *argh)
cf2b4488 136{
62dd656d 137 ASSERT(card);
cf2b4488 138
62dd656d 139 return brcmf_sdioh_interrupt_register(card->sdioh, fn, argh);
cf2b4488
HP
140}
141
127aa5cf 142int brcmf_sdcard_intr_dereg(struct brcmf_sdio_card *card)
cf2b4488 143{
62dd656d 144 ASSERT(card);
cf2b4488 145
62dd656d 146 return brcmf_sdioh_interrupt_deregister(card->sdioh);
cf2b4488
HP
147}
148
127aa5cf
RV
149u8 brcmf_sdcard_cfg_read(struct brcmf_sdio_card *card, uint fnc_num, u32 addr,
150 int *err)
cf2b4488 151{
3c793822 152 int status;
cf2b4488 153#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
3e26416e 154 s32 retry = 0;
cf2b4488 155#endif
3fd79f7c 156 u8 data = 0;
cf2b4488 157
62dd656d
RV
158 if (!card)
159 card = l_card;
cf2b4488 160
62dd656d 161 ASSERT(card->init_success);
cf2b4488
HP
162
163#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
164 do {
165 if (retry) /* wait for 1 ms till bus get settled down */
7383141b 166 udelay(1000);
cf2b4488
HP
167#endif
168 status =
62dd656d 169 brcmf_sdioh_cfg_read(card->sdioh, fnc_num, addr,
3fd79f7c 170 (u8 *) &data);
cf2b4488 171#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
67f72bef 172 } while (status != 0
cf2b4488
HP
173 && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT));
174#endif
175 if (err)
67f72bef 176 *err = status;
cf2b4488 177
62dd656d 178 BRCMF_SD_INFO(("%s:fun = %d, addr = 0x%x, u8data = 0x%x\n",
cf2b4488
HP
179 __func__, fnc_num, addr, data));
180
181 return data;
182}
183
184void
127aa5cf
RV
185brcmf_sdcard_cfg_write(struct brcmf_sdio_card *card, uint fnc_num, u32 addr,
186 u8 data, int *err)
cf2b4488 187{
3c793822 188 int status;
cf2b4488 189#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
3e26416e 190 s32 retry = 0;
cf2b4488
HP
191#endif
192
62dd656d
RV
193 if (!card)
194 card = l_card;
cf2b4488 195
62dd656d 196 ASSERT(card->init_success);
cf2b4488
HP
197
198#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
199 do {
200 if (retry) /* wait for 1 ms till bus get settled down */
7383141b 201 udelay(1000);
cf2b4488
HP
202#endif
203 status =
62dd656d 204 brcmf_sdioh_cfg_write(card->sdioh, fnc_num, addr,
3fd79f7c 205 (u8 *) &data);
cf2b4488 206#ifdef SDIOH_API_ACCESS_RETRY_LIMIT
67f72bef 207 } while (status != 0
cf2b4488
HP
208 && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT));
209#endif
210 if (err)
67f72bef 211 *err = status;
cf2b4488 212
62dd656d 213 BRCMF_SD_INFO(("%s:fun = %d, addr = 0x%x, u8data = 0x%x\n",
cf2b4488
HP
214 __func__, fnc_num, addr, data));
215}
216
127aa5cf
RV
217u32 brcmf_sdcard_cfg_read_word(struct brcmf_sdio_card *card, uint fnc_num,
218 u32 addr, int *err)
cf2b4488 219{
3c793822 220 int status;
66cbd3ab 221 u32 data = 0;
cf2b4488 222
62dd656d
RV
223 if (!card)
224 card = l_card;
cf2b4488 225
62dd656d 226 ASSERT(card->init_success);
cf2b4488 227
62dd656d 228 status = brcmf_sdioh_request_word(card->sdioh, SDIOH_CMD_TYPE_NORMAL,
54ca2969 229 SDIOH_READ, fnc_num, addr, &data, 4);
cf2b4488
HP
230
231 if (err)
67f72bef 232 *err = status;
cf2b4488 233
62dd656d 234 BRCMF_SD_INFO(("%s:fun = %d, addr = 0x%x, u32data = 0x%x\n",
cf2b4488
HP
235 __func__, fnc_num, addr, data));
236
237 return data;
238}
239
240void
127aa5cf
RV
241brcmf_sdcard_cfg_write_word(struct brcmf_sdio_card *card, uint fnc_num,
242 u32 addr, u32 data, int *err)
cf2b4488 243{
3c793822 244 int status;
cf2b4488 245
62dd656d
RV
246 if (!card)
247 card = l_card;
cf2b4488 248
62dd656d 249 ASSERT(card->init_success);
cf2b4488
HP
250
251 status =
62dd656d 252 brcmf_sdioh_request_word(card->sdioh, SDIOH_CMD_TYPE_NORMAL,
cf2b4488
HP
253 SDIOH_WRITE, fnc_num, addr, &data, 4);
254
255 if (err)
67f72bef 256 *err = status;
cf2b4488 257
62dd656d 258 BRCMF_SD_INFO(("%s:fun = %d, addr = 0x%x, u32data = 0x%x\n",
cf2b4488
HP
259 __func__, fnc_num, addr, data));
260}
261
127aa5cf
RV
262int brcmf_sdcard_cis_read(struct brcmf_sdio_card *card, uint func, u8 * cis,
263 uint length)
cf2b4488 264{
3c793822 265 int status;
cf2b4488 266
3fd79f7c
GKH
267 u8 *tmp_buf, *tmp_ptr;
268 u8 *ptr;
cf2b4488
HP
269 bool ascii = func & ~0xf;
270 func &= 0x7;
271
62dd656d
RV
272 if (!card)
273 card = l_card;
cf2b4488 274
62dd656d 275 ASSERT(card->init_success);
cf2b4488
HP
276 ASSERT(cis);
277 ASSERT(length <= SBSDIO_CIS_SIZE_LIMIT);
278
62dd656d 279 status = brcmf_sdioh_cis_read(card->sdioh, func, cis, length);
cf2b4488
HP
280
281 if (ascii) {
282 /* Move binary bits to tmp and format them
283 into the provided buffer. */
5fcc1fcb 284 tmp_buf = kmalloc(length, GFP_ATOMIC);
c74c95cd 285 if (tmp_buf == NULL) {
62dd656d 286 BRCMF_SD_ERROR(("%s: out of memory\n", __func__));
e10d82d4 287 return -ENOMEM;
cf2b4488 288 }
02160695 289 memcpy(tmp_buf, cis, length);
cf2b4488
HP
290 for (tmp_ptr = tmp_buf, ptr = cis; ptr < (cis + length - 4);
291 tmp_ptr++) {
292 ptr += sprintf((char *)ptr, "%.2x ", *tmp_ptr & 0xff);
293 if ((((tmp_ptr - tmp_buf) + 1) & 0xf) == 0)
294 ptr += sprintf((char *)ptr, "\n");
295 }
182acb3c 296 kfree(tmp_buf);
cf2b4488
HP
297 }
298
67f72bef 299 return status;
cf2b4488
HP
300}
301
127aa5cf
RV
302static int
303brcmf_sdcard_set_sbaddr_window(struct brcmf_sdio_card *card, u32 address)
cf2b4488
HP
304{
305 int err = 0;
62dd656d 306 brcmf_sdcard_cfg_write(card, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRLOW,
cf2b4488
HP
307 (address >> 8) & SBSDIO_SBADDRLOW_MASK, &err);
308 if (!err)
62dd656d 309 brcmf_sdcard_cfg_write(card, SDIO_FUNC_1,
54ca2969
RV
310 SBSDIO_FUNC1_SBADDRMID,
311 (address >> 16) & SBSDIO_SBADDRMID_MASK,
312 &err);
cf2b4488 313 if (!err)
62dd656d 314 brcmf_sdcard_cfg_write(card, SDIO_FUNC_1,
54ca2969
RV
315 SBSDIO_FUNC1_SBADDRHIGH,
316 (address >> 24) & SBSDIO_SBADDRHIGH_MASK,
317 &err);
cf2b4488
HP
318
319 return err;
320}
321
127aa5cf 322u32 brcmf_sdcard_reg_read(struct brcmf_sdio_card *card, u32 addr, uint size)
cf2b4488 323{
3c793822 324 int status;
66cbd3ab 325 u32 word = 0;
cf2b4488
HP
326 uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK;
327
62dd656d 328 BRCMF_SD_INFO(("%s:fun = 1, addr = 0x%x, ", __func__, addr));
cf2b4488 329
62dd656d
RV
330 if (!card)
331 card = l_card;
cf2b4488 332
62dd656d 333 ASSERT(card->init_success);
cf2b4488 334
62dd656d
RV
335 if (bar0 != card->sbwad) {
336 if (brcmf_sdcard_set_sbaddr_window(card, bar0))
cf2b4488
HP
337 return 0xFFFFFFFF;
338
62dd656d 339 card->sbwad = bar0;
cf2b4488
HP
340 }
341
342 addr &= SBSDIO_SB_OFT_ADDR_MASK;
343 if (size == 4)
344 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
345
62dd656d 346 status = brcmf_sdioh_request_word(card->sdioh, SDIOH_CMD_TYPE_NORMAL,
cf2b4488
HP
347 SDIOH_READ, SDIO_FUNC_1, addr, &word, size);
348
62dd656d 349 card->regfail = (status != 0);
cf2b4488 350
62dd656d 351 BRCMF_SD_INFO(("u32data = 0x%x\n", word));
cf2b4488
HP
352
353 /* if ok, return appropriately masked word */
67f72bef 354 if (status == 0) {
cf2b4488 355 switch (size) {
3fd79f7c 356 case sizeof(u8):
cf2b4488 357 return word & 0xff;
7d4df48e 358 case sizeof(u16):
cf2b4488 359 return word & 0xffff;
66cbd3ab 360 case sizeof(u32):
cf2b4488
HP
361 return word;
362 default:
62dd656d 363 card->regfail = true;
cf2b4488
HP
364
365 }
366 }
367
368 /* otherwise, bad sdio access or invalid size */
62dd656d 369 BRCMF_SD_ERROR(("%s: error reading addr 0x%04x size %d\n", __func__,
cf2b4488
HP
370 addr, size));
371 return 0xFFFFFFFF;
372}
373
127aa5cf
RV
374u32 brcmf_sdcard_reg_write(struct brcmf_sdio_card *card, u32 addr, uint size,
375 u32 data)
cf2b4488 376{
3c793822 377 int status;
cf2b4488
HP
378 uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK;
379 int err = 0;
380
62dd656d 381 BRCMF_SD_INFO(("%s:fun = 1, addr = 0x%x, uint%ddata = 0x%x\n",
cf2b4488
HP
382 __func__, addr, size * 8, data));
383
62dd656d
RV
384 if (!card)
385 card = l_card;
cf2b4488 386
62dd656d 387 ASSERT(card->init_success);
cf2b4488 388
62dd656d
RV
389 if (bar0 != card->sbwad) {
390 err = brcmf_sdcard_set_sbaddr_window(card, bar0);
c74c95cd 391 if (err)
cf2b4488
HP
392 return err;
393
62dd656d 394 card->sbwad = bar0;
cf2b4488
HP
395 }
396
397 addr &= SBSDIO_SB_OFT_ADDR_MASK;
398 if (size == 4)
399 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
400 status =
62dd656d 401 brcmf_sdioh_request_word(card->sdioh, SDIOH_CMD_TYPE_NORMAL,
cf2b4488 402 SDIOH_WRITE, SDIO_FUNC_1, addr, &data, size);
62dd656d 403 card->regfail = (status != 0);
cf2b4488 404
67f72bef 405 if (status == 0)
cf2b4488
HP
406 return 0;
407
62dd656d 408 BRCMF_SD_ERROR(("%s: error writing 0x%08x to addr 0x%04x size %d\n",
cf2b4488
HP
409 __func__, data, addr, size));
410 return 0xFFFFFFFF;
411}
412
127aa5cf 413bool brcmf_sdcard_regfail(struct brcmf_sdio_card *card)
cf2b4488 414{
127aa5cf 415 return card->regfail;
cf2b4488
HP
416}
417
418int
127aa5cf
RV
419brcmf_sdcard_recv_buf(struct brcmf_sdio_card *card, u32 addr, uint fn,
420 uint flags,
421 u8 *buf, uint nbytes, struct sk_buff *pkt,
63bec49e
RV
422 void (*complete)(void *handle, int status,
423 bool sync_waiting),
424 void *handle)
cf2b4488 425{
3c793822 426 int status;
cf2b4488
HP
427 uint incr_fix;
428 uint width;
429 uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK;
430 int err = 0;
431
62dd656d
RV
432 ASSERT(card);
433 ASSERT(card->init_success);
cf2b4488 434
62dd656d 435 BRCMF_SD_INFO(("%s:fun = %d, addr = 0x%x, size = %d\n",
cf2b4488
HP
436 __func__, fn, addr, nbytes));
437
438 /* Async not implemented yet */
439 ASSERT(!(flags & SDIO_REQ_ASYNC));
440 if (flags & SDIO_REQ_ASYNC)
e10d82d4 441 return -ENOTSUPP;
cf2b4488 442
62dd656d
RV
443 if (bar0 != card->sbwad) {
444 err = brcmf_sdcard_set_sbaddr_window(card, bar0);
c74c95cd 445 if (err)
cf2b4488
HP
446 return err;
447
62dd656d 448 card->sbwad = bar0;
cf2b4488
HP
449 }
450
451 addr &= SBSDIO_SB_OFT_ADDR_MASK;
452
453 incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC;
454 width = (flags & SDIO_REQ_4BYTE) ? 4 : 2;
455 if (width == 4)
456 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
457
62dd656d 458 status = brcmf_sdioh_request_buffer(card->sdioh, SDIOH_DATA_PIO,
54ca2969 459 incr_fix, SDIOH_READ, fn, addr, width, nbytes, buf, pkt);
cf2b4488 460
67f72bef 461 return status;
cf2b4488
HP
462}
463
464int
127aa5cf
RV
465brcmf_sdcard_send_buf(struct brcmf_sdio_card *card, u32 addr, uint fn,
466 uint flags, u8 *buf, uint nbytes, void *pkt,
63bec49e
RV
467 void (*complete)(void *handle, int status,
468 bool sync_waiting),
469 void *handle)
cf2b4488 470{
cf2b4488
HP
471 uint incr_fix;
472 uint width;
473 uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK;
474 int err = 0;
475
62dd656d
RV
476 ASSERT(card);
477 ASSERT(card->init_success);
cf2b4488 478
62dd656d 479 BRCMF_SD_INFO(("%s:fun = %d, addr = 0x%x, size = %d\n",
cf2b4488
HP
480 __func__, fn, addr, nbytes));
481
482 /* Async not implemented yet */
483 ASSERT(!(flags & SDIO_REQ_ASYNC));
484 if (flags & SDIO_REQ_ASYNC)
e10d82d4 485 return -ENOTSUPP;
cf2b4488 486
62dd656d
RV
487 if (bar0 != card->sbwad) {
488 err = brcmf_sdcard_set_sbaddr_window(card, bar0);
c74c95cd 489 if (err)
cf2b4488
HP
490 return err;
491
62dd656d 492 card->sbwad = bar0;
cf2b4488
HP
493 }
494
495 addr &= SBSDIO_SB_OFT_ADDR_MASK;
496
497 incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC;
498 width = (flags & SDIO_REQ_4BYTE) ? 4 : 2;
499 if (width == 4)
500 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
501
62dd656d 502 return brcmf_sdioh_request_buffer(card->sdioh, SDIOH_DATA_PIO,
54ca2969 503 incr_fix, SDIOH_WRITE, fn, addr, width, nbytes, buf, pkt);
cf2b4488
HP
504}
505
127aa5cf
RV
506int brcmf_sdcard_rwdata(struct brcmf_sdio_card *card, uint rw, u32 addr,
507 u8 *buf, uint nbytes)
cf2b4488 508{
62dd656d
RV
509 ASSERT(card);
510 ASSERT(card->init_success);
cf2b4488
HP
511 ASSERT((addr & SBSDIO_SBWINDOW_MASK) == 0);
512
513 addr &= SBSDIO_SB_OFT_ADDR_MASK;
514 addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
515
62dd656d 516 return brcmf_sdioh_request_buffer(card->sdioh, SDIOH_DATA_PIO,
54ca2969
RV
517 SDIOH_DATA_INC, (rw ? SDIOH_WRITE : SDIOH_READ), SDIO_FUNC_1,
518 addr, 4, nbytes, buf, NULL);
cf2b4488
HP
519}
520
127aa5cf 521int brcmf_sdcard_abort(struct brcmf_sdio_card *card, uint fn)
cf2b4488 522{
62dd656d 523 return brcmf_sdioh_abort(card->sdioh, fn);
cf2b4488
HP
524}
525
127aa5cf 526int brcmf_sdcard_query_device(struct brcmf_sdio_card *card)
cf2b4488 527{
62dd656d
RV
528 card->vendevid = (PCI_VENDOR_ID_BROADCOM << 16) | 0;
529 return card->vendevid;
cf2b4488
HP
530}
531
127aa5cf 532u32 brcmf_sdcard_cur_sbwad(struct brcmf_sdio_card *card)
cf2b4488 533{
62dd656d
RV
534 if (!card)
535 card = l_card;
cf2b4488 536
62dd656d 537 return card->sbwad;
cf2b4488 538}
This page took 0.170161 seconds and 5 git commands to generate.