void r8712_recv_indicatepkt(struct _adapter *padapter, union recv_frame *precv_frame) { struct recv_priv *precvpriv; struct __queue *pfree_recv_queue; _pkt *skb; struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; precvpriv = &(padapter->recvpriv); pfree_recv_queue = &(precvpriv->free_recv_queue); skb = precv_frame->u.hdr.pkt; if (skb == NULL) goto _recv_indicatepkt_drop; skb->data = precv_frame->u.hdr.rx_data; skb->len = precv_frame->u.hdr.len; skb_set_tail_pointer(skb, skb->len); if ((pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1)) skb->ip_summed = CHECKSUM_UNNECESSARY; else skb->ip_summed = CHECKSUM_NONE; skb->dev = padapter->pnetdev; skb->protocol = eth_type_trans(skb, padapter->pnetdev); netif_rx(skb); precv_frame->u.hdr.pkt = NULL; /* pointers to NULL before * r8712_free_recvframe() */ r8712_free_recvframe(precv_frame, pfree_recv_queue); return; _recv_indicatepkt_drop: /*enqueue back to free_recv_queue*/ if (precv_frame) r8712_free_recvframe(precv_frame, pfree_recv_queue); precvpriv->rx_drop++; }
void r8712_recv_indicatepkt(struct _adapter *padapter, union recv_frame *precv_frame) { struct recv_priv *precvpriv; struct __queue *pfree_recv_queue; _pkt *skb; struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib; precvpriv = &(padapter->recvpriv); pfree_recv_queue = &(precvpriv->free_recv_queue); skb = precv_frame->u.hdr.pkt; if (skb == NULL) goto _recv_indicatepkt_drop; skb->data = precv_frame->u.hdr.rx_data; #ifdef NET_SKBUFF_DATA_USES_OFFSET skb->tail = (sk_buff_data_t)(precv_frame->u.hdr.rx_tail - precv_frame->u.hdr.rx_head); #else skb->tail = (sk_buff_data_t)precv_frame->u.hdr.rx_tail; #endif skb->len = precv_frame->u.hdr.len; if ((pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1)) skb->ip_summed = CHECKSUM_UNNECESSARY; else skb->ip_summed = CHECKSUM_NONE; skb->dev = padapter->pnetdev; skb->protocol = eth_type_trans(skb, padapter->pnetdev); netif_rx(skb); precv_frame->u.hdr.pkt = NULL; /* */ r8712_free_recvframe(precv_frame, pfree_recv_queue); return; _recv_indicatepkt_drop: /* */ if (precv_frame) r8712_free_recvframe(precv_frame, pfree_recv_queue); precvpriv->rx_drop++; }