Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8cffb3cf authored by Malcolm Priestley's avatar Malcolm Priestley Committed by Greg Kroah-Hartman
Browse files

staging: vt6656: Remove rx handing from RXvWorkItem



In s_nsBulkInUsbIoCompleteRead reuse or reallocate sb_buff and resubmit
urb.

In device_alloc_bufs allocate memory to rcb individually and
call PIPEnsBulkInUsbRead to submit the urbs

Change handling to free rcb in device_free_rx_bufs

Remove calls to workqueue.

Signed-off-by: default avatarMalcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 09bb27eb
Loading
Loading
Loading
Loading
+15 −23
Original line number Diff line number Diff line
@@ -514,6 +514,8 @@ static void device_free_rx_bufs(struct vnt_private *priv)

	for (ii = 0; ii < priv->cbRD; ii++) {
		rcb = priv->apRCB[ii];
		if (!rcb)
			continue;

		/* deallocate URBs */
		if (rcb->pUrb) {
@@ -524,9 +526,9 @@ static void device_free_rx_bufs(struct vnt_private *priv)
		/* deallocate skb */
		if (rcb->skb)
			dev_kfree_skb(rcb->skb);
	}

	kfree(priv->pRCBMem);
		kfree(rcb);
	}

	return;
}
@@ -576,22 +578,16 @@ static bool device_alloc_bufs(struct vnt_private *priv)
		tx_context->in_use = false;
	}

	/* allocate RCB mem */
	priv->pRCBMem = kzalloc((sizeof(struct vnt_rcb) * priv->cbRD),
								GFP_KERNEL);
	if (priv->pRCBMem == NULL) {
		dev_err(&priv->usb->dev, "alloc rx usb context failed\n");
		goto free_tx;
	for (ii = 0; ii < priv->cbRD; ii++) {
		priv->apRCB[ii] = kzalloc(sizeof(struct vnt_rcb), GFP_KERNEL);
		if (!priv->apRCB[ii]) {
			dev_err(&priv->usb->dev,
					"failed to allocate rcb no %d\n", ii);
			goto free_rx_tx;
		}

	priv->FirstRecvFreeList = NULL;
	priv->LastRecvFreeList = NULL;
	priv->NumRecvFreeList = 0;

	rcb = (struct vnt_rcb *)priv->pRCBMem;
		rcb = priv->apRCB[ii];

	for (ii = 0; ii < priv->cbRD; ii++) {
		priv->apRCB[ii] = rcb;
		rcb->pDevice = priv;

		/* allocate URBs */
@@ -611,11 +607,9 @@ static bool device_alloc_bufs(struct vnt_private *priv)

		rcb->bBoolInUse = false;

		EnqueueRCB(priv->FirstRecvFreeList,
						priv->LastRecvFreeList, rcb);

		priv->NumRecvFreeList++;
		rcb++;
		/* submit rx urb */
		if (PIPEnsBulkInUsbRead(priv, rcb))
			goto free_rx_tx;
	}

	priv->pInterruptURB = usb_alloc_urb(0, GFP_ATOMIC);
@@ -678,7 +672,6 @@ static int vnt_start(struct ieee80211_hw *hw)

	priv->int_interval = 1;  /* bInterval is set to 1 */

	schedule_work(&priv->read_work_item);
	INTvWorkItem(priv);

	priv->flags |= DEVICE_FLAGS_OPENED;
@@ -722,7 +715,6 @@ static void vnt_stop(struct ieee80211_hw *hw)
	MP_CLEAR_FLAG(priv, fMP_POST_READS);

	cancel_delayed_work_sync(&priv->run_command_work);
	cancel_work_sync(&priv->read_work_item);

	priv->bCmdRunning = false;

+15 −10
Original line number Diff line number Diff line
@@ -230,9 +230,6 @@ int PIPEnsBulkInUsbRead(struct vnt_private *priv, struct vnt_rcb *rcb)
	int status = 0;
	struct urb *urb;

	if (priv->Flags & fMP_DISCONNECTED)
		return STATUS_FAILURE;

	urb = rcb->pUrb;
	if (rcb->skb == NULL) {
		dev_dbg(&priv->usb->dev, "rcb->skb is null\n");
@@ -303,16 +300,24 @@ static void s_nsBulkInUsbIoCompleteRead(struct urb *urb)
		spin_unlock_irqrestore(&priv->lock, flags);
	}

	rcb->Ref--;
	if (rcb->Ref == 0) {
		dev_dbg(&priv->usb->dev,
				"RxvFreeNormal %d\n", priv->NumRecvFreeList);
	if (re_alloc_skb) {
		rcb->skb = dev_alloc_skb(priv->rx_buf_sz);
		if (!rcb->skb) {
			dev_dbg(&priv->usb->dev, "Failed to re-alloc rx skb\n");

		spin_lock_irqsave(&priv->lock, flags);
			rcb->bBoolInUse = false;

			return;
		}

		RXvFreeRCB(rcb, re_alloc_skb);
		urb->transfer_buffer = skb_put(rcb->skb,
						skb_tailroom(rcb->skb));
	}

		spin_unlock_irqrestore(&priv->lock, flags);
	if (usb_submit_urb(urb, GFP_ATOMIC)) {
		dev_dbg(&priv->usb->dev, "Failed to re submit rx skb\n");

		rcb->bBoolInUse = false;
	}

	return;