diff options
Diffstat (limited to 'drivers/staging/bcm/Transmit.c')
-rw-r--r-- | drivers/staging/bcm/Transmit.c | 88 |
1 files changed, 57 insertions, 31 deletions
diff --git a/drivers/staging/bcm/Transmit.c b/drivers/staging/bcm/Transmit.c index 49767468ac23..622a482e9826 100644 --- a/drivers/staging/bcm/Transmit.c +++ b/drivers/staging/bcm/Transmit.c @@ -59,21 +59,27 @@ int SendControlPacket(struct bcm_mini_adapter *Adapter, char *pControlPacket) /* Update the netdevice statistics */ /* Dump Packet */ - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_CONTROL, DBG_LVL_ALL, "Leader Status: %x", PLeader->Status); - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_CONTROL, DBG_LVL_ALL, "Leader VCID: %x", PLeader->Vcid); - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_CONTROL, DBG_LVL_ALL, "Leader Length: %x", PLeader->PLength); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_CONTROL, DBG_LVL_ALL, + "Leader Status: %x", PLeader->Status); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_CONTROL, DBG_LVL_ALL, + "Leader VCID: %x", PLeader->Vcid); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_CONTROL, DBG_LVL_ALL, + "Leader Length: %x", PLeader->PLength); if (Adapter->device_removed) return 0; if (netif_msg_pktdata(Adapter)) print_hex_dump(KERN_DEBUG, PFX "tx control: ", DUMP_PREFIX_NONE, - 16, 1, pControlPacket, PLeader->PLength + LEADER_SIZE, 0); + 16, 1, pControlPacket, + PLeader->PLength + LEADER_SIZE, 0); Adapter->interface_transmit(Adapter->pvInterfaceAdapter, - pControlPacket, (PLeader->PLength + LEADER_SIZE)); + pControlPacket, + (PLeader->PLength + LEADER_SIZE)); atomic_dec(&Adapter->CurrNumFreeTxDesc); - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_CONTROL, DBG_LVL_ALL, "<========="); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_CONTROL, DBG_LVL_ALL, + "<========="); return STATUS_SUCCESS; } @@ -83,12 +89,15 @@ int SendControlPacket(struct bcm_mini_adapter *Adapter, char *pControlPacket) * to the target via the host h/w interface. * @return zero(success) or -ve value(failure) */ -int SetupNextSend(struct bcm_mini_adapter *Adapter, struct sk_buff *Packet, USHORT Vcid) +int SetupNextSend(struct bcm_mini_adapter *Adapter, + struct sk_buff *Packet, USHORT Vcid) { int status = 0; bool bHeaderSupressionEnabled = false; B_UINT16 uiClassifierRuleID; u16 QueueIndex = skb_get_queue_mapping(Packet); + struct bcm_packet_info *curr_packet_info = + &Adapter->PackInfo[QueueIndex]; struct bcm_leader Leader = {0}; if (Packet->len > MAX_DEVICE_DESC_SIZE) { @@ -97,18 +106,21 @@ int SetupNextSend(struct bcm_mini_adapter *Adapter, struct sk_buff *Packet, USH } /* Get the Classifier Rule ID */ - uiClassifierRuleID = *((UINT32 *) (Packet->cb) + SKB_CB_CLASSIFICATION_OFFSET); + uiClassifierRuleID = *((UINT32 *) (Packet->cb) + + SKB_CB_CLASSIFICATION_OFFSET); - bHeaderSupressionEnabled = Adapter->PackInfo[QueueIndex].bHeaderSuppressionEnabled - & Adapter->bPHSEnabled; + bHeaderSupressionEnabled = curr_packet_info->bHeaderSuppressionEnabled & + Adapter->bPHSEnabled; if (Adapter->device_removed) { status = STATUS_FAILURE; goto errExit; } - status = PHSTransmit(Adapter, &Packet, Vcid, uiClassifierRuleID, bHeaderSupressionEnabled, - (UINT *)&Packet->len, Adapter->PackInfo[QueueIndex].bEthCSSupport); + status = PHSTransmit(Adapter, &Packet, Vcid, uiClassifierRuleID, + bHeaderSupressionEnabled, + (UINT *)&Packet->len, + curr_packet_info->bEthCSSupport); if (status != STATUS_SUCCESS) { BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, @@ -123,12 +135,14 @@ int SetupNextSend(struct bcm_mini_adapter *Adapter, struct sk_buff *Packet, USH else Leader.Status = LEADER_STATUS; - if (Adapter->PackInfo[QueueIndex].bEthCSSupport) { + if (curr_packet_info->bEthCSSupport) { Leader.PLength = Packet->len; if (skb_headroom(Packet) < LEADER_SIZE) { status = skb_cow(Packet, LEADER_SIZE); if (status) { - BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "bcm_transmit : Failed To Increase headRoom\n"); + BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, NEXT_SEND, + DBG_LVL_ALL, + "bcm_transmit : Failed To Increase headRoom\n"); goto errExit; } } @@ -136,30 +150,36 @@ int SetupNextSend(struct bcm_mini_adapter *Adapter, struct sk_buff *Packet, USH memcpy(Packet->data, &Leader, LEADER_SIZE); } else { Leader.PLength = Packet->len - ETH_HLEN; - memcpy((struct bcm_leader *)skb_pull(Packet, (ETH_HLEN - LEADER_SIZE)), &Leader, LEADER_SIZE); + memcpy((struct bcm_leader *)skb_pull(Packet, + (ETH_HLEN - LEADER_SIZE)), + &Leader, + LEADER_SIZE); } status = Adapter->interface_transmit(Adapter->pvInterfaceAdapter, - Packet->data, (Leader.PLength + LEADER_SIZE)); + Packet->data, + (Leader.PLength + LEADER_SIZE)); if (status) { ++Adapter->dev->stats.tx_errors; if (netif_msg_tx_err(Adapter)) - pr_info(PFX "%s: transmit error %d\n", Adapter->dev->name, + pr_info(PFX "%s: transmit error %d\n", + Adapter->dev->name, status); } else { struct net_device_stats *netstats = &Adapter->dev->stats; - Adapter->PackInfo[QueueIndex].uiTotalTxBytes += Leader.PLength; + + curr_packet_info->uiTotalTxBytes += Leader.PLength; netstats->tx_bytes += Leader.PLength; ++netstats->tx_packets; - Adapter->PackInfo[QueueIndex].uiCurrentTokenCount -= Leader.PLength << 3; - Adapter->PackInfo[QueueIndex].uiSentBytes += (Packet->len); - Adapter->PackInfo[QueueIndex].uiSentPackets++; - Adapter->PackInfo[QueueIndex].NumOfPacketsSent++; + curr_packet_info->uiCurrentTokenCount -= Leader.PLength << 3; + curr_packet_info->uiSentBytes += (Packet->len); + curr_packet_info->uiSentPackets++; + curr_packet_info->NumOfPacketsSent++; - atomic_dec(&Adapter->PackInfo[QueueIndex].uiPerSFTxResourceCount); - Adapter->PackInfo[QueueIndex].uiThisPeriodSentBytes += Leader.PLength; + atomic_dec(&curr_packet_info->uiPerSFTxResourceCount); + curr_packet_info->uiThisPeriodSentBytes += Leader.PLength; } atomic_dec(&Adapter->CurrNumFreeTxDesc); @@ -172,7 +192,8 @@ errExit: static int tx_pending(struct bcm_mini_adapter *Adapter) { return (atomic_read(&Adapter->TxPktAvail) - && MINIMUM_PENDING_DESCRIPTORS < atomic_read(&Adapter->CurrNumFreeTxDesc)) + && MINIMUM_PENDING_DESCRIPTORS < + atomic_read(&Adapter->CurrNumFreeTxDesc)) || Adapter->device_removed || (1 == Adapter->downloadDDR); } @@ -180,18 +201,21 @@ static int tx_pending(struct bcm_mini_adapter *Adapter) * @ingroup tx_functions * Transmit thread */ -int tx_pkt_handler(struct bcm_mini_adapter *Adapter /**< pointer to adapter object*/) +int tx_pkt_handler(struct bcm_mini_adapter *Adapter) { int status = 0; while (!kthread_should_stop()) { - /* FIXME - the timeout looks like workaround for racey usage of TxPktAvail */ + /* FIXME - the timeout looks like workaround + * for racey usage of TxPktAvail + */ if (Adapter->LinkUpStatus) wait_event_timeout(Adapter->tx_packet_wait_queue, - tx_pending(Adapter), msecs_to_jiffies(10)); + tx_pending(Adapter), + msecs_to_jiffies(10)); else wait_event_interruptible(Adapter->tx_packet_wait_queue, - tx_pending(Adapter)); + tx_pending(Adapter)); if (Adapter->device_removed) break; @@ -208,7 +232,8 @@ int tx_pkt_handler(struct bcm_mini_adapter *Adapter /**< pointer to adapter obje if (Adapter->bEndPointHalted == TRUE) { Bcm_clear_halt_of_endpoints(Adapter); Adapter->bEndPointHalted = false; - StartInterruptUrb((struct bcm_interface_adapter *)(Adapter->pvInterfaceAdapter)); + StartInterruptUrb((struct bcm_interface_adapter *) + (Adapter->pvInterfaceAdapter)); } if (Adapter->LinkUpStatus && !Adapter->IdleMode) { @@ -225,7 +250,8 @@ int tx_pkt_handler(struct bcm_mini_adapter *Adapter /**< pointer to adapter obje LinkMessage(Adapter); } - if ((Adapter->IdleMode || Adapter->bShutStatus) && atomic_read(&Adapter->TotalPacketCount)) { + if ((Adapter->IdleMode || Adapter->bShutStatus) && + atomic_read(&Adapter->TotalPacketCount)) { BCM_DEBUG_PRINT(Adapter, DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Device in Low Power mode...waking up"); |