diff options
Diffstat (limited to 'drivers/net/wireless/libertas/cmd.c')
-rw-r--r-- | drivers/net/wireless/libertas/cmd.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index 8c3605cdc64c..01db705a38ec 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c | |||
@@ -119,6 +119,19 @@ int lbs_update_hw_spec(struct lbs_private *priv) | |||
119 | lbs_deb_cmd("GET_HW_SPEC: hardware interface 0x%x, hardware spec 0x%04x\n", | 119 | lbs_deb_cmd("GET_HW_SPEC: hardware interface 0x%x, hardware spec 0x%04x\n", |
120 | cmd.hwifversion, cmd.version); | 120 | cmd.hwifversion, cmd.version); |
121 | 121 | ||
122 | /* Determine mesh_fw_ver from fwrelease and fwcapinfo */ | ||
123 | /* 5.0.16p0 9.0.0.p0 is known to NOT support any mesh */ | ||
124 | /* 5.110.22 have mesh command with 0xa3 command id */ | ||
125 | /* 10.0.0.p0 FW brings in mesh config command with different id */ | ||
126 | /* Check FW version MSB and initialize mesh_fw_ver */ | ||
127 | if (MRVL_FW_MAJOR_REV(priv->fwrelease) == MRVL_FW_V5) | ||
128 | priv->mesh_fw_ver = MESH_FW_OLD; | ||
129 | else if ((MRVL_FW_MAJOR_REV(priv->fwrelease) >= MRVL_FW_V10) && | ||
130 | (priv->fwcapinfo & MESH_CAPINFO_ENABLE_MASK)) | ||
131 | priv->mesh_fw_ver = MESH_FW_NEW; | ||
132 | else | ||
133 | priv->mesh_fw_ver = MESH_NONE; | ||
134 | |||
122 | /* Clamp region code to 8-bit since FW spec indicates that it should | 135 | /* Clamp region code to 8-bit since FW spec indicates that it should |
123 | * only ever be 8-bit, even though the field size is 16-bit. Some firmware | 136 | * only ever be 8-bit, even though the field size is 16-bit. Some firmware |
124 | * returns non-zero high 8 bits here. | 137 | * returns non-zero high 8 bits here. |
@@ -1036,17 +1049,26 @@ static int __lbs_mesh_config_send(struct lbs_private *priv, | |||
1036 | uint16_t action, uint16_t type) | 1049 | uint16_t action, uint16_t type) |
1037 | { | 1050 | { |
1038 | int ret; | 1051 | int ret; |
1052 | u16 command = CMD_MESH_CONFIG_OLD; | ||
1039 | 1053 | ||
1040 | lbs_deb_enter(LBS_DEB_CMD); | 1054 | lbs_deb_enter(LBS_DEB_CMD); |
1041 | 1055 | ||
1042 | cmd->hdr.command = cpu_to_le16(CMD_MESH_CONFIG); | 1056 | /* |
1057 | * Command id is 0xac for v10 FW along with mesh interface | ||
1058 | * id in bits 14-13-12. | ||
1059 | */ | ||
1060 | if (priv->mesh_fw_ver == MESH_FW_NEW) | ||
1061 | command = CMD_MESH_CONFIG | | ||
1062 | (MESH_IFACE_ID << MESH_IFACE_BIT_OFFSET); | ||
1063 | |||
1064 | cmd->hdr.command = cpu_to_le16(command); | ||
1043 | cmd->hdr.size = cpu_to_le16(sizeof(struct cmd_ds_mesh_config)); | 1065 | cmd->hdr.size = cpu_to_le16(sizeof(struct cmd_ds_mesh_config)); |
1044 | cmd->hdr.result = 0; | 1066 | cmd->hdr.result = 0; |
1045 | 1067 | ||
1046 | cmd->type = cpu_to_le16(type); | 1068 | cmd->type = cpu_to_le16(type); |
1047 | cmd->action = cpu_to_le16(action); | 1069 | cmd->action = cpu_to_le16(action); |
1048 | 1070 | ||
1049 | ret = lbs_cmd_with_response(priv, CMD_MESH_CONFIG, cmd); | 1071 | ret = lbs_cmd_with_response(priv, command, cmd); |
1050 | 1072 | ||
1051 | lbs_deb_leave(LBS_DEB_CMD); | 1073 | lbs_deb_leave(LBS_DEB_CMD); |
1052 | return ret; | 1074 | return ret; |
@@ -1198,8 +1220,7 @@ static void lbs_submit_command(struct lbs_private *priv, | |||
1198 | command = le16_to_cpu(cmd->command); | 1220 | command = le16_to_cpu(cmd->command); |
1199 | 1221 | ||
1200 | /* These commands take longer */ | 1222 | /* These commands take longer */ |
1201 | if (command == CMD_802_11_SCAN || command == CMD_802_11_ASSOCIATE || | 1223 | if (command == CMD_802_11_SCAN || command == CMD_802_11_ASSOCIATE) |
1202 | command == CMD_802_11_AUTHENTICATE) | ||
1203 | timeo = 5 * HZ; | 1224 | timeo = 5 * HZ; |
1204 | 1225 | ||
1205 | lbs_deb_cmd("DNLD_CMD: command 0x%04x, seq %d, size %d\n", | 1226 | lbs_deb_cmd("DNLD_CMD: command 0x%04x, seq %d, size %d\n", |
@@ -1393,15 +1414,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv, | |||
1393 | ret = lbs_cmd_802_11_ps_mode(cmdptr, cmd_action); | 1414 | ret = lbs_cmd_802_11_ps_mode(cmdptr, cmd_action); |
1394 | break; | 1415 | break; |
1395 | 1416 | ||
1396 | case CMD_802_11_ASSOCIATE: | ||
1397 | case CMD_802_11_REASSOCIATE: | ||
1398 | ret = lbs_cmd_80211_associate(priv, cmdptr, pdata_buf); | ||
1399 | break; | ||
1400 | |||
1401 | case CMD_802_11_AUTHENTICATE: | ||
1402 | ret = lbs_cmd_80211_authenticate(priv, cmdptr, pdata_buf); | ||
1403 | break; | ||
1404 | |||
1405 | case CMD_MAC_REG_ACCESS: | 1417 | case CMD_MAC_REG_ACCESS: |
1406 | case CMD_BBP_REG_ACCESS: | 1418 | case CMD_BBP_REG_ACCESS: |
1407 | case CMD_RF_REG_ACCESS: | 1419 | case CMD_RF_REG_ACCESS: |
@@ -1448,8 +1460,8 @@ int lbs_prepare_and_send_command(struct lbs_private *priv, | |||
1448 | break; | 1460 | break; |
1449 | case CMD_802_11_LED_GPIO_CTRL: | 1461 | case CMD_802_11_LED_GPIO_CTRL: |
1450 | { | 1462 | { |
1451 | struct mrvlietypes_ledgpio *gpio = | 1463 | struct mrvl_ie_ledgpio *gpio = |
1452 | (struct mrvlietypes_ledgpio*) | 1464 | (struct mrvl_ie_ledgpio*) |
1453 | cmdptr->params.ledgpio.data; | 1465 | cmdptr->params.ledgpio.data; |
1454 | 1466 | ||
1455 | memmove(&cmdptr->params.ledgpio, | 1467 | memmove(&cmdptr->params.ledgpio, |