Skip to content

Commit 1100f81

Browse files
Prameela Rani GarnepudiKalle Valo
authored andcommitted
rsi: add rx control block to handle rx packets in USB
Rx bluetooth endpoint shall be added in further patches. Rx control block is introduced here to handle Rx packets properly. Separate function is written to initialize the RX control blocks. Signed-off-by: Prameela Rani Garnepudi <[email protected]> Signed-off-by: Siva Rebbagondla <[email protected]> Signed-off-by: Amitkumar Karwar <[email protected]> Signed-off-by: Kalle Valo <[email protected]>
1 parent a9eab62 commit 1100f81

File tree

7 files changed

+96
-34
lines changed

7 files changed

+96
-34
lines changed

drivers/net/wireless/rsi/rsi_91x_main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ static struct sk_buff *rsi_prepare_skb(struct rsi_common *common,
137137
*
138138
* Return: 0 on success, -1 on failure.
139139
*/
140-
int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
140+
int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len)
141141
{
142142
u8 *frame_desc = NULL, extended_desc = 0;
143143
u32 index, length = 0, queueno = 0;
@@ -146,7 +146,7 @@ int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len)
146146

147147
index = 0;
148148
do {
149-
frame_desc = &common->rx_data_pkt[index];
149+
frame_desc = &rx_pkt[index];
150150
actual_length = *(u16 *)&frame_desc[0];
151151
offset = *(u16 *)&frame_desc[2];
152152

drivers/net/wireless/rsi/rsi_91x_sdio_ops.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ static int rsi_process_pkt(struct rsi_common *common)
118118
goto fail;
119119
}
120120

121-
status = rsi_read_pkt(common, rcv_pkt_len);
121+
status = rsi_read_pkt(common, common->rx_data_pkt, rcv_pkt_len);
122122

123123
fail:
124124
kfree(common->rx_data_pkt);

drivers/net/wireless/rsi/rsi_91x_usb.c

Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,13 @@ static int rsi_usb_reg_write(struct usb_device *usbdev,
247247
*/
248248
static void rsi_rx_done_handler(struct urb *urb)
249249
{
250-
struct rsi_hw *adapter = urb->context;
251-
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
250+
struct rx_usb_ctrl_block *rx_cb = urb->context;
251+
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)rx_cb->data;
252252

253253
if (urb->status)
254254
return;
255255

256+
rx_cb->pend = 1;
256257
rsi_set_event(&dev->rx_thread.event);
257258
}
258259

@@ -262,10 +263,11 @@ static void rsi_rx_done_handler(struct urb *urb)
262263
*
263264
* Return: 0 on success, a negative error code on failure.
264265
*/
265-
static int rsi_rx_urb_submit(struct rsi_hw *adapter)
266+
static int rsi_rx_urb_submit(struct rsi_hw *adapter, u8 ep_num)
266267
{
267268
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
268-
struct urb *urb = dev->rx_usb_urb[0];
269+
struct rx_usb_ctrl_block *rx_cb = &dev->rx_cb[ep_num - 1];
270+
struct urb *urb = rx_cb->rx_urb;
269271
int status;
270272

271273
usb_fill_bulk_urb(urb,
@@ -275,7 +277,7 @@ static int rsi_rx_urb_submit(struct rsi_hw *adapter)
275277
urb->transfer_buffer,
276278
3000,
277279
rsi_rx_done_handler,
278-
adapter);
280+
rx_cb);
279281

