|
|
@@ -402,16 +402,19 @@ static void vnt_free_int_bufs(struct vnt_private *priv)
|
|
|
kfree(priv->int_buf.data_buf);
|
|
|
}
|
|
|
|
|
|
-static bool vnt_alloc_bufs(struct vnt_private *priv)
|
|
|
+static int vnt_alloc_bufs(struct vnt_private *priv)
|
|
|
{
|
|
|
+ int ret = 0;
|
|
|
struct vnt_usb_send_context *tx_context;
|
|
|
struct vnt_rcb *rcb;
|
|
|
int ii;
|
|
|
|
|
|
for (ii = 0; ii < priv->num_tx_context; ii++) {
|
|
|
tx_context = kmalloc(sizeof(*tx_context), GFP_KERNEL);
|
|
|
- if (!tx_context)
|
|
|
+ if (!tx_context) {
|
|
|
+ ret = -ENOMEM;
|
|
|
goto free_tx;
|
|
|
+ }
|
|
|
|
|
|
priv->tx_context[ii] = tx_context;
|
|
|
tx_context->priv = priv;
|
|
|
@@ -419,16 +422,20 @@ static bool vnt_alloc_bufs(struct vnt_private *priv)
|
|
|
|
|
|
/* allocate URBs */
|
|
|
tx_context->urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
|
- if (!tx_context->urb)
|
|
|
+ if (!tx_context->urb) {
|
|
|
+ ret = -ENOMEM;
|
|
|
goto free_tx;
|
|
|
+ }
|
|
|
|
|
|
tx_context->in_use = false;
|
|
|
}
|
|
|
|
|
|
for (ii = 0; ii < priv->num_rcb; ii++) {
|
|
|
priv->rcb[ii] = kzalloc(sizeof(*priv->rcb[ii]), GFP_KERNEL);
|
|
|
- if (!priv->rcb[ii])
|
|
|
+ if (!priv->rcb[ii]) {
|
|
|
+ ret = -ENOMEM;
|
|
|
goto free_rx_tx;
|
|
|
+ }
|
|
|
|
|
|
rcb = priv->rcb[ii];
|
|
|
|
|
|
@@ -436,39 +443,46 @@ static bool vnt_alloc_bufs(struct vnt_private *priv)
|
|
|
|
|
|
/* allocate URBs */
|
|
|
rcb->urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
|
- if (!rcb->urb)
|
|
|
+ if (!rcb->urb) {
|
|
|
+ ret = -ENOMEM;
|
|
|
goto free_rx_tx;
|
|
|
+ }
|
|
|
|
|
|
rcb->skb = dev_alloc_skb(priv->rx_buf_sz);
|
|
|
- if (!rcb->skb)
|
|
|
+ if (!rcb->skb) {
|
|
|
+ ret = -ENOMEM;
|
|
|
goto free_rx_tx;
|
|
|
+ }
|
|
|
|
|
|
rcb->in_use = false;
|
|
|
|
|
|
/* submit rx urb */
|
|
|
- if (vnt_submit_rx_urb(priv, rcb))
|
|
|
+ ret = vnt_submit_rx_urb(priv, rcb);
|
|
|
+ if (ret)
|
|
|
goto free_rx_tx;
|
|
|
}
|
|
|
|
|
|
priv->interrupt_urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
|
- if (!priv->interrupt_urb)
|
|
|
+ if (!priv->interrupt_urb) {
|
|
|
+ ret = -ENOMEM;
|
|
|
goto free_rx_tx;
|
|
|
+ }
|
|
|
|
|
|
priv->int_buf.data_buf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
|
|
|
if (!priv->int_buf.data_buf) {
|
|
|
- usb_free_urb(priv->interrupt_urb);
|
|
|
- goto free_rx_tx;
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto free_rx_tx_urb;
|
|
|
}
|
|
|
|
|
|
- return true;
|
|
|
+ return 0;
|
|
|
|
|
|
+free_rx_tx_urb:
|
|
|
+ usb_free_urb(priv->interrupt_urb);
|
|
|
free_rx_tx:
|
|
|
vnt_free_rx_bufs(priv);
|
|
|
-
|
|
|
free_tx:
|
|
|
vnt_free_tx_bufs(priv);
|
|
|
-
|
|
|
- return false;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static void vnt_tx_80211(struct ieee80211_hw *hw,
|