224af53e0faea90a7b7f74d40467a3cac189151b
[linux-3.10.git] / drivers / bluetooth / btmrvl_sdio.c
1 /**
2  * Marvell BT-over-SDIO driver: SDIO interface related functions.
3  *
4  * Copyright (C) 2009, Marvell International Ltd.
5  *
6  * This software file (the "File") is distributed by Marvell International
7  * Ltd. under the terms of the GNU General Public License Version 2, June 1991
8  * (the "License").  You may use, redistribute and/or modify this File in
9  * accordance with the terms and conditions of the License, a copy of which
10  * is available by writing to the Free Software Foundation, Inc.,
11  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
12  * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
13  *
14  *
15  * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
17  * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
18  * this warranty disclaimer.
19  **/
20
21 #include <linux/firmware.h>
22
23 #include <linux/mmc/sdio_ids.h>
24 #include <linux/mmc/sdio_func.h>
25
26 #include <net/bluetooth/bluetooth.h>
27 #include <net/bluetooth/hci_core.h>
28
29 #include "btmrvl_drv.h"
30 #include "btmrvl_sdio.h"
31
32 #define VERSION "1.0"
33
34 /* The btmrvl_sdio_remove() callback function is called
35  * when user removes this module from kernel space or ejects
36  * the card from the slot. The driver handles these 2 cases
37  * differently.
38  * If the user is removing the module, a MODULE_SHUTDOWN_REQ
39  * command is sent to firmware and interrupt will be disabled.
40  * If the card is removed, there is no need to send command
41  * or disable interrupt.
42  *
43  * The variable 'user_rmmod' is used to distinguish these two
44  * scenarios. This flag is initialized as FALSE in case the card
45  * is removed, and will be set to TRUE for module removal when
46  * module_exit function is called.
47  */
48 static u8 user_rmmod;
49
50 static const struct btmrvl_sdio_device btmrvl_sdio_sd6888 = {
51         .helper         = "sd8688_helper.bin",
52         .firmware       = "sd8688.bin",
53 };
54
55 static const struct sdio_device_id btmrvl_sdio_ids[] = {
56         /* Marvell SD8688 Bluetooth device */
57         { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x9105),
58                         .driver_data = (unsigned long) &btmrvl_sdio_sd6888 },
59
60         { }     /* Terminating entry */
61 };
62
63 MODULE_DEVICE_TABLE(sdio, btmrvl_sdio_ids);
64
65 static int btmrvl_sdio_get_rx_unit(struct btmrvl_sdio_card *card)
66 {
67         u8 reg;
68         int ret;
69
70         reg = sdio_readb(card->func, CARD_RX_UNIT_REG, &ret);
71         if (!ret)
72                 card->rx_unit = reg;
73
74         return ret;
75 }
76
77 static int btmrvl_sdio_read_fw_status(struct btmrvl_sdio_card *card, u16 *dat)
78 {
79         u8 fws0, fws1;
80         int ret;
81
82         *dat = 0;
83
84         fws0 = sdio_readb(card->func, CARD_FW_STATUS0_REG, &ret);
85
86         if (!ret)
87                 fws1 = sdio_readb(card->func, CARD_FW_STATUS1_REG, &ret);
88
89         if (ret)
90                 return -EIO;
91
92         *dat = (((u16) fws1) << 8) | fws0;
93
94         return 0;
95 }
96
97 static int btmrvl_sdio_read_rx_len(struct btmrvl_sdio_card *card, u16 *dat)
98 {
99         u8 reg;
100         int ret;
101
102         reg = sdio_readb(card->func, CARD_RX_LEN_REG, &ret);
103         if (!ret)
104                 *dat = (u16) reg << card->rx_unit;
105
106         return ret;
107 }
108
109 static int btmrvl_sdio_enable_host_int_mask(struct btmrvl_sdio_card *card,
110                                                                 u8 mask)
111 {
112         int ret;
113
114         sdio_writeb(card->func, mask, HOST_INT_MASK_REG, &ret);
115         if (ret) {
116                 BT_ERR("Unable to enable the host interrupt!");
117                 ret = -EIO;
118         }
119
120         return ret;
121 }
122
123 static int btmrvl_sdio_disable_host_int_mask(struct btmrvl_sdio_card *card,
124                                                                 u8 mask)
125 {
126         u8 host_int_mask;
127         int ret;
128
129         host_int_mask = sdio_readb(card->func, HOST_INT_MASK_REG, &ret);
130         if (ret)
131                 return -EIO;
132
133         host_int_mask &= ~mask;
134
135         sdio_writeb(card->func, host_int_mask, HOST_INT_MASK_REG, &ret);
136         if (ret < 0) {
137                 BT_ERR("Unable to disable the host interrupt!");
138                 return -EIO;
139         }
140
141         return 0;
142 }
143
144 static int btmrvl_sdio_poll_card_status(struct btmrvl_sdio_card *card, u8 bits)
145 {
146         unsigned int tries;
147         u8 status;
148         int ret;
149
150         for (tries = 0; tries < MAX_POLL_TRIES * 1000; tries++) {
151                 status = sdio_readb(card->func, CARD_STATUS_REG, &ret);
152                 if (ret)
153                         goto failed;
154                 if ((status & bits) == bits)
155                         return ret;
156
157                 udelay(1);
158         }
159
160         ret = -ETIMEDOUT;
161
162 failed:
163         BT_ERR("FAILED! ret=%d", ret);
164
165         return ret;
166 }
167
168 static int btmrvl_sdio_verify_fw_download(struct btmrvl_sdio_card *card,
169                                                                 int pollnum)
170 {
171         int ret = -ETIMEDOUT;
172         u16 firmwarestat;
173         unsigned int tries;
174
175          /* Wait for firmware to become ready */
176         for (tries = 0; tries < pollnum; tries++) {
177                 if (btmrvl_sdio_read_fw_status(card, &firmwarestat) < 0)
178                         continue;
179
180                 if (firmwarestat == FIRMWARE_READY) {
181                         ret = 0;
182                         break;
183                 } else {
184                         msleep(10);
185                 }
186         }
187
188         return ret;
189 }
190
191 static int btmrvl_sdio_download_helper(struct btmrvl_sdio_card *card)
192 {
193         const struct firmware *fw_helper = NULL;
194         const u8 *helper = NULL;
195         int ret;
196         void *tmphlprbuf = NULL;
197         int tmphlprbufsz, hlprblknow, helperlen;
198         u8 *helperbuf;
199         u32 tx_len;
200
201         ret = request_firmware(&fw_helper, card->helper,
202                                                 &card->func->dev);
203         if ((ret < 0) || !fw_helper) {
204                 BT_ERR("request_firmware(helper) failed, error code = %d",
205                                                                         ret);
206                 ret = -ENOENT;
207                 goto done;
208         }
209
210         helper = fw_helper->data;
211         helperlen = fw_helper->size;
212
213         BT_DBG("Downloading helper image (%d bytes), block size %d bytes",
214                                                 helperlen, SDIO_BLOCK_SIZE);
215
216         tmphlprbufsz = ALIGN_SZ(BTM_UPLD_SIZE, BTSDIO_DMA_ALIGN);
217
218         tmphlprbuf = kmalloc(tmphlprbufsz, GFP_KERNEL);
219         if (!tmphlprbuf) {
220                 BT_ERR("Unable to allocate buffer for helper."
221                         " Terminating download");
222                 ret = -ENOMEM;
223                 goto done;
224         }
225
226         memset(tmphlprbuf, 0, tmphlprbufsz);
227
228         helperbuf = (u8 *) ALIGN_ADDR(tmphlprbuf, BTSDIO_DMA_ALIGN);
229
230         /* Perform helper data transfer */
231         tx_len = (FIRMWARE_TRANSFER_NBLOCK * SDIO_BLOCK_SIZE)
232                         - SDIO_HEADER_LEN;
233         hlprblknow = 0;
234
235         do {
236                 ret = btmrvl_sdio_poll_card_status(card,
237                                             CARD_IO_READY | DN_LD_CARD_RDY);
238                 if (ret < 0) {
239                         BT_ERR("Helper download poll status timeout @ %d",
240                                 hlprblknow);
241                         goto done;
242                 }
243
244                 /* Check if there is more data? */
245                 if (hlprblknow >= helperlen)
246                         break;
247
248                 if (helperlen - hlprblknow < tx_len)
249                         tx_len = helperlen - hlprblknow;
250
251                 /* Little-endian */
252                 helperbuf[0] = ((tx_len & 0x000000ff) >> 0);
253                 helperbuf[1] = ((tx_len & 0x0000ff00) >> 8);
254                 helperbuf[2] = ((tx_len & 0x00ff0000) >> 16);
255                 helperbuf[3] = ((tx_len & 0xff000000) >> 24);
256
257                 memcpy(&helperbuf[SDIO_HEADER_LEN], &helper[hlprblknow],
258                                 tx_len);
259
260                 /* Now send the data */
261                 ret = sdio_writesb(card->func, card->ioport, helperbuf,
262                                 FIRMWARE_TRANSFER_NBLOCK * SDIO_BLOCK_SIZE);
263                 if (ret < 0) {
264                         BT_ERR("IO error during helper download @ %d",
265                                 hlprblknow);
266                         goto done;
267                 }
268
269                 hlprblknow += tx_len;
270         } while (true);
271
272         BT_DBG("Transferring helper image EOF block");
273
274         memset(helperbuf, 0x0, SDIO_BLOCK_SIZE);
275
276         ret = sdio_writesb(card->func, card->ioport, helperbuf,
277                                                         SDIO_BLOCK_SIZE);
278         if (ret < 0) {
279                 BT_ERR("IO error in writing helper image EOF block");
280                 goto done;
281         }
282
283         ret = 0;
284
285 done:
286         kfree(tmphlprbuf);
287         if (fw_helper)
288                 release_firmware(fw_helper);
289
290         return ret;
291 }
292
293 static int btmrvl_sdio_download_fw_w_helper(struct btmrvl_sdio_card *card)
294 {
295         const struct firmware *fw_firmware = NULL;
296         const u8 *firmware = NULL;
297         int firmwarelen, tmpfwbufsz, ret;
298         unsigned int tries, offset;
299         u8 base0, base1;
300         void *tmpfwbuf = NULL;
301         u8 *fwbuf;
302         u16 len;
303         int txlen = 0, tx_blocks = 0, count = 0;
304
305         ret = request_firmware(&fw_firmware, card->firmware,
306                                                         &card->func->dev);
307         if ((ret < 0) || !fw_firmware) {
308                 BT_ERR("request_firmware(firmware) failed, error code = %d",
309                                                                         ret);
310                 ret = -ENOENT;
311                 goto done;
312         }
313
314         firmware = fw_firmware->data;
315         firmwarelen = fw_firmware->size;
316
317         BT_DBG("Downloading FW image (%d bytes)", firmwarelen);
318
319         tmpfwbufsz = ALIGN_SZ(BTM_UPLD_SIZE, BTSDIO_DMA_ALIGN);
320         tmpfwbuf = kmalloc(tmpfwbufsz, GFP_KERNEL);
321         if (!tmpfwbuf) {
322                 BT_ERR("Unable to allocate buffer for firmware."
323                        " Terminating download");
324                 ret = -ENOMEM;
325                 goto done;
326         }
327
328         memset(tmpfwbuf, 0, tmpfwbufsz);
329
330         /* Ensure aligned firmware buffer */
331         fwbuf = (u8 *) ALIGN_ADDR(tmpfwbuf, BTSDIO_DMA_ALIGN);
332
333         /* Perform firmware data transfer */
334         offset = 0;
335         do {
336                 ret = btmrvl_sdio_poll_card_status(card,
337                                         CARD_IO_READY | DN_LD_CARD_RDY);
338                 if (ret < 0) {
339                         BT_ERR("FW download with helper poll status"
340                                                 " timeout @ %d", offset);
341                         goto done;
342                 }
343
344                 /* Check if there is more data ? */
345                 if (offset >= firmwarelen)
346                         break;
347
348                 for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
349                         base0 = sdio_readb(card->func,
350                                         SQ_READ_BASE_ADDRESS_A0_REG, &ret);
351                         if (ret) {
352                                 BT_ERR("BASE0 register read failed:"
353                                         " base0 = 0x%04X(%d)."
354                                         " Terminating download",
355                                         base0, base0);
356                                 ret = -EIO;
357                                 goto done;
358                         }
359                         base1 = sdio_readb(card->func,
360                                         SQ_READ_BASE_ADDRESS_A1_REG, &ret);
361                         if (ret) {
362                                 BT_ERR("BASE1 register read failed:"
363                                         " base1 = 0x%04X(%d)."
364                                         " Terminating download",
365                                         base1, base1);
366                                 ret = -EIO;
367                                 goto done;
368                         }
369
370                         len = (((u16) base1) << 8) | base0;
371                         if (len)
372                                 break;
373
374                         udelay(10);
375                 }
376
377                 if (!len)
378                         break;
379                 else if (len > BTM_UPLD_SIZE) {
380                         BT_ERR("FW download failure @%d, invalid length %d",
381                                                                 offset, len);
382                         ret = -EINVAL;
383                         goto done;
384                 }
385
386                 txlen = len;
387
388                 if (len & BIT(0)) {
389                         count++;
390                         if (count > MAX_WRITE_IOMEM_RETRY) {
391                                 BT_ERR("FW download failure @%d, "
392                                         "over max retry count", offset);
393                                 ret = -EIO;
394                                 goto done;
395                         }
396                         BT_ERR("FW CRC error indicated by the helper: "
397                                 "len = 0x%04X, txlen = %d", len, txlen);
398                         len &= ~BIT(0);
399                         /* Set txlen to 0 so as to resend from same offset */
400                         txlen = 0;
401                 } else {
402                         count = 0;
403
404                         /* Last block ? */
405                         if (firmwarelen - offset < txlen)
406                                 txlen = firmwarelen - offset;
407
408                         tx_blocks =
409                             (txlen + SDIO_BLOCK_SIZE - 1) / SDIO_BLOCK_SIZE;
410
411                         memcpy(fwbuf, &firmware[offset], txlen);
412                 }
413
414                 ret = sdio_writesb(card->func, card->ioport, fwbuf,
415                                         tx_blocks * SDIO_BLOCK_SIZE);
416
417                 if (ret < 0) {
418                         BT_ERR("FW download, writesb(%d) failed @%d",
419                                                         count, offset);
420                         sdio_writeb(card->func, HOST_CMD53_FIN, CONFIG_REG,
421                                                                         &ret);
422                         if (ret)
423                                 BT_ERR("writeb failed (CFG)");
424                 }
425
426                 offset += txlen;
427         } while (true);
428
429         BT_DBG("FW download over, size %d bytes", offset);
430
431         ret = 0;
432
433 done:
434         kfree(tmpfwbuf);
435
436         if (fw_firmware)
437                 release_firmware(fw_firmware);
438
439         return ret;
440 }
441
442 static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv)
443 {
444         u16 buf_len = 0;
445         int ret, buf_block_len, blksz;
446         struct sk_buff *skb = NULL;
447         u32 type;
448         u8 *payload = NULL;
449         struct hci_dev *hdev = priv->btmrvl_dev.hcidev;
450         struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
451
452         if (!card || !card->func) {
453                 BT_ERR("card or function is NULL!");
454                 ret = -EINVAL;
455                 goto exit;
456         }
457
458         /* Read the length of data to be transferred */
459         ret = btmrvl_sdio_read_rx_len(card, &buf_len);
460         if (ret < 0) {
461                 BT_ERR("read rx_len failed");
462                 ret = -EIO;
463                 goto exit;
464         }
465
466         blksz = SDIO_BLOCK_SIZE;
467         buf_block_len = (buf_len + blksz - 1) / blksz;
468
469         if (buf_len <= SDIO_HEADER_LEN
470                         || (buf_block_len * blksz) > ALLOC_BUF_SIZE) {
471                 BT_ERR("invalid packet length: %d", buf_len);
472                 ret = -EINVAL;
473                 goto exit;
474         }
475
476         /* Allocate buffer */
477         skb = bt_skb_alloc(buf_block_len * blksz + BTSDIO_DMA_ALIGN,
478                                                                 GFP_ATOMIC);
479         if (skb == NULL) {
480                 BT_ERR("No free skb");
481                 goto exit;
482         }
483
484         if ((u32) skb->data & (BTSDIO_DMA_ALIGN - 1)) {
485                 skb_put(skb, (u32) skb->data & (BTSDIO_DMA_ALIGN - 1));
486                 skb_pull(skb, (u32) skb->data & (BTSDIO_DMA_ALIGN - 1));
487         }
488
489         payload = skb->tail;
490
491         ret = sdio_readsb(card->func, payload, card->ioport,
492                           buf_block_len * blksz);
493         if (ret < 0) {
494                 BT_ERR("readsb failed: %d", ret);
495                 ret = -EIO;
496                 goto exit;
497         }
498
499         /* This is SDIO specific header length: byte[2][1][0], type: byte[3]
500          * (HCI_COMMAND = 1, ACL_DATA = 2, SCO_DATA = 3, 0xFE = Vendor)
501          */
502
503         buf_len = payload[0];
504         buf_len |= (u16) payload[1] << 8;
505         type = payload[3];
506
507         switch (type) {
508         case HCI_ACLDATA_PKT:
509         case HCI_SCODATA_PKT:
510         case HCI_EVENT_PKT:
511                 bt_cb(skb)->pkt_type = type;
512                 skb->dev = (void *)hdev;
513                 skb_put(skb, buf_len);
514                 skb_pull(skb, SDIO_HEADER_LEN);
515
516                 if (type == HCI_EVENT_PKT)
517                         btmrvl_check_evtpkt(priv, skb);
518
519                 hci_recv_frame(skb);
520                 hdev->stat.byte_rx += buf_len;
521                 break;
522
523         case MRVL_VENDOR_PKT:
524                 bt_cb(skb)->pkt_type = HCI_VENDOR_PKT;
525                 skb->dev = (void *)hdev;
526                 skb_put(skb, buf_len);
527                 skb_pull(skb, SDIO_HEADER_LEN);
528
529                 if (btmrvl_process_event(priv, skb))
530                         hci_recv_frame(skb);
531
532                 hdev->stat.byte_rx += buf_len;
533                 break;
534
535         default:
536                 BT_ERR("Unknow packet type:%d", type);
537                 print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, payload,
538                                                 blksz * buf_block_len);
539
540                 kfree_skb(skb);
541                 skb = NULL;
542                 break;
543         }
544
545 exit:
546         if (ret) {
547                 hdev->stat.err_rx++;
548                 if (skb)
549                         kfree_skb(skb);
550         }
551
552         return ret;
553 }
554
555 static int btmrvl_sdio_get_int_status(struct btmrvl_private *priv, u8 * ireg)
556 {
557         int ret;
558         u8 sdio_ireg = 0;
559         struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
560
561         *ireg = 0;
562
563         sdio_ireg = sdio_readb(card->func, HOST_INTSTATUS_REG, &ret);
564         if (ret) {
565                 BT_ERR("sdio_readb: read int status register failed");
566                 ret = -EIO;
567                 goto done;
568         }
569
570         if (sdio_ireg != 0) {
571                 /*
572                  * DN_LD_HOST_INT_STATUS and/or UP_LD_HOST_INT_STATUS
573                  * Clear the interrupt status register and re-enable the
574                  * interrupt.
575                  */
576                 BT_DBG("sdio_ireg = 0x%x", sdio_ireg);
577
578                 sdio_writeb(card->func, ~(sdio_ireg) & (DN_LD_HOST_INT_STATUS |
579                                                         UP_LD_HOST_INT_STATUS),
580                             HOST_INTSTATUS_REG, &ret);
581                 if (ret) {
582                         BT_ERR("sdio_writeb: clear int status register "
583                                 "failed");
584                         ret = -EIO;
585                         goto done;
586                 }
587         }
588
589         if (sdio_ireg & DN_LD_HOST_INT_STATUS) {
590                 if (priv->btmrvl_dev.tx_dnld_rdy)
591                         BT_DBG("tx_done already received: "
592                                 " int_status=0x%x", sdio_ireg);
593                 else
594                         priv->btmrvl_dev.tx_dnld_rdy = true;
595         }
596
597         if (sdio_ireg & UP_LD_HOST_INT_STATUS)
598                 btmrvl_sdio_card_to_host(priv);
599
600         *ireg = sdio_ireg;
601
602         ret = 0;
603
604 done:
605         return ret;
606 }
607
608 static void btmrvl_sdio_interrupt(struct sdio_func *func)
609 {
610         struct btmrvl_private *priv;
611         struct hci_dev *hcidev;
612         struct btmrvl_sdio_card *card;
613         u8 ireg = 0;
614
615         card = sdio_get_drvdata(func);
616         if (card && card->priv) {
617                 priv = card->priv;
618                 hcidev = priv->btmrvl_dev.hcidev;
619
620                 if (btmrvl_sdio_get_int_status(priv, &ireg))
621                         BT_ERR("reading HOST_INT_STATUS_REG failed");
622                 else
623                         BT_DBG("HOST_INT_STATUS_REG %#x", ireg);
624
625                 btmrvl_interrupt(priv);
626         }
627 }
628
629 static int btmrvl_sdio_register_dev(struct btmrvl_sdio_card *card)
630 {
631         struct sdio_func *func;
632         u8 reg;
633         int ret = 0;
634
635         if (!card || !card->func) {
636                 BT_ERR("Error: card or function is NULL!");
637                 ret = -EINVAL;
638                 goto failed;
639         }
640
641         func = card->func;
642
643         sdio_claim_host(func);
644
645         ret = sdio_enable_func(func);
646         if (ret) {
647                 BT_ERR("sdio_enable_func() failed: ret=%d", ret);
648                 ret = -EIO;
649                 goto release_host;
650         }
651
652         ret = sdio_claim_irq(func, btmrvl_sdio_interrupt);
653         if (ret) {
654                 BT_ERR("sdio_claim_irq failed: ret=%d", ret);
655                 ret = -EIO;
656                 goto disable_func;
657         }
658
659         ret = sdio_set_block_size(card->func, SDIO_BLOCK_SIZE);
660         if (ret) {
661                 BT_ERR("cannot set SDIO block size");
662                 ret = -EIO;
663                 goto release_irq;
664         }
665
666         reg = sdio_readb(func, IO_PORT_0_REG, &ret);
667         if (ret < 0) {
668                 ret = -EIO;
669                 goto release_irq;
670         }
671
672         card->ioport = reg;
673
674         reg = sdio_readb(func, IO_PORT_1_REG, &ret);
675         if (ret < 0) {
676                 ret = -EIO;
677                 goto release_irq;
678         }
679
680         card->ioport |= (reg << 8);
681
682         reg = sdio_readb(func, IO_PORT_2_REG, &ret);
683         if (ret < 0) {
684                 ret = -EIO;
685                 goto release_irq;
686         }
687
688         card->ioport |= (reg << 16);
689
690         BT_DBG("SDIO FUNC%d IO port: 0x%x", func->num, card->ioport);
691
692         sdio_set_drvdata(func, card);
693
694         sdio_release_host(func);
695
696         return 0;
697
698 release_irq:
699         sdio_release_irq(func);
700
701 disable_func:
702         sdio_disable_func(func);
703
704 release_host:
705         sdio_release_host(func);
706
707 failed:
708         return ret;
709 }
710
711 static int btmrvl_sdio_unregister_dev(struct btmrvl_sdio_card *card)
712 {
713         if (card && card->func) {
714                 sdio_claim_host(card->func);
715                 sdio_release_irq(card->func);
716                 sdio_disable_func(card->func);
717                 sdio_release_host(card->func);
718                 sdio_set_drvdata(card->func, NULL);
719         }
720
721         return 0;
722 }
723
724 static int btmrvl_sdio_enable_host_int(struct btmrvl_sdio_card *card)
725 {
726         int ret;
727
728         if (!card || !card->func)
729                 return -EINVAL;
730
731         sdio_claim_host(card->func);
732
733         ret = btmrvl_sdio_enable_host_int_mask(card, HIM_ENABLE);
734
735         btmrvl_sdio_get_rx_unit(card);
736
737         sdio_release_host(card->func);
738
739         return ret;
740 }
741
742 static int btmrvl_sdio_disable_host_int(struct btmrvl_sdio_card *card)
743 {
744         int ret;
745
746         if (!card || !card->func)
747                 return -EINVAL;
748
749         sdio_claim_host(card->func);
750
751         ret = btmrvl_sdio_disable_host_int_mask(card, HIM_DISABLE);
752
753         sdio_release_host(card->func);
754
755         return ret;
756 }
757
758 static int btmrvl_sdio_host_to_card(struct btmrvl_private *priv,
759                                 u8 *payload, u16 nb)
760 {
761         struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
762         int ret = 0;
763         int buf_block_len;
764         int blksz;
765         int i = 0;
766         u8 *buf = NULL;
767         void *tmpbuf = NULL;
768         int tmpbufsz;
769
770         if (!card || !card->func) {
771                 BT_ERR("card or function is NULL!");
772                 return -EINVAL;
773         }
774
775         buf = payload;
776         if ((u32) payload & (BTSDIO_DMA_ALIGN - 1)) {
777                 tmpbufsz = ALIGN_SZ(nb, BTSDIO_DMA_ALIGN);
778                 tmpbuf = kmalloc(tmpbufsz, GFP_KERNEL);
779                 memset(tmpbuf, 0, tmpbufsz);
780                 buf = (u8 *) ALIGN_ADDR(tmpbuf, BTSDIO_DMA_ALIGN);
781                 memcpy(buf, payload, nb);
782         }
783
784         blksz = SDIO_BLOCK_SIZE;
785         buf_block_len = (nb + blksz - 1) / blksz;
786
787         sdio_claim_host(card->func);
788
789         do {
790                 /* Transfer data to card */
791                 ret = sdio_writesb(card->func, card->ioport, buf,
792                                    buf_block_len * blksz);
793                 if (ret < 0) {
794                         i++;
795                         BT_ERR("i=%d writesb failed: %d", i, ret);
796                         print_hex_dump_bytes("", DUMP_PREFIX_OFFSET,
797                                                 payload, nb);
798                         ret = -EIO;
799                         if (i > MAX_WRITE_IOMEM_RETRY)
800                                 goto exit;
801                 }
802         } while (ret);
803
804         priv->btmrvl_dev.tx_dnld_rdy = false;
805
806 exit:
807         sdio_release_host(card->func);
808
809         return ret;
810 }
811
812 static int btmrvl_sdio_download_fw(struct btmrvl_sdio_card *card)
813 {
814         int ret = 0;
815
816         if (!card || !card->func) {
817                 BT_ERR("card or function is NULL!");
818                 return -EINVAL;
819         }
820         sdio_claim_host(card->func);
821
822         if (!btmrvl_sdio_verify_fw_download(card, 1)) {
823                 BT_DBG("Firmware already downloaded!");
824                 goto done;
825         }
826
827         ret = btmrvl_sdio_download_helper(card);
828         if (ret) {
829                 BT_ERR("Failed to download helper!");
830                 ret = -EIO;
831                 goto done;
832         }
833
834         if (btmrvl_sdio_download_fw_w_helper(card)) {
835                 BT_ERR("Failed to download firmware!");
836                 ret = -EIO;
837                 goto done;
838         }
839
840         if (btmrvl_sdio_verify_fw_download(card, MAX_POLL_TRIES)) {
841                 BT_ERR("FW failed to be active in time!");
842                 ret = -ETIMEDOUT;
843                 goto done;
844         }
845
846 done:
847         sdio_release_host(card->func);
848
849         return ret;
850 }
851
852 static int btmrvl_sdio_wakeup_fw(struct btmrvl_private *priv)
853 {
854         struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
855         int ret = 0;
856
857         if (!card || !card->func) {
858                 BT_ERR("card or function is NULL!");
859                 return -EINVAL;
860         }
861
862         sdio_claim_host(card->func);
863
864         sdio_writeb(card->func, HOST_POWER_UP, CONFIG_REG, &ret);
865
866         sdio_release_host(card->func);
867
868         BT_DBG("wake up firmware");
869
870         return ret;
871 }
872
873 static int btmrvl_sdio_probe(struct sdio_func *func,
874                                         const struct sdio_device_id *id)
875 {
876         int ret = 0;
877         struct btmrvl_private *priv = NULL;
878         struct btmrvl_sdio_card *card = NULL;
879
880         BT_INFO("vendor=0x%x, device=0x%x, class=%d, fn=%d",
881                         id->vendor, id->device, id->class, func->num);
882
883         card = kzalloc(sizeof(*card), GFP_KERNEL);
884         if (!card) {
885                 ret = -ENOMEM;
886                 goto done;
887         }
888
889         card->func = func;
890
891         if (id->driver_data) {
892                 struct btmrvl_sdio_device *data = (void *) id->driver_data;
893                 card->helper   = data->helper;
894                 card->firmware = data->firmware;
895         }
896
897         if (btmrvl_sdio_register_dev(card) < 0) {
898                 BT_ERR("Failed to register BT device!");
899                 ret = -ENODEV;
900                 goto free_card;
901         }
902
903         /* Disable the interrupts on the card */
904         btmrvl_sdio_disable_host_int(card);
905
906         if (btmrvl_sdio_download_fw(card)) {
907                 BT_ERR("Downloading firmware failed!");
908                 ret = -ENODEV;
909                 goto unreg_dev;
910         }
911
912         msleep(100);
913
914         btmrvl_sdio_enable_host_int(card);
915
916         priv = btmrvl_add_card(card);
917         if (!priv) {
918                 BT_ERR("Initializing card failed!");
919                 ret = -ENODEV;
920                 goto disable_host_int;
921         }
922
923         card->priv = priv;
924
925         /* Initialize the interface specific function pointers */
926         priv->hw_host_to_card = btmrvl_sdio_host_to_card;
927         priv->hw_wakeup_firmware = btmrvl_sdio_wakeup_fw;
928
929         btmrvl_send_module_cfg_cmd(priv, MODULE_BRINGUP_REQ);
930
931         return 0;
932
933 disable_host_int:
934         btmrvl_sdio_disable_host_int(card);
935 unreg_dev:
936         btmrvl_sdio_unregister_dev(card);
937 free_card:
938         kfree(card);
939 done:
940         return ret;
941 }
942
943 static void btmrvl_sdio_remove(struct sdio_func *func)
944 {
945         struct btmrvl_sdio_card *card;
946
947         if (func) {
948                 card = sdio_get_drvdata(func);
949                 if (card) {
950                         /* Send SHUTDOWN command & disable interrupt
951                          * if user removes the module.
952                          */
953                         if (user_rmmod) {
954                                 btmrvl_send_module_cfg_cmd(card->priv,
955                                                         MODULE_SHUTDOWN_REQ);
956                                 btmrvl_sdio_disable_host_int(card);
957                         }
958                         BT_DBG("unregester dev");
959                         btmrvl_sdio_unregister_dev(card);
960                         btmrvl_remove_card(card->priv);
961                         kfree(card);
962                 }
963         }
964 }
965
966 static struct sdio_driver bt_mrvl_sdio = {
967         .name           = "btmrvl_sdio",
968         .id_table       = btmrvl_sdio_ids,
969         .probe          = btmrvl_sdio_probe,
970         .remove         = btmrvl_sdio_remove,
971 };
972
973 static int btmrvl_sdio_init_module(void)
974 {
975         if (sdio_register_driver(&bt_mrvl_sdio) != 0) {
976                 BT_ERR("SDIO Driver Registration Failed");
977                 return -ENODEV;
978         }
979
980         /* Clear the flag in case user removes the card. */
981         user_rmmod = 0;
982
983         return 0;
984 }
985
986 static void btmrvl_sdio_exit_module(void)
987 {
988         /* Set the flag as user is removing this module. */
989         user_rmmod = 1;
990
991         sdio_unregister_driver(&bt_mrvl_sdio);
992 }
993
994 module_init(btmrvl_sdio_init_module);
995 module_exit(btmrvl_sdio_exit_module);
996
997 MODULE_AUTHOR("Marvell International Ltd.");
998 MODULE_DESCRIPTION("Marvell BT-over-SDIO driver ver " VERSION);
999 MODULE_VERSION(VERSION);
1000 MODULE_LICENSE("GPL v2");