diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/bcm/Bcmnet.c | 66 | ||||
-rw-r--r-- | drivers/staging/bcm/InterfaceInit.c | 2 | ||||
-rw-r--r-- | drivers/staging/bcm/Prototypes.h | 14 | ||||
-rw-r--r-- | drivers/staging/bcm/Qos.c | 30 | ||||
-rw-r--r-- | drivers/staging/bcm/Transmit.c | 61 |
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 | ||
57 | static 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 | |||
76 | static 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 |
59 | Register other driver entry points with the kernel | 124 | Register 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 | ||
71 | static struct device_type wimax_type = { | 137 | static 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 | ||
47 | INT SearchSfid(PMINI_ADAPTER Adapter,UINT uiSfid); | 47 | INT SearchSfid(PMINI_ADAPTER Adapter,UINT uiSfid); |
48 | 48 | ||
49 | USHORT GetPacketQueueIndex(PMINI_ADAPTER Adapter, /**<Pointer to the driver control structure */ | 49 | USHORT ClassifyPacket(PMINI_ADAPTER Adapter,struct sk_buff* skb); |
50 | struct sk_buff* Packet /**< Pointer to the Packet to be sent*/ | 50 | |
51 | ); | 51 | BOOLEAN MatchSrcPort(S_CLASSIFIER_RULE *pstClassifierRule,USHORT ushSrcPort); |
52 | BOOLEAN MatchDestPort(S_CLASSIFIER_RULE *pstClassifierRule,USHORT ushSrcPort); | ||
53 | BOOLEAN MatchProtocol(S_CLASSIFIER_RULE *pstClassifierRule,UCHAR ucProtocol); | ||
52 | 54 | ||
53 | VOID | ||
54 | reply_to_arp_request(struct sk_buff *skb /**<sk_buff of ARP request*/ | ||
55 | ); | ||
56 | 55 | ||
57 | INT SetupNextSend(PMINI_ADAPTER Adapter, /**<Logical Adapter*/ | 56 | INT 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 | ||
69 | INT bcm_transmit(struct sk_buff *skb, /**< skb */ | ||
70 | struct net_device *dev /**< net device pointer */ | ||
71 | ); | ||
72 | 68 | ||
73 | int register_networkdev(PMINI_ADAPTER Adapter); | 69 | int 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 | ||
7 | BOOLEAN MatchSrcIpAddress(S_CLASSIFIER_RULE *pstClassifierRule,ULONG ulSrcIP); | ||
8 | BOOLEAN MatchTos(S_CLASSIFIER_RULE *pstClassifierRule,UCHAR ucTypeOfService); | ||
9 | BOOLEAN MatchSrcPort(S_CLASSIFIER_RULE *pstClassifierRule,USHORT ushSrcPort); | ||
10 | BOOLEAN MatchDestPort(S_CLASSIFIER_RULE *pstClassifierRule,USHORT ushDestPort); | ||
11 | BOOLEAN MatchProtocol(S_CLASSIFIER_RULE *pstClassifierRule,UCHAR ucProtocol); | ||
12 | BOOLEAN MatchDestIpAddress(S_CLASSIFIER_RULE *pstClassifierRule,ULONG ulDestIP); | ||
13 | USHORT ClassifyPacket(PMINI_ADAPTER Adapter,struct sk_buff* skb); | ||
14 | void EThCSGetPktInfo(PMINI_ADAPTER Adapter,PVOID pvEthPayload,PS_ETHCS_PKT_INFO pstEthCsPktInfo); | 7 | void EThCSGetPktInfo(PMINI_ADAPTER Adapter,PVOID pvEthPayload,PS_ETHCS_PKT_INFO pstEthCsPktInfo); |
15 | BOOLEAN EThCSClassifyPkt(PMINI_ADAPTER Adapter,struct sk_buff* skb,PS_ETHCS_PKT_INFO pstEthCsPktInfo,S_CLASSIFIER_RULE *pstClassifierRule, B_UINT8 EthCSCupport); | 8 | BOOLEAN 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 | */ | ||
319 | USHORT 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 | ||
339 | VOID PruneQueueAllSF(PMINI_ADAPTER Adapter) | 309 | VOID 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 | |||
53 | netdev_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 |