|
@@ -519,7 +519,7 @@ static void brcmf_usb_tx_complete(struct urb *urb)
|
|
|
else
|
|
|
devinfo->bus_pub.bus->dstats.tx_errors++;
|
|
|
|
|
|
- dev_kfree_skb(req->skb);
|
|
|
+ brcmu_pkt_buf_free_skb(req->skb);
|
|
|
req->skb = NULL;
|
|
|
brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req);
|
|
|
|
|
@@ -540,7 +540,7 @@ static void brcmf_usb_rx_complete(struct urb *urb)
|
|
|
devinfo->bus_pub.bus->dstats.rx_packets++;
|
|
|
} else {
|
|
|
devinfo->bus_pub.bus->dstats.rx_errors++;
|
|
|
- dev_kfree_skb(skb);
|
|
|
+ brcmu_pkt_buf_free_skb(skb);
|
|
|
brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req);
|
|
|
return;
|
|
|
}
|
|
@@ -550,13 +550,15 @@ static void brcmf_usb_rx_complete(struct urb *urb)
|
|
|
if (brcmf_proto_hdrpull(devinfo->dev, &ifidx, skb) != 0) {
|
|
|
brcmf_dbg(ERROR, "rx protocol error\n");
|
|
|
brcmu_pkt_buf_free_skb(skb);
|
|
|
+ brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req);
|
|
|
devinfo->bus_pub.bus->dstats.rx_errors++;
|
|
|
} else {
|
|
|
brcmf_rx_packet(devinfo->dev, ifidx, skb);
|
|
|
brcmf_usb_rx_refill(devinfo, req);
|
|
|
}
|
|
|
} else {
|
|
|
- dev_kfree_skb(skb);
|
|
|
+ brcmu_pkt_buf_free_skb(skb);
|
|
|
+ brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req);
|
|
|
}
|
|
|
return;
|
|
|
|
|
@@ -581,14 +583,13 @@ static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo,
|
|
|
usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->rx_pipe,
|
|
|
skb->data, skb_tailroom(skb), brcmf_usb_rx_complete,
|
|
|
req);
|
|
|
- req->urb->transfer_flags |= URB_ZERO_PACKET;
|
|
|
req->devinfo = devinfo;
|
|
|
+ brcmf_usb_enq(devinfo, &devinfo->rx_postq, req);
|
|
|
|
|
|
ret = usb_submit_urb(req->urb, GFP_ATOMIC);
|
|
|
- if (ret == 0) {
|
|
|
- brcmf_usb_enq(devinfo, &devinfo->rx_postq, req);
|
|
|
- } else {
|
|
|
- dev_kfree_skb(req->skb);
|
|
|
+ if (ret) {
|
|
|
+ brcmf_usb_del_fromq(devinfo, req);
|
|
|
+ brcmu_pkt_buf_free_skb(req->skb);
|
|
|
req->skb = NULL;
|
|
|
brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req);
|
|
|
}
|
|
@@ -683,23 +684,22 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
|
|
|
|
|
|
req = brcmf_usb_deq(devinfo, &devinfo->tx_freeq);
|
|
|
if (!req) {
|
|
|
+ brcmu_pkt_buf_free_skb(skb);
|
|
|
brcmf_dbg(ERROR, "no req to send\n");
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
- if (!req->urb) {
|
|
|
- brcmf_dbg(ERROR, "no urb for req %p\n", req);
|
|
|
- return -ENOBUFS;
|
|
|
- }
|
|
|
|
|
|
req->skb = skb;
|
|
|
req->devinfo = devinfo;
|
|
|
usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe,
|
|
|
skb->data, skb->len, brcmf_usb_tx_complete, req);
|
|
|
req->urb->transfer_flags |= URB_ZERO_PACKET;
|
|
|
+ brcmf_usb_enq(devinfo, &devinfo->tx_postq, req);
|
|
|
ret = usb_submit_urb(req->urb, GFP_ATOMIC);
|
|
|
- if (!ret) {
|
|
|
- brcmf_usb_enq(devinfo, &devinfo->tx_postq, req);
|
|
|
- } else {
|
|
|
+ if (ret) {
|
|
|
+ brcmf_dbg(ERROR, "brcmf_usb_tx usb_submit_urb FAILED\n");
|
|
|
+ brcmf_usb_del_fromq(devinfo, req);
|
|
|
+ brcmu_pkt_buf_free_skb(req->skb);
|
|
|
req->skb = NULL;
|
|
|
brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req);
|
|
|
}
|