summaryrefslogtreecommitdiffstats
path: root/drivers/staging/ks7010/ks7010_sdio.h
blob: 0a0951ffffa64e9095e1f920a80849dbf4b60969 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
 *   Driver for KeyStream, KS7010 based SDIO cards. 
 *
 *   Copyright (C) 2006-2008 KeyStream Corp.
 *   Copyright (C) 2009 Renesas Technology Corp.
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License version 2 as
 *   published by the Free Software Foundation.
 */
#ifndef _KS7010_SDIO_H
#define _KS7010_SDIO_H

#ifdef	DEVICE_ALIGNMENT
#undef	DEVICE_ALIGNMENT
#endif
#define DEVICE_ALIGNMENT 32

/*  SDIO KeyStream vendor and device */
#define SDIO_VENDOR_ID_KS_CODE_A	0x005b
#define SDIO_VENDOR_ID_KS_CODE_B	0x0023
/* Older sources suggest earlier versions were named 7910 or 79xx */
#define SDIO_DEVICE_ID_KS_7010		0x7910

/* Read Status Register */
#define READ_STATUS		0x000000
#define READ_STATUS_BUSY	0
#define READ_STATUS_IDLE	1

/* Read Index Register */
#define READ_INDEX		0x000004

/* Read Data Size Register */
#define READ_DATA_SIZE		0x000008

/* Write Status Register */
#define WRITE_STATUS		0x00000C
#define WRITE_STATUS_BUSY	0
#define WRITE_STATUS_IDLE	1

/* Write Index Register */
#define WRITE_INDEX		0x000010

/* Write Status/Read Data Size Register 
 * for network packet (less than 2048 bytes data)
 */
#define WSTATUS_RSIZE		0x000014
#define WSTATUS_MASK		0x80	/* Write Status Register value */
#define RSIZE_MASK		0x7F	/* Read Data Size Register value [10:4] */

/* ARM to SD interrupt Enable */
#define INT_ENABLE		0x000020
/* ARM to SD interrupt Pending */
#define INT_PENDING		0x000024

#define INT_GCR_B              BIT(7)
#define INT_GCR_A              BIT(6)
#define INT_WRITE_STATUS       BIT(5)
#define INT_WRITE_INDEX        BIT(4)
#define INT_WRITE_SIZE         BIT(3)
#define INT_READ_STATUS        BIT(2)
#define INT_READ_INDEX         BIT(1)
#define INT_READ_SIZE          BIT(0)

/* General Communication Register A */
#define GCR_A			0x000028
#define GCR_A_INIT		0
#define GCR_A_REMAP		1
#define GCR_A_RUN		2

/* General Communication Register B */
#define GCR_B			0x00002C
#define GCR_B_ACTIVE		0
#define GCR_B_DOZE		1

/* Wakeup Register */
/* #define WAKEUP			0x008104 */
/* #define WAKEUP_REQ		0x00 */
#define WAKEUP			0x008018
#define WAKEUP_REQ		0x5a

/* AHB Data Window  0x010000-0x01FFFF */
#define DATA_WINDOW		0x010000
#define WINDOW_SIZE		64*1024

#define KS7010_IRAM_ADDRESS	0x06000000

/* 
 * struct define
 */
struct hw_info_t {
	struct ks_sdio_card *sdio_card;
	struct completion ks7010_sdio_wait;
	struct workqueue_struct *ks7010sdio_wq;
	struct delayed_work rw_wq;
	unsigned char *read_buf;
	struct tasklet_struct rx_bh_task;
};

struct ks_sdio_packet {
	struct ks_sdio_packet *next;
	u16 nb;
	u8 buffer[0] __aligned(4);
};

struct ks_sdio_card {
	struct sdio_func *func;
	struct ks_wlan_private *priv;
	spinlock_t lock;
};

/* Tx Device struct */
#define	TX_DEVICE_BUFF_SIZE	1024

struct tx_device_buffer {
	unsigned char *sendp;	/* pointer of send req data */
	unsigned int size;
	void (*complete_handler) (void *arg1, void *arg2);
	void *arg1;
	void *arg2;
};

struct tx_device {
	struct tx_device_buffer tx_dev_buff[TX_DEVICE_BUFF_SIZE];
	unsigned int qhead;	/* tx buffer queue first pointer */
	unsigned int qtail;	/* tx buffer queue last pointer */
	spinlock_t tx_dev_lock;
};

/* Rx Device struct */
#define	RX_DATA_SIZE	(2 + 2 + 2347 + 1)
#define	RX_DEVICE_BUFF_SIZE	32

struct rx_device_buffer {
	unsigned char data[RX_DATA_SIZE];
	unsigned int size;
};

struct rx_device {
	struct rx_device_buffer rx_dev_buff[RX_DEVICE_BUFF_SIZE];
	unsigned int qhead;	/* rx buffer queue first pointer */
	unsigned int qtail;	/* rx buffer queue last pointer */
	spinlock_t rx_dev_lock;
};
#define	ROM_FILE "ks7010sd.rom"

#endif /* _KS7010_SDIO_H */