2 * Driver for KeyStream, KS7010 based SDIO cards.
4 * Copyright (C) 2006-2008 KeyStream Corp.
5 * Copyright (C) 2009 Renesas Technology Corp.
6 * Copyright (C) 2016 Sang Engineering, Wolfram Sang
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 #include <linux/firmware.h>
14 #include <linux/mmc/card.h>
15 #include <linux/mmc/sdio_func.h>
16 #include <linux/workqueue.h>
17 #include <linux/atomic.h>
20 #include "ks_wlan_ioctl.h"
21 #include "ks_hostif.h"
22 #include "ks7010_sdio.h"
24 #define KS7010_FUNC_NUM 1
25 #define KS7010_IO_BLOCK_SIZE 512
26 #define KS7010_MAX_CLOCK 25000000
28 static const struct sdio_device_id ks7010_sdio_ids
[] = {
29 {SDIO_DEVICE(SDIO_VENDOR_ID_KS_CODE_A
, SDIO_DEVICE_ID_KS_7010
)},
30 {SDIO_DEVICE(SDIO_VENDOR_ID_KS_CODE_B
, SDIO_DEVICE_ID_KS_7010
)},
33 MODULE_DEVICE_TABLE(sdio
, ks7010_sdio_ids
);
37 #define inc_txqhead(priv) \
38 (priv->tx_dev.qhead = (priv->tx_dev.qhead + 1) % TX_DEVICE_BUFF_SIZE)
39 #define inc_txqtail(priv) \
40 (priv->tx_dev.qtail = (priv->tx_dev.qtail + 1) % TX_DEVICE_BUFF_SIZE)
41 #define cnt_txqbody(priv) \
42 (((priv->tx_dev.qtail + TX_DEVICE_BUFF_SIZE) - (priv->tx_dev.qhead)) % TX_DEVICE_BUFF_SIZE)
44 #define inc_rxqhead(priv) \
45 (priv->rx_dev.qhead = (priv->rx_dev.qhead + 1) % RX_DEVICE_BUFF_SIZE)
46 #define inc_rxqtail(priv) \
47 (priv->rx_dev.qtail = (priv->rx_dev.qtail + 1) % RX_DEVICE_BUFF_SIZE)
48 #define cnt_rxqbody(priv) \
49 (((priv->rx_dev.qtail + RX_DEVICE_BUFF_SIZE) - (priv->rx_dev.qhead)) % RX_DEVICE_BUFF_SIZE)
51 static int ks7010_sdio_read(struct ks_wlan_private
*priv
, unsigned int address
,
52 unsigned char *buffer
, int length
)
54 struct ks_sdio_card
*card
;
57 card
= priv
->ks_wlan_hw
.sdio_card
;
59 if (length
== 1) /* CMD52 */
60 *buffer
= sdio_readb(card
->func
, address
, &rc
);
61 else /* CMD53 multi-block transfer */
62 rc
= sdio_memcpy_fromio(card
->func
, buffer
, address
, length
);
65 DPRINTK(1, "sdio error=%d size=%d\n", rc
, length
);
70 static int ks7010_sdio_write(struct ks_wlan_private
*priv
, unsigned int address
,
71 unsigned char *buffer
, int length
)
73 struct ks_sdio_card
*card
;
76 card
= priv
->ks_wlan_hw
.sdio_card
;
78 if (length
== 1) /* CMD52 */
79 sdio_writeb(card
->func
, *buffer
, address
, &rc
);
81 rc
= sdio_memcpy_toio(card
->func
, address
, buffer
, length
);
84 DPRINTK(1, "sdio error=%d size=%d\n", rc
, length
);
89 static void ks_wlan_hw_sleep_doze_request(struct ks_wlan_private
*priv
)
91 unsigned char rw_data
;
97 atomic_set(&priv
->sleepstatus
.doze_request
, 0);
99 if (atomic_read(&priv
->sleepstatus
.status
) == 0) {
100 rw_data
= GCR_B_DOZE
;
102 ks7010_sdio_write(priv
, GCR_B
, &rw_data
, sizeof(rw_data
));
104 DPRINTK(1, " error : GCR_B=%02X\n", rw_data
);
107 DPRINTK(4, "PMG SET!! : GCR_B=%02X\n", rw_data
);
108 DPRINTK(3, "sleep_mode=SLP_SLEEP\n");
109 atomic_set(&priv
->sleepstatus
.status
, 1);
110 priv
->last_doze
= jiffies
;
112 DPRINTK(1, "sleep_mode=%d\n", priv
->sleep_mode
);
116 priv
->sleep_mode
= atomic_read(&priv
->sleepstatus
.status
);
119 static void ks_wlan_hw_sleep_wakeup_request(struct ks_wlan_private
*priv
)
121 unsigned char rw_data
;
127 atomic_set(&priv
->sleepstatus
.wakeup_request
, 0);
129 if (atomic_read(&priv
->sleepstatus
.status
) == 1) {
130 rw_data
= WAKEUP_REQ
;
132 ks7010_sdio_write(priv
, WAKEUP
, &rw_data
, sizeof(rw_data
));
134 DPRINTK(1, " error : WAKEUP=%02X\n", rw_data
);
137 DPRINTK(4, "wake up : WAKEUP=%02X\n", rw_data
);
138 atomic_set(&priv
->sleepstatus
.status
, 0);
139 priv
->last_wakeup
= jiffies
;
140 ++priv
->wakeup_count
;
142 DPRINTK(1, "sleep_mode=%d\n", priv
->sleep_mode
);
146 priv
->sleep_mode
= atomic_read(&priv
->sleepstatus
.status
);
149 void ks_wlan_hw_wakeup_request(struct ks_wlan_private
*priv
)
151 unsigned char rw_data
;
155 if (atomic_read(&priv
->psstatus
.status
) == PS_SNOOZE
) {
156 rw_data
= WAKEUP_REQ
;
158 ks7010_sdio_write(priv
, WAKEUP
, &rw_data
, sizeof(rw_data
));
160 DPRINTK(1, " error : WAKEUP=%02X\n", rw_data
);
162 DPRINTK(4, "wake up : WAKEUP=%02X\n", rw_data
);
163 priv
->last_wakeup
= jiffies
;
164 ++priv
->wakeup_count
;
166 DPRINTK(1, "psstatus=%d\n",
167 atomic_read(&priv
->psstatus
.status
));
171 static int _ks_wlan_hw_power_save(struct ks_wlan_private
*priv
)
173 unsigned char rw_data
;
176 if (priv
->reg
.powermgt
== POWMGT_ACTIVE_MODE
)
179 if (priv
->reg
.operation_mode
!= MODE_INFRASTRUCTURE
||
180 (priv
->connect_status
& CONNECT_STATUS_MASK
) != CONNECT_STATUS
)
183 if (priv
->dev_state
!= DEVICE_STATE_SLEEP
)
186 switch (atomic_read(&priv
->psstatus
.status
)) {
187 case PS_SNOOZE
: /* 4 */
190 DPRINTK(5, "\npsstatus.status=%d\npsstatus.confirm_wait=%d\npsstatus.snooze_guard=%d\ncnt_txqbody=%d\n",
191 atomic_read(&priv
->psstatus
.status
),
192 atomic_read(&priv
->psstatus
.confirm_wait
),
193 atomic_read(&priv
->psstatus
.snooze_guard
),
196 if (!atomic_read(&priv
->psstatus
.confirm_wait
)
197 && !atomic_read(&priv
->psstatus
.snooze_guard
)
198 && !cnt_txqbody(priv
)) {
200 ks7010_sdio_read(priv
, INT_PENDING
,
205 " error : INT_PENDING=%02X\n",
207 queue_delayed_work(priv
->ks_wlan_hw
.ks7010sdio_wq
,
208 &priv
->ks_wlan_hw
.rw_wq
, 1);
212 rw_data
= GCR_B_DOZE
;
214 ks7010_sdio_write(priv
,
220 " error : GCR_B=%02X\n",
223 (priv
->ks_wlan_hw
.ks7010sdio_wq
,
224 &priv
->ks_wlan_hw
.rw_wq
, 1);
228 "PMG SET!! : GCR_B=%02X\n",
230 atomic_set(&priv
->psstatus
.
233 "psstatus.status=PS_SNOOZE\n");
235 queue_delayed_work(priv
->ks_wlan_hw
.ks7010sdio_wq
,
236 &priv
->ks_wlan_hw
.rw_wq
, 1);
239 queue_delayed_work(priv
->ks_wlan_hw
.
241 &priv
->ks_wlan_hw
.rw_wq
,
250 int ks_wlan_hw_power_save(struct ks_wlan_private
*priv
)
252 queue_delayed_work(priv
->ks_wlan_hw
.ks7010sdio_wq
,
253 &priv
->ks_wlan_hw
.rw_wq
, 1);
257 static int enqueue_txdev(struct ks_wlan_private
*priv
, unsigned char *p
,
259 void (*complete_handler
)(void *arg1
, void *arg2
),
260 void *arg1
, void *arg2
)
262 struct tx_device_buffer
*sp
;
264 if (priv
->dev_state
< DEVICE_STATE_BOOT
) {
266 if (complete_handler
)
267 (*complete_handler
) (arg1
, arg2
);
271 if ((TX_DEVICE_BUFF_SIZE
- 1) <= cnt_txqbody(priv
)) {
272 /* in case of buffer overflow */
273 DPRINTK(1, "tx buffer overflow\n");
275 if (complete_handler
)
276 (*complete_handler
) (arg1
, arg2
);
280 sp
= &priv
->tx_dev
.tx_dev_buff
[priv
->tx_dev
.qtail
];
283 sp
->complete_handler
= complete_handler
;
292 static int write_to_device(struct ks_wlan_private
*priv
, unsigned char *buffer
,
296 unsigned char rw_data
;
297 struct hostif_hdr
*hdr
;
299 hdr
= (struct hostif_hdr
*)buffer
;
301 DPRINTK(4, "size=%d\n", hdr
->size
);
302 if (hdr
->event
< HIF_DATA_REQ
|| HIF_REQ_MAX
< hdr
->event
) {
303 DPRINTK(1, "unknown event=%04X\n", hdr
->event
);
307 retval
= ks7010_sdio_write(priv
, DATA_WINDOW
, buffer
, size
);
309 DPRINTK(1, " write error : retval=%d\n", retval
);
313 rw_data
= WRITE_STATUS_BUSY
;
315 ks7010_sdio_write(priv
, WRITE_STATUS
, &rw_data
, sizeof(rw_data
));
317 DPRINTK(1, " error : WRITE_STATUS=%02X\n", rw_data
);
324 static void tx_device_task(void *dev
)
326 struct ks_wlan_private
*priv
= (struct ks_wlan_private
*)dev
;
327 struct tx_device_buffer
*sp
;
331 if (cnt_txqbody(priv
) > 0
332 && atomic_read(&priv
->psstatus
.status
) != PS_SNOOZE
) {
333 sp
= &priv
->tx_dev
.tx_dev_buff
[priv
->tx_dev
.qhead
];
334 if (priv
->dev_state
>= DEVICE_STATE_BOOT
) {
335 rc
= write_to_device(priv
, sp
->sendp
, sp
->size
);
337 DPRINTK(1, "write_to_device error !!(%d)\n",
339 queue_delayed_work(priv
->ks_wlan_hw
.
341 &priv
->ks_wlan_hw
.rw_wq
, 1);
345 kfree(sp
->sendp
); /* allocated memory free */
346 if (sp
->complete_handler
) /* TX Complete */
347 (*sp
->complete_handler
) (sp
->arg1
, sp
->arg2
);
350 if (cnt_txqbody(priv
) > 0) {
351 queue_delayed_work(priv
->ks_wlan_hw
.ks7010sdio_wq
,
352 &priv
->ks_wlan_hw
.rw_wq
, 0);
357 int ks_wlan_hw_tx(struct ks_wlan_private
*priv
, void *p
, unsigned long size
,
358 void (*complete_handler
)(void *arg1
, void *arg2
),
359 void *arg1
, void *arg2
)
362 struct hostif_hdr
*hdr
;
364 hdr
= (struct hostif_hdr
*)p
;
366 if (hdr
->event
< HIF_DATA_REQ
|| HIF_REQ_MAX
< hdr
->event
) {
367 DPRINTK(1, "unknown event=%04X\n", hdr
->event
);
371 /* add event to hostt buffer */
372 priv
->hostt
.buff
[priv
->hostt
.qtail
] = hdr
->event
;
373 priv
->hostt
.qtail
= (priv
->hostt
.qtail
+ 1) % SME_EVENT_BUFF_SIZE
;
375 DPRINTK(4, "event=%04X\n", hdr
->event
);
376 spin_lock(&priv
->tx_dev
.tx_dev_lock
);
377 result
= enqueue_txdev(priv
, p
, size
, complete_handler
, arg1
, arg2
);
378 spin_unlock(&priv
->tx_dev
.tx_dev_lock
);
380 if (cnt_txqbody(priv
) > 0) {
381 queue_delayed_work(priv
->ks_wlan_hw
.ks7010sdio_wq
,
382 &priv
->ks_wlan_hw
.rw_wq
, 0);
387 static void rx_event_task(unsigned long dev
)
389 struct ks_wlan_private
*priv
= (struct ks_wlan_private
*)dev
;
390 struct rx_device_buffer
*rp
;
394 if (cnt_rxqbody(priv
) > 0 && priv
->dev_state
>= DEVICE_STATE_BOOT
) {
395 rp
= &priv
->rx_dev
.rx_dev_buff
[priv
->rx_dev
.qhead
];
396 hostif_receive(priv
, rp
->data
, rp
->size
);
399 if (cnt_rxqbody(priv
) > 0)
400 tasklet_schedule(&priv
->ks_wlan_hw
.rx_bh_task
);
404 static void ks_wlan_hw_rx(void *dev
, uint16_t size
)
406 struct ks_wlan_private
*priv
= (struct ks_wlan_private
*)dev
;
408 struct rx_device_buffer
*rx_buffer
;
409 struct hostif_hdr
*hdr
;
410 unsigned char read_status
;
411 unsigned short event
= 0;
416 if (cnt_rxqbody(priv
) >= (RX_DEVICE_BUFF_SIZE
- 1)) {
417 /* in case of buffer overflow */
418 DPRINTK(1, "rx buffer overflow\n");
421 rx_buffer
= &priv
->rx_dev
.rx_dev_buff
[priv
->rx_dev
.qtail
];
424 ks7010_sdio_read(priv
, DATA_WINDOW
, &rx_buffer
->data
[0],
425 hif_align_size(size
));
430 if (size
> 2046 || size
== 0) {
432 if (KS_WLAN_DEBUG
> 5)
433 print_hex_dump_bytes("INVALID DATA dump: ",
435 rx_buffer
->data
, 32);
437 /* rx_status update */
438 read_status
= READ_STATUS_IDLE
;
440 ks7010_sdio_write(priv
, READ_STATUS
, &read_status
,
441 sizeof(read_status
));
443 DPRINTK(1, " error : READ_STATUS=%02X\n", read_status
);
448 hdr
= (struct hostif_hdr
*)&rx_buffer
->data
[0];
449 rx_buffer
->size
= le16_to_cpu(hdr
->size
) + sizeof(hdr
->size
);
453 /* read status update */
454 read_status
= READ_STATUS_IDLE
;
456 ks7010_sdio_write(priv
, READ_STATUS
, &read_status
,
457 sizeof(read_status
));
459 DPRINTK(1, " error : READ_STATUS=%02X\n", read_status
);
461 DPRINTK(4, "READ_STATUS=%02X\n", read_status
);
463 if (atomic_read(&priv
->psstatus
.confirm_wait
)) {
464 if (IS_HIF_CONF(event
)) {
465 DPRINTK(4, "IS_HIF_CONF true !!\n");
466 atomic_dec(&priv
->psstatus
.confirm_wait
);
470 /* rx_event_task((void *)priv); */
471 tasklet_schedule(&priv
->ks_wlan_hw
.rx_bh_task
);
477 static void ks7010_rw_function(struct work_struct
*work
)
479 struct hw_info_t
*hw
;
480 struct ks_wlan_private
*priv
;
481 unsigned char rw_data
;
484 hw
= container_of(work
, struct hw_info_t
, rw_wq
.work
);
485 priv
= container_of(hw
, struct ks_wlan_private
, ks_wlan_hw
);
489 /* wiat after DOZE */
490 if (time_after(priv
->last_doze
+ ((30 * HZ
) / 1000), jiffies
)) {
491 DPRINTK(4, "wait after DOZE\n");
492 queue_delayed_work(priv
->ks_wlan_hw
.ks7010sdio_wq
,
493 &priv
->ks_wlan_hw
.rw_wq
, 1);
497 /* wiat after WAKEUP */
498 while (time_after(priv
->last_wakeup
+ ((30 * HZ
) / 1000), jiffies
)) {
499 DPRINTK(4, "wait after WAKEUP\n");
500 /* queue_delayed_work(priv->ks_wlan_hw.ks7010sdio_wq,&priv->ks_wlan_hw.rw_wq,
501 (priv->last_wakeup + ((30*HZ)/1000) - jiffies));*/
502 dev_info(&priv
->ks_wlan_hw
.sdio_card
->func
->dev
,
504 priv
->last_wakeup
+ (30 * HZ
) / 1000,
509 sdio_claim_host(priv
->ks_wlan_hw
.sdio_card
->func
);
511 /* power save wakeup */
512 if (atomic_read(&priv
->psstatus
.status
) == PS_SNOOZE
) {
513 if (cnt_txqbody(priv
) > 0) {
514 ks_wlan_hw_wakeup_request(priv
);
515 queue_delayed_work(priv
->ks_wlan_hw
.ks7010sdio_wq
,
516 &priv
->ks_wlan_hw
.rw_wq
, 1);
521 /* sleep mode doze */
522 if (atomic_read(&priv
->sleepstatus
.doze_request
) == 1) {
523 ks_wlan_hw_sleep_doze_request(priv
);
526 /* sleep mode wakeup */
527 if (atomic_read(&priv
->sleepstatus
.wakeup_request
) == 1) {
528 ks_wlan_hw_sleep_wakeup_request(priv
);
532 /* read (WriteStatus/ReadDataSize FN1:00_0014) */
534 ks7010_sdio_read(priv
, WSTATUS_RSIZE
, &rw_data
, sizeof(rw_data
));
536 DPRINTK(1, " error : WSTATUS_RSIZE=%02X psstatus=%d\n", rw_data
,
537 atomic_read(&priv
->psstatus
.status
));
540 DPRINTK(4, "WSTATUS_RSIZE=%02X\n", rw_data
);
542 if (rw_data
& RSIZE_MASK
) { /* Read schedule */
543 ks_wlan_hw_rx((void *)priv
,
544 (uint16_t)((rw_data
& RSIZE_MASK
) << 4));
546 if ((rw_data
& WSTATUS_MASK
))
547 tx_device_task((void *)priv
);
549 _ks_wlan_hw_power_save(priv
);
552 sdio_release_host(priv
->ks_wlan_hw
.sdio_card
->func
);
555 static void ks_sdio_interrupt(struct sdio_func
*func
)
558 struct ks_sdio_card
*card
;
559 struct ks_wlan_private
*priv
;
560 unsigned char status
, rsize
, rw_data
;
562 card
= sdio_get_drvdata(func
);
566 if (priv
->dev_state
>= DEVICE_STATE_BOOT
) {
568 ks7010_sdio_read(priv
, INT_PENDING
, &status
,
571 DPRINTK(1, "read INT_PENDING Failed!!(%d)\n", retval
);
574 DPRINTK(4, "INT_PENDING=%02X\n", rw_data
);
576 /* schedule task for interrupt status */
577 /* bit7 -> Write General Communication B register */
578 /* read (General Communication B register) */
579 /* bit5 -> Write Status Idle */
580 /* bit2 -> Read Status Busy */
581 if (status
& INT_GCR_B
582 || atomic_read(&priv
->psstatus
.status
) == PS_SNOOZE
) {
584 ks7010_sdio_read(priv
, GCR_B
, &rw_data
,
587 DPRINTK(1, " error : GCR_B=%02X\n", rw_data
);
590 /* DPRINTK(1, "GCR_B=%02X\n", rw_data); */
591 if (rw_data
== GCR_B_ACTIVE
) {
592 if (atomic_read(&priv
->psstatus
.status
) ==
594 atomic_set(&priv
->psstatus
.status
,
596 priv
->wakeup_count
= 0;
598 complete(&priv
->psstatus
.wakeup_wait
);
603 /* read (WriteStatus/ReadDataSize FN1:00_0014) */
605 ks7010_sdio_read(priv
, WSTATUS_RSIZE
, &rw_data
,
608 DPRINTK(1, " error : WSTATUS_RSIZE=%02X\n",
612 DPRINTK(4, "WSTATUS_RSIZE=%02X\n", rw_data
);
613 rsize
= rw_data
& RSIZE_MASK
;
614 if (rsize
) { /* Read schedule */
615 ks_wlan_hw_rx((void *)priv
,
616 (uint16_t)(rsize
<< 4));
618 if (rw_data
& WSTATUS_MASK
) {
620 if (status
& INT_WRITE_STATUS
621 && !cnt_txqbody(priv
)) {
622 /* dummy write for interrupt clear */
625 ks7010_sdio_write(priv
, DATA_WINDOW
,
630 "write DATA_WINDOW Failed!!(%d)\n",
633 status
&= ~INT_WRITE_STATUS
;
636 if (atomic_read(&priv
->psstatus
.status
) == PS_SNOOZE
) {
637 if (cnt_txqbody(priv
)) {
638 ks_wlan_hw_wakeup_request(priv
);
647 tx_device_task((void *)priv
);
657 queue_delayed_work(priv
->ks_wlan_hw
.ks7010sdio_wq
,
658 &priv
->ks_wlan_hw
.rw_wq
, 0);
661 static int trx_device_init(struct ks_wlan_private
*priv
)
663 /* initialize values (tx) */
664 priv
->tx_dev
.qhead
= 0;
665 priv
->tx_dev
.qtail
= 0;
667 /* initialize values (rx) */
668 priv
->rx_dev
.qhead
= 0;
669 priv
->rx_dev
.qtail
= 0;
671 /* initialize spinLock (tx,rx) */
672 spin_lock_init(&priv
->tx_dev
.tx_dev_lock
);
673 spin_lock_init(&priv
->rx_dev
.rx_dev_lock
);
675 tasklet_init(&priv
->ks_wlan_hw
.rx_bh_task
, rx_event_task
,
676 (unsigned long)priv
);
681 static void trx_device_exit(struct ks_wlan_private
*priv
)
683 struct tx_device_buffer
*sp
;
685 /* tx buffer clear */
686 while (cnt_txqbody(priv
) > 0) {
687 sp
= &priv
->tx_dev
.tx_dev_buff
[priv
->tx_dev
.qhead
];
688 kfree(sp
->sendp
); /* allocated memory free */
689 if (sp
->complete_handler
) /* TX Complete */
690 (*sp
->complete_handler
) (sp
->arg1
, sp
->arg2
);
694 tasklet_kill(&priv
->ks_wlan_hw
.rx_bh_task
);
697 static int ks7010_sdio_update_index(struct ks_wlan_private
*priv
, u32 index
)
701 unsigned char *data_buf
;
703 data_buf
= kmalloc(sizeof(u32
), GFP_KERNEL
);
709 memcpy(data_buf
, &index
, sizeof(index
));
710 retval
= ks7010_sdio_write(priv
, WRITE_INDEX
, data_buf
, sizeof(index
));
716 retval
= ks7010_sdio_write(priv
, READ_INDEX
, data_buf
, sizeof(index
));
726 #define ROM_BUFF_SIZE (64 * 1024)
727 static int ks7010_sdio_data_compare(struct ks_wlan_private
*priv
, u32 address
,
728 unsigned char *data
, unsigned int size
)
732 unsigned char *read_buf
;
734 read_buf
= kmalloc(ROM_BUFF_SIZE
, GFP_KERNEL
);
739 retval
= ks7010_sdio_read(priv
, address
, read_buf
, size
);
744 retval
= memcmp(data
, read_buf
, size
);
747 DPRINTK(0, "data compare error (%d)\n", retval
);
756 static int ks7010_upload_firmware(struct ks_wlan_private
*priv
,
757 struct ks_sdio_card
*card
)
759 unsigned int size
, offset
, n
= 0;
760 unsigned char *rom_buf
;
761 unsigned char rw_data
= 0;
764 const struct firmware
*fw_entry
= NULL
;
766 /* buffer allocate */
767 rom_buf
= kmalloc(ROM_BUFF_SIZE
, GFP_KERNEL
);
771 sdio_claim_host(card
->func
);
773 /* Firmware running ? */
774 retval
= ks7010_sdio_read(priv
, GCR_A
, &rw_data
, sizeof(rw_data
));
775 if (rw_data
== GCR_A_RUN
) {
776 DPRINTK(0, "MAC firmware running ...\n");
781 retval
= request_firmware(&fw_entry
, ROM_FILE
, &priv
->ks_wlan_hw
.sdio_card
->func
->dev
);
785 length
= fw_entry
->size
;
790 if (length
>= ROM_BUFF_SIZE
) {
791 size
= ROM_BUFF_SIZE
;
792 length
= length
- ROM_BUFF_SIZE
;
797 DPRINTK(4, "size = %d\n", size
);
800 memcpy(rom_buf
, fw_entry
->data
+ n
, size
);
801 /* Update write index */
804 ks7010_sdio_update_index(priv
,
805 KS7010_IRAM_ADDRESS
+ offset
);
812 retval
= ks7010_sdio_write(priv
, DATA_WINDOW
, rom_buf
, size
);
820 ks7010_sdio_data_compare(priv
, DATA_WINDOW
, rom_buf
, size
);
830 rw_data
= GCR_A_REMAP
;
831 retval
= ks7010_sdio_write(priv
, GCR_A
, &rw_data
, sizeof(rw_data
));
836 DPRINTK(4, " REMAP Request : GCR_A=%02X\n", rw_data
);
838 /* Firmware running check */
839 for (n
= 0; n
< 50; ++n
) {
840 mdelay(10); /* wait_ms(10); */
842 ks7010_sdio_read(priv
, GCR_A
, &rw_data
, sizeof(rw_data
));
847 if (rw_data
== GCR_A_RUN
)
850 DPRINTK(4, "firmware wakeup (%d)!!!!\n", n
);
852 DPRINTK(1, "firmware can't start\n");
860 release_firmware(fw_entry
);
862 sdio_release_host(card
->func
);
867 static void ks7010_card_init(struct ks_wlan_private
*priv
)
869 DPRINTK(5, "\ncard_init_task()\n");
871 /* init_waitqueue_head(&priv->confirm_wait); */
872 init_completion(&priv
->confirm_wait
);
874 DPRINTK(5, "init_completion()\n");
876 /* get mac address & firmware version */
877 hostif_sme_enqueue(priv
, SME_START
);
879 DPRINTK(5, "hostif_sme_enqueu()\n");
881 if (!wait_for_completion_interruptible_timeout
882 (&priv
->confirm_wait
, 5 * HZ
)) {
883 DPRINTK(1, "wait time out!! SME_START\n");
886 if (priv
->mac_address_valid
&& priv
->version_size
)
887 priv
->dev_state
= DEVICE_STATE_PREINIT
;
889 hostif_sme_enqueue(priv
, SME_GET_EEPROM_CKSUM
);
891 /* load initial wireless parameter */
892 hostif_sme_enqueue(priv
, SME_STOP_REQUEST
);
894 hostif_sme_enqueue(priv
, SME_RTS_THRESHOLD_REQUEST
);
895 hostif_sme_enqueue(priv
, SME_FRAGMENTATION_THRESHOLD_REQUEST
);
897 hostif_sme_enqueue(priv
, SME_WEP_INDEX_REQUEST
);
898 hostif_sme_enqueue(priv
, SME_WEP_KEY1_REQUEST
);
899 hostif_sme_enqueue(priv
, SME_WEP_KEY2_REQUEST
);
900 hostif_sme_enqueue(priv
, SME_WEP_KEY3_REQUEST
);
901 hostif_sme_enqueue(priv
, SME_WEP_KEY4_REQUEST
);
903 hostif_sme_enqueue(priv
, SME_WEP_FLAG_REQUEST
);
904 hostif_sme_enqueue(priv
, SME_RSN_ENABLED_REQUEST
);
905 hostif_sme_enqueue(priv
, SME_MODE_SET_REQUEST
);
906 hostif_sme_enqueue(priv
, SME_START_REQUEST
);
908 if (!wait_for_completion_interruptible_timeout
909 (&priv
->confirm_wait
, 5 * HZ
)) {
910 DPRINTK(1, "wait time out!! wireless parameter set\n");
913 if (priv
->dev_state
>= DEVICE_STATE_PREINIT
) {
914 DPRINTK(1, "DEVICE READY!!\n");
915 priv
->dev_state
= DEVICE_STATE_READY
;
917 DPRINTK(1, "dev_state=%d\n", priv
->dev_state
);
921 static void ks7010_init_defaults(struct ks_wlan_private
*priv
)
923 priv
->reg
.tx_rate
= TX_RATE_AUTO
;
924 priv
->reg
.preamble
= LONG_PREAMBLE
;
925 priv
->reg
.powermgt
= POWMGT_ACTIVE_MODE
;
926 priv
->reg
.scan_type
= ACTIVE_SCAN
;
927 priv
->reg
.beacon_lost_count
= 20;
928 priv
->reg
.rts
= 2347UL;
929 priv
->reg
.fragment
= 2346UL;
930 priv
->reg
.phy_type
= D_11BG_COMPATIBLE_MODE
;
931 priv
->reg
.cts_mode
= CTS_MODE_FALSE
;
932 priv
->reg
.rate_set
.body
[11] = TX_RATE_54M
;
933 priv
->reg
.rate_set
.body
[10] = TX_RATE_48M
;
934 priv
->reg
.rate_set
.body
[9] = TX_RATE_36M
;
935 priv
->reg
.rate_set
.body
[8] = TX_RATE_18M
;
936 priv
->reg
.rate_set
.body
[7] = TX_RATE_9M
;
937 priv
->reg
.rate_set
.body
[6] = TX_RATE_24M
| BASIC_RATE
;
938 priv
->reg
.rate_set
.body
[5] = TX_RATE_12M
| BASIC_RATE
;
939 priv
->reg
.rate_set
.body
[4] = TX_RATE_6M
| BASIC_RATE
;
940 priv
->reg
.rate_set
.body
[3] = TX_RATE_11M
| BASIC_RATE
;
941 priv
->reg
.rate_set
.body
[2] = TX_RATE_5M
| BASIC_RATE
;
942 priv
->reg
.rate_set
.body
[1] = TX_RATE_2M
| BASIC_RATE
;
943 priv
->reg
.rate_set
.body
[0] = TX_RATE_1M
| BASIC_RATE
;
944 priv
->reg
.tx_rate
= TX_RATE_FULL_AUTO
;
945 priv
->reg
.rate_set
.size
= 12;
948 static int ks7010_sdio_probe(struct sdio_func
*func
,
949 const struct sdio_device_id
*device
)
951 struct ks_wlan_private
*priv
;
952 struct ks_sdio_card
*card
;
953 struct net_device
*netdev
;
954 unsigned char rw_data
;
957 DPRINTK(5, "ks7010_sdio_probe()\n");
962 /* initialize ks_sdio_card */
963 card
= kzalloc(sizeof(*card
), GFP_KERNEL
);
968 spin_lock_init(&card
->lock
);
970 /*** Initialize SDIO ***/
971 sdio_claim_host(func
);
974 /* Issue config request to override clock rate */
976 /* function blocksize set */
977 ret
= sdio_set_block_size(func
, KS7010_IO_BLOCK_SIZE
);
978 DPRINTK(5, "multi_block=%d sdio_set_block_size()=%d %d\n",
979 func
->card
->cccr
.multi_block
, func
->cur_blksize
, ret
);
981 /* Allocate the slot current */
983 /* function enable */
984 ret
= sdio_enable_func(func
);
985 DPRINTK(5, "sdio_enable_func() %d\n", ret
);
987 goto error_free_card
;
989 /* interrupt disable */
990 sdio_writeb(func
, 0, INT_ENABLE
, &ret
);
992 goto error_free_card
;
993 sdio_writeb(func
, 0xff, INT_PENDING
, &ret
);
995 goto error_disable_func
;
997 /* setup interrupt handler */
998 ret
= sdio_claim_irq(func
, ks_sdio_interrupt
);
1000 goto error_disable_func
;
1002 sdio_release_host(func
);
1004 sdio_set_drvdata(func
, card
);
1006 DPRINTK(5, "class = 0x%X, vendor = 0x%X, "
1007 "device = 0x%X\n", func
->class, func
->vendor
, func
->device
);
1009 /* private memory allocate */
1010 netdev
= alloc_etherdev(sizeof(*priv
));
1012 dev_err(&card
->func
->dev
, "ks7010 : Unable to alloc new net device\n");
1013 goto error_release_irq
;
1015 if (dev_alloc_name(netdev
, "wlan%d") < 0) {
1016 dev_err(&card
->func
->dev
,
1017 "ks7010 : Couldn't get name!\n");
1018 goto error_free_netdev
;
1021 priv
= netdev_priv(netdev
);
1024 SET_NETDEV_DEV(netdev
, &card
->func
->dev
); /* for create sysfs symlinks */
1026 /* private memory initialize */
1027 priv
->ks_wlan_hw
.sdio_card
= card
;
1028 init_completion(&priv
->ks_wlan_hw
.ks7010_sdio_wait
);
1029 priv
->ks_wlan_hw
.read_buf
= NULL
;
1030 priv
->ks_wlan_hw
.read_buf
= kmalloc(RX_DATA_SIZE
, GFP_KERNEL
);
1031 if (!priv
->ks_wlan_hw
.read_buf
)
1032 goto error_free_netdev
;
1034 priv
->dev_state
= DEVICE_STATE_PREBOOT
;
1035 priv
->net_dev
= netdev
;
1036 priv
->firmware_version
[0] = '\0';
1037 priv
->version_size
= 0;
1038 priv
->last_doze
= jiffies
; /* set current jiffies */
1039 priv
->last_wakeup
= jiffies
;
1040 memset(&priv
->nstats
, 0, sizeof(priv
->nstats
));
1041 memset(&priv
->wstats
, 0, sizeof(priv
->wstats
));
1044 atomic_set(&priv
->sleepstatus
.doze_request
, 0);
1045 atomic_set(&priv
->sleepstatus
.wakeup_request
, 0);
1046 atomic_set(&priv
->sleepstatus
.wakeup_request
, 0);
1048 trx_device_init(priv
);
1050 ks_wlan_net_start(netdev
);
1052 ks7010_init_defaults(priv
);
1054 /* Upload firmware */
1055 ret
= ks7010_upload_firmware(priv
, card
); /* firmware load */
1057 dev_err(&card
->func
->dev
,
1058 "ks7010: firmware load failed !! return code = %d\n",
1060 goto error_free_read_buf
;
1063 /* interrupt setting */
1064 /* clear Interrupt status write (ARMtoSD_InterruptPending FN1:00_0024) */
1066 sdio_claim_host(func
);
1067 ret
= ks7010_sdio_write(priv
, INT_PENDING
, &rw_data
, sizeof(rw_data
));
1068 sdio_release_host(func
);
1070 DPRINTK(1, " error : INT_PENDING=%02X\n", rw_data
);
1072 DPRINTK(4, " clear Interrupt : INT_PENDING=%02X\n", rw_data
);
1074 /* enable ks7010sdio interrupt (INT_GCR_B|INT_READ_STATUS|INT_WRITE_STATUS) */
1075 rw_data
= (INT_GCR_B
| INT_READ_STATUS
| INT_WRITE_STATUS
);
1076 sdio_claim_host(func
);
1077 ret
= ks7010_sdio_write(priv
, INT_ENABLE
, &rw_data
, sizeof(rw_data
));
1078 sdio_release_host(func
);
1080 DPRINTK(1, " error : INT_ENABLE=%02X\n", rw_data
);
1082 DPRINTK(4, " enable Interrupt : INT_ENABLE=%02X\n", rw_data
);
1083 priv
->dev_state
= DEVICE_STATE_BOOT
;
1085 priv
->ks_wlan_hw
.ks7010sdio_wq
= create_workqueue("ks7010sdio_wq");
1086 if (!priv
->ks_wlan_hw
.ks7010sdio_wq
) {
1087 DPRINTK(1, "create_workqueue failed !!\n");
1088 goto error_free_read_buf
;
1091 INIT_DELAYED_WORK(&priv
->ks_wlan_hw
.rw_wq
, ks7010_rw_function
);
1092 ks7010_card_init(priv
);
1094 ret
= register_netdev(priv
->net_dev
);
1096 goto error_free_read_buf
;
1100 error_free_read_buf
:
1101 kfree(priv
->ks_wlan_hw
.read_buf
);
1102 priv
->ks_wlan_hw
.read_buf
= NULL
;
1104 free_netdev(priv
->net_dev
);
1107 sdio_claim_host(func
);
1108 sdio_release_irq(func
);
1110 sdio_disable_func(func
);
1112 sdio_release_host(func
);
1113 sdio_set_drvdata(func
, NULL
);
1119 static void ks7010_sdio_remove(struct sdio_func
*func
)
1122 struct ks_sdio_card
*card
;
1123 struct ks_wlan_private
*priv
;
1125 DPRINTK(1, "ks7010_sdio_remove()\n");
1127 card
= sdio_get_drvdata(func
);
1132 DPRINTK(1, "priv = card->priv\n");
1135 struct net_device
*netdev
= priv
->net_dev
;
1137 ks_wlan_net_stop(netdev
);
1138 DPRINTK(1, "ks_wlan_net_stop\n");
1140 /* interrupt disable */
1141 sdio_claim_host(func
);
1142 sdio_writeb(func
, 0, INT_ENABLE
, &ret
);
1143 sdio_writeb(func
, 0xff, INT_PENDING
, &ret
);
1144 sdio_release_host(func
);
1145 DPRINTK(1, "interrupt disable\n");
1147 /* send stop request to MAC */
1149 struct hostif_stop_request_t
*pp
;
1151 pp
= kzalloc(hif_align_size(sizeof(*pp
)), GFP_KERNEL
);
1153 DPRINTK(3, "allocate memory failed..\n");
1154 return; /* to do goto ni suru */
1157 cpu_to_le16((uint16_t)
1159 sizeof(pp
->header
.size
)));
1160 pp
->header
.event
= cpu_to_le16((uint16_t)HIF_STOP_REQ
);
1162 sdio_claim_host(func
);
1163 write_to_device(priv
, (unsigned char *)pp
,
1164 hif_align_size(sizeof(*pp
)));
1165 sdio_release_host(func
);
1168 DPRINTK(1, "STOP Req\n");
1170 if (priv
->ks_wlan_hw
.ks7010sdio_wq
) {
1171 flush_workqueue(priv
->ks_wlan_hw
.ks7010sdio_wq
);
1172 destroy_workqueue(priv
->ks_wlan_hw
.ks7010sdio_wq
);
1175 "destroy_workqueue(priv->ks_wlan_hw.ks7010sdio_wq);\n");
1178 DPRINTK(1, "hostif_exit\n");
1180 unregister_netdev(netdev
);
1182 trx_device_exit(priv
);
1183 kfree(priv
->ks_wlan_hw
.read_buf
);
1184 free_netdev(priv
->net_dev
);
1188 sdio_claim_host(func
);
1189 sdio_release_irq(func
);
1190 DPRINTK(1, "sdio_release_irq()\n");
1191 sdio_disable_func(func
);
1192 DPRINTK(1, "sdio_disable_func()\n");
1193 sdio_release_host(func
);
1195 sdio_set_drvdata(func
, NULL
);
1198 DPRINTK(1, "kfree()\n");
1200 DPRINTK(5, " Bye !!\n");
1203 static struct sdio_driver ks7010_sdio_driver
= {
1204 .name
= "ks7010_sdio",
1205 .id_table
= ks7010_sdio_ids
,
1206 .probe
= ks7010_sdio_probe
,
1207 .remove
= ks7010_sdio_remove
,
1210 module_driver(ks7010_sdio_driver
, sdio_register_driver
, sdio_unregister_driver
);
1211 MODULE_AUTHOR("Sang Engineering, Qi-Hardware, KeyStream");
1212 MODULE_DESCRIPTION("Driver for KeyStream KS7010 based SDIO cards");
1213 MODULE_LICENSE("GPL v2");
1214 MODULE_FIRMWARE(ROM_FILE
);