Commit b73b2f9e authored by Franky Lin's avatar Franky Lin Committed by Greg Kroah-Hartman

staging: brcm80211: remove struct sdioh_info from brcmfmac

Use brcmf_sdio_dev as the unified structure to store information
of device.
Reviewed-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent c9ed29ac
...@@ -49,18 +49,18 @@ int ...@@ -49,18 +49,18 @@ int
brcmf_sdcard_iovar_op(struct brcmf_sdio_dev *sdiodev, const char *name, brcmf_sdcard_iovar_op(struct brcmf_sdio_dev *sdiodev, const char *name,
void *params, int plen, void *arg, int len, bool set) void *params, int plen, void *arg, int len, bool set)
{ {
return brcmf_sdioh_iovar_op(sdiodev->sdioh, name, params, plen, arg, return brcmf_sdioh_iovar_op(sdiodev, name, params, plen, arg,
len, set); len, set);
} }
int brcmf_sdcard_intr_reg(struct brcmf_sdio_dev *sdiodev) int brcmf_sdcard_intr_reg(struct brcmf_sdio_dev *sdiodev)
{ {
return brcmf_sdioh_interrupt_register(sdiodev->sdioh); return brcmf_sdioh_interrupt_register();
} }
int brcmf_sdcard_intr_dereg(struct brcmf_sdio_dev *sdiodev) int brcmf_sdcard_intr_dereg(struct brcmf_sdio_dev *sdiodev)
{ {
return brcmf_sdioh_interrupt_deregister(sdiodev->sdioh); return brcmf_sdioh_interrupt_deregister();
} }
u8 brcmf_sdcard_cfg_read(struct brcmf_sdio_dev *sdiodev, uint fnc_num, u32 addr, u8 brcmf_sdcard_cfg_read(struct brcmf_sdio_dev *sdiodev, uint fnc_num, u32 addr,
...@@ -74,7 +74,7 @@ u8 brcmf_sdcard_cfg_read(struct brcmf_sdio_dev *sdiodev, uint fnc_num, u32 addr, ...@@ -74,7 +74,7 @@ u8 brcmf_sdcard_cfg_read(struct brcmf_sdio_dev *sdiodev, uint fnc_num, u32 addr,
if (retry) /* wait for 1 ms till bus get settled down */ if (retry) /* wait for 1 ms till bus get settled down */
udelay(1000); udelay(1000);
status = status =
brcmf_sdioh_cfg_read(sdiodev->sdioh, fnc_num, addr, brcmf_sdioh_cfg_read(sdiodev, fnc_num, addr,
(u8 *) &data); (u8 *) &data);
} while (status != 0 } while (status != 0
&& (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT)); && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT));
...@@ -98,7 +98,7 @@ brcmf_sdcard_cfg_write(struct brcmf_sdio_dev *sdiodev, uint fnc_num, u32 addr, ...@@ -98,7 +98,7 @@ brcmf_sdcard_cfg_write(struct brcmf_sdio_dev *sdiodev, uint fnc_num, u32 addr,
if (retry) /* wait for 1 ms till bus get settled down */ if (retry) /* wait for 1 ms till bus get settled down */
udelay(1000); udelay(1000);
status = status =
brcmf_sdioh_cfg_write(sdiodev->sdioh, fnc_num, addr, brcmf_sdioh_cfg_write(sdiodev, fnc_num, addr,
(u8 *) &data); (u8 *) &data);
} while (status != 0 } while (status != 0
&& (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT)); && (retry++ < SDIOH_API_ACCESS_RETRY_LIMIT));
...@@ -119,7 +119,7 @@ int brcmf_sdcard_cis_read(struct brcmf_sdio_dev *sdiodev, uint func, u8 * cis, ...@@ -119,7 +119,7 @@ int brcmf_sdcard_cis_read(struct brcmf_sdio_dev *sdiodev, uint func, u8 * cis,
bool ascii = func & ~0xf; bool ascii = func & ~0xf;
func &= 0x7; func &= 0x7;
status = brcmf_sdioh_cis_read(sdiodev->sdioh, func, cis, length); status = brcmf_sdioh_cis_read(sdiodev, func, cis, length);
if (ascii) { if (ascii) {
/* Move binary bits to tmp and format them /* Move binary bits to tmp and format them
...@@ -181,7 +181,7 @@ u32 brcmf_sdcard_reg_read(struct brcmf_sdio_dev *sdiodev, u32 addr, uint size) ...@@ -181,7 +181,7 @@ u32 brcmf_sdcard_reg_read(struct brcmf_sdio_dev *sdiodev, u32 addr, uint size)
if (size == 4) if (size == 4)
addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
status = brcmf_sdioh_request_word(sdiodev->sdioh, SDIOH_CMD_TYPE_NORMAL, status = brcmf_sdioh_request_word(sdiodev, SDIOH_CMD_TYPE_NORMAL,
SDIOH_READ, SDIO_FUNC_1, addr, &word, size); SDIOH_READ, SDIO_FUNC_1, addr, &word, size);
sdiodev->regfail = (status != 0); sdiodev->regfail = (status != 0);
...@@ -231,7 +231,7 @@ u32 brcmf_sdcard_reg_write(struct brcmf_sdio_dev *sdiodev, u32 addr, uint size, ...@@ -231,7 +231,7 @@ u32 brcmf_sdcard_reg_write(struct brcmf_sdio_dev *sdiodev, u32 addr, uint size,
if (size == 4) if (size == 4)
addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
status = status =
brcmf_sdioh_request_word(sdiodev->sdioh, SDIOH_CMD_TYPE_NORMAL, brcmf_sdioh_request_word(sdiodev, SDIOH_CMD_TYPE_NORMAL,
SDIOH_WRITE, SDIO_FUNC_1, addr, &data, size); SDIOH_WRITE, SDIO_FUNC_1, addr, &data, size);
sdiodev->regfail = (status != 0); sdiodev->regfail = (status != 0);
...@@ -284,7 +284,7 @@ brcmf_sdcard_recv_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, ...@@ -284,7 +284,7 @@ brcmf_sdcard_recv_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
if (width == 4) if (width == 4)
addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
status = brcmf_sdioh_request_buffer(sdiodev->sdioh, SDIOH_DATA_PIO, status = brcmf_sdioh_request_buffer(sdiodev, SDIOH_DATA_PIO,
incr_fix, SDIOH_READ, fn, addr, width, nbytes, buf, pkt); incr_fix, SDIOH_READ, fn, addr, width, nbytes, buf, pkt);
return status; return status;
...@@ -324,7 +324,7 @@ brcmf_sdcard_send_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn, ...@@ -324,7 +324,7 @@ brcmf_sdcard_send_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
if (width == 4) if (width == 4)
addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
return brcmf_sdioh_request_buffer(sdiodev->sdioh, SDIOH_DATA_PIO, return brcmf_sdioh_request_buffer(sdiodev, SDIOH_DATA_PIO,
incr_fix, SDIOH_WRITE, fn, addr, width, nbytes, buf, pkt); incr_fix, SDIOH_WRITE, fn, addr, width, nbytes, buf, pkt);
} }
...@@ -334,14 +334,14 @@ int brcmf_sdcard_rwdata(struct brcmf_sdio_dev *sdiodev, uint rw, u32 addr, ...@@ -334,14 +334,14 @@ int brcmf_sdcard_rwdata(struct brcmf_sdio_dev *sdiodev, uint rw, u32 addr,
addr &= SBSDIO_SB_OFT_ADDR_MASK; addr &= SBSDIO_SB_OFT_ADDR_MASK;
addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
return brcmf_sdioh_request_buffer(sdiodev->sdioh, SDIOH_DATA_PIO, return brcmf_sdioh_request_buffer(sdiodev, SDIOH_DATA_PIO,
SDIOH_DATA_INC, (rw ? SDIOH_WRITE : SDIOH_READ), SDIO_FUNC_1, SDIOH_DATA_INC, (rw ? SDIOH_WRITE : SDIOH_READ), SDIO_FUNC_1,
addr, 4, nbytes, buf, NULL); addr, 4, nbytes, buf, NULL);
} }
int brcmf_sdcard_abort(struct brcmf_sdio_dev *sdiodev, uint fn) int brcmf_sdcard_abort(struct brcmf_sdio_dev *sdiodev, uint fn)
{ {
return brcmf_sdioh_abort(sdiodev->sdioh, fn); return brcmf_sdioh_abort(sdiodev, fn);
} }
u32 brcmf_sdcard_cur_sbwad(struct brcmf_sdio_dev *sdiodev) u32 brcmf_sdcard_cur_sbwad(struct brcmf_sdio_dev *sdiodev)
...@@ -354,11 +354,9 @@ int brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev) ...@@ -354,11 +354,9 @@ int brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
u32 regs = 0; u32 regs = 0;
int ret = 0; int ret = 0;
sdiodev->sdioh = brcmf_sdioh_attach((void *)0); ret = brcmf_sdioh_attach(sdiodev);
if (!sdiodev->sdioh) { if (ret)
ret = -ENODEV;
goto out; goto out;
}
regs = SI_ENUM_BASE; regs = SI_ENUM_BASE;
...@@ -388,10 +386,7 @@ int brcmf_sdio_remove(struct brcmf_sdio_dev *sdiodev) ...@@ -388,10 +386,7 @@ int brcmf_sdio_remove(struct brcmf_sdio_dev *sdiodev)
sdiodev->bus = NULL; sdiodev->bus = NULL;
} }
if (sdiodev->sdioh) { brcmf_sdioh_detach(sdiodev);
brcmf_sdioh_detach(sdiodev->sdioh);
sdiodev->sdioh = NULL;
}
sdiodev->sbwad = 0; sdiodev->sbwad = 0;
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
static void brcmf_sdioh_irqhandler(struct sdio_func *func); static void brcmf_sdioh_irqhandler(struct sdio_func *func);
static void brcmf_sdioh_irqhandler_f2(struct sdio_func *func); static void brcmf_sdioh_irqhandler_f2(struct sdio_func *func);
static int brcmf_sdioh_get_cisaddr(struct sdioh_info *sd, u32 regaddr); static int brcmf_sdioh_get_cisaddr(struct brcmf_sdio_dev *sdiodev, u32 regaddr);
static int brcmf_ops_sdio_probe(struct sdio_func *func, static int brcmf_ops_sdio_probe(struct sdio_func *func,
const struct sdio_device_id *id); const struct sdio_device_id *id);
static void brcmf_ops_sdio_remove(struct sdio_func *func); static void brcmf_ops_sdio_remove(struct sdio_func *func);
...@@ -106,10 +106,10 @@ DECLARE_WAIT_QUEUE_HEAD(sdioh_request_buffer_wait); ...@@ -106,10 +106,10 @@ DECLARE_WAIT_QUEUE_HEAD(sdioh_request_buffer_wait);
#endif /* CONFIG_PM_SLEEP */ #endif /* CONFIG_PM_SLEEP */
static int static int
brcmf_sdioh_card_regread(struct sdioh_info *sd, int func, u32 regaddr, brcmf_sdioh_card_regread(struct brcmf_sdio_dev *sdiodev, int func, u32 regaddr,
int regsize, u32 *data); int regsize, u32 *data);
static int brcmf_sdioh_enablefuncs(struct sdioh_info *sd) static int brcmf_sdioh_enablefuncs(struct brcmf_sdio_dev *sdiodev)
{ {
int err_ret; int err_ret;
u32 fbraddr; u32 fbraddr;
...@@ -118,24 +118,20 @@ static int brcmf_sdioh_enablefuncs(struct sdioh_info *sd) ...@@ -118,24 +118,20 @@ static int brcmf_sdioh_enablefuncs(struct sdioh_info *sd)
BRCMF_TRACE(("%s\n", __func__)); BRCMF_TRACE(("%s\n", __func__));
/* Get the Card's common CIS address */ /* Get the Card's common CIS address */
sd->com_cis_ptr = brcmf_sdioh_get_cisaddr(sd, SDIO_CCCR_CIS); sdiodev->func_cis_ptr[0] = brcmf_sdioh_get_cisaddr(sdiodev,
sd->func_cis_ptr[0] = sd->com_cis_ptr; SDIO_CCCR_CIS);
BRCMF_INFO(("%s: Card's Common CIS Ptr = 0x%x\n", __func__, BRCMF_INFO(("%s: Card's Common CIS Ptr = 0x%x\n", __func__,
sd->com_cis_ptr)); sdiodev->func_cis_ptr[0]));
/* Get the Card's function CIS (for each function) */ /* Get the Card's function CIS (for each function) */
for (fbraddr = SDIO_FBR_BASE(1), func = 1; for (fbraddr = SDIO_FBR_BASE(1), func = 1;
func <= sd->num_funcs; func++, fbraddr += SDIOD_FBR_SIZE) { func <= sdiodev->num_funcs; func++, fbraddr += SDIOD_FBR_SIZE) {
sd->func_cis_ptr[func] = sdiodev->func_cis_ptr[func] =
brcmf_sdioh_get_cisaddr(sd, SDIO_FBR_CIS + fbraddr); brcmf_sdioh_get_cisaddr(sdiodev, SDIO_FBR_CIS + fbraddr);
BRCMF_INFO(("%s: Function %d CIS Ptr = 0x%x\n", __func__, func, BRCMF_INFO(("%s: Function %d CIS Ptr = 0x%x\n", __func__, func,
sd->func_cis_ptr[func])); sdiodev->func_cis_ptr[func]));
} }
sd->func_cis_ptr[0] = sd->com_cis_ptr;
BRCMF_INFO(("%s: Card's Common CIS Ptr = 0x%x\n", __func__,
sd->com_cis_ptr));
/* Enable Function 1 */ /* Enable Function 1 */
sdio_claim_host(gInstance->func[1]); sdio_claim_host(gInstance->func[1]);
err_ret = sdio_enable_func(gInstance->func[1]); err_ret = sdio_enable_func(gInstance->func[1]);
...@@ -150,82 +146,66 @@ static int brcmf_sdioh_enablefuncs(struct sdioh_info *sd) ...@@ -150,82 +146,66 @@ static int brcmf_sdioh_enablefuncs(struct sdioh_info *sd)
/* /*
* Public entry points & extern's * Public entry points & extern's
*/ */
struct sdioh_info *brcmf_sdioh_attach(void *bar0) int brcmf_sdioh_attach(struct brcmf_sdio_dev *sdiodev)
{ {
struct sdioh_info *sd; int err_ret = 0;
int err_ret;
BRCMF_TRACE(("%s\n", __func__)); BRCMF_TRACE(("%s\n", __func__));
if (gInstance == NULL) { if (gInstance == NULL) {
BRCMF_ERROR(("%s: SDIO Device not present\n", __func__)); BRCMF_ERROR(("%s: SDIO Device not present\n", __func__));
return NULL; err_ret = -ENODEV;
} goto out;
sd = kzalloc(sizeof(struct sdioh_info), GFP_ATOMIC);
if (sd == NULL) {
BRCMF_ERROR(("sdioh_attach: out of memory\n"));
return NULL;
} }
sd->num_funcs = 2; sdiodev->num_funcs = 2;
gInstance->sd = sd;
/* Claim host controller */
sdio_claim_host(gInstance->func[1]); sdio_claim_host(gInstance->func[1]);
err_ret = sdio_set_block_size(gInstance->func[1], 64); err_ret = sdio_set_block_size(gInstance->func[1], 64);
if (err_ret)
BRCMF_ERROR(("%s: Failed to set F1 blocksize\n", __func__));
/* Release host controller F1 */
sdio_release_host(gInstance->func[1]); sdio_release_host(gInstance->func[1]);
if (err_ret) {
BRCMF_ERROR(("%s: Failed to set F1 blocksize\n", __func__));
goto out;
}
if (gInstance->func[2]) { if (gInstance->func[2]) {
/* Claim host controller F2 */
sdio_claim_host(gInstance->func[2]); sdio_claim_host(gInstance->func[2]);
err_ret = err_ret =
sdio_set_block_size(gInstance->func[2], sd_f2_blocksize); sdio_set_block_size(gInstance->func[2], sd_f2_blocksize);
if (err_ret) sdio_release_host(gInstance->func[2]);
if (err_ret) {
BRCMF_ERROR(("%s: Failed to set F2 blocksize" BRCMF_ERROR(("%s: Failed to set F2 blocksize"
" to %d\n", __func__, sd_f2_blocksize)); " to %d\n", __func__, sd_f2_blocksize));
goto out;
/* Release host controller F2 */ }
sdio_release_host(gInstance->func[2]);
} }
brcmf_sdioh_enablefuncs(sd); brcmf_sdioh_enablefuncs(sdiodev);
out:
BRCMF_TRACE(("%s: Done\n", __func__)); BRCMF_TRACE(("%s: Done\n", __func__));
return sd; return err_ret;
} }
extern int brcmf_sdioh_detach(struct sdioh_info *sd) void brcmf_sdioh_detach(struct brcmf_sdio_dev *sdiodev)
{ {
BRCMF_TRACE(("%s\n", __func__)); BRCMF_TRACE(("%s\n", __func__));
if (sd) { /* Disable Function 2 */
sdio_claim_host(gInstance->func[2]);
sdio_disable_func(gInstance->func[2]);
sdio_release_host(gInstance->func[2]);
/* Disable Function 2 */ /* Disable Function 1 */
sdio_claim_host(gInstance->func[2]); sdio_claim_host(gInstance->func[1]);
sdio_disable_func(gInstance->func[2]); sdio_disable_func(gInstance->func[1]);
sdio_release_host(gInstance->func[2]); sdio_release_host(gInstance->func[1]);
/* Disable Function 1 */
sdio_claim_host(gInstance->func[1]);
sdio_disable_func(gInstance->func[1]);
sdio_release_host(gInstance->func[1]);
kfree(sd);
}
return 0;
} }
/* Configure callback to client when we receive client interrupt */ /* Configure callback to client when we receive client interrupt */
extern int extern int
brcmf_sdioh_interrupt_register(struct sdioh_info *sd) brcmf_sdioh_interrupt_register(void)
{ {
BRCMF_TRACE(("%s: Entering\n", __func__)); BRCMF_TRACE(("%s: Entering\n", __func__));
...@@ -245,7 +225,7 @@ brcmf_sdioh_interrupt_register(struct sdioh_info *sd) ...@@ -245,7 +225,7 @@ brcmf_sdioh_interrupt_register(struct sdioh_info *sd)
return 0; return 0;
} }
extern int brcmf_sdioh_interrupt_deregister(struct sdioh_info *sd) extern int brcmf_sdioh_interrupt_deregister(void)
{ {
BRCMF_TRACE(("%s: Entering\n", __func__)); BRCMF_TRACE(("%s: Entering\n", __func__));
...@@ -270,14 +250,12 @@ extern int brcmf_sdioh_interrupt_deregister(struct sdioh_info *sd) ...@@ -270,14 +250,12 @@ extern int brcmf_sdioh_interrupt_deregister(struct sdioh_info *sd)
/* IOVar table */ /* IOVar table */
enum { enum {
IOV_MSGLEVEL = 1, IOV_MSGLEVEL = 1,
IOV_NUMINTS,
IOV_DEVREG, IOV_DEVREG,
IOV_HCIREGS, IOV_HCIREGS,
IOV_RXCHAIN IOV_RXCHAIN
}; };
const struct brcmu_iovar sdioh_iovars[] = { const struct brcmu_iovar sdioh_iovars[] = {
{"sd_numints", IOV_NUMINTS, 0, IOVT_UINT32, 0},
{"sd_devreg", IOV_DEVREG, 0, IOVT_BUFFER, sizeof(struct brcmf_sdreg)} {"sd_devreg", IOV_DEVREG, 0, IOVT_BUFFER, sizeof(struct brcmf_sdreg)}
, ,
{"sd_rxchain", IOV_RXCHAIN, 0, IOVT_BOOL, 0} {"sd_rxchain", IOV_RXCHAIN, 0, IOVT_BOOL, 0}
...@@ -286,7 +264,7 @@ const struct brcmu_iovar sdioh_iovars[] = { ...@@ -286,7 +264,7 @@ const struct brcmu_iovar sdioh_iovars[] = {
}; };
int int
brcmf_sdioh_iovar_op(struct sdioh_info *si, const char *name, brcmf_sdioh_iovar_op(struct brcmf_sdio_dev *sdiodev, const char *name,
void *params, int plen, void *arg, int len, bool set) void *params, int plen, void *arg, int len, bool set)
{ {
const struct brcmu_iovar *vi = NULL; const struct brcmu_iovar *vi = NULL;
...@@ -345,11 +323,6 @@ brcmf_sdioh_iovar_op(struct sdioh_info *si, const char *name, ...@@ -345,11 +323,6 @@ brcmf_sdioh_iovar_op(struct sdioh_info *si, const char *name,
memcpy(arg, &int_val, val_size); memcpy(arg, &int_val, val_size);
break; break;
case IOV_GVAL(IOV_NUMINTS):
int_val = (s32) si->intrcount;
memcpy(arg, &int_val, val_size);
break;
case IOV_GVAL(IOV_DEVREG): case IOV_GVAL(IOV_DEVREG):
{ {
struct brcmf_sdreg *sd_ptr = struct brcmf_sdreg *sd_ptr =
...@@ -357,7 +330,7 @@ brcmf_sdioh_iovar_op(struct sdioh_info *si, const char *name, ...@@ -357,7 +330,7 @@ brcmf_sdioh_iovar_op(struct sdioh_info *si, const char *name,
u8 data = 0; u8 data = 0;
if (brcmf_sdioh_cfg_read if (brcmf_sdioh_cfg_read
(si, sd_ptr->func, sd_ptr->offset, &data)) { (sdiodev, sd_ptr->func, sd_ptr->offset, &data)) {
bcmerror = -EIO; bcmerror = -EIO;
break; break;
} }
...@@ -374,7 +347,7 @@ brcmf_sdioh_iovar_op(struct sdioh_info *si, const char *name, ...@@ -374,7 +347,7 @@ brcmf_sdioh_iovar_op(struct sdioh_info *si, const char *name,
u8 data = (u8) sd_ptr->value; u8 data = (u8) sd_ptr->value;
if (brcmf_sdioh_cfg_write if (brcmf_sdioh_cfg_write
(si, sd_ptr->func, sd_ptr->offset, &data)) { (sdiodev, sd_ptr->func, sd_ptr->offset, &data)) {
bcmerror = -EIO; bcmerror = -EIO;
break; break;
} }
...@@ -391,32 +364,36 @@ brcmf_sdioh_iovar_op(struct sdioh_info *si, const char *name, ...@@ -391,32 +364,36 @@ brcmf_sdioh_iovar_op(struct sdioh_info *si, const char *name,
} }
extern int extern int
brcmf_sdioh_cfg_read(struct sdioh_info *sd, uint fnc_num, u32 addr, u8 *data) brcmf_sdioh_cfg_read(struct brcmf_sdio_dev *sdiodev, uint fnc_num, u32 addr,
u8 *data)
{ {
int status; int status;
/* No lock needed since brcmf_sdioh_request_byte does locking */ /* No lock needed since brcmf_sdioh_request_byte does locking */
status = brcmf_sdioh_request_byte(sd, SDIOH_READ, fnc_num, addr, data); status = brcmf_sdioh_request_byte(sdiodev, SDIOH_READ, fnc_num,
addr, data);
return status; return status;
} }
extern int extern int
brcmf_sdioh_cfg_write(struct sdioh_info *sd, uint fnc_num, u32 addr, u8 *data) brcmf_sdioh_cfg_write(struct brcmf_sdio_dev *sdiodev, uint fnc_num, u32 addr,
u8 *data)
{ {
/* No lock needed since brcmf_sdioh_request_byte does locking */ /* No lock needed since brcmf_sdioh_request_byte does locking */
int status; int status;
status = brcmf_sdioh_request_byte(sd, SDIOH_WRITE, fnc_num, addr, data); status = brcmf_sdioh_request_byte(sdiodev, SDIOH_WRITE, fnc_num,
addr, data);
return status; return status;
} }
static int brcmf_sdioh_get_cisaddr(struct sdioh_info *sd, u32 regaddr) static int brcmf_sdioh_get_cisaddr(struct brcmf_sdio_dev *sdiodev, u32 regaddr)
{ {
/* read 24 bits and return valid 17 bit addr */ /* read 24 bits and return valid 17 bit addr */
int i; int i;
u32 scratch, regdata; u32 scratch, regdata;
u8 *ptr = (u8 *)&scratch; u8 *ptr = (u8 *)&scratch;
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
if ((brcmf_sdioh_card_regread(sd, 0, regaddr, 1, &regdata)) != if ((brcmf_sdioh_card_regread(sdiodev, 0, regaddr, 1,
SUCCESS) &regdata)) != SUCCESS)
BRCMF_ERROR(("%s: Can't read!\n", __func__)); BRCMF_ERROR(("%s: Can't read!\n", __func__));
*ptr++ = (u8) regdata; *ptr++ = (u8) regdata;
...@@ -430,7 +407,8 @@ static int brcmf_sdioh_get_cisaddr(struct sdioh_info *sd, u32 regaddr) ...@@ -430,7 +407,8 @@ static int brcmf_sdioh_get_cisaddr(struct sdioh_info *sd, u32 regaddr)
} }
extern int extern int
brcmf_sdioh_cis_read(struct sdioh_info *sd, uint func, u8 *cisd, u32 length) brcmf_sdioh_cis_read(struct brcmf_sdio_dev *sdiodev, uint func,
u8 *cisd, u32 length)
{ {
u32 count; u32 count;
int offset; int offset;
...@@ -439,18 +417,18 @@ brcmf_sdioh_cis_read(struct sdioh_info *sd, uint func, u8 *cisd, u32 length) ...@@ -439,18 +417,18 @@ brcmf_sdioh_cis_read(struct sdioh_info *sd, uint func, u8 *cisd, u32 length)
BRCMF_TRACE(("%s: Func = %d\n", __func__, func)); BRCMF_TRACE(("%s: Func = %d\n", __func__, func));
if (!sd->func_cis_ptr[func]) { if (!sdiodev->func_cis_ptr[func]) {
memset(cis, 0, length); memset(cis, 0, length);
BRCMF_ERROR(("%s: no func_cis_ptr[%d]\n", __func__, func)); BRCMF_ERROR(("%s: no func_cis_ptr[%d]\n", __func__, func));
return -ENOTSUPP; return -ENOTSUPP;
} }
BRCMF_ERROR(("%s: func_cis_ptr[%d]=0x%04x\n", __func__, func, BRCMF_ERROR(("%s: func_cis_ptr[%d]=0x%04x\n", __func__, func,
sd->func_cis_ptr[func])); sdiodev->func_cis_ptr[func]));
for (count = 0; count < length; count++) { for (count = 0; count < length; count++) {
offset = sd->func_cis_ptr[func] + count; offset = sdiodev->func_cis_ptr[func] + count;
if (brcmf_sdioh_card_regread(sd, 0, offset, 1, &foo) < 0) { if (brcmf_sdioh_card_regread(sdiodev, 0, offset, 1, &foo) < 0) {
BRCMF_ERROR(("%s: regread failed: Can't read CIS\n", BRCMF_ERROR(("%s: regread failed: Can't read CIS\n",
__func__)); __func__));
return -EIO; return -EIO;
...@@ -464,7 +442,7 @@ brcmf_sdioh_cis_read(struct sdioh_info *sd, uint func, u8 *cisd, u32 length) ...@@ -464,7 +442,7 @@ brcmf_sdioh_cis_read(struct sdioh_info *sd, uint func, u8 *cisd, u32 length)
} }
extern int extern int
brcmf_sdioh_request_byte(struct sdioh_info *sd, uint rw, uint func, brcmf_sdioh_request_byte(struct brcmf_sdio_dev *sdiodev, uint rw, uint func,
uint regaddr, u8 *byte) uint regaddr, u8 *byte)
{ {
int err_ret; int err_ret;
...@@ -566,7 +544,7 @@ brcmf_sdioh_request_byte(struct sdioh_info *sd, uint rw, uint func, ...@@ -566,7 +544,7 @@ brcmf_sdioh_request_byte(struct sdioh_info *sd, uint rw, uint func,
} }
extern int extern int
brcmf_sdioh_request_word(struct sdioh_info *sd, uint cmd_type, uint rw, brcmf_sdioh_request_word(struct brcmf_sdio_dev *sdiodev, uint cmd_type, uint rw,
uint func, uint addr, u32 *word, uint nbytes) uint func, uint addr, u32 *word, uint nbytes)
{ {
int err_ret = -EIO; int err_ret = -EIO;
...@@ -618,8 +596,9 @@ brcmf_sdioh_request_word(struct sdioh_info *sd, uint cmd_type, uint rw, ...@@ -618,8 +596,9 @@ brcmf_sdioh_request_word(struct sdioh_info *sd, uint cmd_type, uint rw,
} }
static int static int
brcmf_sdioh_request_packet(struct sdioh_info *sd, uint fix_inc, uint write, brcmf_sdioh_request_packet(struct brcmf_sdio_dev *sdiodev, uint fix_inc,
uint func, uint addr, struct sk_buff *pkt) uint write, uint func, uint addr,
struct sk_buff *pkt)
{ {
bool fifo = (fix_inc == SDIOH_DATA_FIX); bool fifo = (fix_inc == SDIOH_DATA_FIX);
u32 SGCount = 0; u32 SGCount = 0;
...@@ -698,9 +677,10 @@ brcmf_sdioh_request_packet(struct sdioh_info *sd, uint fix_inc, uint write, ...@@ -698,9 +677,10 @@ brcmf_sdioh_request_packet(struct sdioh_info *sd, uint fix_inc, uint write,
* *
*/ */
extern int extern int
brcmf_sdioh_request_buffer(struct sdioh_info *sd, uint pio_dma, uint fix_inc, brcmf_sdioh_request_buffer(struct brcmf_sdio_dev *sdiodev, uint pio_dma,
uint write, uint func, uint addr, uint reg_width, uint fix_inc, uint write, uint func, uint addr,
uint buflen_u, u8 *buffer, struct sk_buff *pkt) uint reg_width, uint buflen_u, u8 *buffer,
struct sk_buff *pkt)
{ {
int Status; int Status;
struct sk_buff *mypkt = NULL; struct sk_buff *mypkt = NULL;
...@@ -724,8 +704,8 @@ brcmf_sdioh_request_buffer(struct sdioh_info *sd, uint pio_dma, uint fix_inc, ...@@ -724,8 +704,8 @@ brcmf_sdioh_request_buffer(struct sdioh_info *sd, uint pio_dma, uint fix_inc,
if (write) if (write)
memcpy(mypkt->data, buffer, buflen_u); memcpy(mypkt->data, buffer, buflen_u);
Status = brcmf_sdioh_request_packet(sd, fix_inc, write, func, Status = brcmf_sdioh_request_packet(sdiodev, fix_inc, write,
addr, mypkt); func, addr, mypkt);
/* For a read, copy the packet data back to the buffer. */ /* For a read, copy the packet data back to the buffer. */
if (!write) if (!write)
...@@ -750,8 +730,8 @@ brcmf_sdioh_request_buffer(struct sdioh_info *sd, uint pio_dma, uint fix_inc, ...@@ -750,8 +730,8 @@ brcmf_sdioh_request_buffer(struct sdioh_info *sd, uint pio_dma, uint fix_inc,
if (write) if (write)
memcpy(mypkt->data, pkt->data, pkt->len); memcpy(mypkt->data, pkt->data, pkt->len);
Status = brcmf_sdioh_request_packet(sd, fix_inc, write, func, Status = brcmf_sdioh_request_packet(sdiodev, fix_inc, write,
addr, mypkt); func, addr, mypkt);
/* For a read, copy the packet data back to the buffer. */ /* For a read, copy the packet data back to the buffer. */
if (!write) if (!write)
...@@ -762,22 +742,22 @@ brcmf_sdioh_request_buffer(struct sdioh_info *sd, uint pio_dma, uint fix_inc, ...@@ -762,22 +742,22 @@ brcmf_sdioh_request_buffer(struct sdioh_info *sd, uint pio_dma, uint fix_inc,
it is aligned. */ it is aligned. */
BRCMF_DATA(("%s: Aligned %s Packet, direct DMA\n", BRCMF_DATA(("%s: Aligned %s Packet, direct DMA\n",
__func__, write ? "Tx" : "Rx")); __func__, write ? "Tx" : "Rx"));
Status = brcmf_sdioh_request_packet(sd, fix_inc, write, func, Status = brcmf_sdioh_request_packet(sdiodev, fix_inc, write,
addr, pkt); func, addr, pkt);
} }
return Status; return Status;
} }
/* this function performs "abort" for both of host & device */ /* this function performs "abort" for both of host & device */
extern int brcmf_sdioh_abort(struct sdioh_info *sd, uint func) extern int brcmf_sdioh_abort(struct brcmf_sdio_dev *sdiodev, uint func)
{ {
char t_func = (char)func; char t_func = (char)func;
BRCMF_TRACE(("%s: Enter\n", __func__)); BRCMF_TRACE(("%s: Enter\n", __func__));
/* issue abort cmd52 command through F0 */ /* issue abort cmd52 command through F0 */
brcmf_sdioh_request_byte(sd, SDIOH_WRITE, SDIO_FUNC_0, SDIO_CCCR_ABORT, brcmf_sdioh_request_byte(sdiodev, SDIOH_WRITE, SDIO_FUNC_0,
&t_func); SDIO_CCCR_ABORT, &t_func);
BRCMF_TRACE(("%s: Exit\n", __func__)); BRCMF_TRACE(("%s: Exit\n", __func__));
return 0; return 0;
...@@ -785,20 +765,21 @@ extern int brcmf_sdioh_abort(struct sdioh_info *sd, uint func) ...@@ -785,20 +765,21 @@ extern int brcmf_sdioh_abort(struct sdioh_info *sd, uint func)
/* Read client card reg */ /* Read client card reg */
int int
brcmf_sdioh_card_regread(struct sdioh_info *sd, int func, u32 regaddr, brcmf_sdioh_card_regread(struct brcmf_sdio_dev *sdiodev, int func, u32 regaddr,
int regsize, u32 *data) int regsize, u32 *data)
{ {
if ((func == 0) || (regsize == 1)) { if ((func == 0) || (regsize == 1)) {
u8 temp = 0; u8 temp = 0;
brcmf_sdioh_request_byte(sd, SDIOH_READ, func, regaddr, &temp); brcmf_sdioh_request_byte(sdiodev, SDIOH_READ, func, regaddr,
&temp);
*data = temp; *data = temp;
*data &= 0xff; *data &= 0xff;
BRCMF_DATA(("%s: byte read data=0x%02x\n", __func__, *data)); BRCMF_DATA(("%s: byte read data=0x%02x\n", __func__, *data));
} else { } else {
brcmf_sdioh_request_word(sd, 0, SDIOH_READ, func, regaddr, data, brcmf_sdioh_request_word(sdiodev, 0, SDIOH_READ, func, regaddr,
regsize); data, regsize);
if (regsize == 2) if (regsize == 2)
*data &= 0xffff; *data &= 0xffff;
...@@ -810,15 +791,12 @@ brcmf_sdioh_card_regread(struct sdioh_info *sd, int func, u32 regaddr, ...@@ -810,15 +791,12 @@ brcmf_sdioh_card_regread(struct sdioh_info *sd, int func, u32 regaddr,
static void brcmf_sdioh_irqhandler(struct sdio_func *func) static void brcmf_sdioh_irqhandler(struct sdio_func *func)
{ {
struct sdioh_info *sd;
struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(&func->card->dev); struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(&func->card->dev);
BRCMF_TRACE(("brcmf: ***IRQHandler\n")); BRCMF_TRACE(("brcmf: ***IRQHandler\n"));
sd = gInstance->sd;
sdio_release_host(gInstance->func[0]); sdio_release_host(gInstance->func[0]);
sd->intrcount++;
brcmf_sdbrcm_isr(sdiodev->bus); brcmf_sdbrcm_isr(sdiodev->bus);
sdio_claim_host(gInstance->func[0]); sdio_claim_host(gInstance->func[0]);
...@@ -827,11 +805,7 @@ static void brcmf_sdioh_irqhandler(struct sdio_func *func) ...@@ -827,11 +805,7 @@ static void brcmf_sdioh_irqhandler(struct sdio_func *func)
/* interrupt handler for F2 (dummy handler) */ /* interrupt handler for F2 (dummy handler) */
static void brcmf_sdioh_irqhandler_f2(struct sdio_func *func) static void brcmf_sdioh_irqhandler_f2(struct sdio_func *func)
{ {
struct sdioh_info *sd;
BRCMF_TRACE(("brcmf: ***IRQHandlerF2\n")); BRCMF_TRACE(("brcmf: ***IRQHandlerF2\n"));
sd = gInstance->sd;
} }
static int brcmf_ops_sdio_probe(struct sdio_func *func, static int brcmf_ops_sdio_probe(struct sdio_func *func,
......
...@@ -122,23 +122,7 @@ struct brcmf_sdreg { ...@@ -122,23 +122,7 @@ struct brcmf_sdreg {
int value; int value;
}; };
struct sdioh_info {
struct osl_info *osh; /* osh handler */
uint irq; /* Client irq */
int intrcount; /* Client interrupts */
bool sd_blockmode; /* sd_blockmode == false => 64 Byte Cmd 53s. */
/* Must be on for sd_multiblock to be effective */
u8 num_funcs; /* Supported funcs on client */
u32 com_cis_ptr;
u32 func_cis_ptr[SDIOD_MAX_IOFUNCS];
uint max_dma_len;
/* DMA Descriptors supported by this controller. */
uint max_dma_descriptors;
};
struct brcmf_sdmmc_instance { struct brcmf_sdmmc_instance {
struct sdioh_info *sd;
struct sdio_func *func[SDIOD_MAX_IOFUNCS]; struct sdio_func *func[SDIOD_MAX_IOFUNCS];
u32 host_claimed; u32 host_claimed;
atomic_t suspend; /* suspend flag */ atomic_t suspend; /* suspend flag */
...@@ -147,7 +131,8 @@ struct brcmf_sdmmc_instance { ...@@ -147,7 +131,8 @@ struct brcmf_sdmmc_instance {
struct brcmf_sdio_dev { struct brcmf_sdio_dev {
struct sdio_func *func1; struct sdio_func *func1;
struct sdio_func *func2; struct sdio_func *func2;
void *sdioh; /* sdioh handler */ u8 num_funcs; /* Supported funcs on client */
u32 func_cis_ptr[SDIOD_MAX_IOFUNCS];
u32 sbwad; /* Save backplane window address */ u32 sbwad; /* Save backplane window address */
bool regfail; /* status of last reg_r/w call */ bool regfail; /* status of last reg_r/w call */
void *bus; void *bus;
...@@ -250,10 +235,6 @@ extern int brcmf_sdcard_iovar_op(struct brcmf_sdio_dev *sdiodev, ...@@ -250,10 +235,6 @@ extern int brcmf_sdcard_iovar_op(struct brcmf_sdio_dev *sdiodev,
const char *name, void *params, int plen, const char *name, void *params, int plen,
void *arg, int len, bool set); void *arg, int len, bool set);
/* helper functions */
struct sdioh_info;
/* platform specific/high level functions */ /* platform specific/high level functions */
extern int brcmf_sdio_function_init(void); extern int brcmf_sdio_function_init(void);
extern int brcmf_sdio_register(void); extern int brcmf_sdio_register(void);
...@@ -269,47 +250,47 @@ extern u32 brcmf_sdcard_cur_sbwad(struct brcmf_sdio_dev *sdiodev); ...@@ -269,47 +250,47 @@ extern u32 brcmf_sdcard_cur_sbwad(struct brcmf_sdio_dev *sdiodev);
* The handler shall be provided by all subsequent calls. No local cache * The handler shall be provided by all subsequent calls. No local cache
* cfghdl points to the starting address of pci device mapped memory * cfghdl points to the starting address of pci device mapped memory
*/ */
extern struct sdioh_info *brcmf_sdioh_attach(void *cfghdl); extern int brcmf_sdioh_attach(struct brcmf_sdio_dev *sdiodev);
extern int brcmf_sdioh_detach(struct sdioh_info *si); extern void brcmf_sdioh_detach(struct brcmf_sdio_dev *sdiodev);
extern int extern int
brcmf_sdioh_interrupt_register(struct sdioh_info *si); brcmf_sdioh_interrupt_register(void);
extern int brcmf_sdioh_interrupt_deregister(struct sdioh_info *si); extern int brcmf_sdioh_interrupt_deregister(void);
/* read or write one byte using cmd52 */ /* read or write one byte using cmd52 */
extern int extern int brcmf_sdioh_request_byte(struct brcmf_sdio_dev *sdiodev, uint rw,
brcmf_sdioh_request_byte(struct sdioh_info *si, uint rw, uint fnc, uint addr, uint fnc, uint addr, u8 *byte);
u8 *byte);
/* read or write 2/4 bytes using cmd53 */ /* read or write 2/4 bytes using cmd53 */
extern int extern int
brcmf_sdioh_request_word(struct sdioh_info *si, uint cmd_type, brcmf_sdioh_request_word(struct brcmf_sdio_dev *sdiodev, uint cmd_type,
uint rw, uint fnc, uint addr, uint rw, uint fnc, uint addr,
u32 *word, uint nbyte); u32 *word, uint nbyte);
/* read or write any buffer using cmd53 */ /* read or write any buffer using cmd53 */
extern int extern int
brcmf_sdioh_request_buffer(struct sdioh_info *si, uint pio_dma, brcmf_sdioh_request_buffer(struct brcmf_sdio_dev *sdiodev, uint pio_dma,
uint fix_inc, uint rw, uint fnc_num, uint fix_inc, uint rw, uint fnc_num,
u32 addr, uint regwidth, u32 addr, uint regwidth,
u32 buflen, u8 *buffer, struct sk_buff *pkt); u32 buflen, u8 *buffer, struct sk_buff *pkt);
/* get cis data */ /* get cis data */
extern int extern int brcmf_sdioh_cis_read(struct brcmf_sdio_dev *sdiodev, uint fuc,
brcmf_sdioh_cis_read(struct sdioh_info *si, uint fuc, u8 *cis, u32 length); u8 *cis, u32 length);
extern int extern int brcmf_sdioh_cfg_read(struct brcmf_sdio_dev *sdiodev, uint fuc,
brcmf_sdioh_cfg_read(struct sdioh_info *si, uint fuc, u32 addr, u8 *data); u32 addr, u8 *data);
extern int extern int brcmf_sdioh_cfg_write(struct brcmf_sdio_dev *sdiodev, uint fuc,
brcmf_sdioh_cfg_write(struct sdioh_info *si, uint fuc, u32 addr, u8 *data); u32 addr, u8 *data);
/* handle iovars */ /* handle iovars */
extern int brcmf_sdioh_iovar_op(struct sdioh_info *si, const char *name, extern int brcmf_sdioh_iovar_op(struct brcmf_sdio_dev *sdiodev,
void *params, int plen, void *arg, int len, bool set); const char *name, void *params, int plen,
void *arg, int len, bool set);
/* Issue abort to the specified function and clear controller as needed */ /* Issue abort to the specified function and clear controller as needed */
extern int brcmf_sdioh_abort(struct sdioh_info *si, uint fnc); extern int brcmf_sdioh_abort(struct brcmf_sdio_dev *sdiodev, uint fnc);
/* Watchdog timer interface for pm ops */ /* Watchdog timer interface for pm ops */
extern void brcmf_sdio_wdtmr_enable(struct brcmf_sdio_dev *sdiodev, extern void brcmf_sdio_wdtmr_enable(struct brcmf_sdio_dev *sdiodev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment