diff options
Diffstat (limited to 'drivers/net/wireless/zd1211rw/zd_usb.h')
-rw-r--r-- | drivers/net/wireless/zd1211rw/zd_usb.h | 40 |
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 | |||
35 | enum devicetype { | 39 | enum 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 | ||
176 | struct zd_usb_rx { | 182 | struct 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 | */ |
194 | struct zd_usb_tx { | 203 | struct 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 | ||
235 | int zd_usb_scnprint_id(struct zd_usb *usb, char *buffer, size_t size); | 250 | int zd_usb_scnprint_id(struct zd_usb *usb, char *buffer, size_t size); |
236 | 251 | ||
252 | void zd_tx_watchdog_enable(struct zd_usb *usb); | ||
253 | void zd_tx_watchdog_disable(struct zd_usb *usb); | ||
254 | |||
237 | int zd_usb_enable_int(struct zd_usb *usb); | 255 | int zd_usb_enable_int(struct zd_usb *usb); |
238 | void zd_usb_disable_int(struct zd_usb *usb); | 256 | void zd_usb_disable_int(struct zd_usb *usb); |
239 | 257 | ||
240 | int zd_usb_enable_rx(struct zd_usb *usb); | 258 | int zd_usb_enable_rx(struct zd_usb *usb); |
241 | void zd_usb_disable_rx(struct zd_usb *usb); | 259 | void zd_usb_disable_rx(struct zd_usb *usb); |
242 | 260 | ||
261 | void zd_usb_reset_rx_idle_timer(struct zd_usb *usb); | ||
262 | |||
243 | void zd_usb_enable_tx(struct zd_usb *usb); | 263 | void zd_usb_enable_tx(struct zd_usb *usb); |
244 | void zd_usb_disable_tx(struct zd_usb *usb); | 264 | void 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 | ||
277 | void zd_usb_iowrite16v_async_start(struct zd_usb *usb); | ||
278 | int zd_usb_iowrite16v_async_end(struct zd_usb *usb, unsigned int timeout); | ||
279 | int zd_usb_iowrite16v_async(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, | ||
280 | unsigned int count); | ||
257 | int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, | 281 | int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, |
258 | unsigned int count); | 282 | unsigned int count); |
259 | 283 | ||