14 #include <linux/module.h>
16 #include <linux/kernel.h>
28 #define TYPE_A_HEADER_SIZE 4
29 #define TYPE_A_LOOKAHEAD_SIZE 16
31 #define MAX_NR_RX_BUF 4
33 #define SDU_TX_BUF_SIZE 2048
34 #define TX_BUF_SIZE 2048
35 #define TX_CHUNK_SIZE (2048 - TYPE_A_HEADER_SIZE)
36 #define RX_BUF_SIZE (25*1024)
39 #define TX_INTERVAL (1000000/TX_HZ)
44 static void release_sdio(
struct sdiowm_dev *sdev);
47 static void hexdump(
char *title,
u8 *
data,
int len)
52 for (i = 0; i < len; i++) {
79 static void free_tx_struct(
struct sdio_tx *t)
97 static void free_rx_struct(
struct sdio_rx *r)
103 static struct sdio_tx *get_tx_struct(
struct tx_cxt *tx,
int *no_spc)
113 *no_spc = list_empty(&tx->
free_list) ? 1 : 0;
119 static void put_tx_struct(
struct tx_cxt *tx,
struct sdio_tx *t)
139 static void put_rx_struct(
struct rx_cxt *rx,
struct sdio_rx *r)
165 t = alloc_tx_struct(tx);
179 r = alloc_rx_struct(rx);
200 static void release_sdio(
struct sdiowm_dev *sdev)
239 int n, blocks,
ret, remain;
256 remain = (remain + 3) & ~3;
277 int pos,
len,
i, estlen, aggr_num = 0, aggr_len;
285 estlen = ((t->
len + 3) & ~3) + 4;
300 spin_unlock_irqrestore(&tx->
lock, flags);
308 len = aggr_len -
pos;
313 buf[1] = (len >> 8) & 0xff;
314 buf[2] = (len >> 16) & 0xff;
315 buf[3] = (pos + len) >= aggr_len ? 0 : 1;
316 send_sdio_pkt(func, buf, len + TYPE_A_HEADER_SIZE);
321 for (l = tx->
sdu_list.next, i = 0; i < aggr_num; i++, l = next) {
328 put_tx_struct(t->
tx_cxt, t);
332 spin_unlock_irqrestore(&tx->
lock, flags);
344 send_sdio_pkt(func, t->
buf, t->
len);
350 spin_unlock_irqrestore(&tx->
lock, flags);
366 spin_unlock_irqrestore(&tx->
lock, flags);
378 diff = (now.tv_sec - before->
tv_sec) * 1000000 +
379 (now.tv_usec - before->
tv_usec);
382 spin_unlock_irqrestore(&tx->
lock, flags);
388 if (!is_sdu && t ==
NULL) {
389 spin_unlock_irqrestore(&tx->
lock, flags);
395 spin_unlock_irqrestore(&tx->
lock, flags);
400 send_hci(func, tx, t);
403 static int gdm_sdio_send(
void *priv_dev,
void *data,
int len,
418 cmd_evt = (pkt[0] << 8) | pkt[1];
420 t = get_tx_struct(tx, &no_spc);
423 spin_unlock_irqrestore(&tx->
lock, flags);
434 t = alloc_tx_struct(tx);
436 spin_unlock_irqrestore(&tx->
lock, flags);
441 t->
buf[0] = len & 0xff;
442 t->
buf[1] = (len >> 8) & 0xff;
443 t->
buf[2] = (len >> 16) & 0xff;
455 spin_unlock_irqrestore(&tx->
lock, flags);
466 static int control_sdu_tx_flow(
struct sdiowm_dev *sdev,
u8 *hci_data,
int len)
474 cmd_evt = (hci_data[0] << 8) | (hci_data[1]);
478 if (hci_data[4] == 0) {
483 }
else if (hci_data[4] == 1) {
500 spin_unlock_irqrestore(&tx->
lock, flags);
504 static void gdm_sdio_irq(
struct sdio_func *func)
529 len = (hdr[2] << 16) | (hdr[1] << 8) | hdr[0];
537 u32 *ack_seq = (
u32 *)&hdr[4];
544 spin_unlock_irqrestore(&tx->
lock, flags);
584 hexdump(
"sdio_receive", rx->
rx_buf, len);
586 len = control_sdu_tx_flow(sdev, rx->
rx_buf, len);
592 spin_unlock_irqrestore(&rx->
lock, flags);
597 put_rx_struct(rx, r);
600 spin_unlock_irqrestore(&rx->
lock, flags);
608 static int gdm_sdio_receive(
void *priv_dev,
609 void (*
cb)(
void *cb_data,
void *data,
int len),
618 r = get_rx_struct(rx);
620 spin_unlock_irqrestore(&rx->
lock, flags);
628 spin_unlock_irqrestore(&rx->
lock, flags);
633 static int sdio_wimax_probe(
struct sdio_func *func,
637 struct phy_dev *phy_dev =
NULL;
652 phy_dev = kzalloc(
sizeof(*phy_dev),
GFP_KERNEL);
653 if (phy_dev ==
NULL) {
665 phy_dev->
rcv_func = gdm_sdio_receive;
667 ret = init_sdio(sdev);
688 static void sdio_wimax_remove(
struct sdio_func *func)
713 .probe = sdio_wimax_probe,
714 .remove = sdio_wimax_remove,
715 .name =
"sdio_wimax",
716 .id_table = sdio_wimax_ids,
719 static int __init sdio_gdm_wimax_init(
void)
724 static void __exit sdio_gdm_wimax_exit(
void)