Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: ISC
0002 /*
0003  * Copyright (c) 2010 Broadcom Corporation
0004  */
0005 /* ****************** SDIO CARD Interface Functions **************************/
0006 
0007 #include <linux/types.h>
0008 #include <linux/netdevice.h>
0009 #include <linux/pci.h>
0010 #include <linux/pci_ids.h>
0011 #include <linux/sched.h>
0012 #include <linux/completion.h>
0013 #include <linux/interrupt.h>
0014 #include <linux/scatterlist.h>
0015 #include <linux/mmc/sdio.h>
0016 #include <linux/mmc/core.h>
0017 #include <linux/mmc/sdio_func.h>
0018 #include <linux/mmc/card.h>
0019 #include <linux/mmc/host.h>
0020 #include <linux/pm_runtime.h>
0021 #include <linux/suspend.h>
0022 #include <linux/errno.h>
0023 #include <linux/module.h>
0024 #include <linux/acpi.h>
0025 #include <net/cfg80211.h>
0026 
0027 #include <defs.h>
0028 #include <brcm_hw_ids.h>
0029 #include <brcmu_utils.h>
0030 #include <brcmu_wifi.h>
0031 #include <chipcommon.h>
0032 #include <soc.h>
0033 #include "chip.h"
0034 #include "bus.h"
0035 #include "debug.h"
0036 #include "sdio.h"
0037 #include "core.h"
0038 #include "common.h"
0039 
0040 #define SDIOH_API_ACCESS_RETRY_LIMIT    2
0041 
0042 #define DMA_ALIGN_MASK  0x03
0043 
0044 #define SDIO_FUNC1_BLOCKSIZE        64
0045 #define SDIO_FUNC2_BLOCKSIZE        512
0046 #define SDIO_4373_FUNC2_BLOCKSIZE   256
0047 #define SDIO_435X_FUNC2_BLOCKSIZE   256
0048 #define SDIO_4329_FUNC2_BLOCKSIZE   128
0049 /* Maximum milliseconds to wait for F2 to come up */
0050 #define SDIO_WAIT_F2RDY 3000
0051 
0052 #define BRCMF_DEFAULT_RXGLOM_SIZE   32  /* max rx frames in glom chain */
0053 
0054 struct brcmf_sdiod_freezer {
0055     atomic_t freezing;
0056     atomic_t thread_count;
0057     u32 frozen_count;
0058     wait_queue_head_t thread_freeze;
0059     struct completion resumed;
0060 };
0061 
0062 static irqreturn_t brcmf_sdiod_oob_irqhandler(int irq, void *dev_id)
0063 {
0064     struct brcmf_bus *bus_if = dev_get_drvdata(dev_id);
0065     struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
0066 
0067     brcmf_dbg(INTR, "OOB intr triggered\n");
0068 
0069     /* out-of-band interrupt is level-triggered which won't
0070      * be cleared until dpc
0071      */
0072     if (sdiodev->irq_en) {
0073         disable_irq_nosync(irq);
0074         sdiodev->irq_en = false;
0075     }
0076 
0077     brcmf_sdio_isr(sdiodev->bus, true);
0078 
0079     return IRQ_HANDLED;
0080 }
0081 
0082 static void brcmf_sdiod_ib_irqhandler(struct sdio_func *func)
0083 {
0084     struct brcmf_bus *bus_if = dev_get_drvdata(&func->dev);
0085     struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
0086 
0087     brcmf_dbg(INTR, "IB intr triggered\n");
0088 
0089     brcmf_sdio_isr(sdiodev->bus, false);
0090 }
0091 
0092 /* dummy handler for SDIO function 2 interrupt */
0093 static void brcmf_sdiod_dummy_irqhandler(struct sdio_func *func)
0094 {
0095 }
0096 
0097 int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev)
0098 {
0099     struct brcmfmac_sdio_pd *pdata;
0100     int ret = 0;
0101     u8 data;
0102     u32 addr, gpiocontrol;
0103 
0104     pdata = &sdiodev->settings->bus.sdio;
0105     if (pdata->oob_irq_supported) {
0106         brcmf_dbg(SDIO, "Enter, register OOB IRQ %d\n",
0107               pdata->oob_irq_nr);
0108         spin_lock_init(&sdiodev->irq_en_lock);
0109         sdiodev->irq_en = true;
0110 
0111         ret = request_irq(pdata->oob_irq_nr, brcmf_sdiod_oob_irqhandler,
0112                   pdata->oob_irq_flags, "brcmf_oob_intr",
0113                   &sdiodev->func1->dev);
0114         if (ret != 0) {
0115             brcmf_err("request_irq failed %d\n", ret);
0116             return ret;
0117         }
0118         sdiodev->oob_irq_requested = true;
0119 
0120         ret = enable_irq_wake(pdata->oob_irq_nr);
0121         if (ret != 0) {
0122             brcmf_err("enable_irq_wake failed %d\n", ret);
0123             return ret;
0124         }
0125         disable_irq_wake(pdata->oob_irq_nr);
0126 
0127         sdio_claim_host(sdiodev->func1);
0128 
0129         if (sdiodev->bus_if->chip == BRCM_CC_43362_CHIP_ID) {
0130             /* assign GPIO to SDIO core */
0131             addr = brcmf_chip_enum_base(sdiodev->func1->device);
0132             addr = CORE_CC_REG(addr, gpiocontrol);
0133             gpiocontrol = brcmf_sdiod_readl(sdiodev, addr, &ret);
0134             gpiocontrol |= 0x2;
0135             brcmf_sdiod_writel(sdiodev, addr, gpiocontrol, &ret);
0136 
0137             brcmf_sdiod_writeb(sdiodev, SBSDIO_GPIO_SELECT,
0138                        0xf, &ret);
0139             brcmf_sdiod_writeb(sdiodev, SBSDIO_GPIO_OUT, 0, &ret);
0140             brcmf_sdiod_writeb(sdiodev, SBSDIO_GPIO_EN, 0x2, &ret);
0141         }
0142 
0143         /* must configure SDIO_CCCR_IENx to enable irq */
0144         data = brcmf_sdiod_func0_rb(sdiodev, SDIO_CCCR_IENx, &ret);
0145         data |= SDIO_CCCR_IEN_FUNC1 | SDIO_CCCR_IEN_FUNC2 |
0146             SDIO_CCCR_IEN_FUNC0;
0147         brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_IENx, data, &ret);
0148 
0149         /* redirect, configure and enable io for interrupt signal */
0150         data = SDIO_CCCR_BRCM_SEPINT_MASK | SDIO_CCCR_BRCM_SEPINT_OE;
0151         if (pdata->oob_irq_flags & IRQF_TRIGGER_HIGH)
0152             data |= SDIO_CCCR_BRCM_SEPINT_ACT_HI;
0153         brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_SEPINT,
0154                      data, &ret);
0155         sdio_release_host(sdiodev->func1);
0156     } else {
0157         brcmf_dbg(SDIO, "Entering\n");
0158         sdio_claim_host(sdiodev->func1);
0159         sdio_claim_irq(sdiodev->func1, brcmf_sdiod_ib_irqhandler);
0160         sdio_claim_irq(sdiodev->func2, brcmf_sdiod_dummy_irqhandler);
0161         sdio_release_host(sdiodev->func1);
0162         sdiodev->sd_irq_requested = true;
0163     }
0164 
0165     return 0;
0166 }
0167 
0168 void brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev)
0169 {
0170 
0171     brcmf_dbg(SDIO, "Entering oob=%d sd=%d\n",
0172           sdiodev->oob_irq_requested,
0173           sdiodev->sd_irq_requested);
0174 
0175     if (sdiodev->oob_irq_requested) {
0176         struct brcmfmac_sdio_pd *pdata;
0177 
0178         pdata = &sdiodev->settings->bus.sdio;
0179         sdio_claim_host(sdiodev->func1);
0180         brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL);
0181         brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_IENx, 0, NULL);
0182         sdio_release_host(sdiodev->func1);
0183 
0184         sdiodev->oob_irq_requested = false;
0185         free_irq(pdata->oob_irq_nr, &sdiodev->func1->dev);
0186         sdiodev->irq_en = false;
0187         sdiodev->oob_irq_requested = false;
0188     }
0189 
0190     if (sdiodev->sd_irq_requested) {
0191         sdio_claim_host(sdiodev->func1);
0192         sdio_release_irq(sdiodev->func2);
0193         sdio_release_irq(sdiodev->func1);
0194         sdio_release_host(sdiodev->func1);
0195         sdiodev->sd_irq_requested = false;
0196     }
0197 }
0198 
0199 void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
0200                   enum brcmf_sdiod_state state)
0201 {
0202     if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM ||
0203         state == sdiodev->state)
0204         return;
0205 
0206     brcmf_dbg(TRACE, "%d -> %d\n", sdiodev->state, state);
0207     switch (sdiodev->state) {
0208     case BRCMF_SDIOD_DATA:
0209         /* any other state means bus interface is down */
0210         brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN);
0211         break;
0212     case BRCMF_SDIOD_DOWN:
0213         /* transition from DOWN to DATA means bus interface is up */
0214         if (state == BRCMF_SDIOD_DATA)
0215             brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_UP);
0216         break;
0217     default:
0218         break;
0219     }
0220     sdiodev->state = state;
0221 }
0222 
0223 static int brcmf_sdiod_set_backplane_window(struct brcmf_sdio_dev *sdiodev,
0224                         u32 addr)
0225 {
0226     u32 v, bar0 = addr & SBSDIO_SBWINDOW_MASK;
0227     int err = 0, i;
0228 
0229     if (bar0 == sdiodev->sbwad)
0230         return 0;
0231 
0232     v = bar0 >> 8;
0233 
0234     for (i = 0 ; i < 3 && !err ; i++, v >>= 8)
0235         brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i,
0236                    v & 0xff, &err);
0237 
0238     if (!err)
0239         sdiodev->sbwad = bar0;
0240 
0241     return err;
0242 }
0243 
0244 u32 brcmf_sdiod_readl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
0245 {
0246     u32 data = 0;
0247     int retval;
0248 
0249     retval = brcmf_sdiod_set_backplane_window(sdiodev, addr);
0250     if (retval)
0251         goto out;
0252 
0253     addr &= SBSDIO_SB_OFT_ADDR_MASK;
0254     addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
0255 
0256     data = sdio_readl(sdiodev->func1, addr, &retval);
0257 
0258 out:
0259     if (ret)
0260         *ret = retval;
0261 
0262     return data;
0263 }
0264 
0265 void brcmf_sdiod_writel(struct brcmf_sdio_dev *sdiodev, u32 addr,
0266             u32 data, int *ret)
0267 {
0268     int retval;
0269 
0270     retval = brcmf_sdiod_set_backplane_window(sdiodev, addr);
0271     if (retval)
0272         goto out;
0273 
0274     addr &= SBSDIO_SB_OFT_ADDR_MASK;
0275     addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
0276 
0277     sdio_writel(sdiodev->func1, data, addr, &retval);
0278 
0279 out:
0280     if (ret)
0281         *ret = retval;
0282 }
0283 
0284 static int brcmf_sdiod_skbuff_read(struct brcmf_sdio_dev *sdiodev,
0285                    struct sdio_func *func, u32 addr,
0286                    struct sk_buff *skb)
0287 {
0288     unsigned int req_sz;
0289     int err;
0290 
0291     /* Single skb use the standard mmc interface */
0292     req_sz = skb->len + 3;
0293     req_sz &= (uint)~3;
0294 
0295     switch (func->num) {
0296     case 1:
0297         err = sdio_memcpy_fromio(func, ((u8 *)(skb->data)), addr,
0298                      req_sz);
0299         break;
0300     case 2:
0301         err = sdio_readsb(func, ((u8 *)(skb->data)), addr, req_sz);
0302         break;
0303     default:
0304         /* bail out as things are really fishy here */
0305         WARN(1, "invalid sdio function number: %d\n", func->num);
0306         err = -ENOMEDIUM;
0307     }
0308 
0309     if (err == -ENOMEDIUM)
0310         brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
0311 
0312     return err;
0313 }
0314 
0315 static int brcmf_sdiod_skbuff_write(struct brcmf_sdio_dev *sdiodev,
0316                     struct sdio_func *func, u32 addr,
0317                     struct sk_buff *skb)
0318 {
0319     unsigned int req_sz;
0320     int err;
0321 
0322     /* Single skb use the standard mmc interface */
0323     req_sz = skb->len + 3;
0324     req_sz &= (uint)~3;
0325 
0326     err = sdio_memcpy_toio(func, addr, ((u8 *)(skb->data)), req_sz);
0327 
0328     if (err == -ENOMEDIUM)
0329         brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
0330 
0331     return err;
0332 }
0333 
0334 static int mmc_submit_one(struct mmc_data *md, struct mmc_request *mr,
0335               struct mmc_command *mc, int sg_cnt, int req_sz,
0336               int func_blk_sz, u32 *addr,
0337               struct brcmf_sdio_dev *sdiodev,
0338               struct sdio_func *func, int write)
0339 {
0340     int ret;
0341 
0342     md->sg_len = sg_cnt;
0343     md->blocks = req_sz / func_blk_sz;
0344     mc->arg |= (*addr & 0x1FFFF) << 9;  /* address */
0345     mc->arg |= md->blocks & 0x1FF;  /* block count */
0346     /* incrementing addr for function 1 */
0347     if (func->num == 1)
0348         *addr += req_sz;
0349 
0350     mmc_set_data_timeout(md, func->card);
0351     mmc_wait_for_req(func->card->host, mr);
0352 
0353     ret = mc->error ? mc->error : md->error;
0354     if (ret == -ENOMEDIUM) {
0355         brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
0356     } else if (ret != 0) {
0357         brcmf_err("CMD53 sg block %s failed %d\n",
0358               write ? "write" : "read", ret);
0359         ret = -EIO;
0360     }
0361 
0362     return ret;
0363 }
0364 
0365 /**
0366  * brcmf_sdiod_sglist_rw - SDIO interface function for block data access
0367  * @sdiodev: brcmfmac sdio device
0368  * @func: SDIO function
0369  * @write: direction flag
0370  * @addr: dongle memory address as source/destination
0371  * @pktlist: skb buffer head pointer
0372  *
0373  * This function takes the respbonsibility as the interface function to MMC
0374  * stack for block data access. It assumes that the skb passed down by the
0375  * caller has already been padded and aligned.
0376  */
0377 static int brcmf_sdiod_sglist_rw(struct brcmf_sdio_dev *sdiodev,
0378                  struct sdio_func *func,
0379                  bool write, u32 addr,
0380                  struct sk_buff_head *pktlist)
0381 {
0382     unsigned int req_sz, func_blk_sz, sg_cnt, sg_data_sz, pkt_offset;
0383     unsigned int max_req_sz, src_offset, dst_offset;
0384     unsigned char *pkt_data, *orig_data, *dst_data;
0385     struct sk_buff_head local_list, *target_list;
0386     struct sk_buff *pkt_next = NULL, *src;
0387     unsigned short max_seg_cnt;
0388     struct mmc_request mmc_req;
0389     struct mmc_command mmc_cmd;
0390     struct mmc_data mmc_dat;
0391     struct scatterlist *sgl;
0392     int ret = 0;
0393 
0394     if (!pktlist->qlen)
0395         return -EINVAL;
0396 
0397     target_list = pktlist;
0398     /* for host with broken sg support, prepare a page aligned list */
0399     __skb_queue_head_init(&local_list);
0400     if (!write && sdiodev->settings->bus.sdio.broken_sg_support) {
0401         req_sz = 0;
0402         skb_queue_walk(pktlist, pkt_next)
0403             req_sz += pkt_next->len;
0404         req_sz = ALIGN(req_sz, func->cur_blksize);
0405         while (req_sz > PAGE_SIZE) {
0406             pkt_next = brcmu_pkt_buf_get_skb(PAGE_SIZE);
0407             if (pkt_next == NULL) {
0408                 ret = -ENOMEM;
0409                 goto exit;
0410             }
0411             __skb_queue_tail(&local_list, pkt_next);
0412             req_sz -= PAGE_SIZE;
0413         }
0414         pkt_next = brcmu_pkt_buf_get_skb(req_sz);
0415         if (pkt_next == NULL) {
0416             ret = -ENOMEM;
0417             goto exit;
0418         }
0419         __skb_queue_tail(&local_list, pkt_next);
0420         target_list = &local_list;
0421     }
0422 
0423     func_blk_sz = func->cur_blksize;
0424     max_req_sz = sdiodev->max_request_size;
0425     max_seg_cnt = min_t(unsigned short, sdiodev->max_segment_count,
0426                 target_list->qlen);
0427 
0428     memset(&mmc_req, 0, sizeof(struct mmc_request));
0429     memset(&mmc_cmd, 0, sizeof(struct mmc_command));
0430     memset(&mmc_dat, 0, sizeof(struct mmc_data));
0431 
0432     mmc_dat.sg = sdiodev->sgtable.sgl;
0433     mmc_dat.blksz = func_blk_sz;
0434     mmc_dat.flags = write ? MMC_DATA_WRITE : MMC_DATA_READ;
0435     mmc_cmd.opcode = SD_IO_RW_EXTENDED;
0436     mmc_cmd.arg = write ? 1<<31 : 0;    /* write flag  */
0437     mmc_cmd.arg |= (func->num & 0x7) << 28; /* SDIO func num */
0438     mmc_cmd.arg |= 1 << 27;         /* block mode */
0439     /* for function 1 the addr will be incremented */
0440     mmc_cmd.arg |= (func->num == 1) ? 1 << 26 : 0;
0441     mmc_cmd.flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_ADTC;
0442     mmc_req.cmd = &mmc_cmd;
0443     mmc_req.data = &mmc_dat;
0444 
0445     req_sz = 0;
0446     sg_cnt = 0;
0447     sgl = sdiodev->sgtable.sgl;
0448     skb_queue_walk(target_list, pkt_next) {
0449         pkt_offset = 0;
0450         while (pkt_offset < pkt_next->len) {
0451             pkt_data = pkt_next->data + pkt_offset;
0452             sg_data_sz = pkt_next->len - pkt_offset;
0453             if (sg_data_sz > sdiodev->max_segment_size)
0454                 sg_data_sz = sdiodev->max_segment_size;
0455             if (sg_data_sz > max_req_sz - req_sz)
0456                 sg_data_sz = max_req_sz - req_sz;
0457 
0458             sg_set_buf(sgl, pkt_data, sg_data_sz);
0459             sg_cnt++;
0460 
0461             sgl = sg_next(sgl);
0462             req_sz += sg_data_sz;
0463             pkt_offset += sg_data_sz;
0464             if (req_sz >= max_req_sz || sg_cnt >= max_seg_cnt) {
0465                 ret = mmc_submit_one(&mmc_dat, &mmc_req, &mmc_cmd,
0466                              sg_cnt, req_sz, func_blk_sz,
0467                              &addr, sdiodev, func, write);
0468                 if (ret)
0469                     goto exit_queue_walk;
0470                 req_sz = 0;
0471                 sg_cnt = 0;
0472                 sgl = sdiodev->sgtable.sgl;
0473             }
0474         }
0475     }
0476     if (sg_cnt)
0477         ret = mmc_submit_one(&mmc_dat, &mmc_req, &mmc_cmd,
0478                      sg_cnt, req_sz, func_blk_sz,
0479                      &addr, sdiodev, func, write);
0480 exit_queue_walk:
0481     if (!write && sdiodev->settings->bus.sdio.broken_sg_support) {
0482         src = __skb_peek(&local_list);
0483         src_offset = 0;
0484         skb_queue_walk(pktlist, pkt_next) {
0485             dst_offset = 0;
0486 
0487             /* This is safe because we must have enough SKB data
0488              * in the local list to cover everything in pktlist.
0489              */
0490             while (1) {
0491                 req_sz = pkt_next->len - dst_offset;
0492                 if (req_sz > src->len - src_offset)
0493                     req_sz = src->len - src_offset;
0494 
0495                 orig_data = src->data + src_offset;
0496                 dst_data = pkt_next->data + dst_offset;
0497                 memcpy(dst_data, orig_data, req_sz);
0498 
0499                 src_offset += req_sz;
0500                 if (src_offset == src->len) {
0501                     src_offset = 0;
0502                     src = skb_peek_next(src, &local_list);
0503                 }
0504                 dst_offset += req_sz;
0505                 if (dst_offset == pkt_next->len)
0506                     break;
0507             }
0508         }
0509     }
0510 
0511 exit:
0512     sg_init_table(sdiodev->sgtable.sgl, sdiodev->sgtable.orig_nents);
0513     while ((pkt_next = __skb_dequeue(&local_list)) != NULL)
0514         brcmu_pkt_buf_free_skb(pkt_next);
0515 
0516     return ret;
0517 }
0518 
0519 int brcmf_sdiod_recv_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes)
0520 {
0521     struct sk_buff *mypkt;
0522     int err;
0523 
0524     mypkt = brcmu_pkt_buf_get_skb(nbytes);
0525     if (!mypkt) {
0526         brcmf_err("brcmu_pkt_buf_get_skb failed: len %d\n",
0527               nbytes);
0528         return -EIO;
0529     }
0530 
0531     err = brcmf_sdiod_recv_pkt(sdiodev, mypkt);
0532     if (!err)
0533         memcpy(buf, mypkt->data, nbytes);
0534 
0535     brcmu_pkt_buf_free_skb(mypkt);
0536     return err;
0537 }
0538 
0539 int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt)
0540 {
0541     u32 addr = sdiodev->cc_core->base;
0542     int err = 0;
0543 
0544     brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len);
0545 
0546     err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
0547     if (err)
0548         goto done;
0549 
0550     addr &= SBSDIO_SB_OFT_ADDR_MASK;
0551     addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
0552 
0553     err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func2, addr, pkt);
0554 
0555 done:
0556     return err;
0557 }
0558 
0559 int brcmf_sdiod_recv_chain(struct brcmf_sdio_dev *sdiodev,
0560                struct sk_buff_head *pktq, uint totlen)
0561 {
0562     struct sk_buff *glom_skb = NULL;
0563     struct sk_buff *skb;
0564     u32 addr = sdiodev->cc_core->base;
0565     int err = 0;
0566 
0567     brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n",
0568           addr, pktq->qlen);
0569 
0570     err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
0571     if (err)
0572         goto done;
0573 
0574     addr &= SBSDIO_SB_OFT_ADDR_MASK;
0575     addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
0576 
0577     if (pktq->qlen == 1)
0578         err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func2, addr,
0579                           __skb_peek(pktq));
0580     else if (!sdiodev->sg_support) {
0581         glom_skb = brcmu_pkt_buf_get_skb(totlen);
0582         if (!glom_skb)
0583             return -ENOMEM;
0584         err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func2, addr,
0585                           glom_skb);
0586         if (err)
0587             goto done;
0588 
0589         skb_queue_walk(pktq, skb) {
0590             memcpy(skb->data, glom_skb->data, skb->len);
0591             skb_pull(glom_skb, skb->len);
0592         }
0593     } else
0594         err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func2, false,
0595                         addr, pktq);
0596 
0597 done:
0598     brcmu_pkt_buf_free_skb(glom_skb);
0599     return err;
0600 }
0601 
0602 int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes)
0603 {
0604     struct sk_buff *mypkt;
0605     u32 addr = sdiodev->cc_core->base;
0606     int err;
0607 
0608     mypkt = brcmu_pkt_buf_get_skb(nbytes);
0609 
0610     if (!mypkt) {
0611         brcmf_err("brcmu_pkt_buf_get_skb failed: len %d\n",
0612               nbytes);
0613         return -EIO;
0614     }
0615 
0616     memcpy(mypkt->data, buf, nbytes);
0617 
0618     err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
0619     if (err)
0620         goto out;
0621 
0622     addr &= SBSDIO_SB_OFT_ADDR_MASK;
0623     addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
0624 
0625     err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func2, addr, mypkt);
0626 out:
0627     brcmu_pkt_buf_free_skb(mypkt);
0628 
0629     return err;
0630 }
0631 
0632 int brcmf_sdiod_send_pkt(struct brcmf_sdio_dev *sdiodev,
0633              struct sk_buff_head *pktq)
0634 {
0635     struct sk_buff *skb;
0636     u32 addr = sdiodev->cc_core->base;
0637     int err;
0638 
0639     brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pktq->qlen);
0640 
0641     err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
0642     if (err)
0643         return err;
0644 
0645     addr &= SBSDIO_SB_OFT_ADDR_MASK;
0646     addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
0647 
0648     if (pktq->qlen == 1 || !sdiodev->sg_support) {
0649         skb_queue_walk(pktq, skb) {
0650             err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func2,
0651                                addr, skb);
0652             if (err)
0653                 break;
0654         }
0655     } else {
0656         err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func2, true,
0657                         addr, pktq);
0658     }
0659 
0660     return err;
0661 }
0662 
0663 int
0664 brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
0665           u8 *data, uint size)
0666 {
0667     int err = 0;
0668     struct sk_buff *pkt;
0669     u32 sdaddr;
0670     uint dsize;
0671 
0672     dsize = min_t(uint, SBSDIO_SB_OFT_ADDR_LIMIT, size);
0673     pkt = dev_alloc_skb(dsize);
0674     if (!pkt) {
0675         brcmf_err("dev_alloc_skb failed: len %d\n", dsize);
0676         return -EIO;
0677     }
0678     pkt->priority = 0;
0679 
0680     /* Determine initial transfer parameters */
0681     sdaddr = address & SBSDIO_SB_OFT_ADDR_MASK;
0682     if ((sdaddr + size) & SBSDIO_SBWINDOW_MASK)
0683         dsize = (SBSDIO_SB_OFT_ADDR_LIMIT - sdaddr);
0684     else
0685         dsize = size;
0686 
0687     sdio_claim_host(sdiodev->func1);
0688 
0689     /* Do the transfer(s) */
0690     while (size) {
0691         /* Set the backplane window to include the start address */
0692         err = brcmf_sdiod_set_backplane_window(sdiodev, address);
0693         if (err)
0694             break;
0695 
0696         brcmf_dbg(SDIO, "%s %d bytes at offset 0x%08x in window 0x%08x\n",
0697               write ? "write" : "read", dsize,
0698               sdaddr, address & SBSDIO_SBWINDOW_MASK);
0699 
0700         sdaddr &= SBSDIO_SB_OFT_ADDR_MASK;
0701         sdaddr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
0702 
0703         skb_put(pkt, dsize);
0704 
0705         if (write) {
0706             memcpy(pkt->data, data, dsize);
0707             err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func1,
0708                                sdaddr, pkt);
0709         } else {
0710             err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func1,
0711                               sdaddr, pkt);
0712         }
0713 
0714         if (err) {
0715             brcmf_err("membytes transfer failed\n");
0716             break;
0717         }
0718         if (!write)
0719             memcpy(data, pkt->data, dsize);
0720         skb_trim(pkt, 0);
0721 
0722         /* Adjust for next transfer (if any) */
0723         size -= dsize;
0724         if (size) {
0725             data += dsize;
0726             address += dsize;
0727             sdaddr = 0;
0728             dsize = min_t(uint, SBSDIO_SB_OFT_ADDR_LIMIT, size);
0729         }
0730     }
0731 
0732     dev_kfree_skb(pkt);
0733 
0734     sdio_release_host(sdiodev->func1);
0735 
0736     return err;
0737 }
0738 
0739 int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, struct sdio_func *func)
0740 {
0741     brcmf_dbg(SDIO, "Enter\n");
0742 
0743     /* Issue abort cmd52 command through F0 */
0744     brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_ABORT, func->num, NULL);
0745 
0746     brcmf_dbg(SDIO, "Exit\n");
0747     return 0;
0748 }
0749 
0750 void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev)
0751 {
0752     struct sdio_func *func;
0753     struct mmc_host *host;
0754     uint max_blocks;
0755     uint nents;
0756     int err;
0757 
0758     func = sdiodev->func2;
0759     host = func->card->host;
0760     sdiodev->sg_support = host->max_segs > 1;
0761     max_blocks = min_t(uint, host->max_blk_count, 511u);
0762     sdiodev->max_request_size = min_t(uint, host->max_req_size,
0763                       max_blocks * func->cur_blksize);
0764     sdiodev->max_segment_count = min_t(uint, host->max_segs,
0765                        SG_MAX_SINGLE_ALLOC);
0766     sdiodev->max_segment_size = host->max_seg_size;
0767 
0768     if (!sdiodev->sg_support)
0769         return;
0770 
0771     nents = max_t(uint, BRCMF_DEFAULT_RXGLOM_SIZE,
0772               sdiodev->settings->bus.sdio.txglomsz);
0773     nents += (nents >> 4) + 1;
0774 
0775     WARN_ON(nents > sdiodev->max_segment_count);
0776 
0777     brcmf_dbg(TRACE, "nents=%d\n", nents);
0778     err = sg_alloc_table(&sdiodev->sgtable, nents, GFP_KERNEL);
0779     if (err < 0) {
0780         brcmf_err("allocation failed: disable scatter-gather");
0781         sdiodev->sg_support = false;
0782     }
0783 
0784     sdiodev->txglomsz = sdiodev->settings->bus.sdio.txglomsz;
0785 }
0786 
0787 static int brcmf_sdiod_freezer_attach(struct brcmf_sdio_dev *sdiodev)
0788 {
0789     if (!IS_ENABLED(CONFIG_PM_SLEEP))
0790         return 0;
0791 
0792     sdiodev->freezer = kzalloc(sizeof(*sdiodev->freezer), GFP_KERNEL);
0793     if (!sdiodev->freezer)
0794         return -ENOMEM;
0795     atomic_set(&sdiodev->freezer->thread_count, 0);
0796     atomic_set(&sdiodev->freezer->freezing, 0);
0797     init_waitqueue_head(&sdiodev->freezer->thread_freeze);
0798     init_completion(&sdiodev->freezer->resumed);
0799     return 0;
0800 }
0801 
0802 static void brcmf_sdiod_freezer_detach(struct brcmf_sdio_dev *sdiodev)
0803 {
0804     if (sdiodev->freezer) {
0805         WARN_ON(atomic_read(&sdiodev->freezer->freezing));
0806         kfree(sdiodev->freezer);
0807         sdiodev->freezer = NULL;
0808     }
0809 }
0810 
0811 static int brcmf_sdiod_freezer_on(struct brcmf_sdio_dev *sdiodev)
0812 {
0813     atomic_t *expect = &sdiodev->freezer->thread_count;
0814     int res = 0;
0815 
0816     sdiodev->freezer->frozen_count = 0;
0817     reinit_completion(&sdiodev->freezer->resumed);
0818     atomic_set(&sdiodev->freezer->freezing, 1);
0819     brcmf_sdio_trigger_dpc(sdiodev->bus);
0820     wait_event(sdiodev->freezer->thread_freeze,
0821            atomic_read(expect) == sdiodev->freezer->frozen_count);
0822     sdio_claim_host(sdiodev->func1);
0823     res = brcmf_sdio_sleep(sdiodev->bus, true);
0824     sdio_release_host(sdiodev->func1);
0825     return res;
0826 }
0827 
0828 static void brcmf_sdiod_freezer_off(struct brcmf_sdio_dev *sdiodev)
0829 {
0830     sdio_claim_host(sdiodev->func1);
0831     brcmf_sdio_sleep(sdiodev->bus, false);
0832     sdio_release_host(sdiodev->func1);
0833     atomic_set(&sdiodev->freezer->freezing, 0);
0834     complete_all(&sdiodev->freezer->resumed);
0835 }
0836 
0837 bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev)
0838 {
0839     return IS_ENABLED(CONFIG_PM_SLEEP) &&
0840         atomic_read(&sdiodev->freezer->freezing);
0841 }
0842 
0843 void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev)
0844 {
0845     if (!brcmf_sdiod_freezing(sdiodev))
0846         return;
0847     sdiodev->freezer->frozen_count++;
0848     wake_up(&sdiodev->freezer->thread_freeze);
0849     wait_for_completion(&sdiodev->freezer->resumed);
0850 }
0851 
0852 void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev)
0853 {
0854     if (IS_ENABLED(CONFIG_PM_SLEEP))
0855         atomic_inc(&sdiodev->freezer->thread_count);
0856 }
0857 
0858 void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev)
0859 {
0860     if (IS_ENABLED(CONFIG_PM_SLEEP))
0861         atomic_dec(&sdiodev->freezer->thread_count);
0862 }
0863 
0864 int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
0865 {
0866     sdiodev->state = BRCMF_SDIOD_DOWN;
0867     if (sdiodev->bus) {
0868         brcmf_sdio_remove(sdiodev->bus);
0869         sdiodev->bus = NULL;
0870     }
0871 
0872     brcmf_sdiod_freezer_detach(sdiodev);
0873 
0874     /* Disable functions 2 then 1. */
0875     sdio_claim_host(sdiodev->func1);
0876     sdio_disable_func(sdiodev->func2);
0877     sdio_disable_func(sdiodev->func1);
0878     sdio_release_host(sdiodev->func1);
0879 
0880     sg_free_table(&sdiodev->sgtable);
0881     sdiodev->sbwad = 0;
0882 
0883     pm_runtime_allow(sdiodev->func1->card->host->parent);
0884     return 0;
0885 }
0886 
0887 static void brcmf_sdiod_host_fixup(struct mmc_host *host)
0888 {
0889     /* runtime-pm powers off the device */
0890     pm_runtime_forbid(host->parent);
0891     /* avoid removal detection upon resume */
0892     host->caps |= MMC_CAP_NONREMOVABLE;
0893 }
0894 
0895 int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
0896 {
0897     int ret = 0;
0898     unsigned int f2_blksz = SDIO_FUNC2_BLOCKSIZE;
0899 
0900     sdio_claim_host(sdiodev->func1);
0901 
0902     ret = sdio_set_block_size(sdiodev->func1, SDIO_FUNC1_BLOCKSIZE);
0903     if (ret) {
0904         brcmf_err("Failed to set F1 blocksize\n");
0905         sdio_release_host(sdiodev->func1);
0906         return ret;
0907     }
0908     switch (sdiodev->func2->device) {
0909     case SDIO_DEVICE_ID_BROADCOM_CYPRESS_4373:
0910         f2_blksz = SDIO_4373_FUNC2_BLOCKSIZE;
0911         break;
0912     case SDIO_DEVICE_ID_BROADCOM_4359:
0913     case SDIO_DEVICE_ID_BROADCOM_4354:
0914     case SDIO_DEVICE_ID_BROADCOM_4356:
0915         f2_blksz = SDIO_435X_FUNC2_BLOCKSIZE;
0916         break;
0917     case SDIO_DEVICE_ID_BROADCOM_4329:
0918         f2_blksz = SDIO_4329_FUNC2_BLOCKSIZE;
0919         break;
0920     default:
0921         break;
0922     }
0923 
0924     ret = sdio_set_block_size(sdiodev->func2, f2_blksz);
0925     if (ret) {
0926         brcmf_err("Failed to set F2 blocksize\n");
0927         sdio_release_host(sdiodev->func1);
0928         return ret;
0929     } else {
0930         brcmf_dbg(SDIO, "set F2 blocksize to %d\n", f2_blksz);
0931     }
0932 
0933     /* increase F2 timeout */
0934     sdiodev->func2->enable_timeout = SDIO_WAIT_F2RDY;
0935 
0936     /* Enable Function 1 */
0937     ret = sdio_enable_func(sdiodev->func1);
0938     sdio_release_host(sdiodev->func1);
0939     if (ret) {
0940         brcmf_err("Failed to enable F1: err=%d\n", ret);
0941         goto out;
0942     }
0943 
0944     ret = brcmf_sdiod_freezer_attach(sdiodev);
0945     if (ret)
0946         goto out;
0947 
0948     /* try to attach to the target device */
0949     sdiodev->bus = brcmf_sdio_probe(sdiodev);
0950     if (!sdiodev->bus) {
0951         ret = -ENODEV;
0952         goto out;
0953     }
0954     brcmf_sdiod_host_fixup(sdiodev->func2->card->host);
0955 out:
0956     if (ret)
0957         brcmf_sdiod_remove(sdiodev);
0958 
0959     return ret;
0960 }
0961 
0962 #define BRCMF_SDIO_DEVICE(dev_id)   \
0963     {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, dev_id)}
0964 
0965 /* devices we support, null terminated */
0966 static const struct sdio_device_id brcmf_sdmmc_ids[] = {
0967     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43143),
0968     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43241),
0969     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4329),
0970     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4330),
0971     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4334),
0972     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43340),
0973     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341),
0974     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362),
0975     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43364),
0976     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339),
0977     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339),
0978     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430),
0979     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4345),
0980     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43455),
0981     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
0982     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4356),
0983     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4359),
0984     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_4373),
0985     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43012),
0986     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_43752),
0987     BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_CYPRESS_89359),
0988     { /* end: all zeroes */ }
0989 };
0990 MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
0991 
0992 
0993 static void brcmf_sdiod_acpi_set_power_manageable(struct device *dev,
0994                           int val)
0995 {
0996 #if IS_ENABLED(CONFIG_ACPI)
0997     struct acpi_device *adev;
0998 
0999     adev = ACPI_COMPANION(dev);
1000     if (adev)
1001         adev->flags.power_manageable = 0;
1002 #endif
1003 }
1004 
1005 static int brcmf_ops_sdio_probe(struct sdio_func *func,
1006                 const struct sdio_device_id *id)
1007 {
1008     int err;
1009     struct brcmf_sdio_dev *sdiodev;
1010     struct brcmf_bus *bus_if;
1011     struct device *dev;
1012 
1013     brcmf_dbg(SDIO, "Enter\n");
1014     brcmf_dbg(SDIO, "Class=%x\n", func->class);
1015     brcmf_dbg(SDIO, "sdio vendor ID: 0x%04x\n", func->vendor);
1016     brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device);
1017     brcmf_dbg(SDIO, "Function#: %d\n", func->num);
1018 
1019     dev = &func->dev;
1020 
1021     /* Set MMC_QUIRK_LENIENT_FN0 for this card */
1022     func->card->quirks |= MMC_QUIRK_LENIENT_FN0;
1023 
1024     /* prohibit ACPI power management for this device */
1025     brcmf_sdiod_acpi_set_power_manageable(dev, 0);
1026 
1027     /* Consume func num 1 but dont do anything with it. */
1028     if (func->num == 1)
1029         return 0;
1030 
1031     /* Ignore anything but func 2 */
1032     if (func->num != 2)
1033         return -ENODEV;
1034 
1035     bus_if = kzalloc(sizeof(struct brcmf_bus), GFP_KERNEL);
1036     if (!bus_if)
1037         return -ENOMEM;
1038     sdiodev = kzalloc(sizeof(struct brcmf_sdio_dev), GFP_KERNEL);
1039     if (!sdiodev) {
1040         kfree(bus_if);
1041         return -ENOMEM;
1042     }
1043 
1044     /* store refs to functions used. mmc_card does
1045      * not hold the F0 function pointer.
1046      */
1047     sdiodev->func1 = func->card->sdio_func[0];
1048     sdiodev->func2 = func;
1049 
1050     sdiodev->bus_if = bus_if;
1051     bus_if->bus_priv.sdio = sdiodev;
1052     bus_if->proto_type = BRCMF_PROTO_BCDC;
1053     dev_set_drvdata(&func->dev, bus_if);
1054     dev_set_drvdata(&sdiodev->func1->dev, bus_if);
1055     sdiodev->dev = &sdiodev->func1->dev;
1056 
1057     brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN);
1058 
1059     brcmf_dbg(SDIO, "F2 found, calling brcmf_sdiod_probe...\n");
1060     err = brcmf_sdiod_probe(sdiodev);
1061     if (err) {
1062         brcmf_err("F2 error, probe failed %d...\n", err);
1063         goto fail;
1064     }
1065 
1066     brcmf_dbg(SDIO, "F2 init completed...\n");
1067     return 0;
1068 
1069 fail:
1070     dev_set_drvdata(&func->dev, NULL);
1071     dev_set_drvdata(&sdiodev->func1->dev, NULL);
1072     kfree(sdiodev);
1073     kfree(bus_if);
1074     return err;
1075 }
1076 
1077 static void brcmf_ops_sdio_remove(struct sdio_func *func)
1078 {
1079     struct brcmf_bus *bus_if;
1080     struct brcmf_sdio_dev *sdiodev;
1081 
1082     brcmf_dbg(SDIO, "Enter\n");
1083     brcmf_dbg(SDIO, "sdio vendor ID: 0x%04x\n", func->vendor);
1084     brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device);
1085     brcmf_dbg(SDIO, "Function: %d\n", func->num);
1086 
1087     bus_if = dev_get_drvdata(&func->dev);
1088     if (bus_if) {
1089         sdiodev = bus_if->bus_priv.sdio;
1090 
1091         /* start by unregistering irqs */
1092         brcmf_sdiod_intr_unregister(sdiodev);
1093 
1094         if (func->num != 1)
1095             return;
1096 
1097         /* only proceed with rest of cleanup if func 1 */
1098         brcmf_sdiod_remove(sdiodev);
1099 
1100         dev_set_drvdata(&sdiodev->func1->dev, NULL);
1101         dev_set_drvdata(&sdiodev->func2->dev, NULL);
1102 
1103         kfree(bus_if);
1104         kfree(sdiodev);
1105     }
1106 
1107     brcmf_dbg(SDIO, "Exit\n");
1108 }
1109 
1110 void brcmf_sdio_wowl_config(struct device *dev, bool enabled)
1111 {
1112     struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1113     struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
1114     mmc_pm_flag_t pm_caps = sdio_get_host_pm_caps(sdiodev->func1);
1115 
1116     /* Power must be preserved to be able to support WOWL. */
1117     if (!(pm_caps & MMC_PM_KEEP_POWER))
1118         goto notsup;
1119 
1120     if (sdiodev->settings->bus.sdio.oob_irq_supported ||
1121         pm_caps & MMC_PM_WAKE_SDIO_IRQ) {
1122         sdiodev->wowl_enabled = enabled;
1123         brcmf_dbg(SDIO, "Configuring WOWL, enabled=%d\n", enabled);
1124         return;
1125     }
1126 
1127 notsup:
1128     brcmf_dbg(SDIO, "WOWL not supported\n");
1129 }
1130 
1131 static int brcmf_ops_sdio_suspend(struct device *dev)
1132 {
1133     struct sdio_func *func;
1134     struct brcmf_bus *bus_if;
1135     struct brcmf_sdio_dev *sdiodev;
1136     mmc_pm_flag_t sdio_flags;
1137     int ret = 0;
1138 
1139     func = container_of(dev, struct sdio_func, dev);
1140     brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
1141     if (func->num != 1)
1142         return 0;
1143 
1144 
1145     bus_if = dev_get_drvdata(dev);
1146     sdiodev = bus_if->bus_priv.sdio;
1147 
1148     if (sdiodev->wowl_enabled) {
1149         brcmf_sdiod_freezer_on(sdiodev);
1150         brcmf_sdio_wd_timer(sdiodev->bus, 0);
1151 
1152         sdio_flags = MMC_PM_KEEP_POWER;
1153         if (sdiodev->settings->bus.sdio.oob_irq_supported)
1154             enable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr);
1155         else
1156             sdio_flags |= MMC_PM_WAKE_SDIO_IRQ;
1157 
1158         if (sdio_set_host_pm_flags(sdiodev->func1, sdio_flags))
1159             brcmf_err("Failed to set pm_flags %x\n", sdio_flags);
1160 
1161     } else {
1162         /* power will be cut so remove device, probe again in resume */
1163         brcmf_sdiod_intr_unregister(sdiodev);
1164         ret = brcmf_sdiod_remove(sdiodev);
1165         if (ret)
1166             brcmf_err("Failed to remove device on suspend\n");
1167     }
1168 
1169     return ret;
1170 }
1171 
1172 static int brcmf_ops_sdio_resume(struct device *dev)
1173 {
1174     struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1175     struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
1176     struct sdio_func *func = container_of(dev, struct sdio_func, dev);
1177     int ret = 0;
1178 
1179     brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
1180     if (func->num != 2)
1181         return 0;
1182 
1183     if (!sdiodev->wowl_enabled) {
1184         /* bus was powered off and device removed, probe again */
1185         ret = brcmf_sdiod_probe(sdiodev);
1186         if (ret)
1187             brcmf_err("Failed to probe device on resume\n");
1188     } else {
1189         if (sdiodev->settings->bus.sdio.oob_irq_supported)
1190             disable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr);
1191 
1192         brcmf_sdiod_freezer_off(sdiodev);
1193     }
1194 
1195     return ret;
1196 }
1197 
1198 static DEFINE_SIMPLE_DEV_PM_OPS(brcmf_sdio_pm_ops,
1199                 brcmf_ops_sdio_suspend,
1200                 brcmf_ops_sdio_resume);
1201 
1202 static struct sdio_driver brcmf_sdmmc_driver = {
1203     .probe = brcmf_ops_sdio_probe,
1204     .remove = brcmf_ops_sdio_remove,
1205     .name = KBUILD_MODNAME,
1206     .id_table = brcmf_sdmmc_ids,
1207     .drv = {
1208         .owner = THIS_MODULE,
1209         .pm = pm_sleep_ptr(&brcmf_sdio_pm_ops),
1210         .coredump = brcmf_dev_coredump,
1211     },
1212 };
1213 
1214 int brcmf_sdio_register(void)
1215 {
1216     return sdio_register_driver(&brcmf_sdmmc_driver);
1217 }
1218 
1219 void brcmf_sdio_exit(void)
1220 {
1221     brcmf_dbg(SDIO, "Enter\n");
1222 
1223     sdio_unregister_driver(&brcmf_sdmmc_driver);
1224 }
1225