aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/zd1211rw/zd_usb.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/zd1211rw/zd_usb.h')
-rw-r--r--drivers/net/wireless/zd1211rw/zd_usb.h40
1 files changed, 32 insertions, 8 deletions
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.h b/drivers/net/wireless/zd1211rw/zd_usb.h
index 1b1655cb7cb4..bf942843b733 100644
--- a/drivers/net/wireless/zd1211rw/zd_usb.h
+++ b/drivers/net/wireless/zd1211rw/zd_usb.h
@@ -32,6 +32,10 @@
32#define ZD_USB_TX_HIGH 5 32#define ZD_USB_TX_HIGH 5
33#define ZD_USB_TX_LOW 2 33#define ZD_USB_TX_LOW 2
34 34
35#define ZD_TX_TIMEOUT (HZ * 5)
36#define ZD_TX_WATCHDOG_INTERVAL round_jiffies_relative(HZ)
37#define ZD_RX_IDLE_INTERVAL round_jiffies_relative(30 * HZ)
38
35enum devicetype { 39enum devicetype {
36 DEVICE_ZD1211 = 0, 40 DEVICE_ZD1211 = 0,
37 DEVICE_ZD1211B = 1, 41 DEVICE_ZD1211B = 1,
@@ -105,7 +109,7 @@ struct usb_req_rfwrite {
105 __le16 bits; 109 __le16 bits;
106 /* RF2595: 24 */ 110 /* RF2595: 24 */
107 __le16 bit_values[0]; 111 __le16 bit_values[0];
108 /* (CR203 & ~(RF_IF_LE | RF_CLK | RF_DATA)) | (bit ? RF_DATA : 0) */ 112 /* (ZD_CR203 & ~(RF_IF_LE | RF_CLK | RF_DATA)) | (bit ? RF_DATA : 0) */
109} __packed; 113} __packed;
110 114
111/* USB interrupt */ 115/* USB interrupt */
@@ -162,6 +166,8 @@ struct zd_usb_interrupt {
162 struct read_regs_int read_regs; 166 struct read_regs_int read_regs;
163 spinlock_t lock; 167 spinlock_t lock;
164 struct urb *urb; 168 struct urb *urb;
169 void *buffer;
170 dma_addr_t buffer_dma;
165 int interval; 171 int interval;
166 u8 read_regs_enabled:1; 172 u8 read_regs_enabled:1;
167}; 173};
@@ -175,7 +181,10 @@ static inline struct usb_int_regs *get_read_regs(struct zd_usb_interrupt *intr)
175 181
176struct zd_usb_rx { 182struct zd_usb_rx {
177 spinlock_t lock; 183 spinlock_t lock;
178 u8 fragment[2*USB_MAX_RX_SIZE]; 184 struct mutex setup_mutex;
185 struct delayed_work idle_work;
186 struct tasklet_struct reset_timer_tasklet;
187 u8 fragment[2 * USB_MAX_RX_SIZE];
179 unsigned int fragment_length; 188 unsigned int fragment_length;
180 unsigned int usb_packet_size; 189 unsigned int usb_packet_size;
181 struct urb **urbs; 190 struct urb **urbs;
@@ -184,19 +193,21 @@ struct zd_usb_rx {
184 193
185/** 194/**
186 * struct zd_usb_tx - structure used for transmitting frames 195 * struct zd_usb_tx - structure used for transmitting frames
196 * @enabled: atomic enabled flag, indicates whether tx is enabled
187 * @lock: lock for transmission 197 * @lock: lock for transmission
188 * @free_urb_list: list of free URBs, contains all the URBs, which can be used 198 * @submitted: anchor for URBs sent to device
189 * @submitted_urbs: atomic integer that counts the URBs having sent to the 199 * @submitted_urbs: atomic integer that counts the URBs having sent to the
190 * device, which haven't been completed 200 * device, which haven't been completed
191 * @enabled: enabled flag, indicates whether tx is enabled
192 * @stopped: indicates whether higher level tx queues are stopped 201 * @stopped: indicates whether higher level tx queues are stopped
193 */ 202 */
194struct zd_usb_tx { 203struct zd_usb_tx {
204 atomic_t enabled;
195 spinlock_t lock; 205 spinlock_t lock;
196 struct list_head free_urb_list; 206 struct delayed_work watchdog_work;
207 struct sk_buff_head submitted_skbs;
208 struct usb_anchor submitted;
197 int submitted_urbs; 209 int submitted_urbs;
198 int enabled; 210 u8 stopped:1, watchdog_enabled:1;
199 int stopped;
200}; 211};
201 212
202/* Contains the usb parts. The structure doesn't require a lock because intf 213/* Contains the usb parts. The structure doesn't require a lock because intf
@@ -207,7 +218,11 @@ struct zd_usb {
207 struct zd_usb_rx rx; 218 struct zd_usb_rx rx;
208 struct zd_usb_tx tx; 219 struct zd_usb_tx tx;
209 struct usb_interface *intf; 220 struct usb_interface *intf;
210 u8 is_zd1211b:1, initialized:1; 221 struct usb_anchor submitted_cmds;
222 struct urb *urb_async_waiting;
223 int cmd_error;
224 u8 req_buf[64]; /* zd_usb_iowrite16v needs 62 bytes */
225 u8 is_zd1211b:1, initialized:1, was_running:1, in_async:1;
211}; 226};
212 227
213#define zd_usb_dev(usb) (&usb->intf->dev) 228#define zd_usb_dev(usb) (&usb->intf->dev)
@@ -234,12 +249,17 @@ void zd_usb_clear(struct zd_usb *usb);
234 249
235int zd_usb_scnprint_id(struct zd_usb *usb, char *buffer, size_t size); 250int zd_usb_scnprint_id(struct zd_usb *usb, char *buffer, size_t size);
236 251
252void zd_tx_watchdog_enable(struct zd_usb *usb);
253void zd_tx_watchdog_disable(struct zd_usb *usb);
254
237int zd_usb_enable_int(struct zd_usb *usb); 255int zd_usb_enable_int(struct zd_usb *usb);
238void zd_usb_disable_int(struct zd_usb *usb); 256void zd_usb_disable_int(struct zd_usb *usb);
239 257
240int zd_usb_enable_rx(struct zd_usb *usb); 258int zd_usb_enable_rx(struct zd_usb *usb);
241void zd_usb_disable_rx(struct zd_usb *usb); 259void zd_usb_disable_rx(struct zd_usb *usb);
242 260
261void zd_usb_reset_rx_idle_timer(struct zd_usb *usb);
262
243void zd_usb_enable_tx(struct zd_usb *usb); 263void zd_usb_enable_tx(struct zd_usb *usb);
244void zd_usb_disable_tx(struct zd_usb *usb); 264void zd_usb_disable_tx(struct zd_usb *usb);
245 265
@@ -254,6 +274,10 @@ static inline int zd_usb_ioread16(struct zd_usb *usb, u16 *value,
254 return zd_usb_ioread16v(usb, value, (const zd_addr_t *)&addr, 1); 274 return zd_usb_ioread16v(usb, value, (const zd_addr_t *)&addr, 1);
255} 275}
256 276
277void zd_usb_iowrite16v_async_start(struct zd_usb *usb);
278int zd_usb_iowrite16v_async_end(struct zd_usb *usb, unsigned int timeout);
279int zd_usb_iowrite16v_async(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs,
280 unsigned int count);
257int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, 281int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs,
258 unsigned int count); 282 unsigned int count);
259 283