beceem: transmit code cleanup

Eliminate global variable in transmit path
The Leader can be on the stack, and get rid of unnecessary timeval.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
This commit is contained in:
Stephen Hemminger 2010-11-01 12:20:09 -04:00
parent 1da9badcf0
commit ac1b1ae7f8

View file

@ -41,19 +41,10 @@ SendPacketFromQueue->SetupNextSend->bcm_cmd53
This function dispatches control packet to the h/w interface This function dispatches control packet to the h/w interface
@return zero(success) or -ve value(failure) @return zero(success) or -ve value(failure)
*/ */
INT SendControlPacket(PMINI_ADAPTER Adapter, /**<Logical Adapter*/ INT SendControlPacket(PMINI_ADAPTER Adapter, char *pControlPacket)
char *pControlPacket/**<Control Packet*/
)
{ {
PLEADER PLeader = NULL; PLEADER PLeader = (PLEADER)pControlPacket;
struct timeval tv;
memset(&tv, 0, sizeof(tv));
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_CONTROL, DBG_LVL_ALL, "========>");
PLeader=(PLEADER)pControlPacket;
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_CONTROL, DBG_LVL_ALL, "Tx"); BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_CONTROL, DBG_LVL_ALL, "Tx");
if(!pControlPacket || !Adapter) if(!pControlPacket || !Adapter)
{ {
@ -87,27 +78,21 @@ INT SendControlPacket(PMINI_ADAPTER Adapter, /**<Logical Adapter*/
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; return STATUS_SUCCESS;
} }
static LEADER Leader={0};
/** /**
@ingroup tx_functions @ingroup tx_functions
This function despatches the IP packets with the given vcid This function despatches the IP packets with the given vcid
to the target via the host h/w interface. to the target via the host h/w interface.
@return zero(success) or -ve value(failure) @return zero(success) or -ve value(failure)
*/ */
INT SetupNextSend(PMINI_ADAPTER Adapter, /**<Logical Adapter*/ INT SetupNextSend(PMINI_ADAPTER Adapter, struct sk_buff *Packet, USHORT Vcid)
struct sk_buff *Packet, /**<data buffer*/
USHORT Vcid) /**<VCID for this packet*/
{ {
int status=0; int status=0;
BOOLEAN bHeaderSupressionEnabled = FALSE; BOOLEAN bHeaderSupressionEnabled = FALSE;
B_UINT16 uiClassifierRuleID; B_UINT16 uiClassifierRuleID;
int QueueIndex = NO_OF_QUEUES + 1; int QueueIndex = NO_OF_QUEUES + 1;
LEADER Leader={0};
if(!Adapter || !Packet)
{
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "Got NULL Adapter or Packet");
return -EINVAL;
}
if(Packet->len > MAX_DEVICE_DESC_SIZE) if(Packet->len > MAX_DEVICE_DESC_SIZE)
{ {
status = STATUS_FAILURE; status = STATUS_FAILURE;
@ -142,14 +127,9 @@ INT SetupNextSend(PMINI_ADAPTER Adapter, /**<Logical Adapter*/
Leader.Vcid = Vcid; Leader.Vcid = Vcid;
if(TCP_ACK == *((UINT32*) (Packet->cb) + SKB_CB_TCPACK_OFFSET )) if(TCP_ACK == *((UINT32*) (Packet->cb) + SKB_CB_TCPACK_OFFSET ))
{
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "Sending TCP ACK\n");
Leader.Status = LEADER_STATUS_TCP_ACK; Leader.Status = LEADER_STATUS_TCP_ACK;
}
else else
{
Leader.Status = LEADER_STATUS; Leader.Status = LEADER_STATUS;
}
if(Adapter->PackInfo[QueueIndex].bEthCSSupport) if(Adapter->PackInfo[QueueIndex].bEthCSSupport)
{ {
@ -165,35 +145,26 @@ INT SetupNextSend(PMINI_ADAPTER Adapter, /**<Logical Adapter*/
skb_push(Packet, LEADER_SIZE); skb_push(Packet, LEADER_SIZE);
memcpy(Packet->data, &Leader, LEADER_SIZE); memcpy(Packet->data, &Leader, LEADER_SIZE);
} }
else else
{ {
Leader.PLength = Packet->len - ETH_HLEN; Leader.PLength = Packet->len - ETH_HLEN;
memcpy((LEADER*)skb_pull(Packet, (ETH_HLEN - LEADER_SIZE)), &Leader, LEADER_SIZE); memcpy((LEADER*)skb_pull(Packet, (ETH_HLEN - LEADER_SIZE)), &Leader, LEADER_SIZE);
} }
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "Packet->len = %d", Packet->len);
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "Vcid = %d", Vcid);
status = Adapter->interface_transmit(Adapter->pvInterfaceAdapter, status = Adapter->interface_transmit(Adapter->pvInterfaceAdapter,
Packet->data, (Leader.PLength + LEADER_SIZE)); Packet->data, (Leader.PLength + LEADER_SIZE));
if(status) if(status)
{ {
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "Tx Failed..\n"); ++Adapter->dev->stats.tx_errors;
if (netif_msg_tx_err(Adapter))
pr_info(PFX "%s: transmit error %d\n", Adapter->dev->name,
status);
} }
else else
{ {
Adapter->PackInfo[QueueIndex].uiTotalTxBytes += Leader.PLength; Adapter->PackInfo[QueueIndex].uiTotalTxBytes += Leader.PLength;
atomic_add(Leader.PLength, &Adapter->GoodTxByteCount); Adapter->dev->stats.tx_bytes += Leader.PLength;
atomic_inc(&Adapter->TxTotalPacketCount); ++Adapter->dev->stats.tx_packets;
}
atomic_dec(&Adapter->CurrNumFreeTxDesc);
errExit:
if(STATUS_SUCCESS == status)
{
Adapter->PackInfo[QueueIndex].uiCurrentTokenCount -= Leader.PLength << 3; Adapter->PackInfo[QueueIndex].uiCurrentTokenCount -= Leader.PLength << 3;
Adapter->PackInfo[QueueIndex].uiSentBytes += (Packet->len); Adapter->PackInfo[QueueIndex].uiSentBytes += (Packet->len);
Adapter->PackInfo[QueueIndex].uiSentPackets++; Adapter->PackInfo[QueueIndex].uiSentPackets++;
@ -203,6 +174,9 @@ INT SetupNextSend(PMINI_ADAPTER Adapter, /**<Logical Adapter*/
Adapter->PackInfo[QueueIndex].uiThisPeriodSentBytes += Leader.PLength; Adapter->PackInfo[QueueIndex].uiThisPeriodSentBytes += Leader.PLength;
} }
atomic_dec(&Adapter->CurrNumFreeTxDesc);
errExit:
dev_kfree_skb(Packet); dev_kfree_skb(Packet);
return status; return status;
@ -238,11 +212,10 @@ int tx_pkt_handler(PMINI_ADAPTER Adapter /**< pointer to adapter object*/
if(Adapter->downloadDDR == 1) if(Adapter->downloadDDR == 1)
{ {
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "Downloading DDR Settings\n");
Adapter->downloadDDR +=1; Adapter->downloadDDR +=1;
status = download_ddr_settings(Adapter); status = download_ddr_settings(Adapter);
if(status) if(status)
BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_PACKETS, DBG_LVL_ALL, "DDR DOWNLOAD FAILED!\n"); pr_err(PFX "DDR DOWNLOAD FAILED! %d\n", status);
continue; continue;
} }
@ -278,7 +251,6 @@ int tx_pkt_handler(PMINI_ADAPTER Adapter /**< pointer to adapter object*/
wake_up(&Adapter->process_rx_cntrlpkt); wake_up(&Adapter->process_rx_cntrlpkt);
} }
transmit_packets(Adapter); transmit_packets(Adapter);
atomic_set(&Adapter->TxPktAvail, 0); atomic_set(&Adapter->TxPktAvail, 0);
@ -288,6 +260,3 @@ int tx_pkt_handler(PMINI_ADAPTER Adapter /**< pointer to adapter object*/
Adapter->transmit_packet_thread = NULL; Adapter->transmit_packet_thread = NULL;
return 0; return 0;
} }