280282
status = usb_submit_urb(urb, GFP_KERNEL);
281283
if (status)
@@ -484,14 +486,54 @@ static struct rsi_host_intf_ops usb_host_intf_ops = {
484486
*/
485487
static void rsi_deinit_usb_interface(struct rsi_hw *adapter)
486488
{
489+
u8 idx;
490+
487491
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
488492

489493
rsi_kill_thread(&dev->rx_thread);
490-
usb_free_urb(dev->rx_usb_urb[0]);
494+
495+
for (idx = 0; idx < MAX_RX_URBS; idx++) {
496+
usb_free_urb(dev->rx_cb[idx].rx_urb);
497+
kfree(dev->rx_cb[idx].rx_buffer);
498+
}
499+
491500
kfree(adapter->priv->rx_data_pkt);
492501
kfree(dev->tx_buffer);
493502
}
494503

504+
static int rsi_usb_init_rx(struct rsi_hw *adapter)
505+
{
506+
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
507+
struct rx_usb_ctrl_block *rx_cb;
508+
u8 idx;
509+
510+
for (idx = 0; idx < MAX_RX_URBS; idx++) {
511+
rx_cb = &dev->rx_cb[idx];
512+
513+
rx_cb->rx_buffer = kzalloc(RSI_USB_BUF_SIZE * 2,
514+
GFP_KERNEL);
515+
if (!rx_cb->rx_buffer)
516+
goto err;
517+
518+
rx_cb->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
519+
if (!rx_cb->rx_urb) {
520+
rsi_dbg(ERR_ZONE, "Failed alloc rx urb[%d]\n", idx);
521+
goto err;
522+
}
523+
rx_cb->rx_urb->transfer_buffer = rx_cb->rx_buffer;
524+
rx_cb->ep_num = idx + 1;
525+
rx_cb->data = (void *)dev;
526+
}
527+
return 0;
528+
529+
err:
530+
for (idx = 0; idx < MAX_RX_URBS; idx++) {
531+
kfree(dev->rx_cb[idx].rx_buffer);
532+
kfree(dev->rx_cb[idx].rx_urb);
533+
}
534+
return -1;
535+
}
536+
495537
/**
496538
* rsi_init_usb_interface() - This function initializes the usb interface.
497539
* @adapter: Pointer to the adapter structure.
@@ -504,7 +546,7 @@ static int rsi_init_usb_interface(struct rsi_hw *adapter,
504546
{
505547
struct rsi_91x_usbdev *rsi_dev;
506548
struct rsi_common *common = adapter->priv;
507-
int status;
549+
int status, i;
508550

509551
rsi_dev = kzalloc(sizeof(*rsi_dev), GFP_KERNEL);
510552
if (!rsi_dev)
@@ -531,12 +573,12 @@ static int rsi_init_usb_interface(struct rsi_hw *adapter,
531573
status = -ENOMEM;
532574
goto fail_tx;
533575
}
534-
rsi_dev->rx_usb_urb[0] = usb_alloc_urb(0, GFP_KERNEL);
535-
if (!rsi_dev->rx_usb_urb[0]) {
536-
status = -ENOMEM;
537-
goto fail_rx;
576+
577+
if (rsi_usb_init_rx(adapter)) {
578+
rsi_dbg(ERR_ZONE, "Failed to init RX handle\n");
579+
return -ENOMEM;
538580
}
539-
rsi_dev->rx_usb_urb[0]->transfer_buffer = adapter->priv->rx_data_pkt;
581+
540582
rsi_dev->tx_blk_size = 252;
541583
adapter->block_size = rsi_dev->tx_blk_size;
542584

@@ -564,9 +606,10 @@ static int rsi_init_usb_interface(struct rsi_hw *adapter,
564606
return 0;
565607

566608
fail_thread:
567-
usb_free_urb(rsi_dev->rx_usb_urb[0]);
568-
fail_rx:
569-
kfree(rsi_dev->tx_buffer);
609+
for (i = 0; i < MAX_RX_URBS; i++) {
610+
kfree(rsi_dev->rx_cb[i].rx_buffer);
611+
kfree(rsi_dev->rx_cb[i].rx_urb);
612+
}
570613
fail_tx:
571614
kfree(common->rx_data_pkt);
572615
return status;
@@ -698,7 +741,7 @@ static int rsi_probe(struct usb_interface *pfunction,
698741
rsi_dbg(INIT_ZONE, "%s: Device Init Done\n", __func__);
699742
}
700743

701-
status = rsi_rx_urb_submit(adapter);
744+
status = rsi_rx_urb_submit(adapter, WLAN_EP);
702745
if (status)
703746
goto err1;
704747

drivers/net/wireless/rsi/rsi_91x_usb_ops.c

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,28 +29,39 @@ void rsi_usb_rx_thread(struct rsi_common *common)
2929
{
3030
struct rsi_hw *adapter = common->priv;
3131
struct rsi_91x_usbdev *dev = (struct rsi_91x_usbdev *)adapter->rsi_dev;
32-
int status;
32+
struct rx_usb_ctrl_block *rx_cb;
33+
int status, idx;
3334

3435
do {
3536
rsi_wait_event(&dev->rx_thread.event, EVENT_WAIT_FOREVER);
3637

3738
if (atomic_read(&dev->rx_thread.thread_done))
3839
goto out;
3940

40-
mutex_lock(&common->rx_lock);
41-
status = rsi_read_pkt(common, 0);
42-
if (status) {
43-
rsi_dbg(ERR_ZONE, "%s: Failed To read data", __func__);
41+
for (idx = 0; idx < MAX_RX_URBS; idx++) {
42+
rx_cb = &dev->rx_cb[idx];
43+
if (!rx_cb->pend)
44+
continue;
45+
46+
mutex_lock(&common->rx_lock);
47+
status = rsi_read_pkt(common, rx_cb->rx_buffer, 0);
48+
if (status) {
49+
rsi_dbg(ERR_ZONE, "%s: Failed To read data",
50+
__func__);
51+
mutex_unlock(&common->rx_lock);
52+
break;
53+
}
54+
rx_cb->pend = 0;
4455
mutex_unlock(&common->rx_lock);
45-
return;
56+
57+
if (adapter->rx_urb_submit(adapter, rx_cb->ep_num)) {
58+
rsi_dbg(ERR_ZONE,
59+
"%s: Failed in urb submission",
60+
__func__);
61+
return;
62+
}
4663
}
47-
mutex_unlock(&common->rx_lock);
4864
rsi_reset_event(&dev->rx_thread.event);
49-
if (adapter->rx_urb_submit(adapter)) {
50-
rsi_dbg(ERR_ZONE,
51-
"%s: Failed in urb submission", __func__);
52-
return;
53-
}
5465
} while (1);
5566

5667
out:

drivers/net/wireless/rsi/rsi_common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ void rsi_mac80211_detach(struct rsi_hw *hw);
8282
u16 rsi_get_connected_channel(struct ieee80211_vif *vif);
8383
struct rsi_hw *rsi_91x_init(void);
8484
void rsi_91x_deinit(struct rsi_hw *adapter);
85-
int rsi_read_pkt(struct rsi_common *common, s32 rcv_pkt_len);
85+
int rsi_read_pkt(struct rsi_common *common, u8 *rx_pkt, s32 rcv_pkt_len);
8686
#ifdef CONFIG_PM
8787
int rsi_config_wowlan(struct rsi_hw *adapter, struct cfg80211_wowlan *wowlan);
8888
#endif

drivers/net/wireless/rsi/rsi_main.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ struct rsi_hw {
343343
void *rsi_dev;
344344
struct rsi_host_intf_ops *host_intf_ops;
345345
int (*check_hw_queue_status)(struct rsi_hw *adapter, u8 q_num);
346-
int (*rx_urb_submit)(struct rsi_hw *adapter);
346+
int (*rx_urb_submit)(struct rsi_hw *adapter, u8 ep_num);
347347
int (*determine_event_timeout)(struct rsi_hw *adapter);
348348
};
349349

drivers/net/wireless/rsi/rsi_usb.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,20 @@
3939
#define RSI_USB_BUF_SIZE 4096
4040
#define RSI_USB_CTRL_BUF_SIZE 0x04
4141

42+
struct rx_usb_ctrl_block {
43+
u8 *data;
44+
struct urb *rx_urb;
45+
u8 *rx_buffer;
46+
u8 ep_num;
47+
u8 pend;
48+
};
49+
4250
struct rsi_91x_usbdev {
4351
struct rsi_thread rx_thread;
4452
u8 endpoint;
4553
struct usb_device *usbdev;
4654
struct usb_interface *pfunction;
47-
struct urb *rx_usb_urb[MAX_RX_URBS];
55+
struct rx_usb_ctrl_block rx_cb[MAX_RX_URBS];
4856
u8 *tx_buffer;
4957
__le16 bulkin_size;
5058
u8 bulkin_endpoint_addr;

0 commit comments

Comments
 (0)