0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0026
0027 #include <linux/kernel.h>
0028 #include <linux/module.h>
0029 #include <linux/slab.h>
0030 #include <linux/firmware.h>
0031 #include <linux/netdevice.h>
0032 #include <linux/delay.h>
0033 #include <linux/mmc/card.h>
0034 #include <linux/mmc/sdio_func.h>
0035 #include <linux/mmc/sdio_ids.h>
0036 #include <linux/mmc/sdio.h>
0037 #include <linux/mmc/host.h>
0038 #include <linux/pm_runtime.h>
0039
0040 #include "host.h"
0041 #include "decl.h"
0042 #include "defs.h"
0043 #include "dev.h"
0044 #include "cmd.h"
0045 #include "if_sdio.h"
0046
0047 static void if_sdio_interrupt(struct sdio_func *func);
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062 static u8 user_rmmod;
0063
0064 static const struct sdio_device_id if_sdio_ids[] = {
0065 { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL,
0066 SDIO_DEVICE_ID_MARVELL_LIBERTAS) },
0067 { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL,
0068 SDIO_DEVICE_ID_MARVELL_8688_WLAN) },
0069 { },
0070 };
0071
0072 MODULE_DEVICE_TABLE(sdio, if_sdio_ids);
0073
0074 #define MODEL_8385 0x04
0075 #define MODEL_8686 0x0b
0076 #define MODEL_8688 0x10
0077
0078 static const struct lbs_fw_table fw_table[] = {
0079 { MODEL_8385, "libertas/sd8385_helper.bin", "libertas/sd8385.bin" },
0080 { MODEL_8385, "sd8385_helper.bin", "sd8385.bin" },
0081 { MODEL_8686, "libertas/sd8686_v9_helper.bin", "libertas/sd8686_v9.bin" },
0082 { MODEL_8686, "libertas/sd8686_v8_helper.bin", "libertas/sd8686_v8.bin" },
0083 { MODEL_8686, "sd8686_helper.bin", "sd8686.bin" },
0084 { MODEL_8688, "libertas/sd8688_helper.bin", "libertas/sd8688.bin" },
0085 { MODEL_8688, "sd8688_helper.bin", "sd8688.bin" },
0086 { 0, NULL, NULL }
0087 };
0088 MODULE_FIRMWARE("libertas/sd8385_helper.bin");
0089 MODULE_FIRMWARE("libertas/sd8385.bin");
0090 MODULE_FIRMWARE("sd8385_helper.bin");
0091 MODULE_FIRMWARE("sd8385.bin");
0092 MODULE_FIRMWARE("libertas/sd8686_v9_helper.bin");
0093 MODULE_FIRMWARE("libertas/sd8686_v9.bin");
0094 MODULE_FIRMWARE("libertas/sd8686_v8_helper.bin");
0095 MODULE_FIRMWARE("libertas/sd8686_v8.bin");
0096 MODULE_FIRMWARE("sd8686_helper.bin");
0097 MODULE_FIRMWARE("sd8686.bin");
0098 MODULE_FIRMWARE("libertas/sd8688_helper.bin");
0099 MODULE_FIRMWARE("libertas/sd8688.bin");
0100 MODULE_FIRMWARE("sd8688_helper.bin");
0101 MODULE_FIRMWARE("sd8688.bin");
0102
0103 struct if_sdio_packet {
0104 struct if_sdio_packet *next;
0105 u16 nb;
0106 u8 buffer[] __aligned(4);
0107 };
0108
0109 struct if_sdio_card {
0110 struct sdio_func *func;
0111 struct lbs_private *priv;
0112
0113 int model;
0114 unsigned long ioport;
0115 unsigned int scratch_reg;
0116 bool started;
0117 wait_queue_head_t pwron_waitq;
0118
0119 u8 buffer[65536] __attribute__((aligned(4)));
0120
0121 spinlock_t lock;
0122 struct if_sdio_packet *packets;
0123
0124 struct workqueue_struct *workqueue;
0125 struct work_struct packet_worker;
0126
0127 u8 rx_unit;
0128 };
0129
0130 static void if_sdio_finish_power_on(struct if_sdio_card *card);
0131 static int if_sdio_power_off(struct if_sdio_card *card);
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143 static u16 if_sdio_read_scratch(struct if_sdio_card *card, int *err)
0144 {
0145 int ret;
0146 u16 scratch;
0147
0148 scratch = sdio_readb(card->func, card->scratch_reg, &ret);
0149 if (!ret)
0150 scratch |= sdio_readb(card->func, card->scratch_reg + 1,
0151 &ret) << 8;
0152
0153 if (err)
0154 *err = ret;
0155
0156 if (ret)
0157 return 0xffff;
0158
0159 return scratch;
0160 }
0161
0162 static u8 if_sdio_read_rx_unit(struct if_sdio_card *card)
0163 {
0164 int ret;
0165 u8 rx_unit;
0166
0167 rx_unit = sdio_readb(card->func, IF_SDIO_RX_UNIT, &ret);
0168
0169 if (ret)
0170 rx_unit = 0;
0171
0172 return rx_unit;
0173 }
0174
0175 static u16 if_sdio_read_rx_len(struct if_sdio_card *card, int *err)
0176 {
0177 int ret;
0178 u16 rx_len;
0179
0180 switch (card->model) {
0181 case MODEL_8385:
0182 case MODEL_8686:
0183 rx_len = if_sdio_read_scratch(card, &ret);
0184 break;
0185 case MODEL_8688:
0186 default:
0187 rx_len = sdio_readb(card->func, IF_SDIO_RX_LEN, &ret);
0188 if (!ret)
0189 rx_len <<= card->rx_unit;
0190 else
0191 rx_len = 0xffff;
0192
0193 break;
0194 }
0195
0196 if (err)
0197 *err = ret;
0198
0199 return rx_len;
0200 }
0201
0202 static int if_sdio_handle_cmd(struct if_sdio_card *card,
0203 u8 *buffer, unsigned size)
0204 {
0205 struct lbs_private *priv = card->priv;
0206 int ret;
0207 unsigned long flags;
0208 u8 i;
0209
0210 if (size > LBS_CMD_BUFFER_SIZE) {
0211 lbs_deb_sdio("response packet too large (%d bytes)\n",
0212 (int)size);
0213 ret = -E2BIG;
0214 goto out;
0215 }
0216
0217 spin_lock_irqsave(&priv->driver_lock, flags);
0218
0219 i = (priv->resp_idx == 0) ? 1 : 0;
0220 BUG_ON(priv->resp_len[i]);
0221 priv->resp_len[i] = size;
0222 memcpy(priv->resp_buf[i], buffer, size);
0223 lbs_notify_command_response(priv, i);
0224
0225 spin_unlock_irqrestore(&priv->driver_lock, flags);
0226
0227 ret = 0;
0228
0229 out:
0230 return ret;
0231 }
0232
0233 static int if_sdio_handle_data(struct if_sdio_card *card,
0234 u8 *buffer, unsigned size)
0235 {
0236 int ret;
0237 struct sk_buff *skb;
0238
0239 if (size > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE) {
0240 lbs_deb_sdio("response packet too large (%d bytes)\n",
0241 (int)size);
0242 ret = -E2BIG;
0243 goto out;
0244 }
0245
0246 skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE + NET_IP_ALIGN);
0247 if (!skb) {
0248 ret = -ENOMEM;
0249 goto out;
0250 }
0251
0252 skb_reserve(skb, NET_IP_ALIGN);
0253
0254 skb_put_data(skb, buffer, size);
0255
0256 lbs_process_rxed_packet(card->priv, skb);
0257
0258 ret = 0;
0259
0260 out:
0261 return ret;
0262 }
0263
0264 static int if_sdio_handle_event(struct if_sdio_card *card,
0265 u8 *buffer, unsigned size)
0266 {
0267 int ret;
0268 u32 event;
0269
0270 if (card->model == MODEL_8385) {
0271 event = sdio_readb(card->func, IF_SDIO_EVENT, &ret);
0272 if (ret)
0273 goto out;
0274
0275
0276 event >>= 3;
0277 } else {
0278 if (size < 4) {
0279 lbs_deb_sdio("event packet too small (%d bytes)\n",
0280 (int)size);
0281 ret = -EINVAL;
0282 goto out;
0283 }
0284 event = buffer[3] << 24;
0285 event |= buffer[2] << 16;
0286 event |= buffer[1] << 8;
0287 event |= buffer[0] << 0;
0288 }
0289
0290 lbs_queue_event(card->priv, event & 0xFF);
0291 ret = 0;
0292
0293 out:
0294 return ret;
0295 }
0296
0297 static int if_sdio_wait_status(struct if_sdio_card *card, const u8 condition)
0298 {
0299 u8 status;
0300 unsigned long timeout;
0301 int ret = 0;
0302
0303 timeout = jiffies + HZ;
0304 while (1) {
0305 status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
0306 if (ret)
0307 return ret;
0308 if ((status & condition) == condition)
0309 break;
0310 if (time_after(jiffies, timeout))
0311 return -ETIMEDOUT;
0312 mdelay(1);
0313 }
0314 return ret;
0315 }
0316
0317 static int if_sdio_card_to_host(struct if_sdio_card *card)
0318 {
0319 int ret;
0320 u16 size, type, chunk;
0321
0322 size = if_sdio_read_rx_len(card, &ret);
0323 if (ret)
0324 goto out;
0325
0326 if (size < 4) {
0327 lbs_deb_sdio("invalid packet size (%d bytes) from firmware\n",
0328 (int)size);
0329 ret = -EINVAL;
0330 goto out;
0331 }
0332
0333 ret = if_sdio_wait_status(card, IF_SDIO_IO_RDY);
0334 if (ret)
0335 goto out;
0336
0337
0338
0339
0340
0341
0342 chunk = sdio_align_size(card->func, size);
0343
0344 ret = sdio_readsb(card->func, card->buffer, card->ioport, chunk);
0345 if (ret)
0346 goto out;
0347
0348 chunk = card->buffer[0] | (card->buffer[1] << 8);
0349 type = card->buffer[2] | (card->buffer[3] << 8);
0350
0351 lbs_deb_sdio("packet of type %d and size %d bytes\n",
0352 (int)type, (int)chunk);
0353
0354 if (chunk > size) {
0355 lbs_deb_sdio("packet fragment (%d > %d)\n",
0356 (int)chunk, (int)size);
0357 ret = -EINVAL;
0358 goto out;
0359 }
0360
0361 if (chunk < size) {
0362 lbs_deb_sdio("packet fragment (%d < %d)\n",
0363 (int)chunk, (int)size);
0364 }
0365
0366 switch (type) {
0367 case MVMS_CMD:
0368 ret = if_sdio_handle_cmd(card, card->buffer + 4, chunk - 4);
0369 if (ret)
0370 goto out;
0371 break;
0372 case MVMS_DAT:
0373 ret = if_sdio_handle_data(card, card->buffer + 4, chunk - 4);
0374 if (ret)
0375 goto out;
0376 break;
0377 case MVMS_EVENT:
0378 ret = if_sdio_handle_event(card, card->buffer + 4, chunk - 4);
0379 if (ret)
0380 goto out;
0381 break;
0382 default:
0383 lbs_deb_sdio("invalid type (%d) from firmware\n",
0384 (int)type);
0385 ret = -EINVAL;
0386 goto out;
0387 }
0388
0389 out:
0390 if (ret)
0391 pr_err("problem fetching packet from firmware\n");
0392
0393 return ret;
0394 }
0395
0396 static void if_sdio_host_to_card_worker(struct work_struct *work)
0397 {
0398 struct if_sdio_card *card;
0399 struct if_sdio_packet *packet;
0400 int ret;
0401 unsigned long flags;
0402
0403 card = container_of(work, struct if_sdio_card, packet_worker);
0404
0405 while (1) {
0406 spin_lock_irqsave(&card->lock, flags);
0407 packet = card->packets;
0408 if (packet)
0409 card->packets = packet->next;
0410 spin_unlock_irqrestore(&card->lock, flags);
0411
0412 if (!packet)
0413 break;
0414
0415 sdio_claim_host(card->func);
0416
0417 ret = if_sdio_wait_status(card, IF_SDIO_IO_RDY);
0418 if (ret == 0) {
0419 ret = sdio_writesb(card->func, card->ioport,
0420 packet->buffer, packet->nb);
0421 }
0422
0423 if (ret)
0424 pr_err("error %d sending packet to firmware\n", ret);
0425
0426 sdio_release_host(card->func);
0427
0428 kfree(packet);
0429 }
0430 }
0431
0432
0433
0434
0435
0436 #define FW_DL_READY_STATUS (IF_SDIO_IO_RDY | IF_SDIO_DL_RDY)
0437
0438 static int if_sdio_prog_helper(struct if_sdio_card *card,
0439 const struct firmware *fw)
0440 {
0441 int ret;
0442 unsigned long timeout;
0443 u8 *chunk_buffer;
0444 u32 chunk_size;
0445 const u8 *firmware;
0446 size_t size;
0447
0448 chunk_buffer = kzalloc(64, GFP_KERNEL);
0449 if (!chunk_buffer) {
0450 ret = -ENOMEM;
0451 goto out;
0452 }
0453
0454 sdio_claim_host(card->func);
0455
0456 ret = sdio_set_block_size(card->func, 32);
0457 if (ret)
0458 goto release;
0459
0460 firmware = fw->data;
0461 size = fw->size;
0462
0463 while (size) {
0464 ret = if_sdio_wait_status(card, FW_DL_READY_STATUS);
0465 if (ret)
0466 goto release;
0467
0468
0469
0470
0471 mdelay(2);
0472
0473 chunk_size = min_t(size_t, size, 60);
0474
0475 *((__le32*)chunk_buffer) = cpu_to_le32(chunk_size);
0476 memcpy(chunk_buffer + 4, firmware, chunk_size);
0477
0478
0479
0480 ret = sdio_writesb(card->func, card->ioport,
0481 chunk_buffer, 64);
0482 if (ret)
0483 goto release;
0484
0485 firmware += chunk_size;
0486 size -= chunk_size;
0487 }
0488
0489
0490 memset(chunk_buffer, 0, 4);
0491 ret = sdio_writesb(card->func, card->ioport, chunk_buffer, 64);
0492 if (ret)
0493 goto release;
0494
0495 lbs_deb_sdio("waiting for helper to boot...\n");
0496
0497
0498 timeout = jiffies + HZ;
0499 while (1) {
0500 u16 req_size;
0501
0502 req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret);
0503 if (ret)
0504 goto release;
0505
0506 req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1, &ret) << 8;
0507 if (ret)
0508 goto release;
0509
0510 if (req_size != 0)
0511 break;
0512
0513 if (time_after(jiffies, timeout)) {
0514 ret = -ETIMEDOUT;
0515 goto release;
0516 }
0517
0518 msleep(10);
0519 }
0520
0521 ret = 0;
0522
0523 release:
0524 sdio_release_host(card->func);
0525 kfree(chunk_buffer);
0526
0527 out:
0528 if (ret)
0529 pr_err("failed to load helper firmware\n");
0530
0531 return ret;
0532 }
0533
0534 static int if_sdio_prog_real(struct if_sdio_card *card,
0535 const struct firmware *fw)
0536 {
0537 int ret;
0538 unsigned long timeout;
0539 u8 *chunk_buffer;
0540 u32 chunk_size;
0541 const u8 *firmware;
0542 size_t size, req_size;
0543
0544 chunk_buffer = kzalloc(512, GFP_KERNEL);
0545 if (!chunk_buffer) {
0546 ret = -ENOMEM;
0547 goto out;
0548 }
0549
0550 sdio_claim_host(card->func);
0551
0552 ret = sdio_set_block_size(card->func, 32);
0553 if (ret)
0554 goto release;
0555
0556 firmware = fw->data;
0557 size = fw->size;
0558
0559 while (size) {
0560 timeout = jiffies + HZ;
0561 while (1) {
0562 ret = if_sdio_wait_status(card, FW_DL_READY_STATUS);
0563 if (ret)
0564 goto release;
0565
0566 req_size = sdio_readb(card->func, IF_SDIO_RD_BASE,
0567 &ret);
0568 if (ret)
0569 goto release;
0570
0571 req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1,
0572 &ret) << 8;
0573 if (ret)
0574 goto release;
0575
0576
0577
0578
0579
0580
0581
0582
0583 if ((size != fw->size) || (req_size > 2))
0584 break;
0585 if (time_after(jiffies, timeout)) {
0586 ret = -ETIMEDOUT;
0587 goto release;
0588 }
0589 mdelay(1);
0590 }
0591
0592
0593
0594
0595 if (req_size == 0) {
0596 lbs_deb_sdio("firmware helper gave up early\n");
0597 ret = -EIO;
0598 goto release;
0599 }
0600
0601 if (req_size & 0x01) {
0602 lbs_deb_sdio("firmware helper signalled error\n");
0603 ret = -EIO;
0604 goto release;
0605 }
0606
0607 if (req_size > size)
0608 req_size = size;
0609
0610 while (req_size) {
0611 chunk_size = min_t(size_t, req_size, 512);
0612
0613 memcpy(chunk_buffer, firmware, chunk_size);
0614
0615
0616
0617
0618 ret = sdio_writesb(card->func, card->ioport,
0619 chunk_buffer, roundup(chunk_size, 32));
0620 if (ret)
0621 goto release;
0622
0623 firmware += chunk_size;
0624 size -= chunk_size;
0625 req_size -= chunk_size;
0626 }
0627 }
0628
0629 ret = 0;
0630
0631 lbs_deb_sdio("waiting for firmware to boot...\n");
0632
0633
0634 timeout = jiffies + HZ;
0635 while (1) {
0636 u16 scratch;
0637
0638 scratch = if_sdio_read_scratch(card, &ret);
0639 if (ret)
0640 goto release;
0641
0642 if (scratch == IF_SDIO_FIRMWARE_OK)
0643 break;
0644
0645 if (time_after(jiffies, timeout)) {
0646 ret = -ETIMEDOUT;
0647 goto release;
0648 }
0649
0650 msleep(10);
0651 }
0652
0653 ret = 0;
0654
0655 release:
0656 sdio_release_host(card->func);
0657 kfree(chunk_buffer);
0658
0659 out:
0660 if (ret)
0661 pr_err("failed to load firmware\n");
0662
0663 return ret;
0664 }
0665
0666 static void if_sdio_do_prog_firmware(struct lbs_private *priv, int ret,
0667 const struct firmware *helper,
0668 const struct firmware *mainfw)
0669 {
0670 struct if_sdio_card *card = priv->card;
0671
0672 if (ret) {
0673 pr_err("failed to find firmware (%d)\n", ret);
0674 return;
0675 }
0676
0677 ret = if_sdio_prog_helper(card, helper);
0678 if (ret)
0679 return;
0680
0681 lbs_deb_sdio("Helper firmware loaded\n");
0682
0683 ret = if_sdio_prog_real(card, mainfw);
0684 if (ret)
0685 return;
0686
0687 lbs_deb_sdio("Firmware loaded\n");
0688 if_sdio_finish_power_on(card);
0689 }
0690
0691 static int if_sdio_prog_firmware(struct if_sdio_card *card)
0692 {
0693 int ret;
0694 u16 scratch;
0695
0696
0697
0698
0699 sdio_claim_host(card->func);
0700 sdio_writeb(card->func, 0x00, IF_SDIO_H_INT_MASK, &ret);
0701 sdio_release_host(card->func);
0702
0703 sdio_claim_host(card->func);
0704 scratch = if_sdio_read_scratch(card, &ret);
0705 sdio_release_host(card->func);
0706
0707 lbs_deb_sdio("firmware status = %#x\n", scratch);
0708 lbs_deb_sdio("scratch ret = %d\n", ret);
0709
0710 if (ret)
0711 goto out;
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722
0723
0724 if (scratch == IF_SDIO_FIRMWARE_OK) {
0725 lbs_deb_sdio("firmware already loaded\n");
0726 if_sdio_finish_power_on(card);
0727 return 0;
0728 } else if ((card->model == MODEL_8686) && (scratch & 0x7fff)) {
0729 lbs_deb_sdio("firmware may be running\n");
0730 if_sdio_finish_power_on(card);
0731 return 0;
0732 }
0733
0734 ret = lbs_get_firmware_async(card->priv, &card->func->dev, card->model,
0735 fw_table, if_sdio_do_prog_firmware);
0736
0737 out:
0738 return ret;
0739 }
0740
0741
0742
0743
0744
0745
0746 static void if_sdio_finish_power_on(struct if_sdio_card *card)
0747 {
0748 struct sdio_func *func = card->func;
0749 struct lbs_private *priv = card->priv;
0750 int ret;
0751
0752 sdio_claim_host(func);
0753 sdio_set_block_size(card->func, IF_SDIO_BLOCK_SIZE);
0754
0755
0756
0757
0758
0759 if ((card->model != MODEL_8385)
0760 && (card->model != MODEL_8686))
0761 card->rx_unit = if_sdio_read_rx_unit(card);
0762 else
0763 card->rx_unit = 0;
0764
0765
0766
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776 ret = sdio_claim_irq(func, if_sdio_interrupt);
0777 if (ret)
0778 goto release;
0779
0780
0781
0782
0783 sdio_writeb(func, 0x0f, IF_SDIO_H_INT_MASK, &ret);
0784 if (ret)
0785 goto release_irq;
0786
0787 sdio_release_host(func);
0788
0789
0790
0791
0792 priv->fw_ready = 1;
0793
0794
0795
0796
0797 if (card->model == MODEL_8688) {
0798 struct cmd_header cmd;
0799
0800 memset(&cmd, 0, sizeof(cmd));
0801
0802 lbs_deb_sdio("send function INIT command\n");
0803 if (__lbs_cmd(priv, CMD_FUNC_INIT, &cmd, sizeof(cmd),
0804 lbs_cmd_copyback, (unsigned long) &cmd))
0805 netdev_alert(priv->dev, "CMD_FUNC_INIT cmd failed\n");
0806 }
0807
0808 wake_up(&card->pwron_waitq);
0809
0810 if (!card->started) {
0811 ret = lbs_start_card(priv);
0812 if_sdio_power_off(card);
0813 if (ret == 0) {
0814 card->started = true;
0815
0816
0817 pm_runtime_put(&func->dev);
0818 }
0819 }
0820
0821 return;
0822
0823 release_irq:
0824 sdio_release_irq(func);
0825 release:
0826 sdio_release_host(func);
0827 }
0828
0829 static int if_sdio_power_on(struct if_sdio_card *card)
0830 {
0831 struct sdio_func *func = card->func;
0832 struct mmc_host *host = func->card->host;
0833 int ret;
0834
0835 sdio_claim_host(func);
0836
0837 ret = sdio_enable_func(func);
0838 if (ret)
0839 goto release;
0840
0841
0842
0843
0844 if ((card->model == MODEL_8686) &&
0845 (host->caps & MMC_CAP_SDIO_IRQ) &&
0846 (host->ios.bus_width == MMC_BUS_WIDTH_1)) {
0847 u8 reg;
0848
0849 func->card->quirks |= MMC_QUIRK_LENIENT_FN0;
0850 reg = sdio_f0_readb(func, SDIO_CCCR_IF, &ret);
0851 if (ret)
0852 goto disable;
0853
0854 reg |= SDIO_BUS_ECSI;
0855 sdio_f0_writeb(func, reg, SDIO_CCCR_IF, &ret);
0856 if (ret)
0857 goto disable;
0858 }
0859
0860 card->ioport = sdio_readb(func, IF_SDIO_IOPORT, &ret);
0861 if (ret)
0862 goto disable;
0863
0864 card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 1, &ret) << 8;
0865 if (ret)
0866 goto disable;
0867
0868 card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 2, &ret) << 16;
0869 if (ret)
0870 goto disable;
0871
0872 sdio_release_host(func);
0873 ret = if_sdio_prog_firmware(card);
0874 if (ret) {
0875 sdio_claim_host(func);
0876 goto disable;
0877 }
0878
0879 return 0;
0880
0881 disable:
0882 sdio_disable_func(func);
0883 release:
0884 sdio_release_host(func);
0885 return ret;
0886 }
0887
0888 static int if_sdio_power_off(struct if_sdio_card *card)
0889 {
0890 struct sdio_func *func = card->func;
0891 struct lbs_private *priv = card->priv;
0892
0893 priv->fw_ready = 0;
0894
0895 sdio_claim_host(func);
0896 sdio_release_irq(func);
0897 sdio_disable_func(func);
0898 sdio_release_host(func);
0899 return 0;
0900 }
0901
0902
0903
0904
0905
0906
0907 static int if_sdio_host_to_card(struct lbs_private *priv,
0908 u8 type, u8 *buf, u16 nb)
0909 {
0910 int ret;
0911 struct if_sdio_card *card;
0912 struct if_sdio_packet *packet, *cur;
0913 u16 size;
0914 unsigned long flags;
0915
0916 card = priv->card;
0917
0918 if (nb > (65536 - sizeof(struct if_sdio_packet) - 4)) {
0919 ret = -EINVAL;
0920 goto out;
0921 }
0922
0923
0924
0925
0926
0927
0928 size = sdio_align_size(card->func, nb + 4);
0929
0930 packet = kzalloc(sizeof(struct if_sdio_packet) + size,
0931 GFP_ATOMIC);
0932 if (!packet) {
0933 ret = -ENOMEM;
0934 goto out;
0935 }
0936
0937 packet->next = NULL;
0938 packet->nb = size;
0939
0940
0941
0942
0943 packet->buffer[0] = (nb + 4) & 0xff;
0944 packet->buffer[1] = ((nb + 4) >> 8) & 0xff;
0945 packet->buffer[2] = type;
0946 packet->buffer[3] = 0;
0947
0948 memcpy(packet->buffer + 4, buf, nb);
0949
0950 spin_lock_irqsave(&card->lock, flags);
0951
0952 if (!card->packets)
0953 card->packets = packet;
0954 else {
0955 cur = card->packets;
0956 while (cur->next)
0957 cur = cur->next;
0958 cur->next = packet;
0959 }
0960
0961 switch (type) {
0962 case MVMS_CMD:
0963 priv->dnld_sent = DNLD_CMD_SENT;
0964 break;
0965 case MVMS_DAT:
0966 priv->dnld_sent = DNLD_DATA_SENT;
0967 break;
0968 default:
0969 lbs_deb_sdio("unknown packet type %d\n", (int)type);
0970 }
0971
0972 spin_unlock_irqrestore(&card->lock, flags);
0973
0974 queue_work(card->workqueue, &card->packet_worker);
0975
0976 ret = 0;
0977
0978 out:
0979 return ret;
0980 }
0981
0982 static int if_sdio_enter_deep_sleep(struct lbs_private *priv)
0983 {
0984 int ret;
0985 struct cmd_header cmd;
0986
0987 memset(&cmd, 0, sizeof(cmd));
0988
0989 lbs_deb_sdio("send DEEP_SLEEP command\n");
0990 ret = __lbs_cmd(priv, CMD_802_11_DEEP_SLEEP, &cmd, sizeof(cmd),
0991 lbs_cmd_copyback, (unsigned long) &cmd);
0992 if (ret)
0993 netdev_err(priv->dev, "DEEP_SLEEP cmd failed\n");
0994
0995 mdelay(200);
0996 return ret;
0997 }
0998
0999 static int if_sdio_exit_deep_sleep(struct lbs_private *priv)
1000 {
1001 struct if_sdio_card *card = priv->card;
1002 int ret = -1;
1003
1004 sdio_claim_host(card->func);
1005
1006 sdio_writeb(card->func, HOST_POWER_UP, CONFIGURATION_REG, &ret);
1007 if (ret)
1008 netdev_err(priv->dev, "sdio_writeb failed!\n");
1009
1010 sdio_release_host(card->func);
1011
1012 return ret;
1013 }
1014
1015 static int if_sdio_reset_deep_sleep_wakeup(struct lbs_private *priv)
1016 {
1017 struct if_sdio_card *card = priv->card;
1018 int ret = -1;
1019
1020 sdio_claim_host(card->func);
1021
1022 sdio_writeb(card->func, 0, CONFIGURATION_REG, &ret);
1023 if (ret)
1024 netdev_err(priv->dev, "sdio_writeb failed!\n");
1025
1026 sdio_release_host(card->func);
1027
1028 return ret;
1029
1030 }
1031
1032 static struct mmc_host *reset_host;
1033
1034 static void if_sdio_reset_card_worker(struct work_struct *work)
1035 {
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046 pr_info("Resetting card...");
1047 mmc_remove_host(reset_host);
1048 mmc_add_host(reset_host);
1049 }
1050 static DECLARE_WORK(card_reset_work, if_sdio_reset_card_worker);
1051
1052 static void if_sdio_reset_card(struct lbs_private *priv)
1053 {
1054 struct if_sdio_card *card = priv->card;
1055
1056 if (work_pending(&card_reset_work))
1057 return;
1058
1059 reset_host = card->func->card->host;
1060 schedule_work(&card_reset_work);
1061 }
1062
1063 static int if_sdio_power_save(struct lbs_private *priv)
1064 {
1065 struct if_sdio_card *card = priv->card;
1066 int ret;
1067
1068 flush_workqueue(card->workqueue);
1069
1070 ret = if_sdio_power_off(card);
1071
1072
1073 pm_runtime_put_sync(&card->func->dev);
1074
1075 return ret;
1076 }
1077
1078 static int if_sdio_power_restore(struct lbs_private *priv)
1079 {
1080 struct if_sdio_card *card = priv->card;
1081 int r;
1082
1083
1084 pm_runtime_get_sync(&card->func->dev);
1085
1086 r = if_sdio_power_on(card);
1087 if (r)
1088 return r;
1089
1090 wait_event(card->pwron_waitq, priv->fw_ready);
1091 return 0;
1092 }
1093
1094
1095
1096
1097
1098
1099 static void if_sdio_interrupt(struct sdio_func *func)
1100 {
1101 int ret;
1102 struct if_sdio_card *card;
1103 u8 cause;
1104
1105 card = sdio_get_drvdata(func);
1106
1107 cause = sdio_readb(card->func, IF_SDIO_H_INT_STATUS, &ret);
1108 if (ret || !cause)
1109 return;
1110
1111 lbs_deb_sdio("interrupt: 0x%X\n", (unsigned)cause);
1112
1113 sdio_writeb(card->func, ~cause, IF_SDIO_H_INT_STATUS, &ret);
1114 if (ret)
1115 return;
1116
1117
1118
1119
1120
1121 card->priv->is_activity_detected = 1;
1122 if (cause & IF_SDIO_H_INT_DNLD)
1123 lbs_host_to_card_done(card->priv);
1124
1125
1126 if (cause & IF_SDIO_H_INT_UPLD) {
1127 ret = if_sdio_card_to_host(card);
1128 if (ret)
1129 return;
1130 }
1131 }
1132
1133 static int if_sdio_probe(struct sdio_func *func,
1134 const struct sdio_device_id *id)
1135 {
1136 struct if_sdio_card *card;
1137 struct lbs_private *priv;
1138 int ret, i;
1139 unsigned int model;
1140 struct if_sdio_packet *packet;
1141
1142 for (i = 0;i < func->card->num_info;i++) {
1143 if (sscanf(func->card->info[i],
1144 "802.11 SDIO ID: %x", &model) == 1)
1145 break;
1146 if (sscanf(func->card->info[i],
1147 "ID: %x", &model) == 1)
1148 break;
1149 if (!strcmp(func->card->info[i], "IBIS Wireless SDIO Card")) {
1150 model = MODEL_8385;
1151 break;
1152 }
1153 }
1154
1155 if (i == func->card->num_info) {
1156 pr_err("unable to identify card model\n");
1157 return -ENODEV;
1158 }
1159
1160 card = kzalloc(sizeof(struct if_sdio_card), GFP_KERNEL);
1161 if (!card)
1162 return -ENOMEM;
1163
1164 card->func = func;
1165 card->model = model;
1166
1167 switch (card->model) {
1168 case MODEL_8385:
1169 card->scratch_reg = IF_SDIO_SCRATCH_OLD;
1170 break;
1171 case MODEL_8686:
1172 card->scratch_reg = IF_SDIO_SCRATCH;
1173 break;
1174 case MODEL_8688:
1175 default:
1176 card->scratch_reg = IF_SDIO_FW_STATUS;
1177 break;
1178 }
1179
1180 spin_lock_init(&card->lock);
1181 card->workqueue = alloc_workqueue("libertas_sdio", WQ_MEM_RECLAIM, 0);
1182 if (unlikely(!card->workqueue)) {
1183 ret = -ENOMEM;
1184 goto err_queue;
1185 }
1186 INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker);
1187 init_waitqueue_head(&card->pwron_waitq);
1188
1189
1190 for (i = 0; i < ARRAY_SIZE(fw_table); i++) {
1191 if (card->model == fw_table[i].model)
1192 break;
1193 }
1194 if (i == ARRAY_SIZE(fw_table)) {
1195 pr_err("unknown card model 0x%x\n", card->model);
1196 ret = -ENODEV;
1197 goto free;
1198 }
1199
1200 sdio_set_drvdata(func, card);
1201
1202 lbs_deb_sdio("class = 0x%X, vendor = 0x%X, "
1203 "device = 0x%X, model = 0x%X, ioport = 0x%X\n",
1204 func->class, func->vendor, func->device,
1205 model, (unsigned)card->ioport);
1206
1207
1208 priv = lbs_add_card(card, &func->dev);
1209 if (IS_ERR(priv)) {
1210 ret = PTR_ERR(priv);
1211 goto free;
1212 }
1213
1214 card->priv = priv;
1215
1216 priv->card = card;
1217 priv->hw_host_to_card = if_sdio_host_to_card;
1218 priv->enter_deep_sleep = if_sdio_enter_deep_sleep;
1219 priv->exit_deep_sleep = if_sdio_exit_deep_sleep;
1220 priv->reset_deep_sleep_wakeup = if_sdio_reset_deep_sleep_wakeup;
1221 priv->reset_card = if_sdio_reset_card;
1222 priv->power_save = if_sdio_power_save;
1223 priv->power_restore = if_sdio_power_restore;
1224 priv->is_polling = !(func->card->host->caps & MMC_CAP_SDIO_IRQ);
1225 ret = if_sdio_power_on(card);
1226 if (ret)
1227 goto err_activate_card;
1228
1229 out:
1230 return ret;
1231
1232 err_activate_card:
1233 flush_workqueue(card->workqueue);
1234 lbs_remove_card(priv);
1235 free:
1236 destroy_workqueue(card->workqueue);
1237 err_queue:
1238 while (card->packets) {
1239 packet = card->packets;
1240 card->packets = card->packets->next;
1241 kfree(packet);
1242 }
1243
1244 kfree(card);
1245
1246 goto out;
1247 }
1248
1249 static void if_sdio_remove(struct sdio_func *func)
1250 {
1251 struct if_sdio_card *card;
1252 struct if_sdio_packet *packet;
1253
1254 card = sdio_get_drvdata(func);
1255
1256
1257 pm_runtime_get_noresume(&func->dev);
1258
1259 if (user_rmmod && (card->model == MODEL_8688)) {
1260
1261
1262
1263
1264 struct cmd_header cmd;
1265
1266 memset(&cmd, 0, sizeof(cmd));
1267
1268 lbs_deb_sdio("send function SHUTDOWN command\n");
1269 if (__lbs_cmd(card->priv, CMD_FUNC_SHUTDOWN,
1270 &cmd, sizeof(cmd), lbs_cmd_copyback,
1271 (unsigned long) &cmd))
1272 pr_alert("CMD_FUNC_SHUTDOWN cmd failed\n");
1273 }
1274
1275
1276 lbs_deb_sdio("call remove card\n");
1277 lbs_stop_card(card->priv);
1278 lbs_remove_card(card->priv);
1279
1280 destroy_workqueue(card->workqueue);
1281
1282 while (card->packets) {
1283 packet = card->packets;
1284 card->packets = card->packets->next;
1285 kfree(packet);
1286 }
1287
1288 kfree(card);
1289 }
1290
1291 static int if_sdio_suspend(struct device *dev)
1292 {
1293 struct sdio_func *func = dev_to_sdio_func(dev);
1294 struct if_sdio_card *card = sdio_get_drvdata(func);
1295 struct lbs_private *priv = card->priv;
1296 int ret;
1297
1298 mmc_pm_flag_t flags = sdio_get_host_pm_caps(func);
1299 priv->power_up_on_resume = false;
1300
1301
1302
1303 if (!lbs_iface_active(priv)) {
1304 if (priv->fw_ready) {
1305 priv->power_up_on_resume = true;
1306 if_sdio_power_off(card);
1307 }
1308
1309 return 0;
1310 }
1311
1312 dev_info(dev, "%s: suspend: PM flags = 0x%x\n",
1313 sdio_func_id(func), flags);
1314
1315
1316
1317
1318 if (priv->wol_criteria == EHS_REMOVE_WAKEUP) {
1319 dev_info(dev, "Suspend without wake params -- powering down card\n");
1320 if (priv->fw_ready) {
1321 ret = lbs_suspend(priv);
1322 if (ret)
1323 return ret;
1324
1325 priv->power_up_on_resume = true;
1326 if_sdio_power_off(card);
1327 }
1328
1329 return 0;
1330 }
1331
1332 if (!(flags & MMC_PM_KEEP_POWER)) {
1333 dev_err(dev, "%s: cannot remain alive while host is suspended\n",
1334 sdio_func_id(func));
1335 return -ENOSYS;
1336 }
1337
1338 ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
1339 if (ret)
1340 return ret;
1341
1342 ret = lbs_suspend(priv);
1343 if (ret)
1344 return ret;
1345
1346 return sdio_set_host_pm_flags(func, MMC_PM_WAKE_SDIO_IRQ);
1347 }
1348
1349 static int if_sdio_resume(struct device *dev)
1350 {
1351 struct sdio_func *func = dev_to_sdio_func(dev);
1352 struct if_sdio_card *card = sdio_get_drvdata(func);
1353 int ret;
1354
1355 dev_info(dev, "%s: resume: we're back\n", sdio_func_id(func));
1356
1357 if (card->priv->power_up_on_resume) {
1358 if_sdio_power_on(card);
1359 wait_event(card->pwron_waitq, card->priv->fw_ready);
1360 }
1361
1362 ret = lbs_resume(card->priv);
1363
1364 return ret;
1365 }
1366
1367 static const struct dev_pm_ops if_sdio_pm_ops = {
1368 .suspend = if_sdio_suspend,
1369 .resume = if_sdio_resume,
1370 };
1371
1372 static struct sdio_driver if_sdio_driver = {
1373 .name = "libertas_sdio",
1374 .id_table = if_sdio_ids,
1375 .probe = if_sdio_probe,
1376 .remove = if_sdio_remove,
1377 .drv = {
1378 .pm = &if_sdio_pm_ops,
1379 },
1380 };
1381
1382
1383
1384
1385
1386 static int __init if_sdio_init_module(void)
1387 {
1388 int ret = 0;
1389
1390 printk(KERN_INFO "libertas_sdio: Libertas SDIO driver\n");
1391 printk(KERN_INFO "libertas_sdio: Copyright Pierre Ossman\n");
1392
1393 ret = sdio_register_driver(&if_sdio_driver);
1394
1395
1396 user_rmmod = 0;
1397
1398 return ret;
1399 }
1400
1401 static void __exit if_sdio_exit_module(void)
1402 {
1403
1404 user_rmmod = 1;
1405
1406 cancel_work_sync(&card_reset_work);
1407
1408 sdio_unregister_driver(&if_sdio_driver);
1409 }
1410
1411 module_init(if_sdio_init_module);
1412 module_exit(if_sdio_exit_module);
1413
1414 MODULE_DESCRIPTION("Libertas SDIO WLAN Driver");
1415 MODULE_AUTHOR("Pierre Ossman");
1416 MODULE_LICENSE("GPL");