Skip to content

Commit

Permalink
libertas: separate mesh connectivity from that of the main interface
Browse files Browse the repository at this point in the history
The transmit and receive traffic as soon as the mesh interface is
brought up.

Test case 1:  Bring up only the mesh interface and ping.  No need for
any iwconfig commands on the main interface.

$ ifconfig msh0 192.168.5.3
$ iwconfig msh0 channel X
$ ping 192.168.5.2
If ping succeeds, PASS

Test case 2:  Associate with the main interface, and turn off AP.  Mesh
interface should not lose connectivity.

$ iwconfig eth0 mode managed essid "my_ssid"
$ ifconfig msh0 192.168.5.3
$ ping 192.168.5.2
<turn off access point>
If ping continues uninterrupted, PASS

This feature requires firmware version 5.110.19.p0 or newer, available
here: http://dev.laptop.org/pub/firmware/libertas/

Signed-off-by: Ashish Shukla <ashishs@marvell.com>
Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Brajesh Dave authored and David S. Miller committed Jan 28, 2008
1 parent 798fbfe commit 01d77d8
Show file tree
Hide file tree
Showing 9 changed files with 47 additions and 36 deletions.
3 changes: 2 additions & 1 deletion drivers/net/wireless/libertas/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1755,7 +1755,8 @@ int lbs_execute_next_command(lbs_private * priv)
*/
if ((adapter->psmode != LBS802_11POWERMODECAM) &&
(adapter->psstate == PS_STATE_FULL_POWER) &&
(adapter->connect_status == LBS_CONNECTED)) {
((adapter->connect_status == LBS_CONNECTED) ||
(adapter->mesh_connect_status == LBS_CONNECTED))) {
if (adapter->secinfo.WPAenabled ||
adapter->secinfo.WPA2enabled) {
/* check for valid WPA group keys */
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/libertas/cmdresp.c
Original file line number Diff line number Diff line change
Expand Up @@ -979,7 +979,7 @@ int lbs_process_event(lbs_private * priv)
break;
}
lbs_pr_info("EVENT: MESH_AUTO_STARTED\n");
adapter->connect_status = LBS_CONNECTED;
adapter->mesh_connect_status = LBS_CONNECTED;
if (priv->mesh_open == 1) {
netif_wake_queue(priv->mesh_dev);
netif_carrier_on(priv->mesh_dev);
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/libertas/dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,7 @@ struct _lbs_adapter {
/** NIC Operation characteristics */
u16 currentpacketfilter;
u32 connect_status;
u32 mesh_connect_status;
u16 regioncode;
u16 txpowerlevel;

Expand Down
5 changes: 3 additions & 2 deletions drivers/net/wireless/libertas/if_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,11 @@ static void if_usb_write_bulk_callback(struct urb *urb)
if (!adapter->cur_cmd)
wake_up_interruptible(&priv->waitq);

if ((adapter->connect_status == LBS_CONNECTED)) {
if (adapter->connect_status == LBS_CONNECTED)
netif_wake_queue(dev);

if (priv->mesh_dev && (adapter->mesh_connect_status == LBS_CONNECTED))
netif_wake_queue(priv->mesh_dev);
}
}
} else {
/* print the failure status number for debug */
Expand Down
9 changes: 0 additions & 9 deletions drivers/net/wireless/libertas/join.c
Original file line number Diff line number Diff line change
Expand Up @@ -795,10 +795,6 @@ int lbs_ret_80211_associate(lbs_private *priv,
netif_carrier_on(priv->dev);
netif_wake_queue(priv->dev);

if (priv->mesh_dev) {
netif_carrier_on(priv->mesh_dev);
netif_wake_queue(priv->mesh_dev);
}

memcpy(wrqu.ap_addr.sa_data, adapter->curbssparams.bssid, ETH_ALEN);
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
Expand Down Expand Up @@ -884,11 +880,6 @@ int lbs_ret_80211_ad_hoc_start(lbs_private *priv,
netif_carrier_on(priv->dev);
netif_wake_queue(priv->dev);

if (priv->mesh_dev) {
netif_carrier_on(priv->mesh_dev);
netif_wake_queue(priv->mesh_dev);
}

memset(&wrqu, 0, sizeof(wrqu));
memcpy(wrqu.ap_addr.sa_data, adapter->curbssparams.bssid, ETH_ALEN);
wrqu.ap_addr.sa_family = ARPHRD_ETHER;
Expand Down
29 changes: 20 additions & 9 deletions drivers/net/wireless/libertas/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -406,13 +406,15 @@ static int lbs_dev_open(struct net_device *dev)

priv->open = 1;

if (adapter->connect_status == LBS_CONNECTED) {
if (adapter->connect_status == LBS_CONNECTED)
netif_carrier_on(priv->dev);
if (priv->mesh_dev)
netif_carrier_on(priv->mesh_dev);
} else {
else
netif_carrier_off(priv->dev);
if (priv->mesh_dev)

if (priv->mesh_dev) {
if (adapter->mesh_connect_status == LBS_CONNECTED)
netif_carrier_on(priv->mesh_dev);
else
netif_carrier_off(priv->mesh_dev);
}

Expand All @@ -433,6 +435,11 @@ static int lbs_mesh_open(struct net_device *dev)
return -1;
priv->mesh_open = 1 ;
netif_wake_queue(priv->mesh_dev);

priv->adapter->mesh_connect_status = LBS_CONNECTED;

netif_carrier_on(priv->mesh_dev);
netif_wake_queue(priv->mesh_dev);
if (priv->infra_open == 0)
return lbs_dev_open(priv->dev) ;
return 0;
Expand Down Expand Up @@ -548,7 +555,7 @@ static int lbs_mesh_pre_start_xmit(struct sk_buff *skb,

SET_MESH_FRAME(skb);

ret = lbs_hard_start_xmit(skb, priv->dev);
ret = lbs_hard_start_xmit(skb, priv->mesh_dev);
lbs_deb_leave_args(LBS_DEB_MESH, "ret %d", ret);
return ret;
}
Expand Down Expand Up @@ -595,9 +602,12 @@ static void lbs_tx_timeout(struct net_device *dev)
lbs_send_tx_feedback(priv);
} else
wake_up_interruptible(&priv->waitq);
} else if (priv->adapter->connect_status == LBS_CONNECTED) {
netif_wake_queue(priv->dev);
if (priv->mesh_dev)
} else if (dev == priv->dev) {
if (priv->adapter->connect_status == LBS_CONNECTED)
netif_wake_queue(priv->dev);

} else if (dev == priv->mesh_dev) {
if (priv->adapter->mesh_connect_status == LBS_CONNECTED)
netif_wake_queue(priv->mesh_dev);
}

Expand Down Expand Up @@ -1054,6 +1064,7 @@ static int lbs_init_adapter(lbs_private *priv)
memset(adapter->current_addr, 0xff, ETH_ALEN);

adapter->connect_status = LBS_DISCONNECTED;
adapter->mesh_connect_status = LBS_DISCONNECTED;
adapter->secinfo.auth_mode = IW_AUTH_ALG_OPEN_SYSTEM;
adapter->mode = IW_MODE_INFRA;
adapter->curbssparams.channel = DEFAULT_AD_HOC_CHANNEL;
Expand Down
14 changes: 8 additions & 6 deletions drivers/net/wireless/libertas/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,8 @@ static void lbs_scan_create_channel_list(lbs_private *priv,

for (rgnidx = 0; rgnidx < ARRAY_SIZE(adapter->region_channel); rgnidx++) {
if (priv->adapter->enable11d &&
adapter->connect_status != LBS_CONNECTED) {
(adapter->connect_status != LBS_CONNECTED) &&
(adapter->mesh_connect_status != LBS_CONNECTED)) {
/* Scan all the supported chan for the first scan */
if (!adapter->universal_channel[rgnidx].valid)
continue;
Expand Down Expand Up @@ -897,13 +898,14 @@ int lbs_scan_networks(lbs_private *priv,
mutex_unlock(&adapter->lock);
#endif

if (priv->adapter->connect_status == LBS_CONNECTED) {
if (adapter->connect_status == LBS_CONNECTED) {
netif_carrier_on(priv->dev);
netif_wake_queue(priv->dev);
if (priv->mesh_dev) {
netif_carrier_on(priv->mesh_dev);
netif_wake_queue(priv->mesh_dev);
}
}

if (priv->mesh_dev && (adapter->mesh_connect_status == LBS_CONNECTED)) {
netif_carrier_on(priv->mesh_dev);
netif_wake_queue(priv->mesh_dev);
}

out:
Expand Down
9 changes: 5 additions & 4 deletions drivers/net/wireless/libertas/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,10 +273,11 @@ void lbs_send_tx_feedback(lbs_private *priv)
lbs_upload_rx_packet(priv, adapter->currenttxskb);
adapter->currenttxskb = NULL;
priv->adapter->TxLockFlag = 0;
if (priv->adapter->connect_status == LBS_CONNECTED) {

if (adapter->connect_status == LBS_CONNECTED)
netif_wake_queue(priv->dev);
if (priv->mesh_dev)
netif_wake_queue(priv->mesh_dev);
}

if (priv->mesh_dev && (adapter->mesh_connect_status == LBS_CONNECTED))
netif_wake_queue(priv->mesh_dev);
}
EXPORT_SYMBOL_GPL(lbs_send_tx_feedback);
11 changes: 7 additions & 4 deletions drivers/net/wireless/libertas/wext.c
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,8 @@ static void copy_active_data_rates(lbs_adapter *adapter, u8 *rates)
{
lbs_deb_enter(LBS_DEB_WEXT);

if (adapter->connect_status != LBS_CONNECTED)
if ((adapter->connect_status != LBS_CONNECTED) &&
(adapter->mesh_connect_status != LBS_CONNECTED))
memcpy(rates, lbs_bg_rates, MAX_RATES);
else
memcpy(rates, adapter->curbssparams.rates, MAX_RATES);
Expand Down Expand Up @@ -274,7 +275,7 @@ static int mesh_get_nick(struct net_device *dev, struct iw_request_info *info,

/* Use nickname to indicate that mesh is on */

if (adapter->connect_status == LBS_CONNECTED) {
if (adapter->mesh_connect_status == LBS_CONNECTED) {
strncpy(extra, "Mesh", 12);
extra[12] = '\0';
dwrq->length = strlen(extra);
Expand Down Expand Up @@ -589,7 +590,8 @@ static int lbs_get_range(struct net_device *dev, struct iw_request_info *info,

range->num_frequency = 0;
if (priv->adapter->enable11d &&
adapter->connect_status == LBS_CONNECTED) {
(adapter->connect_status == LBS_CONNECTED ||
adapter->mesh_connect_status == LBS_CONNECTED)) {
u8 chan_no;
u8 band;

Expand Down Expand Up @@ -827,7 +829,8 @@ static struct iw_statistics *lbs_get_wireless_stats(struct net_device *dev)
priv->wstats.status = adapter->mode;

/* If we're not associated, all quality values are meaningless */
if (adapter->connect_status != LBS_CONNECTED)
if ((adapter->connect_status != LBS_CONNECTED) &&
(adapter->mesh_connect_status != LBS_CONNECTED))
goto out;

/* Quality by RSSI */
Expand Down

0 comments on commit 01d77d8

Please sign in to comment.