]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/net/wireless/libertas/if_sdio.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[net-next-2.6.git] / drivers / net / wireless / libertas / if_sdio.c
CommitLineData
727c26ed
PO
1/*
2 * linux/drivers/net/wireless/libertas/if_sdio.c
3 *
ad3868b2 4 * Copyright 2007-2008 Pierre Ossman
727c26ed
PO
5 *
6 * Inspired by if_cs.c, Copyright 2007 Holger Schurig
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or (at
11 * your option) any later version.
12 *
13 * This hardware has more or less no CMD53 support, so all registers
14 * must be accessed using sdio_readb()/sdio_writeb().
15 *
16 * Transfers must be in one transaction or the firmware goes bonkers.
17 * This means that the transfer must either be small enough to do a
18 * byte based transfer or it must be padded to a multiple of the
19 * current block size.
20 *
21 * As SDIO is still new to the kernel, it is unfortunately common with
7e226272 22 * bugs in the host controllers related to that. One such bug is that
727c26ed
PO
23 * controllers cannot do transfers that aren't a multiple of 4 bytes.
24 * If you don't have time to fix the host controller driver, you can
25 * work around the problem by modifying if_sdio_host_to_card() and
26 * if_sdio_card_to_host() to pad the data.
27 */
28
23827926 29#include <linux/kernel.h>
727c26ed 30#include <linux/moduleparam.h>
5a0e3ad6 31#include <linux/slab.h>
727c26ed
PO
32#include <linux/firmware.h>
33#include <linux/netdevice.h>
34#include <linux/delay.h>
35#include <linux/mmc/card.h>
36#include <linux/mmc/sdio_func.h>
37#include <linux/mmc/sdio_ids.h>
38
39#include "host.h"
40#include "decl.h"
41#include "defs.h"
42#include "dev.h"
6bc61f4d 43#include "cmd.h"
727c26ed
PO
44#include "if_sdio.h"
45
6bc61f4d
BZ
46/* The if_sdio_remove() callback function is called when
47 * user removes this module from kernel space or ejects
48 * the card from the slot. The driver handles these 2 cases
49 * differently for SD8688 combo chip.
50 * If the user is removing the module, the FUNC_SHUTDOWN
51 * command for SD8688 is sent to the firmware.
52 * If the card is removed, there is no need to send this command.
53 *
54 * The variable 'user_rmmod' is used to distinguish these two
55 * scenarios. This flag is initialized as FALSE in case the card
56 * is removed, and will be set to TRUE for module removal when
57 * module_exit function is called.
58 */
59static u8 user_rmmod;
60
10078321
HS
61static char *lbs_helper_name = NULL;
62module_param_named(helper_name, lbs_helper_name, charp, 0644);
727c26ed 63
10078321
HS
64static char *lbs_fw_name = NULL;
65module_param_named(fw_name, lbs_fw_name, charp, 0644);
727c26ed
PO
66
67static const struct sdio_device_id if_sdio_ids[] = {
e45d8e53
BZ
68 { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL,
69 SDIO_DEVICE_ID_MARVELL_LIBERTAS) },
70 { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL,
71 SDIO_DEVICE_ID_MARVELL_8688WLAN) },
72 { /* end: all zeroes */ },
727c26ed
PO
73};
74
75MODULE_DEVICE_TABLE(sdio, if_sdio_ids);
76
77struct if_sdio_model {
78 int model;
79 const char *helper;
80 const char *firmware;
81};
82
83static struct if_sdio_model if_sdio_models[] = {
84 {
85 /* 8385 */
e70a5ac5 86 .model = IF_SDIO_MODEL_8385,
727c26ed
PO
87 .helper = "sd8385_helper.bin",
88 .firmware = "sd8385.bin",
89 },
90 {
91 /* 8686 */
e70a5ac5 92 .model = IF_SDIO_MODEL_8686,
727c26ed
PO
93 .helper = "sd8686_helper.bin",
94 .firmware = "sd8686.bin",
95 },
e45d8e53
BZ
96 {
97 /* 8688 */
e70a5ac5 98 .model = IF_SDIO_MODEL_8688,
e45d8e53
BZ
99 .helper = "sd8688_helper.bin",
100 .firmware = "sd8688.bin",
101 },
727c26ed 102};
a974a4bb
BH
103MODULE_FIRMWARE("sd8385_helper.bin");
104MODULE_FIRMWARE("sd8385.bin");
105MODULE_FIRMWARE("sd8686_helper.bin");
106MODULE_FIRMWARE("sd8686.bin");
107MODULE_FIRMWARE("sd8688_helper.bin");
108MODULE_FIRMWARE("sd8688.bin");
727c26ed
PO
109
110struct if_sdio_packet {
111 struct if_sdio_packet *next;
112 u16 nb;
113 u8 buffer[0] __attribute__((aligned(4)));
114};
115
116struct if_sdio_card {
117 struct sdio_func *func;
69f9032d 118 struct lbs_private *priv;
727c26ed
PO
119
120 int model;
121 unsigned long ioport;
2c7e5798 122 unsigned int scratch_reg;
727c26ed
PO
123
124 const char *helper;
125 const char *firmware;
126
127 u8 buffer[65536];
727c26ed
PO
128
129 spinlock_t lock;
130 struct if_sdio_packet *packets;
9b02f419
DW
131
132 struct workqueue_struct *workqueue;
727c26ed 133 struct work_struct packet_worker;
b136a141
BZ
134
135 u8 rx_unit;
727c26ed
PO
136};
137
138/********************************************************************/
139/* I/O */
140/********************************************************************/
141
2c7e5798
BZ
142/*
143 * For SD8385/SD8686, this function reads firmware status after
144 * the image is downloaded, or reads RX packet length when
145 * interrupt (with IF_SDIO_H_INT_UPLD bit set) is received.
146 * For SD8688, this function reads firmware status only.
147 */
727c26ed
PO
148static u16 if_sdio_read_scratch(struct if_sdio_card *card, int *err)
149{
2c7e5798 150 int ret;
727c26ed
PO
151 u16 scratch;
152
2c7e5798 153 scratch = sdio_readb(card->func, card->scratch_reg, &ret);
727c26ed 154 if (!ret)
2c7e5798
BZ
155 scratch |= sdio_readb(card->func, card->scratch_reg + 1,
156 &ret) << 8;
727c26ed
PO
157
158 if (err)
159 *err = ret;
160
161 if (ret)
162 return 0xffff;
163
164 return scratch;
165}
166
b136a141
BZ
167static u8 if_sdio_read_rx_unit(struct if_sdio_card *card)
168{
169 int ret;
170 u8 rx_unit;
171
172 rx_unit = sdio_readb(card->func, IF_SDIO_RX_UNIT, &ret);
173
174 if (ret)
175 rx_unit = 0;
176
177 return rx_unit;
178}
179
180static u16 if_sdio_read_rx_len(struct if_sdio_card *card, int *err)
181{
182 int ret;
183 u16 rx_len;
184
185 switch (card->model) {
186 case IF_SDIO_MODEL_8385:
187 case IF_SDIO_MODEL_8686:
188 rx_len = if_sdio_read_scratch(card, &ret);
189 break;
190 case IF_SDIO_MODEL_8688:
191 default: /* for newer chipsets */
192 rx_len = sdio_readb(card->func, IF_SDIO_RX_LEN, &ret);
193 if (!ret)
194 rx_len <<= card->rx_unit;
195 else
196 rx_len = 0xffff; /* invalid length */
197
198 break;
199 }
200
201 if (err)
202 *err = ret;
203
204 return rx_len;
205}
206
727c26ed
PO
207static int if_sdio_handle_cmd(struct if_sdio_card *card,
208 u8 *buffer, unsigned size)
209{
7919b89c 210 struct lbs_private *priv = card->priv;
727c26ed
PO
211 int ret;
212 unsigned long flags;
7919b89c 213 u8 i;
727c26ed
PO
214
215 lbs_deb_enter(LBS_DEB_SDIO);
216
ddac4526 217 if (size > LBS_CMD_BUFFER_SIZE) {
727c26ed
PO
218 lbs_deb_sdio("response packet too large (%d bytes)\n",
219 (int)size);
220 ret = -E2BIG;
221 goto out;
222 }
223
7919b89c 224 spin_lock_irqsave(&priv->driver_lock, flags);
727c26ed 225
7919b89c
HS
226 i = (priv->resp_idx == 0) ? 1 : 0;
227 BUG_ON(priv->resp_len[i]);
228 priv->resp_len[i] = size;
229 memcpy(priv->resp_buf[i], buffer, size);
230 lbs_notify_command_response(priv, i);
727c26ed 231
7919b89c 232 spin_unlock_irqrestore(&card->priv->driver_lock, flags);
727c26ed
PO
233
234 ret = 0;
235
236out:
727c26ed 237 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
727c26ed
PO
238 return ret;
239}
240
241static int if_sdio_handle_data(struct if_sdio_card *card,
242 u8 *buffer, unsigned size)
243{
244 int ret;
245 struct sk_buff *skb;
246 char *data;
247
248 lbs_deb_enter(LBS_DEB_SDIO);
249
250 if (size > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE) {
251 lbs_deb_sdio("response packet too large (%d bytes)\n",
252 (int)size);
253 ret = -E2BIG;
254 goto out;
255 }
256
51e6b712 257 skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE + NET_IP_ALIGN);
727c26ed
PO
258 if (!skb) {
259 ret = -ENOMEM;
260 goto out;
261 }
262
51e6b712
PO
263 skb_reserve(skb, NET_IP_ALIGN);
264
727c26ed
PO
265 data = skb_put(skb, size);
266
267 memcpy(data, buffer, size);
268
10078321 269 lbs_process_rxed_packet(card->priv, skb);
727c26ed
PO
270
271 ret = 0;
272
273out:
274 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
275
276 return ret;
277}
278
279static int if_sdio_handle_event(struct if_sdio_card *card,
280 u8 *buffer, unsigned size)
281{
282 int ret;
727c26ed
PO
283 u32 event;
284
285 lbs_deb_enter(LBS_DEB_SDIO);
286
e70a5ac5 287 if (card->model == IF_SDIO_MODEL_8385) {
727c26ed
PO
288 event = sdio_readb(card->func, IF_SDIO_EVENT, &ret);
289 if (ret)
290 goto out;
f5ac2b9e
BZ
291
292 /* right shift 3 bits to get the event id */
293 event >>= 3;
727c26ed
PO
294 } else {
295 if (size < 4) {
296 lbs_deb_sdio("event packet too small (%d bytes)\n",
297 (int)size);
298 ret = -EINVAL;
299 goto out;
300 }
301 event = buffer[3] << 24;
302 event |= buffer[2] << 16;
303 event |= buffer[1] << 8;
304 event |= buffer[0] << 0;
727c26ed
PO
305 }
306
7919b89c 307 lbs_queue_event(card->priv, event & 0xFF);
727c26ed
PO
308 ret = 0;
309
310out:
311 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
312
313 return ret;
314}
315
316static int if_sdio_card_to_host(struct if_sdio_card *card)
317{
318 int ret;
319 u8 status;
320 u16 size, type, chunk;
321 unsigned long timeout;
322
323 lbs_deb_enter(LBS_DEB_SDIO);
324
b136a141 325 size = if_sdio_read_rx_len(card, &ret);
727c26ed
PO
326 if (ret)
327 goto out;
328
329 if (size < 4) {
330 lbs_deb_sdio("invalid packet size (%d bytes) from firmware\n",
331 (int)size);
332 ret = -EINVAL;
333 goto out;
334 }
335
336 timeout = jiffies + HZ;
337 while (1) {
338 status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
339 if (ret)
340 goto out;
341 if (status & IF_SDIO_IO_RDY)
342 break;
343 if (time_after(jiffies, timeout)) {
344 ret = -ETIMEDOUT;
345 goto out;
346 }
347 mdelay(1);
348 }
349
350 /*
351 * The transfer must be in one transaction or the firmware
ad3868b2
PO
352 * goes suicidal. There's no way to guarantee that for all
353 * controllers, but we can at least try.
727c26ed 354 */
ad3868b2 355 chunk = sdio_align_size(card->func, size);
727c26ed
PO
356
357 ret = sdio_readsb(card->func, card->buffer, card->ioport, chunk);
358 if (ret)
359 goto out;
360
361 chunk = card->buffer[0] | (card->buffer[1] << 8);
362 type = card->buffer[2] | (card->buffer[3] << 8);
363
364 lbs_deb_sdio("packet of type %d and size %d bytes\n",
365 (int)type, (int)chunk);
366
367 if (chunk > size) {
368 lbs_deb_sdio("packet fragment (%d > %d)\n",
369 (int)chunk, (int)size);
370 ret = -EINVAL;
371 goto out;
372 }
373
374 if (chunk < size) {
375 lbs_deb_sdio("packet fragment (%d < %d)\n",
376 (int)chunk, (int)size);
377 }
378
379 switch (type) {
380 case MVMS_CMD:
381 ret = if_sdio_handle_cmd(card, card->buffer + 4, chunk - 4);
382 if (ret)
383 goto out;
384 break;
385 case MVMS_DAT:
386 ret = if_sdio_handle_data(card, card->buffer + 4, chunk - 4);
387 if (ret)
388 goto out;
389 break;
390 case MVMS_EVENT:
391 ret = if_sdio_handle_event(card, card->buffer + 4, chunk - 4);
392 if (ret)
393 goto out;
394 break;
395 default:
396 lbs_deb_sdio("invalid type (%d) from firmware\n",
397 (int)type);
398 ret = -EINVAL;
399 goto out;
400 }
401
402out:
403 if (ret)
404 lbs_pr_err("problem fetching packet from firmware\n");
405
406 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
407
408 return ret;
409}
410
411static void if_sdio_host_to_card_worker(struct work_struct *work)
412{
413 struct if_sdio_card *card;
414 struct if_sdio_packet *packet;
415 unsigned long timeout;
416 u8 status;
417 int ret;
418 unsigned long flags;
419
420 lbs_deb_enter(LBS_DEB_SDIO);
421
422 card = container_of(work, struct if_sdio_card, packet_worker);
423
424 while (1) {
425 spin_lock_irqsave(&card->lock, flags);
426 packet = card->packets;
427 if (packet)
428 card->packets = packet->next;
429 spin_unlock_irqrestore(&card->lock, flags);
430
431 if (!packet)
432 break;
433
434 sdio_claim_host(card->func);
435
436 timeout = jiffies + HZ;
437 while (1) {
438 status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
439 if (ret)
440 goto release;
441 if (status & IF_SDIO_IO_RDY)
442 break;
443 if (time_after(jiffies, timeout)) {
444 ret = -ETIMEDOUT;
445 goto release;
446 }
447 mdelay(1);
448 }
449
450 ret = sdio_writesb(card->func, card->ioport,
451 packet->buffer, packet->nb);
452 if (ret)
453 goto release;
454release:
455 sdio_release_host(card->func);
456
457 kfree(packet);
458 }
459
460 lbs_deb_leave(LBS_DEB_SDIO);
461}
462
463/********************************************************************/
464/* Firmware */
465/********************************************************************/
466
467static int if_sdio_prog_helper(struct if_sdio_card *card)
468{
469 int ret;
470 u8 status;
471 const struct firmware *fw;
472 unsigned long timeout;
473 u8 *chunk_buffer;
474 u32 chunk_size;
6dfff895 475 const u8 *firmware;
727c26ed
PO
476 size_t size;
477
478 lbs_deb_enter(LBS_DEB_SDIO);
479
480 ret = request_firmware(&fw, card->helper, &card->func->dev);
481 if (ret) {
482 lbs_pr_err("can't load helper firmware\n");
483 goto out;
484 }
485
486 chunk_buffer = kzalloc(64, GFP_KERNEL);
487 if (!chunk_buffer) {
488 ret = -ENOMEM;
489 goto release_fw;
490 }
491
492 sdio_claim_host(card->func);
493
494 ret = sdio_set_block_size(card->func, 32);
495 if (ret)
496 goto release;
497
498 firmware = fw->data;
499 size = fw->size;
500
501 while (size) {
502 timeout = jiffies + HZ;
503 while (1) {
504 status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
505 if (ret)
506 goto release;
507 if ((status & IF_SDIO_IO_RDY) &&
508 (status & IF_SDIO_DL_RDY))
509 break;
510 if (time_after(jiffies, timeout)) {
511 ret = -ETIMEDOUT;
512 goto release;
513 }
514 mdelay(1);
515 }
516
517 chunk_size = min(size, (size_t)60);
518
c2df2efe 519 *((__le32*)chunk_buffer) = cpu_to_le32(chunk_size);
727c26ed
PO
520 memcpy(chunk_buffer + 4, firmware, chunk_size);
521/*
522 lbs_deb_sdio("sending %d bytes chunk\n", chunk_size);
523*/
524 ret = sdio_writesb(card->func, card->ioport,
525 chunk_buffer, 64);
526 if (ret)
527 goto release;
528
529 firmware += chunk_size;
530 size -= chunk_size;
531 }
532
533 /* an empty block marks the end of the transfer */
534 memset(chunk_buffer, 0, 4);
535 ret = sdio_writesb(card->func, card->ioport, chunk_buffer, 64);
536 if (ret)
537 goto release;
538
539 lbs_deb_sdio("waiting for helper to boot...\n");
540
541 /* wait for the helper to boot by looking at the size register */
542 timeout = jiffies + HZ;
543 while (1) {
544 u16 req_size;
545
546 req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret);
547 if (ret)
548 goto release;
549
550 req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1, &ret) << 8;
551 if (ret)
552 goto release;
553
554 if (req_size != 0)
555 break;
556
557 if (time_after(jiffies, timeout)) {
558 ret = -ETIMEDOUT;
559 goto release;
560 }
561
562 msleep(10);
563 }
564
565 ret = 0;
566
567release:
727c26ed
PO
568 sdio_release_host(card->func);
569 kfree(chunk_buffer);
570release_fw:
571 release_firmware(fw);
572
573out:
574 if (ret)
575 lbs_pr_err("failed to load helper firmware\n");
576
577 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
578
579 return ret;
580}
581
582static int if_sdio_prog_real(struct if_sdio_card *card)
583{
584 int ret;
585 u8 status;
586 const struct firmware *fw;
587 unsigned long timeout;
588 u8 *chunk_buffer;
589 u32 chunk_size;
6dfff895 590 const u8 *firmware;
727c26ed
PO
591 size_t size, req_size;
592
593 lbs_deb_enter(LBS_DEB_SDIO);
594
595 ret = request_firmware(&fw, card->firmware, &card->func->dev);
596 if (ret) {
597 lbs_pr_err("can't load firmware\n");
598 goto out;
599 }
600
601 chunk_buffer = kzalloc(512, GFP_KERNEL);
602 if (!chunk_buffer) {
603 ret = -ENOMEM;
604 goto release_fw;
605 }
606
607 sdio_claim_host(card->func);
608
609 ret = sdio_set_block_size(card->func, 32);
610 if (ret)
611 goto release;
612
613 firmware = fw->data;
614 size = fw->size;
615
616 while (size) {
617 timeout = jiffies + HZ;
618 while (1) {
619 status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
620 if (ret)
621 goto release;
622 if ((status & IF_SDIO_IO_RDY) &&
623 (status & IF_SDIO_DL_RDY))
624 break;
625 if (time_after(jiffies, timeout)) {
626 ret = -ETIMEDOUT;
627 goto release;
628 }
629 mdelay(1);
630 }
631
632 req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret);
633 if (ret)
634 goto release;
635
636 req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1, &ret) << 8;
637 if (ret)
638 goto release;
639/*
640 lbs_deb_sdio("firmware wants %d bytes\n", (int)req_size);
641*/
642 if (req_size == 0) {
643 lbs_deb_sdio("firmware helper gave up early\n");
644 ret = -EIO;
645 goto release;
646 }
647
648 if (req_size & 0x01) {
649 lbs_deb_sdio("firmware helper signalled error\n");
650 ret = -EIO;
651 goto release;
652 }
653
654 if (req_size > size)
655 req_size = size;
656
657 while (req_size) {
658 chunk_size = min(req_size, (size_t)512);
659
660 memcpy(chunk_buffer, firmware, chunk_size);
661/*
662 lbs_deb_sdio("sending %d bytes (%d bytes) chunk\n",
663 chunk_size, (chunk_size + 31) / 32 * 32);
664*/
665 ret = sdio_writesb(card->func, card->ioport,
23827926 666 chunk_buffer, roundup(chunk_size, 32));
727c26ed
PO
667 if (ret)
668 goto release;
669
670 firmware += chunk_size;
671 size -= chunk_size;
672 req_size -= chunk_size;
673 }
674 }
675
676 ret = 0;
677
678 lbs_deb_sdio("waiting for firmware to boot...\n");
679
680 /* wait for the firmware to boot */
681 timeout = jiffies + HZ;
682 while (1) {
683 u16 scratch;
684
685 scratch = if_sdio_read_scratch(card, &ret);
686 if (ret)
687 goto release;
688
689 if (scratch == IF_SDIO_FIRMWARE_OK)
690 break;
691
692 if (time_after(jiffies, timeout)) {
693 ret = -ETIMEDOUT;
694 goto release;
695 }
696
697 msleep(10);
698 }
699
700 ret = 0;
701
702release:
727c26ed
PO
703 sdio_release_host(card->func);
704 kfree(chunk_buffer);
705release_fw:
706 release_firmware(fw);
707
708out:
709 if (ret)
710 lbs_pr_err("failed to load firmware\n");
711
712 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
713
714 return ret;
715}
716
717static int if_sdio_prog_firmware(struct if_sdio_card *card)
718{
719 int ret;
720 u16 scratch;
721
722 lbs_deb_enter(LBS_DEB_SDIO);
723
724 sdio_claim_host(card->func);
725 scratch = if_sdio_read_scratch(card, &ret);
726 sdio_release_host(card->func);
727
728 if (ret)
729 goto out;
730
2c7e5798
BZ
731 lbs_deb_sdio("firmware status = %#x\n", scratch);
732
727c26ed
PO
733 if (scratch == IF_SDIO_FIRMWARE_OK) {
734 lbs_deb_sdio("firmware already loaded\n");
735 goto success;
736 }
737
738 ret = if_sdio_prog_helper(card);
739 if (ret)
740 goto out;
741
742 ret = if_sdio_prog_real(card);
743 if (ret)
744 goto out;
745
746success:
d26285f8
BZ
747 sdio_claim_host(card->func);
748 sdio_set_block_size(card->func, IF_SDIO_BLOCK_SIZE);
749 sdio_release_host(card->func);
727c26ed
PO
750 ret = 0;
751
752out:
753 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
754
755 return ret;
756}
757
758/*******************************************************************/
759/* Libertas callbacks */
760/*******************************************************************/
761
69f9032d
HS
762static int if_sdio_host_to_card(struct lbs_private *priv,
763 u8 type, u8 *buf, u16 nb)
727c26ed
PO
764{
765 int ret;
766 struct if_sdio_card *card;
767 struct if_sdio_packet *packet, *cur;
768 u16 size;
769 unsigned long flags;
770
771 lbs_deb_enter_args(LBS_DEB_SDIO, "type %d, bytes %d", type, nb);
772
773 card = priv->card;
774
775 if (nb > (65536 - sizeof(struct if_sdio_packet) - 4)) {
776 ret = -EINVAL;
777 goto out;
778 }
779
780 /*
781 * The transfer must be in one transaction or the firmware
ad3868b2
PO
782 * goes suicidal. There's no way to guarantee that for all
783 * controllers, but we can at least try.
727c26ed 784 */
ad3868b2 785 size = sdio_align_size(card->func, nb + 4);
727c26ed
PO
786
787 packet = kzalloc(sizeof(struct if_sdio_packet) + size,
788 GFP_ATOMIC);
789 if (!packet) {
790 ret = -ENOMEM;
791 goto out;
792 }
793
794 packet->next = NULL;
795 packet->nb = size;
796
797 /*
798 * SDIO specific header.
799 */
800 packet->buffer[0] = (nb + 4) & 0xff;
801 packet->buffer[1] = ((nb + 4) >> 8) & 0xff;
802 packet->buffer[2] = type;
803 packet->buffer[3] = 0;
804
805 memcpy(packet->buffer + 4, buf, nb);
806
807 spin_lock_irqsave(&card->lock, flags);
808
809 if (!card->packets)
810 card->packets = packet;
811 else {
812 cur = card->packets;
813 while (cur->next)
814 cur = cur->next;
815 cur->next = packet;
816 }
817
818 switch (type) {
819 case MVMS_CMD:
820 priv->dnld_sent = DNLD_CMD_SENT;
821 break;
822 case MVMS_DAT:
823 priv->dnld_sent = DNLD_DATA_SENT;
824 break;
825 default:
826 lbs_deb_sdio("unknown packet type %d\n", (int)type);
827 }
828
829 spin_unlock_irqrestore(&card->lock, flags);
830
9b02f419 831 queue_work(card->workqueue, &card->packet_worker);
727c26ed
PO
832
833 ret = 0;
834
835out:
836 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
837
838 return ret;
839}
840
49125454
AK
841static int if_sdio_enter_deep_sleep(struct lbs_private *priv)
842{
843 int ret = -1;
844 struct cmd_header cmd;
845
846 memset(&cmd, 0, sizeof(cmd));
847
848 lbs_deb_sdio("send DEEP_SLEEP command\n");
849 ret = __lbs_cmd(priv, CMD_802_11_DEEP_SLEEP, &cmd, sizeof(cmd),
850 lbs_cmd_copyback, (unsigned long) &cmd);
851 if (ret)
852 lbs_pr_err("DEEP_SLEEP cmd failed\n");
853
854 mdelay(200);
855 return ret;
856}
857
858static int if_sdio_exit_deep_sleep(struct lbs_private *priv)
859{
860 struct if_sdio_card *card = priv->card;
861 int ret = -1;
862
863 lbs_deb_enter(LBS_DEB_SDIO);
864 sdio_claim_host(card->func);
865
866 sdio_writeb(card->func, HOST_POWER_UP, CONFIGURATION_REG, &ret);
867 if (ret)
868 lbs_pr_err("sdio_writeb failed!\n");
869
870 sdio_release_host(card->func);
871 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
872 return ret;
873}
874
875static int if_sdio_reset_deep_sleep_wakeup(struct lbs_private *priv)
876{
877 struct if_sdio_card *card = priv->card;
878 int ret = -1;
879
880 lbs_deb_enter(LBS_DEB_SDIO);
881 sdio_claim_host(card->func);
882
883 sdio_writeb(card->func, 0, CONFIGURATION_REG, &ret);
884 if (ret)
885 lbs_pr_err("sdio_writeb failed!\n");
886
887 sdio_release_host(card->func);
888 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
889 return ret;
890
891}
892
727c26ed
PO
893/*******************************************************************/
894/* SDIO callbacks */
895/*******************************************************************/
896
897static void if_sdio_interrupt(struct sdio_func *func)
898{
899 int ret;
900 struct if_sdio_card *card;
901 u8 cause;
902
903 lbs_deb_enter(LBS_DEB_SDIO);
904
905 card = sdio_get_drvdata(func);
906
907 cause = sdio_readb(card->func, IF_SDIO_H_INT_STATUS, &ret);
908 if (ret)
909 goto out;
910
911 lbs_deb_sdio("interrupt: 0x%X\n", (unsigned)cause);
912
913 sdio_writeb(card->func, ~cause, IF_SDIO_H_INT_STATUS, &ret);
914 if (ret)
915 goto out;
916
917 /*
918 * Ignore the define name, this really means the card has
919 * successfully received the command.
920 */
49125454 921 card->priv->is_activity_detected = 1;
e775ed7c
DW
922 if (cause & IF_SDIO_H_INT_DNLD)
923 lbs_host_to_card_done(card->priv);
924
727c26ed
PO
925
926 if (cause & IF_SDIO_H_INT_UPLD) {
927 ret = if_sdio_card_to_host(card);
928 if (ret)
929 goto out;
930 }
931
932 ret = 0;
933
934out:
935 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
936}
937
938static int if_sdio_probe(struct sdio_func *func,
939 const struct sdio_device_id *id)
940{
941 struct if_sdio_card *card;
69f9032d 942 struct lbs_private *priv;
727c26ed
PO
943 int ret, i;
944 unsigned int model;
945 struct if_sdio_packet *packet;
946
947 lbs_deb_enter(LBS_DEB_SDIO);
948
949 for (i = 0;i < func->card->num_info;i++) {
950 if (sscanf(func->card->info[i],
951 "802.11 SDIO ID: %x", &model) == 1)
952 break;
953 if (sscanf(func->card->info[i],
954 "ID: %x", &model) == 1)
955 break;
e70a5ac5
BZ
956 if (!strcmp(func->card->info[i], "IBIS Wireless SDIO Card")) {
957 model = IF_SDIO_MODEL_8385;
958 break;
959 }
727c26ed
PO
960 }
961
962 if (i == func->card->num_info) {
963 lbs_pr_err("unable to identify card model\n");
964 return -ENODEV;
965 }
966
967 card = kzalloc(sizeof(struct if_sdio_card), GFP_KERNEL);
968 if (!card)
969 return -ENOMEM;
970
971 card->func = func;
972 card->model = model;
2c7e5798
BZ
973
974 switch (card->model) {
975 case IF_SDIO_MODEL_8385:
976 card->scratch_reg = IF_SDIO_SCRATCH_OLD;
977 break;
978 case IF_SDIO_MODEL_8686:
979 card->scratch_reg = IF_SDIO_SCRATCH;
980 break;
981 case IF_SDIO_MODEL_8688:
982 default: /* for newer chipsets */
983 card->scratch_reg = IF_SDIO_FW_STATUS;
984 break;
985 }
986
727c26ed 987 spin_lock_init(&card->lock);
9b02f419 988 card->workqueue = create_workqueue("libertas_sdio");
727c26ed
PO
989 INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker);
990
991 for (i = 0;i < ARRAY_SIZE(if_sdio_models);i++) {
992 if (card->model == if_sdio_models[i].model)
993 break;
994 }
995
996 if (i == ARRAY_SIZE(if_sdio_models)) {
af901ca1 997 lbs_pr_err("unknown card model 0x%x\n", card->model);
727c26ed
PO
998 ret = -ENODEV;
999 goto free;
1000 }
1001
1002 card->helper = if_sdio_models[i].helper;
1003 card->firmware = if_sdio_models[i].firmware;
1004
10078321 1005 if (lbs_helper_name) {
727c26ed 1006 lbs_deb_sdio("overriding helper firmware: %s\n",
10078321
HS
1007 lbs_helper_name);
1008 card->helper = lbs_helper_name;
727c26ed
PO
1009 }
1010
10078321
HS
1011 if (lbs_fw_name) {
1012 lbs_deb_sdio("overriding firmware: %s\n", lbs_fw_name);
1013 card->firmware = lbs_fw_name;
727c26ed
PO
1014 }
1015
1016 sdio_claim_host(func);
1017
1018 ret = sdio_enable_func(func);
1019 if (ret)
1020 goto release;
1021
1022 ret = sdio_claim_irq(func, if_sdio_interrupt);
1023 if (ret)
1024 goto disable;
1025
1026 card->ioport = sdio_readb(func, IF_SDIO_IOPORT, &ret);
1027 if (ret)
1028 goto release_int;
1029
1030 card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 1, &ret) << 8;
1031 if (ret)
1032 goto release_int;
1033
1034 card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 2, &ret) << 16;
1035 if (ret)
1036 goto release_int;
1037
1038 sdio_release_host(func);
1039
1040 sdio_set_drvdata(func, card);
1041
1042 lbs_deb_sdio("class = 0x%X, vendor = 0x%X, "
1043 "device = 0x%X, model = 0x%X, ioport = 0x%X\n",
1044 func->class, func->vendor, func->device,
1045 model, (unsigned)card->ioport);
1046
1047 ret = if_sdio_prog_firmware(card);
1048 if (ret)
1049 goto reclaim;
1050
10078321 1051 priv = lbs_add_card(card, &func->dev);
727c26ed
PO
1052 if (!priv) {
1053 ret = -ENOMEM;
1054 goto reclaim;
1055 }
1056
1057 card->priv = priv;
1058
1059 priv->card = card;
1060 priv->hw_host_to_card = if_sdio_host_to_card;
49125454
AK
1061 priv->enter_deep_sleep = if_sdio_enter_deep_sleep;
1062 priv->exit_deep_sleep = if_sdio_exit_deep_sleep;
1063 priv->reset_deep_sleep_wakeup = if_sdio_reset_deep_sleep_wakeup;
727c26ed 1064
aa21c004 1065 priv->fw_ready = 1;
727c26ed 1066
b136a141
BZ
1067 sdio_claim_host(func);
1068
1069 /*
1070 * Get rx_unit if the chip is SD8688 or newer.
1071 * SD8385 & SD8686 do not have rx_unit.
1072 */
1073 if ((card->model != IF_SDIO_MODEL_8385)
1074 && (card->model != IF_SDIO_MODEL_8686))
1075 card->rx_unit = if_sdio_read_rx_unit(card);
1076 else
1077 card->rx_unit = 0;
1078
727c26ed
PO
1079 /*
1080 * Enable interrupts now that everything is set up
1081 */
727c26ed
PO
1082 sdio_writeb(func, 0x0f, IF_SDIO_H_INT_MASK, &ret);
1083 sdio_release_host(func);
1084 if (ret)
1085 goto reclaim;
1086
d26285f8
BZ
1087 /*
1088 * FUNC_INIT is required for SD8688 WLAN/BT multiple functions
1089 */
6bc61f4d
BZ
1090 if (card->model == IF_SDIO_MODEL_8688) {
1091 struct cmd_header cmd;
1092
1093 memset(&cmd, 0, sizeof(cmd));
1094
1095 lbs_deb_sdio("send function INIT command\n");
1096 if (__lbs_cmd(priv, CMD_FUNC_INIT, &cmd, sizeof(cmd),
1097 lbs_cmd_copyback, (unsigned long) &cmd))
1098 lbs_pr_alert("CMD_FUNC_INIT cmd failed\n");
1099 }
d26285f8 1100
10078321 1101 ret = lbs_start_card(priv);
727c26ed
PO
1102 if (ret)
1103 goto err_activate_card;
1104
1105out:
1106 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
1107
1108 return ret;
1109
1110err_activate_card:
9b02f419
DW
1111 flush_workqueue(card->workqueue);
1112 lbs_remove_card(priv);
727c26ed
PO
1113reclaim:
1114 sdio_claim_host(func);
1115release_int:
1116 sdio_release_irq(func);
1117disable:
1118 sdio_disable_func(func);
1119release:
1120 sdio_release_host(func);
1121free:
9b02f419 1122 destroy_workqueue(card->workqueue);
727c26ed
PO
1123 while (card->packets) {
1124 packet = card->packets;
1125 card->packets = card->packets->next;
1126 kfree(packet);
1127 }
1128
1129 kfree(card);
1130
1131 goto out;
1132}
1133
1134static void if_sdio_remove(struct sdio_func *func)
1135{
1136 struct if_sdio_card *card;
1137 struct if_sdio_packet *packet;
1138
1139 lbs_deb_enter(LBS_DEB_SDIO);
1140
1141 card = sdio_get_drvdata(func);
1142
6bc61f4d
BZ
1143 if (user_rmmod && (card->model == IF_SDIO_MODEL_8688)) {
1144 /*
1145 * FUNC_SHUTDOWN is required for SD8688 WLAN/BT
1146 * multiple functions
1147 */
1148 struct cmd_header cmd;
1149
1150 memset(&cmd, 0, sizeof(cmd));
1151
1152 lbs_deb_sdio("send function SHUTDOWN command\n");
1153 if (__lbs_cmd(card->priv, CMD_FUNC_SHUTDOWN,
1154 &cmd, sizeof(cmd), lbs_cmd_copyback,
1155 (unsigned long) &cmd))
1156 lbs_pr_alert("CMD_FUNC_SHUTDOWN cmd failed\n");
1157 }
d26285f8 1158
727c26ed
PO
1159
1160 lbs_deb_sdio("call remove card\n");
6bc61f4d 1161 lbs_stop_card(card->priv);
10078321 1162 lbs_remove_card(card->priv);
23b149c1 1163 card->priv->surpriseremoved = 1;
727c26ed 1164
9b02f419
DW
1165 flush_workqueue(card->workqueue);
1166 destroy_workqueue(card->workqueue);
727c26ed
PO
1167
1168 sdio_claim_host(func);
1169 sdio_release_irq(func);
1170 sdio_disable_func(func);
1171 sdio_release_host(func);
1172
1173 while (card->packets) {
1174 packet = card->packets;
1175 card->packets = card->packets->next;
1176 kfree(packet);
1177 }
1178
1179 kfree(card);
1180
1181 lbs_deb_leave(LBS_DEB_SDIO);
1182}
1183
1184static struct sdio_driver if_sdio_driver = {
1185 .name = "libertas_sdio",
1186 .id_table = if_sdio_ids,
1187 .probe = if_sdio_probe,
1188 .remove = if_sdio_remove,
1189};
1190
1191/*******************************************************************/
1192/* Module functions */
1193/*******************************************************************/
1194
4fb910fd 1195static int __init if_sdio_init_module(void)
727c26ed
PO
1196{
1197 int ret = 0;
1198
1199 lbs_deb_enter(LBS_DEB_SDIO);
1200
1201 printk(KERN_INFO "libertas_sdio: Libertas SDIO driver\n");
1202 printk(KERN_INFO "libertas_sdio: Copyright Pierre Ossman\n");
1203
1204 ret = sdio_register_driver(&if_sdio_driver);
1205
6bc61f4d
BZ
1206 /* Clear the flag in case user removes the card. */
1207 user_rmmod = 0;
1208
727c26ed
PO
1209 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
1210
1211 return ret;
1212}
1213
4fb910fd 1214static void __exit if_sdio_exit_module(void)
727c26ed
PO
1215{
1216 lbs_deb_enter(LBS_DEB_SDIO);
1217
6bc61f4d
BZ
1218 /* Set the flag as user is removing this module. */
1219 user_rmmod = 1;
d26285f8 1220
727c26ed
PO
1221 sdio_unregister_driver(&if_sdio_driver);
1222
1223 lbs_deb_leave(LBS_DEB_SDIO);
1224}
1225
1226module_init(if_sdio_init_module);
1227module_exit(if_sdio_exit_module);
1228
1229MODULE_DESCRIPTION("Libertas SDIO WLAN Driver");
1230MODULE_AUTHOR("Pierre Ossman");
1231MODULE_LICENSE("GPL");