aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/bcm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/bcm')
-rw-r--r--drivers/staging/bcm/Bcmnet.c66
-rw-r--r--drivers/staging/bcm/InterfaceInit.c2
-rw-r--r--drivers/staging/bcm/Prototypes.h14
-rw-r--r--drivers/staging/bcm/Qos.c30
-rw-r--r--drivers/staging/bcm/Transmit.c61
5 files changed, 72 insertions, 101 deletions
diff --git a/drivers/staging/bcm/Bcmnet.c b/drivers/staging/bcm/Bcmnet.c
index e3575ad65e9..5b466174a58 100644
--- a/drivers/staging/bcm/Bcmnet.c
+++ b/drivers/staging/bcm/Bcmnet.c
@@ -54,6 +54,71 @@ static struct net_device_stats *bcm_get_stats(struct net_device *dev)
54 return netstats; 54 return netstats;
55} 55}
56 56
57static u16 bcm_select_queue(struct net_device *dev, struct sk_buff *skb)
58{
59 return ClassifyPacket(netdev_priv(dev), skb);
60}
61
62
63/*******************************************************************
64* Function - bcm_transmit()
65*
66* Description - This is the main transmit function for our virtual
67* interface(eth0). It handles the ARP packets. It
68* clones this packet and then Queue it to a suitable
69* Queue. Then calls the transmit_packet().
70*
71* Parameter - skb - Pointer to the socket buffer structure
72* dev - Pointer to the virtual net device structure
73*
74*********************************************************************/
75
76static netdev_tx_t bcm_transmit(struct sk_buff *skb, struct net_device *dev)
77{
78 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(dev);
79 u16 qindex = skb_get_queue_mapping(skb);
80
81 if (Adapter->device_removed || !Adapter->LinkUpStatus)
82 goto drop;
83
84 if (Adapter->TransferMode != IP_PACKET_ONLY_MODE )
85 goto drop;
86
87 if (INVALID_QUEUE_INDEX==qindex)
88 goto drop;
89
90 if (Adapter->PackInfo[qindex].uiCurrentPacketsOnHost >= SF_MAX_ALLOWED_PACKETS_TO_BACKUP)
91 return NETDEV_TX_BUSY;
92
93 /* Now Enqueue the packet */
94 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL,
95 "bcm_transmit Enqueueing the Packet To Queue %d",qindex);
96 spin_lock(&Adapter->PackInfo[qindex].SFQueueLock);
97 Adapter->PackInfo[qindex].uiCurrentBytesOnHost += skb->len;
98 Adapter->PackInfo[qindex].uiCurrentPacketsOnHost++;
99
100 *((B_UINT32 *)skb->cb + SKB_CB_LATENCY_OFFSET ) = jiffies;
101 ENQUEUEPACKET(Adapter->PackInfo[qindex].FirstTxQueue,
102 Adapter->PackInfo[qindex].LastTxQueue, skb);
103 atomic_inc(&Adapter->TotalPacketCount);
104 spin_unlock(&Adapter->PackInfo[qindex].SFQueueLock);
105
106 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_OSAL_DBG, DBG_LVL_ALL,"ENQ: \n");
107
108 /* FIXME - this is racy and incorrect, replace with work queue */
109 if (!atomic_read(&Adapter->TxPktAvail)) {
110 atomic_set(&Adapter->TxPktAvail, 1);
111 wake_up(&Adapter->tx_packet_wait_queue);
112 }
113 return NETDEV_TX_OK;
114
115 drop:
116 dev_kfree_skb(skb);
117 return NETDEV_TX_OK;
118}
119
120
121
57/** 122/**
58@ingroup init_functions 123@ingroup init_functions
59Register other driver entry points with the kernel 124Register other driver entry points with the kernel
@@ -66,6 +131,7 @@ static const struct net_device_ops bcmNetDevOps = {
66 .ndo_change_mtu = eth_change_mtu, 131 .ndo_change_mtu = eth_change_mtu,
67 .ndo_set_mac_address = eth_mac_addr, 132 .ndo_set_mac_address = eth_mac_addr,
68 .ndo_validate_addr = eth_validate_addr, 133 .ndo_validate_addr = eth_validate_addr,
134 .ndo_select_queue = bcm_select_queue,
69}; 135};
70 136
71static struct device_type wimax_type = { 137static struct device_type wimax_type = {
diff --git a/drivers/staging/bcm/InterfaceInit.c b/drivers/staging/bcm/InterfaceInit.c
index 14866e9c8cd..845ced1670e 100644
--- a/drivers/staging/bcm/InterfaceInit.c
+++ b/drivers/staging/bcm/InterfaceInit.c
@@ -188,7 +188,7 @@ usbbcm_device_probe(struct usb_interface *intf, const struct usb_device_id *id)
188 PS_INTERFACE_ADAPTER psIntfAdapter; 188 PS_INTERFACE_ADAPTER psIntfAdapter;
189 struct net_device *ndev; 189 struct net_device *ndev;
190 190
191 ndev = alloc_etherdev(sizeof(MINI_ADAPTER)); 191 ndev = alloc_etherdev_mq(sizeof(MINI_ADAPTER), NO_OF_QUEUES);
192 if(ndev == NULL) { 192 if(ndev == NULL) {
193 dev_err(&udev->dev, DRV_NAME ": no memory for device\n"); 193 dev_err(&udev->dev, DRV_NAME ": no memory for device\n");
194 return -ENOMEM; 194 return -ENOMEM;
diff --git a/drivers/staging/bcm/Prototypes.h b/drivers/staging/bcm/Prototypes.h
index 8ca6b9eb4e3..a4b57bb07fa 100644
--- a/drivers/staging/bcm/Prototypes.h
+++ b/drivers/staging/bcm/Prototypes.h
@@ -46,13 +46,12 @@ VOID PruneQueueAllSF(PMINI_ADAPTER Adapter);
46 46
47INT SearchSfid(PMINI_ADAPTER Adapter,UINT uiSfid); 47INT SearchSfid(PMINI_ADAPTER Adapter,UINT uiSfid);
48 48
49USHORT GetPacketQueueIndex(PMINI_ADAPTER Adapter, /**<Pointer to the driver control structure */ 49USHORT ClassifyPacket(PMINI_ADAPTER Adapter,struct sk_buff* skb);
50 struct sk_buff* Packet /**< Pointer to the Packet to be sent*/ 50
51 ); 51BOOLEAN MatchSrcPort(S_CLASSIFIER_RULE *pstClassifierRule,USHORT ushSrcPort);
52BOOLEAN MatchDestPort(S_CLASSIFIER_RULE *pstClassifierRule,USHORT ushSrcPort);
53BOOLEAN MatchProtocol(S_CLASSIFIER_RULE *pstClassifierRule,UCHAR ucProtocol);
52 54
53VOID
54reply_to_arp_request(struct sk_buff *skb /**<sk_buff of ARP request*/
55 );
56 55
57INT SetupNextSend(PMINI_ADAPTER Adapter, /**<Logical Adapter*/ 56INT SetupNextSend(PMINI_ADAPTER Adapter, /**<Logical Adapter*/
58 struct sk_buff *Packet, /**<data buffer*/ 57 struct sk_buff *Packet, /**<data buffer*/
@@ -66,9 +65,6 @@ INT SendControlPacket(PMINI_ADAPTER Adapter, /**<Logical Adapter*/
66 char *pControlPacket/**<Control Packet*/ 65 char *pControlPacket/**<Control Packet*/
67 ); 66 );
68 67
69INT bcm_transmit(struct sk_buff *skb, /**< skb */
70 struct net_device *dev /**< net device pointer */
71 );
72 68
73int register_networkdev(PMINI_ADAPTER Adapter); 69int register_networkdev(PMINI_ADAPTER Adapter);
74 70
diff --git a/drivers/staging/bcm/Qos.c b/drivers/staging/bcm/Qos.c
index 6e406462904..f85a5a85ad5 100644
--- a/drivers/staging/bcm/Qos.c
+++ b/drivers/staging/bcm/Qos.c
@@ -4,13 +4,6 @@ This file contains the routines related to Quality of Service.
4*/ 4*/
5#include "headers.h" 5#include "headers.h"
6 6
7BOOLEAN MatchSrcIpAddress(S_CLASSIFIER_RULE *pstClassifierRule,ULONG ulSrcIP);
8BOOLEAN MatchTos(S_CLASSIFIER_RULE *pstClassifierRule,UCHAR ucTypeOfService);
9BOOLEAN MatchSrcPort(S_CLASSIFIER_RULE *pstClassifierRule,USHORT ushSrcPort);
10BOOLEAN MatchDestPort(S_CLASSIFIER_RULE *pstClassifierRule,USHORT ushDestPort);
11BOOLEAN MatchProtocol(S_CLASSIFIER_RULE *pstClassifierRule,UCHAR ucProtocol);
12BOOLEAN MatchDestIpAddress(S_CLASSIFIER_RULE *pstClassifierRule,ULONG ulDestIP);
13USHORT ClassifyPacket(PMINI_ADAPTER Adapter,struct sk_buff* skb);
14void EThCSGetPktInfo(PMINI_ADAPTER Adapter,PVOID pvEthPayload,PS_ETHCS_PKT_INFO pstEthCsPktInfo); 7void EThCSGetPktInfo(PMINI_ADAPTER Adapter,PVOID pvEthPayload,PS_ETHCS_PKT_INFO pstEthCsPktInfo);
15BOOLEAN EThCSClassifyPkt(PMINI_ADAPTER Adapter,struct sk_buff* skb,PS_ETHCS_PKT_INFO pstEthCsPktInfo,S_CLASSIFIER_RULE *pstClassifierRule, B_UINT8 EthCSCupport); 8BOOLEAN EThCSClassifyPkt(PMINI_ADAPTER Adapter,struct sk_buff* skb,PS_ETHCS_PKT_INFO pstEthCsPktInfo,S_CLASSIFIER_RULE *pstClassifierRule, B_UINT8 EthCSCupport);
16 9
@@ -312,29 +305,6 @@ USHORT IpVersion4(PMINI_ADAPTER Adapter, /**< Pointer to the driver control stru
312 305
313 return bClassificationSucceed; 306 return bClassificationSucceed;
314} 307}
315/**
316@ingroup tx_functions
317@return Queue Index based on priority.
318*/
319USHORT GetPacketQueueIndex(PMINI_ADAPTER Adapter, /**<Pointer to the driver control structure */
320 struct sk_buff* Packet /**< Pointer to the Packet to be sent*/
321 )
322{
323 USHORT usIndex=-1;
324 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, QUEUE_INDEX, DBG_LVL_ALL, "=====>");
325
326 if(NULL==Adapter || NULL==Packet)
327 {
328 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, QUEUE_INDEX, DBG_LVL_ALL, "Got NULL Values<======");
329 return -1;
330 }
331
332 usIndex = ClassifyPacket(Adapter,Packet);
333
334 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, QUEUE_INDEX, DBG_LVL_ALL, "Got Queue Index %x",usIndex);
335 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, QUEUE_INDEX, DBG_LVL_ALL, "GetPacketQueueIndex <==============");
336 return usIndex;
337}
338 308
339VOID PruneQueueAllSF(PMINI_ADAPTER Adapter) 309VOID PruneQueueAllSF(PMINI_ADAPTER Adapter)
340{ 310{
diff --git a/drivers/staging/bcm/Transmit.c b/drivers/staging/bcm/Transmit.c
index 4b94d822578..734bbbd14e2 100644
--- a/drivers/staging/bcm/Transmit.c
+++ b/drivers/staging/bcm/Transmit.c
@@ -35,67 +35,6 @@ SendPacketFromQueue->SetupNextSend->bcm_cmd53
35 35
36#include "headers.h" 36#include "headers.h"
37 37
38/*******************************************************************
39* Function - bcm_transmit()
40*
41* Description - This is the main transmit function for our virtual
42* interface(eth0). It handles the ARP packets. It
43* clones this packet and then Queue it to a suitable
44* Queue. Then calls the transmit_packet().
45*
46* Parameter - skb - Pointer to the socket buffer structure
47* dev - Pointer to the virtual net device structure
48*
49* Returns - zero (success) or -ve value (failure)
50*
51*********************************************************************/
52
53netdev_tx_t bcm_transmit(struct sk_buff *skb, struct net_device *dev)
54{
55 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(dev);
56 SHORT qindex;
57
58 if (Adapter->device_removed || !Adapter->LinkUpStatus)
59 goto drop;
60
61 if (Adapter->TransferMode != IP_PACKET_ONLY_MODE )
62 goto drop;
63
64 qindex = GetPacketQueueIndex(Adapter, skb);
65
66 if (INVALID_QUEUE_INDEX==qindex)
67 goto drop;
68
69 if (Adapter->PackInfo[qindex].uiCurrentPacketsOnHost >= SF_MAX_ALLOWED_PACKETS_TO_BACKUP)
70 return NETDEV_TX_BUSY;
71
72 /* Now Enqueue the packet */
73 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL,
74 "bcm_transmit Enqueueing the Packet To Queue %d",qindex);
75 spin_lock(&Adapter->PackInfo[qindex].SFQueueLock);
76 Adapter->PackInfo[qindex].uiCurrentBytesOnHost += skb->len;
77 Adapter->PackInfo[qindex].uiCurrentPacketsOnHost++;
78
79 *((B_UINT32 *)skb->cb + SKB_CB_LATENCY_OFFSET ) = jiffies;
80 ENQUEUEPACKET(Adapter->PackInfo[qindex].FirstTxQueue,
81 Adapter->PackInfo[qindex].LastTxQueue, skb);
82 atomic_inc(&Adapter->TotalPacketCount);
83 spin_unlock(&Adapter->PackInfo[qindex].SFQueueLock);
84
85 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, TX_OSAL_DBG, DBG_LVL_ALL,"ENQ: \n");
86
87 /* FIXME - this is racy and incorrect, replace with work queue */
88 if (!atomic_read(&Adapter->TxPktAvail)) {
89 atomic_set(&Adapter->TxPktAvail, 1);
90 wake_up(&Adapter->tx_packet_wait_queue);
91 }
92 return NETDEV_TX_OK;
93
94 drop:
95 dev_kfree_skb(skb);
96 return NETDEV_TX_OK;
97}
98
99 38
100/** 39/**
101@ingroup ctrl_pkt_functions 40@ingroup ctrl_pkt_functions