mt76: update to the latest version
[oweals/openwrt.git] / package / kernel / mac80211 / patches / 316-v4.16-0001-brcmfmac-Remove-array-of-functions.patch
1 From c9aa7a91de740c537dc8c2f9f3d36fc651371b13 Mon Sep 17 00:00:00 2001
2 From: Arend Van Spriel <arend.vanspriel@broadcom.com>
3 Date: Tue, 9 Jan 2018 13:22:52 +0100
4 Subject: [PATCH] brcmfmac: Remove array of functions
5
6 Replace the array of functions with a pair of pointers to the
7 relevant functions.
8
9 Signed-off-by: Ian Molton <ian@mnementh.co.uk>
10 Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
11 Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
12 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
13 ---
14  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 115 +++++++-------
15  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 168 ++++++++++-----------
16  .../wireless/broadcom/brcm80211/brcmfmac/sdio.h    |  15 +-
17  3 files changed, 146 insertions(+), 152 deletions(-)
18
19 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
20 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
21 @@ -118,7 +118,7 @@ int brcmf_sdiod_intr_register(struct brc
22  
23                 ret = request_irq(pdata->oob_irq_nr, brcmf_sdiod_oob_irqhandler,
24                                   pdata->oob_irq_flags, "brcmf_oob_intr",
25 -                                 &sdiodev->func[1]->dev);
26 +                                 &sdiodev->func1->dev);
27                 if (ret != 0) {
28                         brcmf_err("request_irq failed %d\n", ret);
29                         return ret;
30 @@ -132,7 +132,7 @@ int brcmf_sdiod_intr_register(struct brc
31                 }
32                 sdiodev->irq_wake = true;
33  
34 -               sdio_claim_host(sdiodev->func[1]);
35 +               sdio_claim_host(sdiodev->func1);
36  
37                 if (sdiodev->bus_if->chip == BRCM_CC_43362_CHIP_ID) {
38                         /* assign GPIO to SDIO core */
39 @@ -159,13 +159,13 @@ int brcmf_sdiod_intr_register(struct brc
40                         data |= SDIO_CCCR_BRCM_SEPINT_ACT_HI;
41                 brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_SEPINT,
42                                      data, &ret);
43 -               sdio_release_host(sdiodev->func[1]);
44 +               sdio_release_host(sdiodev->func1);
45         } else {
46                 brcmf_dbg(SDIO, "Entering\n");
47 -               sdio_claim_host(sdiodev->func[1]);
48 -               sdio_claim_irq(sdiodev->func[1], brcmf_sdiod_ib_irqhandler);
49 -               sdio_claim_irq(sdiodev->func[2], brcmf_sdiod_dummy_irqhandler);
50 -               sdio_release_host(sdiodev->func[1]);
51 +               sdio_claim_host(sdiodev->func1);
52 +               sdio_claim_irq(sdiodev->func1, brcmf_sdiod_ib_irqhandler);
53 +               sdio_claim_irq(sdiodev->func2, brcmf_sdiod_dummy_irqhandler);
54 +               sdio_release_host(sdiodev->func1);
55                 sdiodev->sd_irq_requested = true;
56         }
57  
58 @@ -183,26 +183,26 @@ void brcmf_sdiod_intr_unregister(struct
59                 struct brcmfmac_sdio_pd *pdata;
60  
61                 pdata = &sdiodev->settings->bus.sdio;
62 -               sdio_claim_host(sdiodev->func[1]);
63 +               sdio_claim_host(sdiodev->func1);
64                 brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL);
65                 brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_IENx, 0, NULL);
66 -               sdio_release_host(sdiodev->func[1]);
67 +               sdio_release_host(sdiodev->func1);
68  
69                 sdiodev->oob_irq_requested = false;
70                 if (sdiodev->irq_wake) {
71                         disable_irq_wake(pdata->oob_irq_nr);
72                         sdiodev->irq_wake = false;
73                 }
74 -               free_irq(pdata->oob_irq_nr, &sdiodev->func[1]->dev);
75 +               free_irq(pdata->oob_irq_nr, &sdiodev->func1->dev);
76                 sdiodev->irq_en = false;
77                 sdiodev->oob_irq_requested = false;
78         }
79  
80         if (sdiodev->sd_irq_requested) {
81 -               sdio_claim_host(sdiodev->func[1]);
82 -               sdio_release_irq(sdiodev->func[2]);
83 -               sdio_release_irq(sdiodev->func[1]);
84 -               sdio_release_host(sdiodev->func[1]);
85 +               sdio_claim_host(sdiodev->func1);
86 +               sdio_release_irq(sdiodev->func2);
87 +               sdio_release_irq(sdiodev->func1);
88 +               sdio_release_host(sdiodev->func1);
89                 sdiodev->sd_irq_requested = false;
90         }
91  }
92 @@ -264,7 +264,7 @@ u32 brcmf_sdiod_readl(struct brcmf_sdio_
93         addr &= SBSDIO_SB_OFT_ADDR_MASK;
94         addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
95  
96 -       data = sdio_readl(sdiodev->func[1], addr, &retval);
97 +       data = sdio_readl(sdiodev->func1, addr, &retval);
98  
99  out:
100         if (ret)
101 @@ -285,7 +285,7 @@ void brcmf_sdiod_writel(struct brcmf_sdi
102         addr &= SBSDIO_SB_OFT_ADDR_MASK;
103         addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
104  
105 -       sdio_writel(sdiodev->func[1], data, addr, &retval);
106 +       sdio_writel(sdiodev->func1, data, addr, &retval);
107  
108  out:
109         if (ret)
110 @@ -550,7 +550,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sd
111         addr &= SBSDIO_SB_OFT_ADDR_MASK;
112         addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
113  
114 -       err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[2], addr, pkt);
115 +       err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func2, addr, pkt);
116  
117  done:
118         return err;
119 @@ -575,13 +575,13 @@ int brcmf_sdiod_recv_chain(struct brcmf_
120         addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
121  
122         if (pktq->qlen == 1)
123 -               err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[2], addr,
124 +               err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func2, addr,
125                                             pktq->next);
126         else if (!sdiodev->sg_support) {
127                 glom_skb = brcmu_pkt_buf_get_skb(totlen);
128                 if (!glom_skb)
129                         return -ENOMEM;
130 -               err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[2], addr,
131 +               err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func2, addr,
132                                             glom_skb);
133                 if (err)
134                         goto done;
135 @@ -591,7 +591,7 @@ int brcmf_sdiod_recv_chain(struct brcmf_
136                         skb_pull(glom_skb, skb->len);
137                 }
138         } else
139 -               err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func[2], false,
140 +               err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func2, false,
141                                             addr, pktq);
142  
143  done:
144 @@ -623,7 +623,7 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
145         addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
146  
147         if (!err)
148 -               err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func[2], addr,
149 +               err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func2, addr,
150                                              mypkt);
151  
152         brcmu_pkt_buf_free_skb(mypkt);
153 @@ -649,13 +649,13 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
154  
155         if (pktq->qlen == 1 || !sdiodev->sg_support) {
156                 skb_queue_walk(pktq, skb) {
157 -                       err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func[2],
158 +                       err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func2,
159                                                      addr, skb);
160                         if (err)
161                                 break;
162                 }
163         } else {
164 -               err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func[2], true,
165 +               err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func2, true,
166                                             addr, pktq);
167         }
168  
169 @@ -686,7 +686,7 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
170         else
171                 dsize = size;
172  
173 -       sdio_claim_host(sdiodev->func[1]);
174 +       sdio_claim_host(sdiodev->func1);
175  
176         /* Do the transfer(s) */
177         while (size) {
178 @@ -706,10 +706,10 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
179  
180                 if (write) {
181                         memcpy(pkt->data, data, dsize);
182 -                       err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func[1],
183 +                       err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func1,
184                                                      sdaddr, pkt);
185                 } else {
186 -                       err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[1],
187 +                       err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func1,
188                                                     sdaddr, pkt);
189                 }
190  
191 @@ -733,7 +733,7 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
192  
193         dev_kfree_skb(pkt);
194  
195 -       sdio_release_host(sdiodev->func[1]);
196 +       sdio_release_host(sdiodev->func1);
197  
198         return err;
199  }
200 @@ -757,7 +757,7 @@ void brcmf_sdiod_sgtable_alloc(struct br
201         uint nents;
202         int err;
203  
204 -       func = sdiodev->func[2];
205 +       func = sdiodev->func2;
206         host = func->card->host;
207         sdiodev->sg_support = host->max_segs > 1;
208         max_blocks = min_t(uint, host->max_blk_count, 511u);
209 @@ -818,17 +818,17 @@ static int brcmf_sdiod_freezer_on(struct
210         brcmf_sdio_trigger_dpc(sdiodev->bus);
211         wait_event(sdiodev->freezer->thread_freeze,
212                    atomic_read(expect) == sdiodev->freezer->frozen_count);
213 -       sdio_claim_host(sdiodev->func[1]);
214 +       sdio_claim_host(sdiodev->func1);
215         res = brcmf_sdio_sleep(sdiodev->bus, true);
216 -       sdio_release_host(sdiodev->func[1]);
217 +       sdio_release_host(sdiodev->func1);
218         return res;
219  }
220  
221  static void brcmf_sdiod_freezer_off(struct brcmf_sdio_dev *sdiodev)
222  {
223 -       sdio_claim_host(sdiodev->func[1]);
224 +       sdio_claim_host(sdiodev->func1);
225         brcmf_sdio_sleep(sdiodev->bus, false);
226 -       sdio_release_host(sdiodev->func[1]);
227 +       sdio_release_host(sdiodev->func1);
228         atomic_set(&sdiodev->freezer->freezing, 0);
229         complete_all(&sdiodev->freezer->resumed);
230  }
231 @@ -878,19 +878,19 @@ static int brcmf_sdiod_remove(struct brc
232         brcmf_sdiod_freezer_detach(sdiodev);
233  
234         /* Disable Function 2 */
235 -       sdio_claim_host(sdiodev->func[2]);
236 -       sdio_disable_func(sdiodev->func[2]);
237 -       sdio_release_host(sdiodev->func[2]);
238 +       sdio_claim_host(sdiodev->func2);
239 +       sdio_disable_func(sdiodev->func2);
240 +       sdio_release_host(sdiodev->func2);
241  
242         /* Disable Function 1 */
243 -       sdio_claim_host(sdiodev->func[1]);
244 -       sdio_disable_func(sdiodev->func[1]);
245 -       sdio_release_host(sdiodev->func[1]);
246 +       sdio_claim_host(sdiodev->func1);
247 +       sdio_disable_func(sdiodev->func1);
248 +       sdio_release_host(sdiodev->func1);
249  
250         sg_free_table(&sdiodev->sgtable);
251         sdiodev->sbwad = 0;
252  
253 -       pm_runtime_allow(sdiodev->func[1]->card->host->parent);
254 +       pm_runtime_allow(sdiodev->func1->card->host->parent);
255         return 0;
256  }
257  
258 @@ -906,29 +906,27 @@ static int brcmf_sdiod_probe(struct brcm
259  {
260         int ret = 0;
261  
262 -       sdiodev->num_funcs = 2;
263 +       sdio_claim_host(sdiodev->func1);
264  
265 -       sdio_claim_host(sdiodev->func[1]);
266 -
267 -       ret = sdio_set_block_size(sdiodev->func[1], SDIO_FUNC1_BLOCKSIZE);
268 +       ret = sdio_set_block_size(sdiodev->func1, SDIO_FUNC1_BLOCKSIZE);
269         if (ret) {
270                 brcmf_err("Failed to set F1 blocksize\n");
271 -               sdio_release_host(sdiodev->func[1]);
272 +               sdio_release_host(sdiodev->func1);
273                 goto out;
274         }
275 -       ret = sdio_set_block_size(sdiodev->func[2], SDIO_FUNC2_BLOCKSIZE);
276 +       ret = sdio_set_block_size(sdiodev->func2, SDIO_FUNC2_BLOCKSIZE);
277         if (ret) {
278                 brcmf_err("Failed to set F2 blocksize\n");
279 -               sdio_release_host(sdiodev->func[1]);
280 +               sdio_release_host(sdiodev->func1);
281                 goto out;
282         }
283  
284         /* increase F2 timeout */
285 -       sdiodev->func[2]->enable_timeout = SDIO_WAIT_F2RDY;
286 +       sdiodev->func2->enable_timeout = SDIO_WAIT_F2RDY;
287  
288         /* Enable Function 1 */
289 -       ret = sdio_enable_func(sdiodev->func[1]);
290 -       sdio_release_host(sdiodev->func[1]);
291 +       ret = sdio_enable_func(sdiodev->func1);
292 +       sdio_release_host(sdiodev->func1);
293         if (ret) {
294                 brcmf_err("Failed to enable F1: err=%d\n", ret);
295                 goto out;
296 @@ -944,7 +942,7 @@ static int brcmf_sdiod_probe(struct brcm
297                 ret = -ENODEV;
298                 goto out;
299         }
300 -       brcmf_sdiod_host_fixup(sdiodev->func[2]->card->host);
301 +       brcmf_sdiod_host_fixup(sdiodev->func2->card->host);
302  out:
303         if (ret)
304                 brcmf_sdiod_remove(sdiodev);
305 @@ -1032,16 +1030,15 @@ static int brcmf_ops_sdio_probe(struct s
306         /* store refs to functions used. mmc_card does
307          * not hold the F0 function pointer.
308          */
309 -       sdiodev->func[0] = NULL;
310 -       sdiodev->func[1] = func->card->sdio_func[0];
311 -       sdiodev->func[2] = func;
312 +       sdiodev->func1 = func->card->sdio_func[0];
313 +       sdiodev->func2 = func;
314  
315         sdiodev->bus_if = bus_if;
316         bus_if->bus_priv.sdio = sdiodev;
317         bus_if->proto_type = BRCMF_PROTO_BCDC;
318         dev_set_drvdata(&func->dev, bus_if);
319 -       dev_set_drvdata(&sdiodev->func[1]->dev, bus_if);
320 -       sdiodev->dev = &sdiodev->func[1]->dev;
321 +       dev_set_drvdata(&sdiodev->func1->dev, bus_if);
322 +       sdiodev->dev = &sdiodev->func1->dev;
323  
324         brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN);
325  
326 @@ -1057,7 +1054,7 @@ static int brcmf_ops_sdio_probe(struct s
327  
328  fail:
329         dev_set_drvdata(&func->dev, NULL);
330 -       dev_set_drvdata(&sdiodev->func[1]->dev, NULL);
331 +       dev_set_drvdata(&sdiodev->func1->dev, NULL);
332         kfree(sdiodev);
333         kfree(bus_if);
334         return err;
335 @@ -1086,8 +1083,8 @@ static void brcmf_ops_sdio_remove(struct
336                 /* only proceed with rest of cleanup if func 1 */
337                 brcmf_sdiod_remove(sdiodev);
338  
339 -               dev_set_drvdata(&sdiodev->func[1]->dev, NULL);
340 -               dev_set_drvdata(&sdiodev->func[2]->dev, NULL);
341 +               dev_set_drvdata(&sdiodev->func1->dev, NULL);
342 +               dev_set_drvdata(&sdiodev->func2->dev, NULL);
343  
344                 kfree(bus_if);
345                 kfree(sdiodev);
346 @@ -1132,7 +1129,7 @@ static int brcmf_ops_sdio_suspend(struct
347                 else
348                         sdio_flags |= MMC_PM_WAKE_SDIO_IRQ;
349         }
350 -       if (sdio_set_host_pm_flags(sdiodev->func[1], sdio_flags))
351 +       if (sdio_set_host_pm_flags(sdiodev->func1, sdio_flags))
352                 brcmf_err("Failed to set pm_flags %x\n", sdio_flags);
353         return 0;
354  }
355 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
356 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
357 @@ -979,7 +979,7 @@ static int brcmf_sdio_readshared(struct
358         struct sdpcm_shared_le sh_le;
359         __le32 addr_le;
360  
361 -       sdio_claim_host(bus->sdiodev->func[1]);
362 +       sdio_claim_host(bus->sdiodev->func1);
363         brcmf_sdio_bus_sleep(bus, false, false);
364  
365         /*
366 @@ -1013,7 +1013,7 @@ static int brcmf_sdio_readshared(struct
367         if (rv < 0)
368                 goto fail;
369  
370 -       sdio_release_host(bus->sdiodev->func[1]);
371 +       sdio_release_host(bus->sdiodev->func1);
372  
373         /* Endianness */
374         sh->flags = le32_to_cpu(sh_le.flags);
375 @@ -1035,7 +1035,7 @@ static int brcmf_sdio_readshared(struct
376  fail:
377         brcmf_err("unable to obtain sdpcm_shared info: rv=%d (addr=0x%x)\n",
378                   rv, addr);
379 -       sdio_release_host(bus->sdiodev->func[1]);
380 +       sdio_release_host(bus->sdiodev->func1);
381         return rv;
382  }
383  
384 @@ -1157,7 +1157,7 @@ static void brcmf_sdio_rxfail(struct brc
385                   rtx ? ", send NAK" : "");
386  
387         if (abort)
388 -               brcmf_sdiod_abort(bus->sdiodev, bus->sdiodev->func[2]);
389 +               brcmf_sdiod_abort(bus->sdiodev, bus->sdiodev->func2);
390  
391         brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, SFC_RF_TERM,
392                            &err);
393 @@ -1209,7 +1209,7 @@ static void brcmf_sdio_txfail(struct brc
394         brcmf_err("sdio error, abort command and terminate frame\n");
395         bus->sdcnt.tx_sderrs++;
396  
397 -       brcmf_sdiod_abort(sdiodev, sdiodev->func[2]);
398 +       brcmf_sdiod_abort(sdiodev, sdiodev->func2);
399         brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_FRAMECTRL, SFC_WF_TERM, NULL);
400         bus->sdcnt.f1regdata++;
401  
402 @@ -1565,10 +1565,10 @@ static u8 brcmf_sdio_rxglom(struct brcmf
403                  * read directly into the chained packet, or allocate a large
404                  * packet and and copy into the chain.
405                  */
406 -               sdio_claim_host(bus->sdiodev->func[1]);
407 +               sdio_claim_host(bus->sdiodev->func1);
408                 errcode = brcmf_sdiod_recv_chain(bus->sdiodev,
409                                                  &bus->glom, dlen);
410 -               sdio_release_host(bus->sdiodev->func[1]);
411 +               sdio_release_host(bus->sdiodev->func1);
412                 bus->sdcnt.f2rxdata++;
413  
414                 /* On failure, kill the superframe */
415 @@ -1576,11 +1576,11 @@ static u8 brcmf_sdio_rxglom(struct brcmf
416                         brcmf_err("glom read of %d bytes failed: %d\n",
417                                   dlen, errcode);
418  
419 -                       sdio_claim_host(bus->sdiodev->func[1]);
420 +                       sdio_claim_host(bus->sdiodev->func1);
421                         brcmf_sdio_rxfail(bus, true, false);
422                         bus->sdcnt.rxglomfail++;
423                         brcmf_sdio_free_glom(bus);
424 -                       sdio_release_host(bus->sdiodev->func[1]);
425 +                       sdio_release_host(bus->sdiodev->func1);
426                         return 0;
427                 }
428  
429 @@ -1590,10 +1590,10 @@ static u8 brcmf_sdio_rxglom(struct brcmf
430  
431                 rd_new.seq_num = rxseq;
432                 rd_new.len = dlen;
433 -               sdio_claim_host(bus->sdiodev->func[1]);
434 +               sdio_claim_host(bus->sdiodev->func1);
435                 errcode = brcmf_sdio_hdparse(bus, pfirst->data, &rd_new,
436                                              BRCMF_SDIO_FT_SUPER);
437 -               sdio_release_host(bus->sdiodev->func[1]);
438 +               sdio_release_host(bus->sdiodev->func1);
439                 bus->cur_read.len = rd_new.len_nxtfrm << 4;
440  
441                 /* Remove superframe header, remember offset */
442 @@ -1609,10 +1609,10 @@ static u8 brcmf_sdio_rxglom(struct brcmf
443  
444                         rd_new.len = pnext->len;
445                         rd_new.seq_num = rxseq++;
446 -                       sdio_claim_host(bus->sdiodev->func[1]);
447 +                       sdio_claim_host(bus->sdiodev->func1);
448                         errcode = brcmf_sdio_hdparse(bus, pnext->data, &rd_new,
449                                                      BRCMF_SDIO_FT_SUB);
450 -                       sdio_release_host(bus->sdiodev->func[1]);
451 +                       sdio_release_host(bus->sdiodev->func1);
452                         brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
453                                            pnext->data, 32, "subframe:\n");
454  
455 @@ -1621,11 +1621,11 @@ static u8 brcmf_sdio_rxglom(struct brcmf
456  
457                 if (errcode) {
458                         /* Terminate frame on error */
459 -                       sdio_claim_host(bus->sdiodev->func[1]);
460 +                       sdio_claim_host(bus->sdiodev->func1);
461                         brcmf_sdio_rxfail(bus, true, false);
462                         bus->sdcnt.rxglomfail++;
463                         brcmf_sdio_free_glom(bus);
464 -                       sdio_release_host(bus->sdiodev->func[1]);
465 +                       sdio_release_host(bus->sdiodev->func1);
466                         bus->cur_read.len = 0;
467                         return 0;
468                 }
469 @@ -1833,7 +1833,7 @@ static uint brcmf_sdio_readframes(struct
470  
471                 rd->len_left = rd->len;
472                 /* read header first for unknow frame length */
473 -               sdio_claim_host(bus->sdiodev->func[1]);
474 +               sdio_claim_host(bus->sdiodev->func1);
475                 if (!rd->len) {
476                         ret = brcmf_sdiod_recv_buf(bus->sdiodev,
477                                                    bus->rxhdr, BRCMF_FIRSTREAD);
478 @@ -1843,7 +1843,7 @@ static uint brcmf_sdio_readframes(struct
479                                           ret);
480                                 bus->sdcnt.rx_hdrfail++;
481                                 brcmf_sdio_rxfail(bus, true, true);
482 -                               sdio_release_host(bus->sdiodev->func[1]);
483 +                               sdio_release_host(bus->sdiodev->func1);
484                                 continue;
485                         }
486  
487 @@ -1853,7 +1853,7 @@ static uint brcmf_sdio_readframes(struct
488  
489                         if (brcmf_sdio_hdparse(bus, bus->rxhdr, rd,
490                                                BRCMF_SDIO_FT_NORMAL)) {
491 -                               sdio_release_host(bus->sdiodev->func[1]);
492 +                               sdio_release_host(bus->sdiodev->func1);
493                                 if (!bus->rxpending)
494                                         break;
495                                 else
496 @@ -1869,7 +1869,7 @@ static uint brcmf_sdio_readframes(struct
497                                 rd->len_nxtfrm = 0;
498                                 /* treat all packet as event if we don't know */
499                                 rd->channel = SDPCM_EVENT_CHANNEL;
500 -                               sdio_release_host(bus->sdiodev->func[1]);
501 +                               sdio_release_host(bus->sdiodev->func1);
502                                 continue;
503                         }
504                         rd->len_left = rd->len > BRCMF_FIRSTREAD ?
505 @@ -1886,7 +1886,7 @@ static uint brcmf_sdio_readframes(struct
506                         brcmf_err("brcmu_pkt_buf_get_skb failed\n");
507                         brcmf_sdio_rxfail(bus, false,
508                                             RETRYCHAN(rd->channel));
509 -                       sdio_release_host(bus->sdiodev->func[1]);
510 +                       sdio_release_host(bus->sdiodev->func1);
511                         continue;
512                 }
513                 skb_pull(pkt, head_read);
514 @@ -1894,16 +1894,16 @@ static uint brcmf_sdio_readframes(struct
515  
516                 ret = brcmf_sdiod_recv_pkt(bus->sdiodev, pkt);
517                 bus->sdcnt.f2rxdata++;
518 -               sdio_release_host(bus->sdiodev->func[1]);
519 +               sdio_release_host(bus->sdiodev->func1);
520  
521                 if (ret < 0) {
522                         brcmf_err("read %d bytes from channel %d failed: %d\n",
523                                   rd->len, rd->channel, ret);
524                         brcmu_pkt_buf_free_skb(pkt);
525 -                       sdio_claim_host(bus->sdiodev->func[1]);
526 +                       sdio_claim_host(bus->sdiodev->func1);
527                         brcmf_sdio_rxfail(bus, true,
528                                             RETRYCHAN(rd->channel));
529 -                       sdio_release_host(bus->sdiodev->func[1]);
530 +                       sdio_release_host(bus->sdiodev->func1);
531                         continue;
532                 }
533  
534 @@ -1914,7 +1914,7 @@ static uint brcmf_sdio_readframes(struct
535                 } else {
536                         memcpy(bus->rxhdr, pkt->data, SDPCM_HDRLEN);
537                         rd_new.seq_num = rd->seq_num;
538 -                       sdio_claim_host(bus->sdiodev->func[1]);
539 +                       sdio_claim_host(bus->sdiodev->func1);
540                         if (brcmf_sdio_hdparse(bus, bus->rxhdr, &rd_new,
541                                                BRCMF_SDIO_FT_NORMAL)) {
542                                 rd->len = 0;
543 @@ -1927,11 +1927,11 @@ static uint brcmf_sdio_readframes(struct
544                                           roundup(rd_new.len, 16) >> 4);
545                                 rd->len = 0;
546                                 brcmf_sdio_rxfail(bus, true, true);
547 -                               sdio_release_host(bus->sdiodev->func[1]);
548 +                               sdio_release_host(bus->sdiodev->func1);
549                                 brcmu_pkt_buf_free_skb(pkt);
550                                 continue;
551                         }
552 -                       sdio_release_host(bus->sdiodev->func[1]);
553 +                       sdio_release_host(bus->sdiodev->func1);
554                         rd->len_nxtfrm = rd_new.len_nxtfrm;
555                         rd->channel = rd_new.channel;
556                         rd->dat_offset = rd_new.dat_offset;
557 @@ -1947,9 +1947,9 @@ static uint brcmf_sdio_readframes(struct
558                                           rd_new.seq_num);
559                                 /* Force retry w/normal header read */
560                                 rd->len = 0;
561 -                               sdio_claim_host(bus->sdiodev->func[1]);
562 +                               sdio_claim_host(bus->sdiodev->func1);
563                                 brcmf_sdio_rxfail(bus, false, true);
564 -                               sdio_release_host(bus->sdiodev->func[1]);
565 +                               sdio_release_host(bus->sdiodev->func1);
566                                 brcmu_pkt_buf_free_skb(pkt);
567                                 continue;
568                         }
569 @@ -1972,9 +1972,9 @@ static uint brcmf_sdio_readframes(struct
570                         } else {
571                                 brcmf_err("%s: glom superframe w/o "
572                                           "descriptor!\n", __func__);
573 -                               sdio_claim_host(bus->sdiodev->func[1]);
574 +                               sdio_claim_host(bus->sdiodev->func1);
575                                 brcmf_sdio_rxfail(bus, false, false);
576 -                               sdio_release_host(bus->sdiodev->func[1]);
577 +                               sdio_release_host(bus->sdiodev->func1);
578                         }
579                         /* prepare the descriptor for the next read */
580                         rd->len = rd->len_nxtfrm << 4;
581 @@ -2072,7 +2072,7 @@ static int brcmf_sdio_txpkt_prep_sg(stru
582         int ntail, ret;
583  
584         sdiodev = bus->sdiodev;
585 -       blksize = sdiodev->func[2]->cur_blksize;
586 +       blksize = sdiodev->func2->cur_blksize;
587         /* sg entry alignment should be a divisor of block size */
588         WARN_ON(blksize % bus->sgentry_align);
589  
590 @@ -2251,14 +2251,14 @@ static int brcmf_sdio_txpkt(struct brcmf
591         if (ret)
592                 goto done;
593  
594 -       sdio_claim_host(bus->sdiodev->func[1]);
595 +       sdio_claim_host(bus->sdiodev->func1);
596         ret = brcmf_sdiod_send_pkt(bus->sdiodev, pktq);
597         bus->sdcnt.f2txdata++;
598  
599         if (ret < 0)
600                 brcmf_sdio_txfail(bus);
601  
602 -       sdio_release_host(bus->sdiodev->func[1]);
603 +       sdio_release_host(bus->sdiodev->func1);
604  
605  done:
606         brcmf_sdio_txpkt_postp(bus, pktq);
607 @@ -2314,10 +2314,11 @@ static uint brcmf_sdio_sendfromq(struct
608                 /* In poll mode, need to check for other events */
609                 if (!bus->intr) {
610                         /* Check device status, signal pending interrupt */
611 -                       sdio_claim_host(bus->sdiodev->func[1]);
612 +                       sdio_claim_host(bus->sdiodev->func1);
613                         intstatus = brcmf_sdiod_readl(bus->sdiodev,
614                                                       intstat_addr, &ret);
615 -                       sdio_release_host(bus->sdiodev->func[1]);
616 +                       sdio_release_host(bus->sdiodev->func1);
617 +
618                         bus->sdcnt.f2txdata++;
619                         if (ret != 0)
620                                 break;
621 @@ -2417,7 +2418,7 @@ static void brcmf_sdio_bus_stop(struct d
622         }
623  
624         if (sdiodev->state != BRCMF_SDIOD_NOMEDIUM) {
625 -               sdio_claim_host(sdiodev->func[1]);
626 +               sdio_claim_host(sdiodev->func1);
627  
628                 /* Enable clock for device interrupts */
629                 brcmf_sdio_bus_sleep(bus, false, false);
630 @@ -2441,13 +2442,13 @@ static void brcmf_sdio_bus_stop(struct d
631  
632                 /* Turn off the bus (F2), free any pending packets */
633                 brcmf_dbg(INTR, "disable SDIO interrupts\n");
634 -               sdio_disable_func(sdiodev->func[2]);
635 +               sdio_disable_func(sdiodev->func2);
636  
637                 /* Clear any pending interrupts now that F2 is disabled */
638                 brcmf_sdiod_writel(sdiodev, core->base + SD_REG(intstatus),
639                                    local_hostintmask, NULL);
640  
641 -               sdio_release_host(sdiodev->func[1]);
642 +               sdio_release_host(sdiodev->func1);
643         }
644         /* Clear the data packet queues */
645         brcmu_pktq_flush(&bus->txq, true, NULL, NULL);
646 @@ -2522,7 +2523,7 @@ static void brcmf_sdio_dpc(struct brcmf_
647  
648         brcmf_dbg(TRACE, "Enter\n");
649  
650 -       sdio_claim_host(bus->sdiodev->func[1]);
651 +       sdio_claim_host(bus->sdiodev->func1);
652  
653         /* If waiting for HTAVAIL, check status */
654         if (!bus->sr_enabled && bus->clkstate == CLK_PENDING) {
655 @@ -2585,7 +2586,7 @@ static void brcmf_sdio_dpc(struct brcmf_
656                 intstatus |= brcmf_sdio_hostmail(bus);
657         }
658  
659 -       sdio_release_host(bus->sdiodev->func[1]);
660 +       sdio_release_host(bus->sdiodev->func1);
661  
662         /* Generally don't ask for these, can get CRC errors... */
663         if (intstatus & I_WR_OOSYNC) {
664 @@ -2628,7 +2629,7 @@ static void brcmf_sdio_dpc(struct brcmf_
665  
666         if (bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL) &&
667             data_ok(bus)) {
668 -               sdio_claim_host(bus->sdiodev->func[1]);
669 +               sdio_claim_host(bus->sdiodev->func1);
670                 if (bus->ctrl_frame_stat) {
671                         err = brcmf_sdio_tx_ctrlframe(bus,  bus->ctrl_frame_buf,
672                                                       bus->ctrl_frame_len);
673 @@ -2636,7 +2637,7 @@ static void brcmf_sdio_dpc(struct brcmf_
674                         wmb();
675                         bus->ctrl_frame_stat = false;
676                 }
677 -               sdio_release_host(bus->sdiodev->func[1]);
678 +               sdio_release_host(bus->sdiodev->func1);
679                 brcmf_sdio_wait_event_wakeup(bus);
680         }
681         /* Send queued frames (limit 1 if rx may still be pending) */
682 @@ -2652,14 +2653,14 @@ static void brcmf_sdio_dpc(struct brcmf_
683                 brcmf_err("failed backplane access over SDIO, halting operation\n");
684                 atomic_set(&bus->intstatus, 0);
685                 if (bus->ctrl_frame_stat) {
686 -                       sdio_claim_host(bus->sdiodev->func[1]);
687 +                       sdio_claim_host(bus->sdiodev->func1);
688                         if (bus->ctrl_frame_stat) {
689                                 bus->ctrl_frame_err = -ENODEV;
690                                 wmb();
691                                 bus->ctrl_frame_stat = false;
692                                 brcmf_sdio_wait_event_wakeup(bus);
693                         }
694 -                       sdio_release_host(bus->sdiodev->func[1]);
695 +                       sdio_release_host(bus->sdiodev->func1);
696                 }
697         } else if (atomic_read(&bus->intstatus) ||
698                    atomic_read(&bus->ipend) > 0 ||
699 @@ -2874,13 +2875,13 @@ brcmf_sdio_bus_txctl(struct device *dev,
700                                          CTL_DONE_TIMEOUT);
701         ret = 0;
702         if (bus->ctrl_frame_stat) {
703 -               sdio_claim_host(bus->sdiodev->func[1]);
704 +               sdio_claim_host(bus->sdiodev->func1);
705                 if (bus->ctrl_frame_stat) {
706                         brcmf_dbg(SDIO, "ctrl_frame timeout\n");
707                         bus->ctrl_frame_stat = false;
708                         ret = -ETIMEDOUT;
709                 }
710 -               sdio_release_host(bus->sdiodev->func[1]);
711 +               sdio_release_host(bus->sdiodev->func1);
712         }
713         if (!ret) {
714                 brcmf_dbg(SDIO, "ctrl_frame complete, err=%d\n",
715 @@ -3004,7 +3005,7 @@ static int brcmf_sdio_assert_info(struct
716                 return 0;
717         }
718  
719 -       sdio_claim_host(bus->sdiodev->func[1]);
720 +       sdio_claim_host(bus->sdiodev->func1);
721         if (sh->assert_file_addr != 0) {
722                 error = brcmf_sdiod_ramrw(bus->sdiodev, false,
723                                           sh->assert_file_addr, (u8 *)file, 80);
724 @@ -3017,7 +3018,7 @@ static int brcmf_sdio_assert_info(struct
725                 if (error < 0)
726                         return error;
727         }
728 -       sdio_release_host(bus->sdiodev->func[1]);
729 +       sdio_release_host(bus->sdiodev->func1);
730  
731         seq_printf(seq, "dongle assert: %s:%d: assert(%s)\n",
732                    file, sh->assert_line, expr);
733 @@ -3291,7 +3292,7 @@ static int brcmf_sdio_download_firmware(
734         int bcmerror;
735         u32 rstvec;
736  
737 -       sdio_claim_host(bus->sdiodev->func[1]);
738 +       sdio_claim_host(bus->sdiodev->func1);
739         brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
740  
741         rstvec = get_unaligned_le32(fw->data);
742 @@ -3320,7 +3321,7 @@ static int brcmf_sdio_download_firmware(
743  
744  err:
745         brcmf_sdio_clkctl(bus, CLK_SDONLY, false);
746 -       sdio_release_host(bus->sdiodev->func[1]);
747 +       sdio_release_host(bus->sdiodev->func1);
748         return bcmerror;
749  }
750  
751 @@ -3435,7 +3436,7 @@ static int brcmf_sdio_bus_preinit(struct
752         if (sdiodev->sg_support) {
753                 bus->txglom = false;
754                 value = 1;
755 -               pad_size = bus->sdiodev->func[2]->cur_blksize << 1;
756 +               pad_size = bus->sdiodev->func2->cur_blksize << 1;
757                 err = brcmf_iovar_data_set(bus->sdiodev->dev, "bus:rxglom",
758                                            &value, sizeof(u32));
759                 if (err < 0) {
760 @@ -3477,7 +3478,7 @@ static int brcmf_sdio_bus_get_memdump(st
761  
762         address = bus->ci->rambase;
763         offset = err = 0;
764 -       sdio_claim_host(sdiodev->func[1]);
765 +       sdio_claim_host(sdiodev->func1);
766         while (offset < mem_size) {
767                 len = ((offset + MEMBLOCK) < mem_size) ? MEMBLOCK :
768                       mem_size - offset;
769 @@ -3493,7 +3494,7 @@ static int brcmf_sdio_bus_get_memdump(st
770         }
771  
772  done:
773 -       sdio_release_host(sdiodev->func[1]);
774 +       sdio_release_host(sdiodev->func1);
775         return err;
776  }
777  
778 @@ -3550,11 +3551,10 @@ static void brcmf_sdio_bus_watchdog(stru
779                         if (!bus->dpc_triggered) {
780                                 u8 devpend;
781  
782 -                               sdio_claim_host(bus->sdiodev->func[1]);
783 +                               sdio_claim_host(bus->sdiodev->func1);
784                                 devpend = brcmf_sdiod_func0_rb(bus->sdiodev,
785 -                                                              SDIO_CCCR_INTx,
786 -                                                              NULL);
787 -                               sdio_release_host(bus->sdiodev->func[1]);
788 +                                                 SDIO_CCCR_INTx, NULL);
789 +                               sdio_release_host(bus->sdiodev->func1);
790                                 intstatus = devpend & (INTR_STATUS_FUNC1 |
791                                                        INTR_STATUS_FUNC2);
792                         }
793 @@ -3580,13 +3580,13 @@ static void brcmf_sdio_bus_watchdog(stru
794                 bus->console.count += jiffies_to_msecs(BRCMF_WD_POLL);
795                 if (bus->console.count >= bus->console_interval) {
796                         bus->console.count -= bus->console_interval;
797 -                       sdio_claim_host(bus->sdiodev->func[1]);
798 +                       sdio_claim_host(bus->sdiodev->func1);
799                         /* Make sure backplane clock is on */
800                         brcmf_sdio_bus_sleep(bus, false, false);
801                         if (brcmf_sdio_readconsole(bus) < 0)
802                                 /* stop on error */
803                                 bus->console_interval = 0;
804 -                       sdio_release_host(bus->sdiodev->func[1]);
805 +                       sdio_release_host(bus->sdiodev->func1);
806                 }
807         }
808  #endif                         /* DEBUG */
809 @@ -3599,11 +3599,11 @@ static void brcmf_sdio_bus_watchdog(stru
810                         bus->idlecount++;
811                         if (bus->idlecount > bus->idletime) {
812                                 brcmf_dbg(SDIO, "idle\n");
813 -                               sdio_claim_host(bus->sdiodev->func[1]);
814 +                               sdio_claim_host(bus->sdiodev->func1);
815                                 brcmf_sdio_wd_timer(bus, false);
816                                 bus->idlecount = 0;
817                                 brcmf_sdio_bus_sleep(bus, true, false);
818 -                               sdio_release_host(bus->sdiodev->func[1]);
819 +                               sdio_release_host(bus->sdiodev->func1);
820                         }
821                 } else {
822                         bus->idlecount = 0;
823 @@ -3773,8 +3773,8 @@ static u32 brcmf_sdio_buscore_read32(voi
824         val = brcmf_sdiod_readl(sdiodev, addr, NULL);
825  
826         if (addr == CORE_CC_REG(SI_ENUM_BASE, chipid) &&
827 -           (sdiodev->func[1]->device == SDIO_DEVICE_ID_BROADCOM_4339 ||
828 -            sdiodev->func[1]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339)) {
829 +           (sdiodev->func1->device == SDIO_DEVICE_ID_BROADCOM_4339 ||
830 +            sdiodev->func1->device == SDIO_DEVICE_ID_BROADCOM_4335_4339)) {
831                 rev = (val & CID_REV_MASK) >> CID_REV_SHIFT;
832                 if (rev >= 2) {
833                         val &= ~CID_ID_MASK;
834 @@ -3810,7 +3810,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
835         u32 drivestrength;
836  
837         sdiodev = bus->sdiodev;
838 -       sdio_claim_host(sdiodev->func[1]);
839 +       sdio_claim_host(sdiodev->func1);
840  
841         pr_debug("F1 signature read @0x18000000=0x%4x\n",
842                  brcmf_sdiod_readl(sdiodev, SI_ENUM_BASE, NULL));
843 @@ -3877,8 +3877,8 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
844         /* wowl can be supported when KEEP_POWER is true and (WAKE_SDIO_IRQ
845          * is true or when platform data OOB irq is true).
846          */
847 -       if ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_KEEP_POWER) &&
848 -           ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_WAKE_SDIO_IRQ) ||
849 +       if ((sdio_get_host_pm_caps(sdiodev->func1) & MMC_PM_KEEP_POWER) &&
850 +           ((sdio_get_host_pm_caps(sdiodev->func1) & MMC_PM_WAKE_SDIO_IRQ) ||
851              (sdiodev->settings->bus.sdio.oob_irq_supported)))
852                 sdiodev->bus_if->wowl_supported = true;
853  #endif
854 @@ -3917,7 +3917,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
855         if (err)
856                 goto fail;
857  
858 -       sdio_release_host(sdiodev->func[1]);
859 +       sdio_release_host(sdiodev->func1);
860  
861         brcmu_pktq_init(&bus->txq, (PRIOMASK + 1), TXQLEN);
862  
863 @@ -3938,7 +3938,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
864         return true;
865  
866  fail:
867 -       sdio_release_host(sdiodev->func[1]);
868 +       sdio_release_host(sdiodev->func1);
869         return false;
870  }
871  
872 @@ -4044,7 +4044,7 @@ static void brcmf_sdio_firmware_callback
873         bus->sdcnt.tickcnt = 0;
874         brcmf_sdio_wd_timer(bus, true);
875  
876 -       sdio_claim_host(sdiodev->func[1]);
877 +       sdio_claim_host(sdiodev->func1);
878  
879         /* Make sure backplane clock is on, needed to generate F2 interrupt */
880         brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
881 @@ -4066,7 +4066,7 @@ static void brcmf_sdio_firmware_callback
882         brcmf_sdiod_writel(sdiod, core->base + SD_REG(tosbmailboxdata),
883                            SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT, NULL);
884  
885 -       err = sdio_enable_func(sdiodev->func[2]);
886 +       err = sdio_enable_func(sdiodev->func2);
887  
888         brcmf_dbg(INFO, "enable F2: err=%d\n", err);
889  
890 @@ -4081,7 +4081,7 @@ static void brcmf_sdio_firmware_callback
891                 brcmf_sdiod_writeb(sdiodev, SBSDIO_WATERMARK, 8, &err);
892         } else {
893                 /* Disable F2 again */
894 -               sdio_disable_func(sdiodev->func[2]);
895 +               sdio_disable_func(sdiodev->func2);
896                 goto release;
897         }
898  
899 @@ -4106,7 +4106,7 @@ static void brcmf_sdio_firmware_callback
900         if (err != 0)
901                 brcmf_sdio_clkctl(bus, CLK_NONE, false);
902  
903 -       sdio_release_host(sdiodev->func[1]);
904 +       sdio_release_host(sdiodev->func1);
905  
906         err = brcmf_bus_started(dev);
907         if (err != 0) {
908 @@ -4116,10 +4116,10 @@ static void brcmf_sdio_firmware_callback
909         return;
910  
911  release:
912 -       sdio_release_host(sdiodev->func[1]);
913 +       sdio_release_host(sdiodev->func1);
914  fail:
915         brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), err);
916 -       device_release_driver(&sdiodev->func[2]->dev);
917 +       device_release_driver(&sdiodev->func2->dev);
918         device_release_driver(dev);
919  }
920  
921 @@ -4146,7 +4146,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
922  
923         /* single-threaded workqueue */
924         wq = alloc_ordered_workqueue("brcmf_wq/%s", WQ_MEM_RECLAIM,
925 -                                    dev_name(&sdiodev->func[1]->dev));
926 +                                    dev_name(&sdiodev->func1->dev));
927         if (!wq) {
928                 brcmf_err("insufficient memory to create txworkqueue\n");
929                 goto fail;
930 @@ -4173,7 +4173,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
931         init_completion(&bus->watchdog_wait);
932         bus->watchdog_tsk = kthread_run(brcmf_sdio_watchdog_thread,
933                                         bus, "brcmf_wdog/%s",
934 -                                       dev_name(&sdiodev->func[1]->dev));
935 +                                       dev_name(&sdiodev->func1->dev));
936         if (IS_ERR(bus->watchdog_tsk)) {
937                 pr_warn("brcmf_watchdog thread failed to start\n");
938                 bus->watchdog_tsk = NULL;
939 @@ -4199,7 +4199,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
940         }
941  
942         /* Query the F2 block size, set roundup accordingly */
943 -       bus->blocksize = bus->sdiodev->func[2]->cur_blksize;
944 +       bus->blocksize = bus->sdiodev->func2->cur_blksize;
945         bus->roundup = min(max_roundup, bus->blocksize);
946  
947         /* Allocate buffers */
948 @@ -4215,17 +4215,17 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
949                 }
950         }
951  
952 -       sdio_claim_host(bus->sdiodev->func[1]);
953 +       sdio_claim_host(bus->sdiodev->func1);
954  
955         /* Disable F2 to clear any intermediate frame state on the dongle */
956 -       sdio_disable_func(bus->sdiodev->func[2]);
957 +       sdio_disable_func(bus->sdiodev->func2);
958  
959         bus->rxflow = false;
960  
961         /* Done with backplane-dependent accesses, can drop clock... */
962         brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL);
963  
964 -       sdio_release_host(bus->sdiodev->func[1]);
965 +       sdio_release_host(bus->sdiodev->func1);
966  
967         /* ...and initialize clock/power states */
968         bus->clkstate = CLK_SDONLY;
969 @@ -4277,7 +4277,7 @@ void brcmf_sdio_remove(struct brcmf_sdio
970  
971                 if (bus->ci) {
972                         if (bus->sdiodev->state != BRCMF_SDIOD_NOMEDIUM) {
973 -                               sdio_claim_host(bus->sdiodev->func[1]);
974 +                               sdio_claim_host(bus->sdiodev->func1);
975                                 brcmf_sdio_wd_timer(bus, false);
976                                 brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
977                                 /* Leave the device in state where it is
978 @@ -4287,7 +4287,7 @@ void brcmf_sdio_remove(struct brcmf_sdio
979                                 msleep(20);
980                                 brcmf_chip_set_passive(bus->ci);
981                                 brcmf_sdio_clkctl(bus, CLK_NONE, false);
982 -                               sdio_release_host(bus->sdiodev->func[1]);
983 +                               sdio_release_host(bus->sdiodev->func1);
984                         }
985                         brcmf_chip_detach(bus->ci);
986                 }
987 @@ -4334,9 +4334,9 @@ int brcmf_sdio_sleep(struct brcmf_sdio *
988  {
989         int ret;
990  
991 -       sdio_claim_host(bus->sdiodev->func[1]);
992 +       sdio_claim_host(bus->sdiodev->func1);
993         ret = brcmf_sdio_bus_sleep(bus, sleep, false);
994 -       sdio_release_host(bus->sdiodev->func[1]);
995 +       sdio_release_host(bus->sdiodev->func1);
996  
997         return ret;
998  }
999 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
1000 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
1001 @@ -21,9 +21,6 @@
1002  #include <linux/firmware.h>
1003  #include "firmware.h"
1004  
1005 -/* Maximum number of I/O funcs */
1006 -#define NUM_SDIO_FUNCS 3
1007 -
1008  #define SDIOD_FBR_SIZE         0x100
1009  
1010  /* io_en */
1011 @@ -173,8 +170,8 @@ struct brcmf_sdio;
1012  struct brcmf_sdiod_freezer;
1013  
1014  struct brcmf_sdio_dev {
1015 -       struct sdio_func *func[NUM_SDIO_FUNCS];
1016 -       u8 num_funcs;                   /* Supported funcs on client */
1017 +       struct sdio_func *func1;
1018 +       struct sdio_func *func2;
1019         u32 sbwad;                      /* Save backplane window address */
1020         struct brcmf_core *cc_core;     /* chipcommon core info struct */
1021         struct brcmf_sdio *bus;
1022 @@ -295,17 +292,17 @@ void brcmf_sdiod_intr_unregister(struct
1023  /* SDIO device register access interface */
1024  /* Accessors for SDIO Function 0 */
1025  #define brcmf_sdiod_func0_rb(sdiodev, addr, r) \
1026 -       sdio_f0_readb((sdiodev)->func[1], (addr), (r))
1027 +       sdio_f0_readb((sdiodev)->func1, (addr), (r))
1028  
1029  #define brcmf_sdiod_func0_wb(sdiodev, addr, v, ret) \
1030 -       sdio_f0_writeb((sdiodev)->func[1], (v), (addr), (ret))
1031 +       sdio_f0_writeb((sdiodev)->func1, (v), (addr), (ret))
1032  
1033  /* Accessors for SDIO Function 1 */
1034  #define brcmf_sdiod_readb(sdiodev, addr, r) \
1035 -       sdio_readb((sdiodev)->func[1], (addr), (r))
1036 +       sdio_readb((sdiodev)->func1, (addr), (r))
1037  
1038  #define brcmf_sdiod_writeb(sdiodev, addr, v, ret) \
1039 -       sdio_writeb((sdiodev)->func[1], (v), (addr), (ret))
1040 +       sdio_writeb((sdiodev)->func1, (v), (addr), (ret))
1041  
1042  u32 brcmf_sdiod_readl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
1043  void brcmf_sdiod_writel(struct brcmf_sdio_dev *sdiodev, u32 addr, u32 data,