Merge tag 'rpmsg-v5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson...
[linux-2.6-microblaze.git] / drivers / staging / vt6656 / usbpipe.c
index 91b62c3..82b774b 100644 (file)
@@ -77,7 +77,7 @@ int vnt_control_out_u8(struct vnt_private *priv, u8 reg, u8 reg_off, u8 data)
 }
 
 int vnt_control_out_blocks(struct vnt_private *priv,
-                          u16 block, u8 reg, u16 length, u8 *data)
+                          u16 block, u8 reg, u16 length, const u8 *data)
 {
        int ret = 0, i;
 
@@ -196,32 +196,18 @@ static void vnt_int_process_data(struct vnt_private *priv)
        if (int_data->tsr3 & TSR_VALID)
                vnt_int_report_rate(priv, int_data->pkt3, int_data->tsr3);
 
-       if (int_data->isr0 != 0) {
-               if (int_data->isr0 & ISR_BNTX &&
-                   priv->op_mode == NL80211_IFTYPE_AP)
-                       vnt_schedule_command(priv, WLAN_CMD_BECON_SEND);
-
-               if (int_data->isr0 & ISR_TBTT &&
-                   priv->hw->conf.flags & IEEE80211_CONF_PS) {
-                       if (!priv->wake_up_count)
-                               priv->wake_up_count =
-                                       priv->hw->conf.listen_interval;
+       if (!int_data->isr0)
+               return;
 
-                       if (priv->wake_up_count)
-                               --priv->wake_up_count;
+       if (int_data->isr0 & ISR_BNTX && priv->op_mode == NL80211_IFTYPE_AP)
+               vnt_schedule_command(priv, WLAN_CMD_BECON_SEND);
 
-                       /* Turn on wake up to listen next beacon */
-                       if (priv->wake_up_count == 1)
-                               vnt_schedule_command(priv,
-                                                    WLAN_CMD_TBTT_WAKEUP);
-               }
-               priv->current_tsf = le64_to_cpu(int_data->tsf);
+       priv->current_tsf = le64_to_cpu(int_data->tsf);
 
-               low_stats->dot11RTSSuccessCount += int_data->rts_success;
-               low_stats->dot11RTSFailureCount += int_data->rts_fail;
-               low_stats->dot11ACKFailureCount += int_data->ack_fail;
-               low_stats->dot11FCSErrorCount += int_data->fcs_err;
-       }
+       low_stats->dot11RTSSuccessCount += int_data->rts_success;
+       low_stats->dot11RTSFailureCount += int_data->rts_fail;
+       low_stats->dot11ACKFailureCount += int_data->ack_fail;
+       low_stats->dot11FCSErrorCount += int_data->fcs_err;
 }
 
 static void vnt_start_interrupt_urb_complete(struct urb *urb)
@@ -442,7 +428,8 @@ static void vnt_tx_context_complete(struct urb *urb)
 
        switch (urb->status) {
        case 0:
-               dev_dbg(&priv->usb->dev, "Write %d bytes\n", context->buf_len);
+               dev_dbg(&priv->usb->dev,
+                       "Write %d bytes\n", urb->actual_length);
                break;
        case -ECONNRESET:
        case -ENOENT:
@@ -467,30 +454,53 @@ static void vnt_tx_context_complete(struct urb *urb)
 }
 
 int vnt_tx_context(struct vnt_private *priv,
-                  struct vnt_usb_send_context *context)
+                  struct vnt_usb_send_context *context,
+                  struct sk_buff *skb)
 {
+       struct vnt_tx_usb_header *usb;
+       struct urb *urb;
        int status;
-       struct urb *urb = context->urb;
+       u16 count = skb->len;
+
+       usb = skb_push(skb, sizeof(*usb));
+       usb->tx_byte_count = cpu_to_le16(count);
+       usb->pkt_no = context->pkt_no;
+       usb->type = context->type;
 
        if (test_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags)) {
                context->in_use = false;
                return -ENODEV;
        }
 
+       if (skb->len > MAX_TOTAL_SIZE_WITH_ALL_HEADERS) {
+               context->in_use = false;
+               return -E2BIG;
+       }
+
+       urb = usb_alloc_urb(0, GFP_ATOMIC);
+       if (!urb) {
+               context->in_use = false;
+               return -ENOMEM;
+       }
+
        usb_fill_bulk_urb(urb,
                          priv->usb,
                          usb_sndbulkpipe(priv->usb, 3),
-                         context->data,
-                         context->buf_len,
+                         skb->data,
+                         skb->len,
                          vnt_tx_context_complete,
                          context);
 
+       usb_anchor_urb(urb, &priv->tx_submitted);
+
        status = usb_submit_urb(urb, GFP_ATOMIC);
        if (status) {
                dev_dbg(&priv->usb->dev, "Submit Tx URB failed %d\n", status);
-
+               usb_unanchor_urb(urb);
                context->in_use = false;
        }
 
+       usb_free_urb(urb);
+
        return status;
 }