diff options
author | Javier Cardona <javier@cozybit.com> | 2007-05-25 12:06:56 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2007-06-11 14:28:38 -0400 |
commit | 51d84f501684db22f5fcc30821cbbde2a0a2f264 (patch) | |
tree | e8cc735e7a285fc753dbee4f6d2cfe7d08d69023 /drivers/net/wireless/libertas/main.c | |
parent | 32a74b7c8f7b883b532e0e4333b7c3014d3d8fe8 (diff) |
[PATCH] libertas: fixed transmission flow control on the mesh interface
This patch implements proper transmission flow control on mshX.
Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/libertas/main.c')
-rw-r--r-- | drivers/net/wireless/libertas/main.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index 44a632e4ce4e..899090108837 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c | |||
@@ -266,8 +266,11 @@ static int wlan_dev_open(struct net_device *dev) | |||
266 | 266 | ||
267 | if (adapter->connect_status == libertas_connected) { | 267 | if (adapter->connect_status == libertas_connected) { |
268 | netif_carrier_on(priv->wlan_dev.netdev); | 268 | netif_carrier_on(priv->wlan_dev.netdev); |
269 | } else | 269 | netif_carrier_on(priv->mesh_dev); |
270 | } else { | ||
270 | netif_carrier_off(priv->wlan_dev.netdev); | 271 | netif_carrier_off(priv->wlan_dev.netdev); |
272 | netif_carrier_off(priv->mesh_dev); | ||
273 | } | ||
271 | 274 | ||
272 | lbs_deb_leave(LBS_DEB_NET); | 275 | lbs_deb_leave(LBS_DEB_NET); |
273 | return 0; | 276 | return 0; |
@@ -285,7 +288,7 @@ static int mesh_open(struct net_device *dev) | |||
285 | if (pre_open_check(dev) == -1) | 288 | if (pre_open_check(dev) == -1) |
286 | return -1; | 289 | return -1; |
287 | priv->mesh_open = 1 ; | 290 | priv->mesh_open = 1 ; |
288 | netif_start_queue(priv->mesh_dev); | 291 | netif_wake_queue(priv->mesh_dev); |
289 | if (priv->infra_open == 0) | 292 | if (priv->infra_open == 0) |
290 | return wlan_dev_open(priv->wlan_dev.netdev) ; | 293 | return wlan_dev_open(priv->wlan_dev.netdev) ; |
291 | return 0; | 294 | return 0; |
@@ -317,6 +320,7 @@ static int wlan_dev_close(struct net_device *dev) | |||
317 | lbs_deb_enter(LBS_DEB_NET); | 320 | lbs_deb_enter(LBS_DEB_NET); |
318 | 321 | ||
319 | netif_carrier_off(priv->wlan_dev.netdev); | 322 | netif_carrier_off(priv->wlan_dev.netdev); |
323 | netif_carrier_off(priv->mesh_dev); | ||
320 | priv->open = 0; | 324 | priv->open = 0; |
321 | 325 | ||
322 | lbs_deb_leave(LBS_DEB_NET); | 326 | lbs_deb_leave(LBS_DEB_NET); |
@@ -373,6 +377,7 @@ static int wlan_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
373 | } | 377 | } |
374 | 378 | ||
375 | netif_stop_queue(priv->wlan_dev.netdev); | 379 | netif_stop_queue(priv->wlan_dev.netdev); |
380 | netif_stop_queue(priv->mesh_dev); | ||
376 | 381 | ||
377 | if (libertas_process_tx(priv, skb) == 0) | 382 | if (libertas_process_tx(priv, skb) == 0) |
378 | dev->trans_start = jiffies; | 383 | dev->trans_start = jiffies; |
@@ -435,8 +440,10 @@ static void wlan_tx_timeout(struct net_device *dev) | |||
435 | libertas_send_tx_feedback(priv); | 440 | libertas_send_tx_feedback(priv); |
436 | } else | 441 | } else |
437 | wake_up_interruptible(&priv->mainthread.waitq); | 442 | wake_up_interruptible(&priv->mainthread.waitq); |
438 | } else if (priv->adapter->connect_status == libertas_connected) | 443 | } else if (priv->adapter->connect_status == libertas_connected) { |
439 | netif_wake_queue(priv->wlan_dev.netdev); | 444 | netif_wake_queue(priv->wlan_dev.netdev); |
445 | netif_wake_queue(priv->mesh_dev); | ||
446 | } | ||
440 | 447 | ||
441 | lbs_deb_leave(LBS_DEB_TX); | 448 | lbs_deb_leave(LBS_DEB_TX); |
442 | } | 449 | } |
@@ -1029,6 +1036,7 @@ void wlan_remove_mesh(wlan_private *priv) | |||
1029 | mesh_dev = priv->mesh_dev; | 1036 | mesh_dev = priv->mesh_dev; |
1030 | 1037 | ||
1031 | netif_stop_queue(mesh_dev); | 1038 | netif_stop_queue(mesh_dev); |
1039 | netif_carrier_off(priv->mesh_dev); | ||
1032 | 1040 | ||
1033 | device_remove_file(&(mesh_dev->dev), &dev_attr_libertas_mpp); | 1041 | device_remove_file(&(mesh_dev->dev), &dev_attr_libertas_mpp); |
1034 | unregister_netdev(mesh_dev); | 1042 | unregister_netdev(mesh_dev); |
@@ -1127,6 +1135,7 @@ void libertas_interrupt(struct net_device *dev) | |||
1127 | if (priv->adapter->psstate == PS_STATE_SLEEP) { | 1135 | if (priv->adapter->psstate == PS_STATE_SLEEP) { |
1128 | priv->adapter->psstate = PS_STATE_AWAKE; | 1136 | priv->adapter->psstate = PS_STATE_AWAKE; |
1129 | netif_wake_queue(dev); | 1137 | netif_wake_queue(dev); |
1138 | netif_wake_queue(priv->mesh_dev); | ||
1130 | } | 1139 | } |
1131 | 1140 | ||
1132 | wake_up_interruptible(&priv->mainthread.waitq); | 1141 | wake_up_interruptible(&priv->mainthread.waitq); |