/* We're receiving Rx packet from the LMAC, and Rx ticket from the UMAC. To forward a target data packet upstream (i.e. to the kernel network stack), we must have received an Rx ticket that tells us we're allowed to release this packet (ticket action is IWM_RX_TICKET_RELEASE). The Rx ticket also indicates, among other things, where valid data actually starts in the Rx packet.  */
void iwm_rx_worker(struct work_struct *work)
/* We're receiving Rx packet from the LMAC, and Rx ticket from the UMAC. To forward a target data packet upstream (i.e. to the kernel network stack), we must have received an Rx ticket that tells us we're allowed to release this packet (ticket action is IWM_RX_TICKET_RELEASE). The Rx ticket also indicates, among other things, where valid data actually starts in the Rx packet.  */
void iwm_rx_worker(struct work_struct *work)
{
	struct iwm_priv *iwm;
	struct iwm_rx_ticket_node *ticket, *next;
	iwm = container_of(work, struct iwm_priv, rx_worker);
	list_for_each_entry_safe(ticket, next, &iwm->rx_tickets, node) {
		struct iwm_rx_packet *packet =
			iwm_rx_packet_get(iwm, le16_to_cpu(ticket->ticket->id));
		if (!packet) {
			IWM_DBG_RX(iwm, DBG, "Skip rx_work: Wait for ticket %d "
				   "to be handled first\n",
				   le16_to_cpu(ticket->ticket->id));
			return;
		}
		list_del(&ticket->node);
		list_del(&packet->node);
		iwm_rx_process_packet(iwm, packet, ticket);
	}
}