14d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt/* 24d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * BCMSDH interface glue 34d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * implement bcmsdh API for SDIOH driver 44d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * 56b8a1c6010b8cff0fc4081d3eba0778c9e8a86b2Dmitry Shmidt * Copyright (C) 1999-2010, Broadcom Corporation 64d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * 74d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * Unless you and Broadcom execute a separate written software license 84d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * agreement governing use of this software, this software is licensed to you 94d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * under the terms of the GNU General Public License version 2 (the "GPL"), 104d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * available at http://www.broadcom.com/licenses/GPLv2.php, with the 114d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * following added to such license: 124d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * 134d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * As a special exception, the copyright holders of this software give you 144d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * permission to link this software with independent modules, and to copy and 154d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * distribute the resulting executable under terms of your choice, provided that 164d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * you also meet, for each linked independent module, the terms and conditions of 174d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * the license of that module. An independent module is a module which is not 184d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * derived from this software. The special exception does not apply to any 194d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * modifications of the software. 204d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * 214d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * Notwithstanding the above, under no circumstances may you combine this 224d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * software in any way with any other Broadcom software provided under a license 234d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * other than the GPL, without Broadcom's express prior written consent. 244d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt * 256b8a1c6010b8cff0fc4081d3eba0778c9e8a86b2Dmitry Shmidt * $Id: bcmsdh.c,v 1.35.2.1.4.8.6.13 2010/04/06 03:26:57 Exp $ 264d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt */ 274d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt/* ****************** BCMSDH Interface Functions *************************** */ 284d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 294d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#include <typedefs.h> 304d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#include <bcmdevs.h> 314d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#include <bcmendian.h> 324d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#include <bcmutils.h> 334d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#include <hndsoc.h> 344d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#include <siutils.h> 354d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#include <osl.h> 364d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 374d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#include <bcmsdh.h> /* BRCM API for SDIO clients (such as wl, dhd) */ 384d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#include <bcmsdbus.h> /* common SDIO/controller interface */ 394d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#include <sbsdio.h> /* BRCM sdio device core */ 404d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 414d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#include <sdio.h> /* sdio spec */ 424d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 431a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#define SDIOH_API_ACCESS_RETRY_LIMIT 2 444d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtconst uint bcmsdh_msglevel = BCMSDH_ERROR_VAL; 454d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 464d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 474d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtstruct bcmsdh_info 484d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 494d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bool init_success; /* underlying driver successfully attached */ 504d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt void *sdioh; /* handler for sdioh */ 514d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint32 vendevid; /* Target Vendor and Device ID on SD bus */ 524d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt osl_t *osh; 534d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bool regfail; /* Save status of last reg_read/reg_write call */ 544d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint32 sbwad; /* Save backplane window address */ 554d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt}; 564d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt/* local copy of bcm sd handler */ 574d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_info_t * l_bcmsdh = NULL; 584d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 59492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt#if defined(OOB_INTR_ONLY) && defined(HW_OOB) 60492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidtextern int 61492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidtsdioh_enable_hw_oob_intr(void *sdioh, bool enable); 62492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt 63492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidtvoid 64492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidtbcmsdh_enable_hw_oob_intr(bcmsdh_info_t *sdh, bool enable) 65492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt{ 66492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt sdioh_enable_hw_oob_intr(sdh->sdioh, enable); 67492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt} 68492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt#endif 69492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt 704d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_info_t * 714d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_attach(osl_t *osh, void *cfghdl, void **regsva, uint irq) 724d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 734d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh; 744d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 754d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if ((bcmsdh = (bcmsdh_info_t *)MALLOC(osh, sizeof(bcmsdh_info_t))) == NULL) { 764d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_ERROR(("bcmsdh_attach: out of memory, malloced %d bytes\n", MALLOCED(osh))); 774d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return NULL; 784d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 794d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bzero((char *)bcmsdh, sizeof(bcmsdh_info_t)); 804d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 814d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt /* save the handler locally */ 824d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt l_bcmsdh = bcmsdh; 834d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 844d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!(bcmsdh->sdioh = sdioh_attach(osh, cfghdl, irq))) { 854d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_detach(osh, bcmsdh); 864d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return NULL; 874d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 884d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 894d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh->osh = osh; 904d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh->init_success = TRUE; 914d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 924d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt *regsva = (uint32 *)SI_ENUM_BASE; 934d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 944d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt /* Report the BAR, to fix if needed */ 954d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh->sbwad = SI_ENUM_BASE; 964d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return bcmsdh; 974d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 984d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 994d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 1004d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_detach(osl_t *osh, void *sdh) 1014d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 1024d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 1034d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 104492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt if (bcmsdh != NULL) { 105492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt if (bcmsdh->sdioh) { 106492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt sdioh_detach(osh, bcmsdh->sdioh); 107492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt bcmsdh->sdioh = NULL; 108492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt } 1094d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt MFREE(osh, bcmsdh, sizeof(bcmsdh_info_t)); 1104d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 1114d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1124d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt l_bcmsdh = NULL; 1134d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return 0; 1144d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 1154d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1164d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 1174d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_iovar_op(void *sdh, const char *name, 1184d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt void *params, int plen, void *arg, int len, bool set) 1194d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 1204d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 1214d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return sdioh_iovar_op(bcmsdh->sdioh, name, params, plen, arg, len, set); 1224d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 1234d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1244d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbool 1254d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_intr_query(void *sdh) 1264d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 1274d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 1284d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 1294d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bool on; 1304d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1314d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh); 1324d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_interrupt_query(bcmsdh->sdioh, &on); 1334d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (SDIOH_API_SUCCESS(status)) 1344d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return FALSE; 1354d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt else 1364d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return on; 1374d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 1384d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1394d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 1404d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_intr_enable(void *sdh) 1414d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 1424d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 1434d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 1444d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh); 1454d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1464d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_interrupt_set(bcmsdh->sdioh, TRUE); 1474d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); 1484d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 1494d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1504d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 1514d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_intr_disable(void *sdh) 1524d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 1534d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 1544d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 1554d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh); 1564d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1574d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_interrupt_set(bcmsdh->sdioh, FALSE); 1584d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); 1594d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 1604d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1614d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 1624d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_intr_reg(void *sdh, bcmsdh_cb_fn_t fn, void *argh) 1634d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 1644d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 1654d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 1664d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh); 1674d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1684d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_interrupt_register(bcmsdh->sdioh, fn, argh); 1694d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); 1704d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 1714d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1724d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 1734d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_intr_dereg(void *sdh) 1744d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 1754d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 1764d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 1774d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh); 1784d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1794d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_interrupt_deregister(bcmsdh->sdioh); 1804d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); 1814d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 1824d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1834d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#if defined(DHD_DEBUG) 1844d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbool 1854d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_intr_pending(void *sdh) 1864d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 1874d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 1884d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1894d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(sdh); 1904d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return sdioh_interrupt_pending(bcmsdh->sdioh); 1914d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 1924d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt#endif 1934d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1944d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 1954d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 1964d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_devremove_reg(void *sdh, bcmsdh_cb_fn_t fn, void *argh) 1974d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 1984d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(sdh); 1994d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2004d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt /* don't support yet */ 2014d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return BCME_UNSUPPORTED; 2024d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 2034d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2044d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtuint8 2054d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_cfg_read(void *sdh, uint fnc_num, uint32 addr, int *err) 2064d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 2074d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 2084d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 2091a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#ifdef SDIOH_API_ACCESS_RETRY_LIMIT 2101a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt int32 retry = 0; 2111a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#endif 2124d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint8 data = 0; 2134d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2144d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!bcmsdh) 2154d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh = l_bcmsdh; 2164d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2174d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh->init_success); 2184d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2191a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#ifdef SDIOH_API_ACCESS_RETRY_LIMIT 2201a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt do { 2211a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt if (retry) /* wait for 1 ms till bus get settled down */ 2221a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt OSL_DELAY(1000); 2231a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#endif 2244d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_cfg_read(bcmsdh->sdioh, fnc_num, addr, (uint8 *)&data); 2251a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#ifdef SDIOH_API_ACCESS_RETRY_LIMIT 2261a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt } while (!SDIOH_API_SUCCESS(status) && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT)); 2271a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#endif 2284d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (err) 2294d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt *err = (SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR); 2304d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2314d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, uint8data = 0x%x\n", __FUNCTION__, 2324d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt fnc_num, addr, data)); 2334d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2344d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return data; 2354d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 2364d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2374d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtvoid 2384d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_cfg_write(void *sdh, uint fnc_num, uint32 addr, uint8 data, int *err) 2394d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 2404d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 2414d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 2421a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#ifdef SDIOH_API_ACCESS_RETRY_LIMIT 2431a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt int32 retry = 0; 2441a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#endif 2454d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2464d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!bcmsdh) 2474d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh = l_bcmsdh; 2484d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2494d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh->init_success); 2504d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2511a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#ifdef SDIOH_API_ACCESS_RETRY_LIMIT 2521a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt do { 2531a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt if (retry) /* wait for 1 ms till bus get settled down */ 2541a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt OSL_DELAY(1000); 2551a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#endif 2564d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_cfg_write(bcmsdh->sdioh, fnc_num, addr, (uint8 *)&data); 2571a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#ifdef SDIOH_API_ACCESS_RETRY_LIMIT 2581a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt } while (!SDIOH_API_SUCCESS(status) && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT)); 2591a9040ebea203168187d4e8f55cd5566a8eace4cDmitry Shmidt#endif 2604d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (err) 2614d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt *err = SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR; 2624d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2634d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, uint8data = 0x%x\n", __FUNCTION__, 2644d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt fnc_num, addr, data)); 2654d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 2664d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2674d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtuint32 2684d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_cfg_read_word(void *sdh, uint fnc_num, uint32 addr, int *err) 2694d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 2704d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 2714d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 2724d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint32 data = 0; 2734d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2744d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!bcmsdh) 2754d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh = l_bcmsdh; 2764d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2774d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh->init_success); 2784d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2794d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL, SDIOH_READ, fnc_num, 2804d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr, &data, 4); 2814d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2824d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (err) 2834d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt *err = (SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR); 2844d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2854d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, uint32data = 0x%x\n", __FUNCTION__, 2864d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt fnc_num, addr, data)); 2874d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2884d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return data; 2894d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 2904d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2914d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtvoid 2924d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_cfg_write_word(void *sdh, uint fnc_num, uint32 addr, uint32 data, int *err) 2934d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 2944d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 2954d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 2964d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 2974d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!bcmsdh) 2984d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh = l_bcmsdh; 2994d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3004d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh->init_success); 3014d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3024d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL, SDIOH_WRITE, fnc_num, 3034d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr, &data, 4); 3044d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3054d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (err) 3064d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt *err = (SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR); 3074d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3084d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, uint32data = 0x%x\n", __FUNCTION__, fnc_num, 3094d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr, data)); 3104d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 3114d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3124d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3134d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 3144d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_cis_read(void *sdh, uint func, uint8 *cis, uint length) 3154d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 3164d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 3174d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 3184d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3194d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint8 *tmp_buf, *tmp_ptr; 3204d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint8 *ptr; 3214d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bool ascii = func & ~0xf; 322492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt func &= 0x7; 3234d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3244d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!bcmsdh) 3254d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh = l_bcmsdh; 3264d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3274d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh->init_success); 3284d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(cis); 3294d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(length <= SBSDIO_CIS_SIZE_LIMIT); 3304d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3314d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_cis_read(bcmsdh->sdioh, func, cis, length); 3324d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3334d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (ascii) { 3344d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt /* Move binary bits to tmp and format them into the provided buffer. */ 3354d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if ((tmp_buf = (uint8 *)MALLOC(bcmsdh->osh, length)) == NULL) { 3364d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_ERROR(("%s: out of memory\n", __FUNCTION__)); 3374d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return BCME_NOMEM; 3384d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 3394d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcopy(cis, tmp_buf, length); 3404d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt for (tmp_ptr = tmp_buf, ptr = cis; ptr < (cis + length - 4); tmp_ptr++) { 3414d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ptr += sprintf((char*)ptr, "%.2x ", *tmp_ptr & 0xff); 3424d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if ((((tmp_ptr - tmp_buf) + 1) & 0xf) == 0) 3434d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ptr += sprintf((char *)ptr, "\n"); 3444d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 3454d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt MFREE(bcmsdh->osh, tmp_buf, length); 3464d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 3474d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3484d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); 3494d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 3504d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3514d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3524d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtstatic int 3534d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdhsdio_set_sbaddr_window(void *sdh, uint32 address) 3544d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 3554d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt int err = 0; 3564d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 3574d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_cfg_write(bcmsdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRLOW, 3584d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt (address >> 8) & SBSDIO_SBADDRLOW_MASK, &err); 3594d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!err) 3604d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_cfg_write(bcmsdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRMID, 3614d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt (address >> 16) & SBSDIO_SBADDRMID_MASK, &err); 3624d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!err) 3634d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_cfg_write(bcmsdh, SDIO_FUNC_1, SBSDIO_FUNC1_SBADDRHIGH, 3644d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt (address >> 24) & SBSDIO_SBADDRHIGH_MASK, &err); 3654d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3664d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3674d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return err; 3684d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 3694d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3704d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtuint32 3714d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_reg_read(void *sdh, uint32 addr, uint size) 3724d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 3734d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 3744d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 375492884be0b302c6c6ea51b360c1f7b0996d96a8bDmitry Shmidt uint32 word = 0; 3764d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK; 3774d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3784d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_INFO(("%s:fun = 1, addr = 0x%x, ", __FUNCTION__, addr)); 3794d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3804d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!bcmsdh) 3814d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh = l_bcmsdh; 3824d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3834d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh->init_success); 3844d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3854d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (bar0 != bcmsdh->sbwad) { 3864d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (bcmsdhsdio_set_sbaddr_window(bcmsdh, bar0)) 3874d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return 0xFFFFFFFF; 3884d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3894d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh->sbwad = bar0; 3904d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 3914d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3924d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr &= SBSDIO_SB_OFT_ADDR_MASK; 3934d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (size == 4) 3944d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; 3954d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3964d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL, 3974d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_READ, SDIO_FUNC_1, addr, &word, size); 3984d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 3994d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh->regfail = !(SDIOH_API_SUCCESS(status)); 4004d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4014d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_INFO(("uint32data = 0x%x\n", word)); 4024d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4034d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt /* if ok, return appropriately masked word */ 4044d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (SDIOH_API_SUCCESS(status)) { 4054d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt switch (size) { 4064d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt case sizeof(uint8): 4074d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (word & 0xff); 4084d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt case sizeof(uint16): 4094d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (word & 0xffff); 4104d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt case sizeof(uint32): 4114d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return word; 4124d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt default: 4134d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh->regfail = TRUE; 4144d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4154d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 4164d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 4174d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4184d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt /* otherwise, bad sdio access or invalid size */ 4194d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_ERROR(("%s: error reading addr 0x%04x size %d\n", __FUNCTION__, addr, size)); 4204d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return 0xFFFFFFFF; 4214d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 4224d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4234d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtuint32 4244d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_reg_write(void *sdh, uint32 addr, uint size, uint32 data) 4254d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 4264d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 4274d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 4284d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK; 4294d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt int err = 0; 4304d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4314d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_INFO(("%s:fun = 1, addr = 0x%x, uint%ddata = 0x%x\n", 4324d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt __FUNCTION__, addr, size*8, data)); 4334d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4344d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!bcmsdh) 4354d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh = l_bcmsdh; 4364d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4374d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh->init_success); 4384d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4394d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (bar0 != bcmsdh->sbwad) { 4404d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if ((err = bcmsdhsdio_set_sbaddr_window(bcmsdh, bar0))) 4414d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return err; 4424d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4434d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh->sbwad = bar0; 4444d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 4454d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4464d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr &= SBSDIO_SB_OFT_ADDR_MASK; 4474d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (size == 4) 4484d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; 4494d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_request_word(bcmsdh->sdioh, SDIOH_CMD_TYPE_NORMAL, SDIOH_WRITE, SDIO_FUNC_1, 4504d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr, &data, size); 4514d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh->regfail = !(SDIOH_API_SUCCESS(status)); 4524d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4534d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (SDIOH_API_SUCCESS(status)) 4544d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return 0; 4554d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4564d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_ERROR(("%s: error writing 0x%08x to addr 0x%04x size %d\n", 4574d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt __FUNCTION__, data, addr, size)); 4584d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return 0xFFFFFFFF; 4594d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 4604d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4614d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbool 4624d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_regfail(void *sdh) 4634d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 4644d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return ((bcmsdh_info_t *)sdh)->regfail; 4654d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 4664d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4674d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 4684d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_recv_buf(void *sdh, uint32 addr, uint fn, uint flags, 4694d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint8 *buf, uint nbytes, void *pkt, 4704d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_cmplt_fn_t complete, void *handle) 4714d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 4724d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 4734d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 4744d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint incr_fix; 4754d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint width; 4764d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK; 4774d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt int err = 0; 4784d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4794d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh); 4804d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh->init_success); 4814d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4824d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, size = %d\n", 4834d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt __FUNCTION__, fn, addr, nbytes)); 4844d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4854d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt /* Async not implemented yet */ 4864d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(!(flags & SDIO_REQ_ASYNC)); 4874d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (flags & SDIO_REQ_ASYNC) 4884d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return BCME_UNSUPPORTED; 4894d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4904d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (bar0 != bcmsdh->sbwad) { 4914d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if ((err = bcmsdhsdio_set_sbaddr_window(bcmsdh, bar0))) 4924d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return err; 4934d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4944d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh->sbwad = bar0; 4954d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 4964d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4974d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr &= SBSDIO_SB_OFT_ADDR_MASK; 4984d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 4994d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC; 5004d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; 5014d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (width == 4) 5024d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; 5034d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5044d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_request_buffer(bcmsdh->sdioh, SDIOH_DATA_PIO, incr_fix, 5054d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_READ, fn, addr, width, nbytes, buf, pkt); 5064d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5074d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (SDIOH_API_SUCCESS(status) ? 0 : BCME_SDIO_ERROR); 5084d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 5094d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5104d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 5114d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_send_buf(void *sdh, uint32 addr, uint fn, uint flags, 5124d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint8 *buf, uint nbytes, void *pkt, 5134d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_cmplt_fn_t complete, void *handle) 5144d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 5154d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 5164d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 5174d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint incr_fix; 5184d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint width; 5194d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt uint bar0 = addr & ~SBSDIO_SB_OFT_ADDR_MASK; 5204d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt int err = 0; 5214d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5224d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh); 5234d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh->init_success); 5244d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5254d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt BCMSDH_INFO(("%s:fun = %d, addr = 0x%x, size = %d\n", 5264d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt __FUNCTION__, fn, addr, nbytes)); 5274d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5284d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt /* Async not implemented yet */ 5294d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(!(flags & SDIO_REQ_ASYNC)); 5304d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (flags & SDIO_REQ_ASYNC) 5314d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return BCME_UNSUPPORTED; 5324d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5334d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (bar0 != bcmsdh->sbwad) { 5344d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if ((err = bcmsdhsdio_set_sbaddr_window(bcmsdh, bar0))) 5354d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return err; 5364d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5374d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh->sbwad = bar0; 5384d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt } 5394d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5404d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr &= SBSDIO_SB_OFT_ADDR_MASK; 5414d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5424d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt incr_fix = (flags & SDIO_REQ_FIXED) ? SDIOH_DATA_FIX : SDIOH_DATA_INC; 5434d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt width = (flags & SDIO_REQ_4BYTE) ? 4 : 2; 5444d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (width == 4) 5454d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; 5464d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5474d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_request_buffer(bcmsdh->sdioh, SDIOH_DATA_PIO, incr_fix, 5484d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_WRITE, fn, addr, width, nbytes, buf, pkt); 5494d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5504d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); 5514d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 5524d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5534d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 5544d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_rwdata(void *sdh, uint rw, uint32 addr, uint8 *buf, uint nbytes) 5554d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 5564d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 5574d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt SDIOH_API_RC status; 5584d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5594d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh); 5604d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(bcmsdh->init_success); 5614d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT((addr & SBSDIO_SBWINDOW_MASK) == 0); 5624d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5634d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr &= SBSDIO_SB_OFT_ADDR_MASK; 5644d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; 5654d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5664d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt status = sdioh_request_buffer(bcmsdh->sdioh, SDIOH_DATA_PIO, SDIOH_DATA_INC, 5674d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt (rw ? SDIOH_WRITE : SDIOH_READ), SDIO_FUNC_1, 5684d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt addr, 4, nbytes, buf, NULL); 5694d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5704d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (SDIOH_API_SUCCESS(status) ? 0 : BCME_ERROR); 5714d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 5724d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5734d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 5744d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_abort(void *sdh, uint fn) 5754d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 5764d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 5774d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5784d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return sdioh_abort(bcmsdh->sdioh, fn); 5794d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 5804d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5814d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 5824d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_start(void *sdh, int stage) 5834d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 5844d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 5854d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5864d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return sdioh_start(bcmsdh->sdioh, stage); 5874d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 5884d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5894d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 5904d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_stop(void *sdh) 5914d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 5924d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 5934d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5944d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return sdioh_stop(bcmsdh->sdioh); 5954d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 5964d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5974d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 5984d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 5994d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_query_device(void *sdh) 6004d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 6014d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 6024d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh->vendevid = (VENDOR_BROADCOM << 16) | 0; 6034d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (bcmsdh->vendevid); 6044d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 6054d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 6064d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtuint 6074d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_query_iofnum(void *sdh) 6084d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 6094d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 6104d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 6114d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!bcmsdh) 6124d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh = l_bcmsdh; 6134d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 6144d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (sdioh_query_iofnum(bcmsdh->sdioh)); 6154d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 6164d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 6174d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtint 6184d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_reset(bcmsdh_info_t *sdh) 6194d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 6204d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 6214d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 6224d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return sdioh_sdio_reset(bcmsdh->sdioh); 6234d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 6244d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 6254d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtvoid *bcmsdh_get_sdioh(bcmsdh_info_t *sdh) 6264d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 6274d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt ASSERT(sdh); 6284d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return sdh->sdioh; 6294d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 6304d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 6314d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt/* Function to pass device-status bits to DHD. */ 6324d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtuint32 6334d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_get_dstatus(void *sdh) 6344d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 6354d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return 0; 6364d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 6374d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtuint32 6384d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_cur_sbwad(void *sdh) 6394d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 6404d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh_info_t *bcmsdh = (bcmsdh_info_t *)sdh; 6414d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 6424d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt if (!bcmsdh) 6434d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt bcmsdh = l_bcmsdh; 6444d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 6454d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return (bcmsdh->sbwad); 6464d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 6474d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt 6484d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtvoid 6494d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidtbcmsdh_chipinfo(void *sdh, uint32 chip, uint32 chiprev) 6504d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt{ 6514d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt return; 6524d92e4c7da35860a39214c8fdb794ce0243dfabbDmitry Shmidt} 653