コード例 #1
0
static void _rtl_tx_complete(struct urb *urb)
{
	struct sk_buff *skb = (struct sk_buff *)urb->context;
	struct rtl_tcb_desc *tcb_desc = (struct rtl_tcb_desc *)(skb->cb);
	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
	struct rtl_usb *rtlusb = (struct rtl_usb *)info->rate_driver_data[0];
	struct ieee80211_hw *hw = usb_get_intfdata(rtlusb->intf);
	int err;

	atomic_dec(&rtlusb->tx_pending_urbs);

	if (tcb_desc->cmd_or_init == DESC_PACKET_TYPE_NORMAL) {
		if (unlikely(IS_USB_STOP(rtlusb))) {
			dev_kfree_skb_irq(skb);
			return;
		}

		err = _usb_tx_post(hw, urb, skb);
		if (err) {
			/* Ignore error and keep issuiing other urbs */
			return;
		}
	} else {
		dev_kfree_skb_irq(skb);
	}

	rtl_usb_tx_schedule(hw);
}
コード例 #2
0
static void _rtl_tx_complete(struct urb *urb)
{
	struct sk_buff *skb = (struct sk_buff *)urb->context;
	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
	struct rtl_usb *rtlusb = (struct rtl_usb *)info->rate_driver_data[0];
	struct ieee80211_hw *hw = usb_get_intfdata(rtlusb->intf);
	int err;

	if (unlikely(IS_USB_STOP(rtlusb)))
		return;
	err = _usb_tx_post(hw, urb, skb);
	if (err) {
		/* Ignore error and keep issuiing other urbs */
		return;
	}
}