diff options
Diffstat (limited to 'drivers/net/wireless/libertas/main.c')
-rw-r--r-- | drivers/net/wireless/libertas/main.c | 42 |
1 files changed, 19 insertions, 23 deletions
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index c2975c8e2f2..60bde1233a3 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c | |||
@@ -123,7 +123,7 @@ static ssize_t lbs_rtap_set(struct device *dev, | |||
123 | if (priv->monitormode == monitor_mode) | 123 | if (priv->monitormode == monitor_mode) |
124 | return strlen(buf); | 124 | return strlen(buf); |
125 | if (!priv->monitormode) { | 125 | if (!priv->monitormode) { |
126 | if (priv->infra_open || priv->mesh_open) | 126 | if (priv->infra_open || lbs_mesh_open(priv)) |
127 | return -EBUSY; | 127 | return -EBUSY; |
128 | if (priv->mode == IW_MODE_INFRA) | 128 | if (priv->mode == IW_MODE_INFRA) |
129 | lbs_cmd_80211_deauthenticate(priv, | 129 | lbs_cmd_80211_deauthenticate(priv, |
@@ -622,7 +622,7 @@ static int lbs_thread(void *data) | |||
622 | if (priv->connect_status == LBS_CONNECTED) | 622 | if (priv->connect_status == LBS_CONNECTED) |
623 | netif_wake_queue(priv->dev); | 623 | netif_wake_queue(priv->dev); |
624 | if (priv->mesh_dev && | 624 | if (priv->mesh_dev && |
625 | priv->mesh_connect_status == LBS_CONNECTED) | 625 | lbs_mesh_connected(priv)) |
626 | netif_wake_queue(priv->mesh_dev); | 626 | netif_wake_queue(priv->mesh_dev); |
627 | } | 627 | } |
628 | } | 628 | } |
@@ -809,18 +809,6 @@ int lbs_exit_auto_deep_sleep(struct lbs_private *priv) | |||
809 | return 0; | 809 | return 0; |
810 | } | 810 | } |
811 | 811 | ||
812 | static void lbs_sync_channel_worker(struct work_struct *work) | ||
813 | { | ||
814 | struct lbs_private *priv = container_of(work, struct lbs_private, | ||
815 | sync_channel); | ||
816 | |||
817 | lbs_deb_enter(LBS_DEB_MAIN); | ||
818 | if (lbs_update_channel(priv)) | ||
819 | lbs_pr_info("Channel synchronization failed."); | ||
820 | lbs_deb_leave(LBS_DEB_MAIN); | ||
821 | } | ||
822 | |||
823 | |||
824 | static int lbs_init_adapter(struct lbs_private *priv) | 812 | static int lbs_init_adapter(struct lbs_private *priv) |
825 | { | 813 | { |
826 | size_t bufsize; | 814 | size_t bufsize; |
@@ -848,14 +836,12 @@ static int lbs_init_adapter(struct lbs_private *priv) | |||
848 | memset(priv->current_addr, 0xff, ETH_ALEN); | 836 | memset(priv->current_addr, 0xff, ETH_ALEN); |
849 | 837 | ||
850 | priv->connect_status = LBS_DISCONNECTED; | 838 | priv->connect_status = LBS_DISCONNECTED; |
851 | priv->mesh_connect_status = LBS_DISCONNECTED; | ||
852 | priv->secinfo.auth_mode = IW_AUTH_ALG_OPEN_SYSTEM; | 839 | priv->secinfo.auth_mode = IW_AUTH_ALG_OPEN_SYSTEM; |
853 | priv->mode = IW_MODE_INFRA; | 840 | priv->mode = IW_MODE_INFRA; |
854 | priv->channel = DEFAULT_AD_HOC_CHANNEL; | 841 | priv->channel = DEFAULT_AD_HOC_CHANNEL; |
855 | priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON; | 842 | priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON; |
856 | priv->radio_on = 1; | 843 | priv->radio_on = 1; |
857 | priv->enablehwauto = 1; | 844 | priv->enablehwauto = 1; |
858 | priv->capability = WLAN_CAPABILITY_SHORT_PREAMBLE; | ||
859 | priv->psmode = LBS802_11POWERMODECAM; | 845 | priv->psmode = LBS802_11POWERMODECAM; |
860 | priv->psstate = PS_STATE_FULL_POWER; | 846 | priv->psstate = PS_STATE_FULL_POWER; |
861 | priv->is_deep_sleep = 0; | 847 | priv->is_deep_sleep = 0; |
@@ -998,11 +984,6 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev) | |||
998 | INIT_DELAYED_WORK(&priv->assoc_work, lbs_association_worker); | 984 | INIT_DELAYED_WORK(&priv->assoc_work, lbs_association_worker); |
999 | INIT_DELAYED_WORK(&priv->scan_work, lbs_scan_worker); | 985 | INIT_DELAYED_WORK(&priv->scan_work, lbs_scan_worker); |
1000 | INIT_WORK(&priv->mcast_work, lbs_set_mcast_worker); | 986 | INIT_WORK(&priv->mcast_work, lbs_set_mcast_worker); |
1001 | INIT_WORK(&priv->sync_channel, lbs_sync_channel_worker); | ||
1002 | |||
1003 | priv->mesh_open = 0; | ||
1004 | sprintf(priv->mesh_ssid, "mesh"); | ||
1005 | priv->mesh_ssid_len = 4; | ||
1006 | 987 | ||
1007 | priv->wol_criteria = 0xffffffff; | 988 | priv->wol_criteria = 0xffffffff; |
1008 | priv->wol_gpio = 0xff; | 989 | priv->wol_gpio = 0xff; |
@@ -1076,6 +1057,17 @@ void lbs_remove_card(struct lbs_private *priv) | |||
1076 | EXPORT_SYMBOL_GPL(lbs_remove_card); | 1057 | EXPORT_SYMBOL_GPL(lbs_remove_card); |
1077 | 1058 | ||
1078 | 1059 | ||
1060 | static int lbs_rtap_supported(struct lbs_private *priv) | ||
1061 | { | ||
1062 | if (MRVL_FW_MAJOR_REV(priv->fwrelease) == MRVL_FW_V5) | ||
1063 | return 1; | ||
1064 | |||
1065 | /* newer firmware use a capability mask */ | ||
1066 | return ((MRVL_FW_MAJOR_REV(priv->fwrelease) >= MRVL_FW_V10) && | ||
1067 | (priv->fwcapinfo & MESH_CAPINFO_ENABLE_MASK)); | ||
1068 | } | ||
1069 | |||
1070 | |||
1079 | int lbs_start_card(struct lbs_private *priv) | 1071 | int lbs_start_card(struct lbs_private *priv) |
1080 | { | 1072 | { |
1081 | struct net_device *dev = priv->dev; | 1073 | struct net_device *dev = priv->dev; |
@@ -1095,12 +1087,14 @@ int lbs_start_card(struct lbs_private *priv) | |||
1095 | 1087 | ||
1096 | lbs_update_channel(priv); | 1088 | lbs_update_channel(priv); |
1097 | 1089 | ||
1090 | lbs_init_mesh(priv); | ||
1091 | |||
1098 | /* | 1092 | /* |
1099 | * While rtap isn't related to mesh, only mesh-enabled | 1093 | * While rtap isn't related to mesh, only mesh-enabled |
1100 | * firmware implements the rtap functionality via | 1094 | * firmware implements the rtap functionality via |
1101 | * CMD_802_11_MONITOR_MODE. | 1095 | * CMD_802_11_MONITOR_MODE. |
1102 | */ | 1096 | */ |
1103 | if (lbs_init_mesh(priv)) { | 1097 | if (lbs_rtap_supported(priv)) { |
1104 | if (device_create_file(&dev->dev, &dev_attr_lbs_rtap)) | 1098 | if (device_create_file(&dev->dev, &dev_attr_lbs_rtap)) |
1105 | lbs_pr_err("cannot register lbs_rtap attribute\n"); | 1099 | lbs_pr_err("cannot register lbs_rtap attribute\n"); |
1106 | } | 1100 | } |
@@ -1134,7 +1128,9 @@ void lbs_stop_card(struct lbs_private *priv) | |||
1134 | netif_carrier_off(dev); | 1128 | netif_carrier_off(dev); |
1135 | 1129 | ||
1136 | lbs_debugfs_remove_one(priv); | 1130 | lbs_debugfs_remove_one(priv); |
1137 | if (lbs_deinit_mesh(priv)) | 1131 | lbs_deinit_mesh(priv); |
1132 | |||
1133 | if (lbs_rtap_supported(priv)) | ||
1138 | device_remove_file(&dev->dev, &dev_attr_lbs_rtap); | 1134 | device_remove_file(&dev->dev, &dev_attr_lbs_rtap); |
1139 | 1135 | ||
1140 | /* Delete the timeout of the currently processing command */ | 1136 | /* Delete the timeout of the currently processing command */ |