diff options
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c')
| -rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c | 60 | 
1 files changed, 21 insertions, 39 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c index 3b2c4c20e7f..11fd1c73558 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c @@ -15,8 +15,6 @@   */  /* ****************** SDIO CARD Interface Functions **************************/ -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -  #include <linux/types.h>  #include <linux/netdevice.h>  #include <linux/export.h> @@ -42,7 +40,8 @@  #ifdef CONFIG_BRCMFMAC_SDIO_OOB  static irqreturn_t brcmf_sdio_irqhandler(int irq, void *dev_id)  { -	struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(dev_id); +	struct brcmf_bus *bus_if = dev_get_drvdata(dev_id); +	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;  	brcmf_dbg(INTR, "oob intr triggered\n"); @@ -66,12 +65,11 @@ int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev)  	u8 data;  	unsigned long flags; -	brcmf_dbg(TRACE, "Entering\n"); +	brcmf_dbg(TRACE, "Entering: irq %d\n", sdiodev->irq); -	brcmf_dbg(ERROR, "requesting irq %d\n", sdiodev->irq);  	ret = request_irq(sdiodev->irq, brcmf_sdio_irqhandler,  			  sdiodev->irq_flags, "brcmf_oob_intr", -			  &sdiodev->func[1]->card->dev); +			  &sdiodev->func[1]->dev);  	if (ret != 0)  		return ret;  	spin_lock_init(&sdiodev->irq_en_lock); @@ -84,6 +82,8 @@ int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev)  		return ret;  	sdiodev->irq_wake = true; +	sdio_claim_host(sdiodev->func[1]); +  	/* must configure SDIO_CCCR_IENx to enable irq */  	data = brcmf_sdio_regrb(sdiodev, SDIO_CCCR_IENx, &ret);  	data |= 1 << SDIO_FUNC_1 | 1 << SDIO_FUNC_2 | 1; @@ -95,6 +95,8 @@ int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev)  		data |= SDIO_SEPINT_ACT_HI;  	brcmf_sdio_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, data, &ret); +	sdio_release_host(sdiodev->func[1]); +  	return 0;  } @@ -102,14 +104,16 @@ int brcmf_sdio_intr_unregister(struct brcmf_sdio_dev *sdiodev)  {  	brcmf_dbg(TRACE, "Entering\n"); +	sdio_claim_host(sdiodev->func[1]);  	brcmf_sdio_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL);  	brcmf_sdio_regwb(sdiodev, SDIO_CCCR_IENx, 0, NULL); +	sdio_release_host(sdiodev->func[1]);  	if (sdiodev->irq_wake) {  		disable_irq_wake(sdiodev->irq);  		sdiodev->irq_wake = false;  	} -	free_irq(sdiodev->irq, &sdiodev->func[1]->card->dev); +	free_irq(sdiodev->irq, &sdiodev->func[1]->dev);  	sdiodev->irq_en = false;  	return 0; @@ -117,7 +121,8 @@ int brcmf_sdio_intr_unregister(struct brcmf_sdio_dev *sdiodev)  #else		/* CONFIG_BRCMFMAC_SDIO_OOB */  static void brcmf_sdio_irqhandler(struct sdio_func *func)  { -	struct brcmf_sdio_dev *sdiodev = dev_get_drvdata(&func->card->dev); +	struct brcmf_bus *bus_if = dev_get_drvdata(&func->dev); +	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;  	brcmf_dbg(INTR, "ib intr triggered\n"); @@ -176,7 +181,7 @@ brcmf_sdcard_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address)  		} while (err != 0 && retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);  		if (err) { -			brcmf_dbg(ERROR, "failed at addr:0x%0x\n", +			brcmf_err("failed at addr:0x%0x\n",  				  SBSDIO_FUNC1_SBADDRLOW + i);  			break;  		} @@ -238,7 +243,7 @@ brcmf_sdio_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,  	} while (ret != 0 && retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);  	if (ret != 0) -		brcmf_dbg(ERROR, "failed with %d\n", ret); +		brcmf_err("failed with %d\n", ret);  	return ret;  } @@ -249,9 +254,7 @@ u8 brcmf_sdio_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)  	int retval;  	brcmf_dbg(INFO, "addr:0x%08x\n", addr); -	sdio_claim_host(sdiodev->func[1]);  	retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, false); -	sdio_release_host(sdiodev->func[1]);  	brcmf_dbg(INFO, "data:0x%02x\n", data);  	if (ret) @@ -266,9 +269,7 @@ u32 brcmf_sdio_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)  	int retval;  	brcmf_dbg(INFO, "addr:0x%08x\n", addr); -	sdio_claim_host(sdiodev->func[1]);  	retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, false); -	sdio_release_host(sdiodev->func[1]);  	brcmf_dbg(INFO, "data:0x%08x\n", data);  	if (ret) @@ -283,9 +284,7 @@ void brcmf_sdio_regwb(struct brcmf_sdio_dev *sdiodev, u32 addr,  	int retval;  	brcmf_dbg(INFO, "addr:0x%08x, data:0x%02x\n", addr, data); -	sdio_claim_host(sdiodev->func[1]);  	retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, true); -	sdio_release_host(sdiodev->func[1]);  	if (ret)  		*ret = retval; @@ -297,9 +296,7 @@ void brcmf_sdio_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr,  	int retval;  	brcmf_dbg(INFO, "addr:0x%08x, data:0x%08x\n", addr, data); -	sdio_claim_host(sdiodev->func[1]);  	retval = brcmf_sdio_regrw_helper(sdiodev, addr, &data, true); -	sdio_release_host(sdiodev->func[1]);  	if (ret)  		*ret = retval; @@ -340,7 +337,7 @@ brcmf_sdcard_recv_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,  	mypkt = brcmu_pkt_buf_get_skb(nbytes);  	if (!mypkt) { -		brcmf_dbg(ERROR, "brcmu_pkt_buf_get_skb failed: len %d\n", +		brcmf_err("brcmu_pkt_buf_get_skb failed: len %d\n",  			  nbytes);  		return -EIO;  	} @@ -364,8 +361,6 @@ brcmf_sdcard_recv_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,  	brcmf_dbg(INFO, "fun = %d, addr = 0x%x, size = %d\n",  		  fn, addr, pkt->len); -	sdio_claim_host(sdiodev->func[1]); -  	width = (flags & SDIO_REQ_4BYTE) ? 4 : 2;  	err = brcmf_sdcard_recv_prepare(sdiodev, fn, flags, width, &addr);  	if (err) @@ -376,8 +371,6 @@ brcmf_sdcard_recv_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,  					 fn, addr, pkt);  done: -	sdio_release_host(sdiodev->func[1]); -  	return err;  } @@ -391,8 +384,6 @@ int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,  	brcmf_dbg(INFO, "fun = %d, addr = 0x%x, size = %d\n",  		  fn, addr, pktq->qlen); -	sdio_claim_host(sdiodev->func[1]); -  	width = (flags & SDIO_REQ_4BYTE) ? 4 : 2;  	err = brcmf_sdcard_recv_prepare(sdiodev, fn, flags, width, &addr);  	if (err) @@ -403,8 +394,6 @@ int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,  					pktq);  done: -	sdio_release_host(sdiodev->func[1]); -  	return err;  } @@ -417,7 +406,7 @@ brcmf_sdcard_send_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,  	mypkt = brcmu_pkt_buf_get_skb(nbytes);  	if (!mypkt) { -		brcmf_dbg(ERROR, "brcmu_pkt_buf_get_skb failed: len %d\n", +		brcmf_err("brcmu_pkt_buf_get_skb failed: len %d\n",  			  nbytes);  		return -EIO;  	} @@ -446,8 +435,6 @@ brcmf_sdcard_send_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,  	if (flags & SDIO_REQ_ASYNC)  		return -ENOTSUPP; -	sdio_claim_host(sdiodev->func[1]); -  	if (bar0 != sdiodev->sbwad) {  		err = brcmf_sdcard_set_sbaddr_window(sdiodev, bar0);  		if (err) @@ -467,8 +454,6 @@ brcmf_sdcard_send_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,  					 addr, pkt);  done: -	sdio_release_host(sdiodev->func[1]); -  	return err;  } @@ -484,7 +469,7 @@ int brcmf_sdcard_rwdata(struct brcmf_sdio_dev *sdiodev, uint rw, u32 addr,  	mypkt = brcmu_pkt_buf_get_skb(nbytes);  	if (!mypkt) { -		brcmf_dbg(ERROR, "brcmu_pkt_buf_get_skb failed: len %d\n", +		brcmf_err("brcmu_pkt_buf_get_skb failed: len %d\n",  			  nbytes);  		return -EIO;  	} @@ -510,10 +495,8 @@ int brcmf_sdcard_abort(struct brcmf_sdio_dev *sdiodev, uint fn)  	brcmf_dbg(TRACE, "Enter\n");  	/* issue abort cmd52 command through F0 */ -	sdio_claim_host(sdiodev->func[1]);  	brcmf_sdioh_request_byte(sdiodev, SDIOH_WRITE, SDIO_FUNC_0,  				 SDIO_CCCR_ABORT, &t_func); -	sdio_release_host(sdiodev->func[1]);  	brcmf_dbg(TRACE, "Exit\n");  	return 0; @@ -530,13 +513,10 @@ int brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)  	regs = SI_ENUM_BASE; -	/* Report the BAR, to fix if needed */ -	sdiodev->sbwad = SI_ENUM_BASE; -  	/* try to attach to the target device */  	sdiodev->bus = brcmf_sdbrcm_probe(regs, sdiodev);  	if (!sdiodev->bus) { -		brcmf_dbg(ERROR, "device attach failed\n"); +		brcmf_err("device attach failed\n");  		ret = -ENODEV;  		goto out;  	} @@ -551,6 +531,8 @@ EXPORT_SYMBOL(brcmf_sdio_probe);  int brcmf_sdio_remove(struct brcmf_sdio_dev *sdiodev)  { +	sdiodev->bus_if->state = BRCMF_BUS_DOWN; +  	if (sdiodev->bus) {  		brcmf_sdbrcm_disconnect(sdiodev->bus);  		sdiodev->bus = NULL;  |