]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/net/wireless/rsi/rsi_91x_usb.c
30bed719486ec00cc17a2bb5508f383e906917d4
[linux.git] / drivers / net / wireless / rsi / rsi_91x_usb.c
1 /**
2  * Copyright (c) 2014 Redpine Signals Inc.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  *
16  */
17
18 #include <linux/module.h>
19 #include <net/rsi_91x.h>
20 #include "rsi_usb.h"
21 #include "rsi_hal.h"
22 #include "rsi_coex.h"
23
24 /* Default operating mode is wlan STA + BT */
25 static u16 dev_oper_mode = DEV_OPMODE_STA_BT_DUAL;
26 module_param(dev_oper_mode, ushort, 0444);
27 MODULE_PARM_DESC(dev_oper_mode,
28                  "1[Wi-Fi], 4[BT], 8[BT LE], 5[Wi-Fi STA + BT classic]\n"
29                  "9[Wi-Fi STA + BT LE], 13[Wi-Fi STA + BT classic + BT LE]\n"
30                  "6[AP + BT classic], 14[AP + BT classic + BT LE]");
31
32 static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num);
33
34 /**
35  * rsi_usb_card_write() - This function writes to the USB Card.
36  * @adapter: Pointer to the adapter structure.
37  * @buf: Pointer to the buffer from where the data has to be taken.
38  * @len: Length to be written.
39  * @endpoint: Type of endpoint.
40  *
41  * Return: status: 0 on success, a negative error code on failure.
42  */
43 static int rsi_usb_card_write(struct rsi_hw *adapter,
44                               u8 *buf,
45                               u16 len,
46                               u8 endpoint)
47 {
48         struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
49         int status;
50         u8 *seg = dev->tx_buffer;
51         int transfer;
52         int ep = dev->bulkout_endpoint_addr[endpoint - 1];
53
54         memset(seg, 0, len + RSI_USB_TX_HEAD_ROOM);
55         memcpy(seg + RSI_USB_TX_HEAD_ROOM, buf, len);
56         len += RSI_USB_TX_HEAD_ROOM;
57         transfer = len;
58         status = usb_bulk_msg(dev->usbdev,
59                               usb_sndbulkpipe(dev->usbdev, ep),
60                               (void *)seg,
61                               (int)len,
62                               &transfer,
63                               HZ * 5);
64
65         if (status < 0) {
66                 rsi_dbg(ERR_ZONE,
67                         "Card write failed with error code :%10d\n", status);
68                 dev->write_fail = 1;
69         }
70         return status;
71 }
72
73 /**
74  * rsi_write_multiple() - This function writes multiple bytes of information
75  *                        to the USB card.
76  * @adapter: Pointer to the adapter structure.
77  * @addr: Address of the register.
78  * @data: Pointer to the data that has to be written.
79  * @count: Number of multiple bytes to be written.
80  *
81  * Return: 0 on success, a negative error code on failure.
82  */
83 static int rsi_write_multiple(struct rsi_hw *adapter,
84                               u8 endpoint,
85                               u8 *data,
86                               u32 count)
87 {
88         struct rsi_91x_usbdev *dev;
89
90         if (!adapter)
91                 return -ENODEV;
92
93         if (endpoint == 0)
94                 return -EINVAL;
95
96         dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
97         if (dev->write_fail)
98                 return -ENETDOWN;
99
100         return rsi_usb_card_write(adapter, data, count, endpoint);
101 }
102
103 /**
104  * rsi_find_bulk_in_and_out_endpoints() - This function initializes the bulk
105  *                                        endpoints to the device.
106  * @interface: Pointer to the USB interface structure.
107  * @adapter: Pointer to the adapter structure.
108  *
109  * Return: ret_val: 0 on success, -ENOMEM on failure.
110  */
111 static int rsi_find_bulk_in_and_out_endpoints(struct usb_interface *interface,
112                                               struct rsi_hw *adapter)
113 {
114         struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
115         struct usb_host_interface *iface_desc;
116         struct usb_endpoint_descriptor *endpoint;
117         __le16 buffer_size;
118         int ii, bin_found = 0, bout_found = 0;
119
120         iface_desc = &(interface->altsetting[0]);
121
122         for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) {
123                 endpoint = &(iface_desc->endpoint[ii].desc);
124
125                 if (!dev->bulkin_endpoint_addr[bin_found] &&
126                     (endpoint->bEndpointAddress & USB_DIR_IN) &&
127                     ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
128                     USB_ENDPOINT_XFER_BULK)) {
129                         buffer_size = endpoint->wMaxPacketSize;
130                         dev->bulkin_size[bin_found] = buffer_size;
131                         dev->bulkin_endpoint_addr[bin_found] =
132                                 endpoint->bEndpointAddress;
133                         bin_found++;
134                 }
135
136                 if (!dev->bulkout_endpoint_addr[bout_found] &&
137                     !(endpoint->bEndpointAddress & USB_DIR_IN) &&
138                     ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
139                     USB_ENDPOINT_XFER_BULK)) {
140                         buffer_size = endpoint->wMaxPacketSize;
141                         dev->bulkout_endpoint_addr[bout_found] =
142                                 endpoint->bEndpointAddress;
143                         dev->bulkout_size[bout_found] = buffer_size;
144                         bout_found++;
145                 }
146
147                 if (bin_found >= MAX_BULK_EP || bout_found >= MAX_BULK_EP)
148                         break;
149         }
150
151         if (!(dev->bulkin_endpoint_addr[0]) &&
152             dev->bulkout_endpoint_addr[0])
153                 return -EINVAL;
154
155         return 0;
156 }
157
158 #define RSI_USB_REQ_OUT (USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE)
159 #define RSI_USB_REQ_IN  (USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE)
160
161 /* rsi_usb_reg_read() - This function reads data from given register address.
162  * @usbdev: Pointer to the usb_device structure.
163  * @reg: Address of the register to be read.
164  * @value: Value to be read.
165  * @len: length of data to be read.
166  *
167  * Return: status: 0 on success, a negative error code on failure.
168  */
169 static int rsi_usb_reg_read(struct usb_device *usbdev,
170                             u32 reg,
171                             u16 *value,
172                             u16 len)
173 {
174         u8 *buf;
175         int status = -ENOMEM;
176
177         if (len > RSI_USB_CTRL_BUF_SIZE)
178                 return -EINVAL;
179
180         buf  = kmalloc(RSI_USB_CTRL_BUF_SIZE, GFP_KERNEL);
181         if (!buf)
182                 return status;
183
184         status = usb_control_msg(usbdev,
185                                  usb_rcvctrlpipe(usbdev, 0),
186                                  USB_VENDOR_REGISTER_READ,
187                                  RSI_USB_REQ_IN,
188                                  ((reg & 0xffff0000) >> 16), (reg & 0xffff),
189                                  (void *)buf,
190                                  len,
191                                  USB_CTRL_GET_TIMEOUT);
192
193         *value = (buf[0] | (buf[1] << 8));
194         if (status < 0) {
195                 rsi_dbg(ERR_ZONE,
196                         "%s: Reg read failed with error code :%d\n",
197                         __func__, status);
198         }
199         kfree(buf);
200
201         return status;
202 }
203
204 /**
205  * rsi_usb_reg_write() - This function writes the given data into the given
206  *                       register address.
207  * @usbdev: Pointer to the usb_device structure.
208  * @reg: Address of the register.
209  * @value: Value to write.
210  * @len: Length of data to be written.
211  *
212  * Return: status: 0 on success, a negative error code on failure.
213  */
214 static int rsi_usb_reg_write(struct usb_device *usbdev,
215                              u32 reg,
216                              u32 value,
217                              u16 len)
218 {
219         u8 *usb_reg_buf;
220         int status = -ENOMEM;
221
222         if (len > RSI_USB_CTRL_BUF_SIZE)
223                 return -EINVAL;
224
225         usb_reg_buf  = kmalloc(RSI_USB_CTRL_BUF_SIZE, GFP_KERNEL);
226         if (!usb_reg_buf)
227                 return status;
228
229         usb_reg_buf[0] = (cpu_to_le32(value) & 0x00ff);
230         usb_reg_buf[1] = (cpu_to_le32(value) & 0xff00) >> 8;
231         usb_reg_buf[2] = (cpu_to_le32(value) & 0x00ff0000) >> 16;
232         usb_reg_buf[3] = (cpu_to_le32(value) & 0xff000000) >> 24;
233
234         status = usb_control_msg(usbdev,
235                                  usb_sndctrlpipe(usbdev, 0),
236                                  USB_VENDOR_REGISTER_WRITE,
237                                  RSI_USB_REQ_OUT,
238                                  ((cpu_to_le32(reg) & 0xffff0000) >> 16),
239                                  (cpu_to_le32(reg) & 0xffff),
240                                  (void *)usb_reg_buf,
241                                  len,
242                                  USB_CTRL_SET_TIMEOUT);
243         if (status < 0) {
244                 rsi_dbg(ERR_ZONE,
245                         "%s: Reg write failed with error code :%d\n",
246                         __func__, status);
247         }
248         kfree(usb_reg_buf);
249
250         return status;
251 }
252
253 /**
254  * rsi_rx_done_handler() - This function is called when a packet is received
255  *                         from USB stack. This is callback to receive done.
256  * @urb: Received URB.
257  *
258  * Return: None.
259  */
260 static void rsi_rx_done_handler(struct urb *urb)
261 {
262         struct rx_usb_ctrl_block *rx_cb = urb->context;
263         struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)rx_cb->data;
264         int status = -EINVAL;
265
266         if (urb->status) {
267                 dev_kfree_skb(rx_cb->rx_skb);
268                 return;
269         }
270
271         if (urb->actual_length <= 0 ||
272             urb->actual_length > rx_cb->rx_skb->len) {
273                 rsi_dbg(INFO_ZONE, "%s: Invalid packet length = %d\n",
274                         __func__, urb->actual_length);
275                 goto out;
276         }
277         if (skb_queue_len(&dev->rx_q) >= RSI_MAX_RX_PKTS) {
278                 rsi_dbg(INFO_ZONE, "Max RX packets reached\n");
279                 goto out;
280         }
281         skb_trim(rx_cb->rx_skb, urb->actual_length);
282         skb_queue_tail(&dev->rx_q, rx_cb->rx_skb);
283
284         rsi_set_event(&dev->rx_thread.event);
285         status = 0;
286
287 out:
288         if (rsi_rx_urb_submit(dev->priv, rx_cb->ep_num))
289                 rsi_dbg(ERR_ZONE, "%s: Failed in urb submission", __func__);
290
291         if (status)
292                 dev_kfree_skb(rx_cb->rx_skb);
293 }
294
295 static void rsi_rx_urb_kill(struct rsi_hw *adapter, u8 ep_num)
296 {
297         struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
298         struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1];
299         struct urb *urb = rx_cb->rx_urb;
300
301         usb_kill_urb(urb);
302 }
303
304 /**
305  * rsi_rx_urb_submit() - This function submits the given URB to the USB stack.
306  * @adapter: Pointer to the adapter structure.
307  *
308  * Return: 0 on success, a negative error code on failure.
309  */
310 static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num)
311 {
312         struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
313         struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1];
314         struct urb *urb = rx_cb->rx_urb;
315         int status;
316         struct sk_buff *skb;
317         u8 dword_align_bytes = 0;
318
319 #define RSI_MAX_RX_USB_PKT_SIZE 3000
320         skb = dev_alloc_skb(RSI_MAX_RX_USB_PKT_SIZE);
321         if (!skb)
322                 return -ENOMEM;
323         skb_reserve(skb, MAX_DWORD_ALIGN_BYTES);
324         skb_put(skb, RSI_MAX_RX_USB_PKT_SIZE - MAX_DWORD_ALIGN_BYTES);
325         dword_align_bytes = (unsigned long)skb->data & 0x3f;
326         if (dword_align_bytes > 0)
327                 skb_push(skb, dword_align_bytes);
328         urb->transfer_buffer = skb->data;
329         rx_cb->rx_skb = skb;
330
331         usb_fill_bulk_urb(urb,
332                           dev->usbdev,
333                           usb_rcvbulkpipe(dev->usbdev,
334                           dev->bulkin_endpoint_addr[ep_num - 1]),
335                           urb->transfer_buffer,
336                           skb->len,
337                           rsi_rx_done_handler,
338                           rx_cb);
339
340         status = usb_submit_urb(urb, GFP_KERNEL);
341         if (status)
342                 rsi_dbg(ERR_ZONE, "%s: Failed in urb submission\n", __func__);
343
344         return status;
345 }
346
347 static int rsi_usb_read_register_multiple(struct rsi_hw *adapter, u32 addr,
348                                           u8 *data, u16 count)
349 {
350         struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
351         u8 *buf;
352         u16 transfer;
353         int status;
354
355         if (!addr)
356                 return -EINVAL;
357
358         buf = kzalloc(RSI_USB_BUF_SIZE, GFP_KERNEL);
359         if (!buf)
360                 return -ENOMEM;
361
362         while (count) {
363                 transfer = min_t(u16, count, RSI_USB_BUF_SIZE);
364                 status = usb_control_msg(dev->usbdev,
365                                          usb_rcvctrlpipe(dev->usbdev, 0),
366                                          USB_VENDOR_REGISTER_READ,
367                                          RSI_USB_REQ_IN,
368                                          ((addr & 0xffff0000) >> 16),
369                                          (addr & 0xffff), (void *)buf,
370                                          transfer, USB_CTRL_GET_TIMEOUT);
371                 if (status < 0) {
372                         rsi_dbg(ERR_ZONE,
373                                 "Reg read failed with error code :%d\n",
374                                  status);
375                         kfree(buf);
376                         return status;
377                 }
378                 memcpy(data, buf, transfer);
379                 count -= transfer;
380                 data += transfer;
381                 addr += transfer;
382         }
383         kfree(buf);
384         return 0;
385 }
386
387 /**
388  * rsi_usb_write_register_multiple() - This function writes multiple bytes of
389  *                                     information to multiple registers.
390  * @adapter: Pointer to the adapter structure.
391  * @addr: Address of the register.
392  * @data: Pointer to the data that has to be written.
393  * @count: Number of multiple bytes to be written on to the registers.
394  *
395  * Return: status: 0 on success, a negative error code on failure.
396  */
397 static int rsi_usb_write_register_multiple(struct rsi_hw *adapter, u32 addr,
398                                            u8 *data, u16 count)
399 {
400         struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
401         u8 *buf;
402         u16 transfer;
403         int status = 0;
404
405         buf = kzalloc(RSI_USB_BUF_SIZE, GFP_KERNEL);
406         if (!buf)
407                 return -ENOMEM;
408
409         while (count) {
410                 transfer = min_t(u16, count, RSI_USB_BUF_SIZE);
411                 memcpy(buf, data, transfer);
412                 status = usb_control_msg(dev->usbdev,
413                                          usb_sndctrlpipe(dev->usbdev, 0),
414                                          USB_VENDOR_REGISTER_WRITE,
415                                          RSI_USB_REQ_OUT,
416                                          ((addr & 0xffff0000) >> 16),
417                                          (addr & 0xffff),
418                                          (void *)buf,
419                                          transfer,
420                                          USB_CTRL_SET_TIMEOUT);
421                 if (status < 0) {
422                         rsi_dbg(ERR_ZONE,
423                                 "Reg write failed with error code :%d\n",
424                                 status);
425                         kfree(buf);
426                         return status;
427                 }
428                 count -= transfer;
429                 data += transfer;
430                 addr += transfer;
431         }
432
433         kfree(buf);
434         return 0;
435 }
436
437 /**
438  *rsi_usb_host_intf_write_pkt() - This function writes the packet to the
439  *                                 USB card.
440  * @adapter: Pointer to the adapter structure.
441  * @pkt: Pointer to the data to be written on to the card.
442  * @len: Length of the data to be written on to the card.
443  *
444  * Return: 0 on success, a negative error code on failure.
445  */
446 static int rsi_usb_host_intf_write_pkt(struct rsi_hw *adapter,
447                                        u8 *pkt,
448                                        u32 len)
449 {
450         u32 queueno = ((pkt[1] >> 4) & 0x7);
451         u8 endpoint;
452
453         endpoint = ((queueno == RSI_WIFI_MGMT_Q || queueno == RSI_WIFI_DATA_Q ||
454                      queueno == RSI_COEX_Q) ? WLAN_EP : BT_EP);
455
456         return rsi_write_multiple(adapter,
457                                   endpoint,
458                                   (u8 *)pkt,
459                                   len);
460 }
461
462 static int rsi_usb_master_reg_read(struct rsi_hw *adapter, u32 reg,
463                                    u32 *value, u16 len)
464 {
465         struct usb_device *usbdev =
466                 ((struct rsi_91x_usbdev *)adapter->rsi_dev)->usbdev;
467         u16 temp;
468         int ret;
469
470         ret = rsi_usb_reg_read(usbdev, reg, &temp, len);
471         if (ret < 0)
472                 return ret;
473         *value = temp;
474
475         return 0;
476 }
477
478 static int rsi_usb_master_reg_write(struct rsi_hw *adapter,
479                                     unsigned long reg,
480                                     unsigned long value, u16 len)
481 {
482         struct usb_device *usbdev =
483                 ((struct rsi_91x_usbdev *)adapter->rsi_dev)->usbdev;
484
485         return rsi_usb_reg_write(usbdev, reg, value, len);
486 }
487
488 static int rsi_usb_load_data_master_write(struct rsi_hw *adapter,
489                                           u32 base_address,
490                                           u32 instructions_sz, u16 block_size,
491                                           u8 *ta_firmware)
492 {
493         u16 num_blocks;
494         u32 cur_indx, i;
495         u8 temp_buf[256];
496         int status;
497
498         num_blocks = instructions_sz / block_size;
499         rsi_dbg(INFO_ZONE, "num_blocks: %d\n", num_blocks);
500
501         for (cur_indx = 0, i = 0; i < num_blocks; i++, cur_indx += block_size) {
502                 memcpy(temp_buf, ta_firmware + cur_indx, block_size);
503                 status = rsi_usb_write_register_multiple(adapter, base_address,
504                                                          (u8 *)(temp_buf),
505                                                          block_size);
506                 if (status < 0)
507                         return status;
508
509                 rsi_dbg(INFO_ZONE, "%s: loading block: %d\n", __func__, i);
510                 base_address += block_size;
511         }
512
513         if (instructions_sz % block_size) {
514                 memset(temp_buf, 0, block_size);
515                 memcpy(temp_buf, ta_firmware + cur_indx,
516                        instructions_sz % block_size);
517                 status = rsi_usb_write_register_multiple
518                                                 (adapter, base_address,
519                                                  (u8 *)temp_buf,
520                                                  instructions_sz % block_size);
521                 if (status < 0)
522                         return status;
523                 rsi_dbg(INFO_ZONE,
524                         "Written Last Block in Address 0x%x Successfully\n",
525                         cur_indx);
526         }
527         return 0;
528 }
529
530 static struct rsi_host_intf_ops usb_host_intf_ops = {
531         .write_pkt              = rsi_usb_host_intf_write_pkt,
532         .read_reg_multiple      = rsi_usb_read_register_multiple,
533         .write_reg_multiple     = rsi_usb_write_register_multiple,
534         .master_reg_read        = rsi_usb_master_reg_read,
535         .master_reg_write       = rsi_usb_master_reg_write,
536         .load_data_master_write = rsi_usb_load_data_master_write,
537 };
538
539 /**
540  * rsi_deinit_usb_interface() - This function deinitializes the usb interface.
541  * @adapter: Pointer to the adapter structure.
542  *
543  * Return: None.
544  */
545 static void rsi_deinit_usb_interface(struct rsi_hw *adapter)
546 {
547         struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
548
549         rsi_kill_thread(&dev->rx_thread);
550
551         usb_free_urb(dev->rx_cb[0].rx_urb);
552         if (adapter->priv->coex_mode > 1)
553                 usb_free_urb(dev->rx_cb[1].rx_urb);
554
555         kfree(dev->tx_buffer);
556 }
557
558 static int rsi_usb_init_rx(struct rsi_hw *adapter)
559 {
560         struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
561         struct rx_usb_ctrl_block *rx_cb;
562         u8 idx, num_rx_cb;
563
564         num_rx_cb = (adapter->priv->coex_mode > 1 ? 2 : 1);
565
566         for (idx = 0; idx < num_rx_cb; idx++) {
567                 rx_cb = &dev->rx_cb[idx];
568
569                 rx_cb->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
570                 if (!rx_cb->rx_urb) {
571                         rsi_dbg(ERR_ZONE, "Failed alloc rx urb[%d]\n", idx);
572                         goto err;
573                 }
574                 rx_cb->ep_num = idx + 1;
575                 rx_cb->data = (void *)dev;
576         }
577         skb_queue_head_init(&dev->rx_q);
578         rsi_init_event(&dev->rx_thread.event);
579         if (rsi_create_kthread(adapter->priv, &dev->rx_thread,
580                                rsi_usb_rx_thread, "RX-Thread")) {
581                 rsi_dbg(ERR_ZONE, "%s: Unable to init rx thrd\n", __func__);
582                 goto err;
583         }
584
585         return 0;
586
587 err:
588         usb_free_urb(dev->rx_cb[0].rx_urb);
589         if (adapter->priv->coex_mode > 1)
590                 usb_free_urb(dev->rx_cb[1].rx_urb);
591
592         return -1;
593 }
594
595 /**
596  * rsi_init_usb_interface() - This function initializes the usb interface.
597  * @adapter: Pointer to the adapter structure.
598  * @pfunction: Pointer to USB interface structure.
599  *
600  * Return: 0 on success, a negative error code on failure.
601  */
602 static int rsi_init_usb_interface(struct rsi_hw *adapter,
603                                   struct usb_interface *pfunction)
604 {
605         struct rsi_91x_usbdev *rsi_dev;
606         int status;
607
608         rsi_dev = kzalloc(sizeof(*rsi_dev), GFP_KERNEL);
609         if (!rsi_dev)
610                 return -ENOMEM;
611
612         adapter->rsi_dev = rsi_dev;
613         rsi_dev->usbdev = interface_to_usbdev(pfunction);
614         rsi_dev->priv = (void *)adapter;
615
616         if (rsi_find_bulk_in_and_out_endpoints(pfunction, adapter)) {
617                 status = -EINVAL;
618                 goto fail_eps;
619         }
620
621         adapter->device = &pfunction->dev;
622         usb_set_intfdata(pfunction, adapter);
623
624         rsi_dev->tx_buffer = kmalloc(2048, GFP_KERNEL);
625         if (!rsi_dev->tx_buffer) {
626                 status = -ENOMEM;
627                 goto fail_eps;
628         }
629
630         if (rsi_usb_init_rx(adapter)) {
631                 rsi_dbg(ERR_ZONE, "Failed to init RX handle\n");
632                 status = -ENOMEM;
633                 goto fail_rx;
634         }
635
636         rsi_dev->tx_blk_size = 252;
637         adapter->block_size = rsi_dev->tx_blk_size;
638
639         /* Initializing function callbacks */
640         adapter->check_hw_queue_status = rsi_usb_check_queue_status;
641         adapter->determine_event_timeout = rsi_usb_event_timeout;
642         adapter->rsi_host_intf = RSI_HOST_INTF_USB;
643         adapter->host_intf_ops = &usb_host_intf_ops;
644
645 #ifdef CONFIG_RSI_DEBUGFS
646         /* In USB, one less than the MAX_DEBUGFS_ENTRIES entries is required */
647         adapter->num_debugfs_entries = (MAX_DEBUGFS_ENTRIES - 1);
648 #endif
649
650         rsi_dbg(INIT_ZONE, "%s: Enabled the interface\n", __func__);
651         return 0;
652
653 fail_rx:
654         kfree(rsi_dev->tx_buffer);
655
656 fail_eps:
657
658         return status;
659 }
660
661 static int usb_ulp_read_write(struct rsi_hw *adapter, u16 addr, u32 data,
662                               u16 len_in_bits)
663 {
664         int ret;
665
666         ret = rsi_usb_master_reg_write
667                         (adapter, RSI_GSPI_DATA_REG1,
668                          ((addr << 6) | ((data >> 16) & 0xffff)), 2);
669         if (ret < 0)
670                 return ret;
671
672         ret = rsi_usb_master_reg_write(adapter, RSI_GSPI_DATA_REG0,
673                                        (data & 0xffff), 2);
674         if (ret < 0)
675                 return ret;
676
677         /* Initializing GSPI for ULP read/writes */
678         rsi_usb_master_reg_write(adapter, RSI_GSPI_CTRL_REG0,
679                                  RSI_GSPI_CTRL_REG0_VALUE, 2);
680
681         ret = rsi_usb_master_reg_write(adapter, RSI_GSPI_CTRL_REG1,
682                                        ((len_in_bits - 1) | RSI_GSPI_TRIG), 2);
683         if (ret < 0)
684                 return ret;
685
686         msleep(20);
687
688         return 0;
689 }
690
691 static int rsi_reset_card(struct rsi_hw *adapter)
692 {
693         int ret;
694
695         rsi_dbg(INFO_ZONE, "Resetting Card...\n");
696         rsi_usb_master_reg_write(adapter, RSI_TA_HOLD_REG, 0xE, 4);
697
698         /* This msleep will ensure Thread-Arch processor to go to hold
699          * and any pending dma transfers to rf in device to finish.
700          */
701         msleep(100);
702
703         ret = rsi_usb_master_reg_write(adapter, SWBL_REGOUT,
704                                        RSI_FW_WDT_DISABLE_REQ,
705                                        RSI_COMMON_REG_SIZE);
706         if (ret < 0) {
707                 rsi_dbg(ERR_ZONE, "Disabling firmware watchdog timer failed\n");
708                 goto fail;
709         }
710
711         if (adapter->device_model != RSI_DEV_9116) {
712                 ret = usb_ulp_read_write(adapter, RSI_WATCH_DOG_TIMER_1,
713                                          RSI_ULP_WRITE_2, 32);
714                 if (ret < 0)
715                         goto fail;
716                 ret = usb_ulp_read_write(adapter, RSI_WATCH_DOG_TIMER_2,
717                                          RSI_ULP_WRITE_0, 32);
718                 if (ret < 0)
719                         goto fail;
720                 ret = usb_ulp_read_write(adapter, RSI_WATCH_DOG_DELAY_TIMER_1,
721                                          RSI_ULP_WRITE_50, 32);
722                 if (ret < 0)
723                         goto fail;
724                 ret = usb_ulp_read_write(adapter, RSI_WATCH_DOG_DELAY_TIMER_2,
725                                          RSI_ULP_WRITE_0, 32);
726                 if (ret < 0)
727                         goto fail;
728                 ret = usb_ulp_read_write(adapter, RSI_WATCH_DOG_TIMER_ENABLE,
729                                          RSI_ULP_TIMER_ENABLE, 32);
730                 if (ret < 0)
731                         goto fail;
732         } else {
733                 if ((rsi_usb_master_reg_write(adapter,
734                                               NWP_WWD_INTERRUPT_TIMER,
735                                               NWP_WWD_INT_TIMER_CLKS,
736                                               RSI_9116_REG_SIZE)) < 0) {
737                         goto fail;
738                 }
739                 if ((rsi_usb_master_reg_write(adapter,
740                                               NWP_WWD_SYSTEM_RESET_TIMER,
741                                               NWP_WWD_SYS_RESET_TIMER_CLKS,
742                                               RSI_9116_REG_SIZE)) < 0) {
743                         goto fail;
744                 }
745                 if ((rsi_usb_master_reg_write(adapter,
746                                               NWP_WWD_MODE_AND_RSTART,
747                                               NWP_WWD_TIMER_DISABLE,
748                                               RSI_9116_REG_SIZE)) < 0) {
749                         goto fail;
750                 }
751         }
752
753         rsi_dbg(INFO_ZONE, "Reset card done\n");
754         return ret;
755
756 fail:
757         rsi_dbg(ERR_ZONE, "Reset card failed\n");
758         return ret;
759 }
760
761 /**
762  * rsi_probe() - This function is called by kernel when the driver provided
763  *               Vendor and device IDs are matched. All the initialization
764  *               work is done here.
765  * @pfunction: Pointer to the USB interface structure.
766  * @id: Pointer to the usb_device_id structure.
767  *
768  * Return: 0 on success, a negative error code on failure.
769  */
770 static int rsi_probe(struct usb_interface *pfunction,
771                      const struct usb_device_id *id)
772 {
773         struct rsi_hw *adapter;
774         struct rsi_91x_usbdev *dev;
775         u16 fw_status;
776         int status;
777
778         rsi_dbg(INIT_ZONE, "%s: Init function called\n", __func__);
779
780         adapter = rsi_91x_init(dev_oper_mode);
781         if (!adapter) {
782                 rsi_dbg(ERR_ZONE, "%s: Failed to init os intf ops\n",
783                         __func__);
784                 return -ENOMEM;
785         }
786         adapter->rsi_host_intf = RSI_HOST_INTF_USB;
787
788         status = rsi_init_usb_interface(adapter, pfunction);
789         if (status) {
790                 rsi_dbg(ERR_ZONE, "%s: Failed to init usb interface\n",
791                         __func__);
792                 goto err;
793         }
794
795         rsi_dbg(ERR_ZONE, "%s: Initialized os intf ops\n", __func__);
796
797         if (id->idProduct == RSI_USB_PID_9113) {
798                 rsi_dbg(INIT_ZONE, "%s: 9113 module detected\n", __func__);
799                 adapter->device_model = RSI_DEV_9113;
800         } else if (id->idProduct == RSI_USB_PID_9116) {
801                 rsi_dbg(INIT_ZONE, "%s: 9116 module detected\n", __func__);
802                 adapter->device_model = RSI_DEV_9116;
803         } else {
804                 rsi_dbg(ERR_ZONE, "%s: Unsupported RSI device id 0x%x\n",
805                         __func__, id->idProduct);
806                 goto err1;
807         }
808
809         dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
810
811         status = rsi_usb_reg_read(dev->usbdev, FW_STATUS_REG, &fw_status, 2);
812         if (status < 0)
813                 goto err1;
814         else
815                 fw_status &= 1;
816
817         if (!fw_status) {
818                 rsi_dbg(INIT_ZONE, "Loading firmware...\n");
819                 status = rsi_hal_device_init(adapter);
820                 if (status) {
821                         rsi_dbg(ERR_ZONE, "%s: Failed in device init\n",
822                                 __func__);
823                         goto err1;
824                 }
825                 rsi_dbg(INIT_ZONE, "%s: Device Init Done\n", __func__);
826         }
827
828         status = rsi_rx_urb_submit(adapter, WLAN_EP);
829         if (status)
830                 goto err1;
831
832         if (adapter->priv->coex_mode > 1) {
833                 status = rsi_rx_urb_submit(adapter, BT_EP);
834                 if (status)
835                         goto err_kill_wlan_urb;
836         }
837
838         return 0;
839
840 err_kill_wlan_urb:
841         rsi_rx_urb_kill(adapter, WLAN_EP);
842 err1:
843         rsi_deinit_usb_interface(adapter);
844 err:
845         rsi_91x_deinit(adapter);
846         rsi_dbg(ERR_ZONE, "%s: Failed in probe...Exiting\n", __func__);
847         return status;
848 }
849
850 /**
851  * rsi_disconnect() - This function performs the reverse of the probe function,
852  *                    it deinitialize the driver structure.
853  * @pfunction: Pointer to the USB interface structure.
854  *
855  * Return: None.
856  */
857 static void rsi_disconnect(struct usb_interface *pfunction)
858 {
859         struct rsi_hw *adapter = usb_get_intfdata(pfunction);
860
861         if (!adapter)
862                 return;
863
864         rsi_mac80211_detach(adapter);
865
866         if (IS_ENABLED(CONFIG_RSI_COEX) && adapter->priv->coex_mode > 1 &&
867             adapter->priv->bt_adapter) {
868                 rsi_bt_ops.detach(adapter->priv->bt_adapter);
869                 adapter->priv->bt_adapter = NULL;
870         }
871
872         if (adapter->priv->coex_mode > 1)
873                 rsi_rx_urb_kill(adapter, BT_EP);
874         rsi_rx_urb_kill(adapter, WLAN_EP);
875
876         rsi_reset_card(adapter);
877         rsi_deinit_usb_interface(adapter);
878         rsi_91x_deinit(adapter);
879
880         rsi_dbg(INFO_ZONE, "%s: Deinitialization completed\n", __func__);
881 }
882
883 #ifdef CONFIG_PM
884 static int rsi_suspend(struct usb_interface *intf, pm_message_t message)
885 {
886         /* Not yet implemented */
887         return -ENOSYS;
888 }
889
890 static int rsi_resume(struct usb_interface *intf)
891 {
892         /* Not yet implemented */
893         return -ENOSYS;
894 }
895 #endif
896
897 static const struct usb_device_id rsi_dev_table[] = {
898         { USB_DEVICE(RSI_USB_VENDOR_ID, RSI_USB_PID_9113) },
899         { USB_DEVICE(RSI_USB_VENDOR_ID, RSI_USB_PID_9116) },
900         { /* Blank */},
901 };
902
903 static struct usb_driver rsi_driver = {
904         .name       = "RSI-USB WLAN",
905         .probe      = rsi_probe,
906         .disconnect = rsi_disconnect,
907         .id_table   = rsi_dev_table,
908 #ifdef CONFIG_PM
909         .suspend    = rsi_suspend,
910         .resume     = rsi_resume,
911 #endif
912 };
913
914 module_usb_driver(rsi_driver);
915
916 MODULE_AUTHOR("Redpine Signals Inc");
917 MODULE_DESCRIPTION("Common USB layer for RSI drivers");
918 MODULE_SUPPORTED_DEVICE("RSI-91x");
919 MODULE_DEVICE_TABLE(usb, rsi_dev_table);
920 MODULE_FIRMWARE(FIRMWARE_RSI9113);
921 MODULE_VERSION("0.1");
922 MODULE_LICENSE("Dual BSD/GPL");