This patch outsources a chunk of code into a function. Signed-off-by: Matthias Beyer <mail@xxxxxxxxxxxxxxxx> --- drivers/staging/bcm/InterfaceRx.c | 129 +++++++++++++++++++++----------------- 1 file changed, 71 insertions(+), 58 deletions(-) diff --git a/drivers/staging/bcm/InterfaceRx.c b/drivers/staging/bcm/InterfaceRx.c index 47b6de7..f2c323d 100644 --- a/drivers/staging/bcm/InterfaceRx.c +++ b/drivers/staging/bcm/InterfaceRx.c @@ -21,6 +21,73 @@ static void handle_control_packet(struct bcm_interface_adapter *interface, wake_up(&ad->process_rx_cntrlpkt); } +static void format_eth_hdr_to_stack(struct bcm_interface_adapter *interface, + struct bcm_mini_adapter *ad, + struct bcm_leader *p_leader, + struct sk_buff *skb, + struct urb *urb, + UINT ui_index, + int queue_index, + bool b_header_supression_endabled, + int *process_done) +{ + /* + * Data Packet, Format a proper Ethernet Header + * and give it to the stack + */ + BCM_DEBUG_PRINT(interface->psAdapter, DBG_TYPE_RX, RX_DATA, + DBG_LVL_ALL, "Received Data pkt..."); + skb_reserve(skb, 2 + SKB_RESERVE_PHS_BYTES); + memcpy(skb->data+ETH_HLEN, (PUCHAR)urb->transfer_buffer + + sizeof(struct bcm_leader), p_leader->PLength); + skb->dev = ad->dev; + + /* currently skb->len has extra ETH_HLEN bytes in the beginning */ + skb_put(skb, p_leader->PLength + ETH_HLEN); + ad->PackInfo[queue_index].uiTotalRxBytes += p_leader->PLength; + ad->PackInfo[queue_index].uiThisPeriodRxBytes += p_leader->PLength; + BCM_DEBUG_PRINT(interface->psAdapter, DBG_TYPE_RX, RX_DATA, + DBG_LVL_ALL, "Received Data pkt of len :0x%X", + p_leader->PLength); + + if (netif_running(ad->dev)) { + /* Moving ahead by ETH_HLEN to the data ptr as received from FW */ + skb_pull(skb, ETH_HLEN); + PHSReceive(ad, p_leader->Vcid, skb, &skb->len, + NULL, b_header_supression_endabled); + + if (!ad->PackInfo[queue_index].bEthCSSupport) { + skb_push(skb, ETH_HLEN); + + memcpy(skb->data, skb->dev->dev_addr, 6); + memcpy(skb->data+6, skb->dev->dev_addr, 6); + (*(skb->data+11))++; + *(skb->data+12) = 0x08; + *(skb->data+13) = 0x00; + p_leader->PLength += ETH_HLEN; + } + + skb->protocol = eth_type_trans(skb, ad->dev); + *process_done = netif_rx(skb); + } else { + BCM_DEBUG_PRINT(interface->psAdapter, DBG_TYPE_RX, + RX_DATA, DBG_LVL_ALL, + "i/f not up hance freeing SKB..."); + dev_kfree_skb(skb); + } + + ++ad->dev->stats.rx_packets; + ad->dev->stats.rx_bytes += p_leader->PLength; + + for (ui_index = 0; ui_index < MIBS_MAX_HIST_ENTRIES; ui_index++) { + if ((p_leader->PLength <= + MIBS_PKTSIZEHIST_RANGE*(ui_index+1)) && + (p_leader->PLength > MIBS_PKTSIZEHIST_RANGE*(ui_index))) + + ad->aRxPktSizeHist[ui_index]++; + } +} + static int SearchVcid(struct bcm_mini_adapter *Adapter, unsigned short usVcid) { int iIndex = 0; @@ -144,64 +211,10 @@ static void read_bulk_callback(struct urb *urb) handle_control_packet(psIntfAdapter, Adapter, pLeader, skb, urb); } else { - /* - * Data Packet, Format a proper Ethernet Header - * and give it to the stack - */ - BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_RX, RX_DATA, - DBG_LVL_ALL, "Received Data pkt..."); - skb_reserve(skb, 2 + SKB_RESERVE_PHS_BYTES); - memcpy(skb->data+ETH_HLEN, (PUCHAR)urb->transfer_buffer + - sizeof(struct bcm_leader), pLeader->PLength); - skb->dev = Adapter->dev; - - /* currently skb->len has extra ETH_HLEN bytes in the beginning */ - skb_put(skb, pLeader->PLength + ETH_HLEN); - Adapter->PackInfo[QueueIndex].uiTotalRxBytes += - pLeader->PLength; - Adapter->PackInfo[QueueIndex].uiThisPeriodRxBytes += - pLeader->PLength; - BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_RX, RX_DATA, - DBG_LVL_ALL, "Received Data pkt of len :0x%X", - pLeader->PLength); - - if (netif_running(Adapter->dev)) { - /* Moving ahead by ETH_HLEN to the data ptr as received from FW */ - skb_pull(skb, ETH_HLEN); - PHSReceive(Adapter, pLeader->Vcid, skb, &skb->len, - NULL, bHeaderSupressionEnabled); - - if (!Adapter->PackInfo[QueueIndex].bEthCSSupport) { - skb_push(skb, ETH_HLEN); - - memcpy(skb->data, skb->dev->dev_addr, 6); - memcpy(skb->data+6, skb->dev->dev_addr, 6); - (*(skb->data+11))++; - *(skb->data+12) = 0x08; - *(skb->data+13) = 0x00; - pLeader->PLength += ETH_HLEN; - } - - skb->protocol = eth_type_trans(skb, Adapter->dev); - process_done = netif_rx(skb); - } else { - BCM_DEBUG_PRINT(psIntfAdapter->psAdapter, DBG_TYPE_RX, - RX_DATA, DBG_LVL_ALL, - "i/f not up hance freeing SKB..."); - dev_kfree_skb(skb); - } - - ++Adapter->dev->stats.rx_packets; - Adapter->dev->stats.rx_bytes += pLeader->PLength; - - for (uiIndex = 0; uiIndex < MIBS_MAX_HIST_ENTRIES; uiIndex++) { - if ((pLeader->PLength <= - MIBS_PKTSIZEHIST_RANGE*(uiIndex+1)) && - (pLeader->PLength > - MIBS_PKTSIZEHIST_RANGE*(uiIndex))) - - Adapter->aRxPktSizeHist[uiIndex]++; - } + format_eth_hdr_to_stack(psIntfAdapter, Adapter, pLeader, skb, + urb, uiIndex, QueueIndex, + bHeaderSupressionEnabled, + &process_done); } Adapter->PrevNumRecvDescs++; pRcb->bUsed = false; -- 2.0.1 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel