diff options
Diffstat (limited to 'drivers/net/wireless/p54/p54common.c')
-rw-r--r-- | drivers/net/wireless/p54/p54common.c | 99 |
1 files changed, 37 insertions, 62 deletions
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index 237090140243..7ddb93bb60a1 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
@@ -1114,53 +1114,41 @@ do { \ | |||
1114 | queue.txop = cpu_to_le16(_txop); \ | 1114 | queue.txop = cpu_to_le16(_txop); \ |
1115 | } while(0) | 1115 | } while(0) |
1116 | 1116 | ||
1117 | static void p54_init_vdcf(struct ieee80211_hw *dev) | 1117 | static int p54_set_edcf(struct ieee80211_hw *dev) |
1118 | { | 1118 | { |
1119 | struct p54_common *priv = dev->priv; | 1119 | struct p54_common *priv = dev->priv; |
1120 | struct p54_control_hdr *hdr; | 1120 | struct p54_control_hdr *hdr; |
1121 | struct p54_tx_control_vdcf *vdcf; | 1121 | struct p54_edcf *edcf; |
1122 | 1122 | ||
1123 | /* all USB V1 adapters need a extra headroom */ | 1123 | hdr = kzalloc(priv->tx_hdr_len + sizeof(*hdr) + sizeof(*edcf), |
1124 | hdr = (void *)priv->cached_vdcf + priv->tx_hdr_len; | 1124 | GFP_ATOMIC); |
1125 | if (!hdr) | ||
1126 | return -ENOMEM; | ||
1127 | |||
1128 | hdr = (void *)hdr + priv->tx_hdr_len; | ||
1125 | hdr->magic1 = cpu_to_le16(0x8001); | 1129 | hdr->magic1 = cpu_to_le16(0x8001); |
1126 | hdr->len = cpu_to_le16(sizeof(*vdcf)); | 1130 | hdr->len = cpu_to_le16(sizeof(*edcf)); |
1127 | hdr->type = cpu_to_le16(P54_CONTROL_TYPE_DCFINIT); | 1131 | hdr->type = cpu_to_le16(P54_CONTROL_TYPE_DCFINIT); |
1128 | hdr->req_id = cpu_to_le32(priv->rx_start); | 1132 | hdr->retry1 = hdr->retry2 = 0; |
1129 | 1133 | edcf = (struct p54_edcf *)hdr->data; | |
1130 | vdcf = (struct p54_tx_control_vdcf *) hdr->data; | ||
1131 | |||
1132 | P54_SET_QUEUE(vdcf->queue[0], 0x0002, 0x0003, 0x0007, 47); | ||
1133 | P54_SET_QUEUE(vdcf->queue[1], 0x0002, 0x0007, 0x000f, 94); | ||
1134 | P54_SET_QUEUE(vdcf->queue[2], 0x0003, 0x000f, 0x03ff, 0); | ||
1135 | P54_SET_QUEUE(vdcf->queue[3], 0x0007, 0x000f, 0x03ff, 0); | ||
1136 | } | ||
1137 | |||
1138 | static void p54_set_vdcf(struct ieee80211_hw *dev) | ||
1139 | { | ||
1140 | struct p54_common *priv = dev->priv; | ||
1141 | struct p54_control_hdr *hdr; | ||
1142 | struct p54_tx_control_vdcf *vdcf; | ||
1143 | |||
1144 | hdr = (void *)priv->cached_vdcf + priv->tx_hdr_len; | ||
1145 | |||
1146 | p54_assign_address(dev, NULL, hdr, sizeof(*hdr) + sizeof(*vdcf)); | ||
1147 | |||
1148 | vdcf = (struct p54_tx_control_vdcf *) hdr->data; | ||
1149 | |||
1150 | if (priv->use_short_slot) { | 1134 | if (priv->use_short_slot) { |
1151 | vdcf->slottime = 9; | 1135 | edcf->slottime = 9; |
1152 | vdcf->magic1 = 0x10; | 1136 | edcf->sifs = 0x10; |
1153 | vdcf->magic2 = 0x00; | 1137 | edcf->eofpad = 0x00; |
1154 | } else { | 1138 | } else { |
1155 | vdcf->slottime = 20; | 1139 | edcf->slottime = 20; |
1156 | vdcf->magic1 = 0x0a; | 1140 | edcf->sifs = 0x0a; |
1157 | vdcf->magic2 = 0x06; | 1141 | edcf->eofpad = 0x06; |
1158 | } | 1142 | } |
1159 | |||
1160 | /* (see prism54/isl_oid.h for further details) */ | 1143 | /* (see prism54/isl_oid.h for further details) */ |
1161 | vdcf->frameburst = cpu_to_le16(0); | 1144 | edcf->frameburst = cpu_to_le16(0); |
1145 | edcf->round_trip_delay = cpu_to_le16(0); | ||
1146 | memset(edcf->mapping, 0, sizeof(edcf->mapping)); | ||
1147 | memcpy(edcf->queue, priv->qos_params, sizeof(edcf->queue)); | ||
1162 | 1148 | ||
1163 | priv->tx(dev, hdr, sizeof(*hdr) + sizeof(*vdcf), 0); | 1149 | p54_assign_address(dev, NULL, hdr, sizeof(*hdr) + sizeof(*edcf)); |
1150 | priv->tx(dev, hdr, sizeof(*hdr) + sizeof(*edcf), 1); | ||
1151 | return 0; | ||
1164 | } | 1152 | } |
1165 | 1153 | ||
1166 | static int p54_start(struct ieee80211_hw *dev) | 1154 | static int p54_start(struct ieee80211_hw *dev) |
@@ -1168,33 +1156,26 @@ static int p54_start(struct ieee80211_hw *dev) | |||
1168 | struct p54_common *priv = dev->priv; | 1156 | struct p54_common *priv = dev->priv; |
1169 | int err; | 1157 | int err; |
1170 | 1158 | ||
1171 | if (!priv->cached_vdcf) { | ||
1172 | priv->cached_vdcf = kzalloc(sizeof(struct p54_tx_control_vdcf)+ | ||
1173 | priv->tx_hdr_len + sizeof(struct p54_control_hdr), | ||
1174 | GFP_KERNEL); | ||
1175 | |||
1176 | if (!priv->cached_vdcf) | ||
1177 | return -ENOMEM; | ||
1178 | } | ||
1179 | |||
1180 | if (!priv->cached_stats) { | 1159 | if (!priv->cached_stats) { |
1181 | priv->cached_stats = kzalloc(sizeof(struct p54_statistics) + | 1160 | priv->cached_stats = kzalloc(sizeof(struct p54_statistics) + |
1182 | priv->tx_hdr_len + sizeof(struct p54_control_hdr), | 1161 | priv->tx_hdr_len + sizeof(struct p54_control_hdr), |
1183 | GFP_KERNEL); | 1162 | GFP_KERNEL); |
1184 | 1163 | ||
1185 | if (!priv->cached_stats) { | 1164 | if (!priv->cached_stats) |
1186 | kfree(priv->cached_vdcf); | ||
1187 | priv->cached_vdcf = NULL; | ||
1188 | return -ENOMEM; | 1165 | return -ENOMEM; |
1189 | } | ||
1190 | } | 1166 | } |
1191 | 1167 | ||
1192 | err = priv->open(dev); | 1168 | err = priv->open(dev); |
1193 | if (!err) | 1169 | if (!err) |
1194 | priv->mode = NL80211_IFTYPE_MONITOR; | 1170 | priv->mode = NL80211_IFTYPE_MONITOR; |
1171 | P54_SET_QUEUE(priv->qos_params[0], 0x0002, 0x0003, 0x0007, 47); | ||
1172 | P54_SET_QUEUE(priv->qos_params[1], 0x0002, 0x0007, 0x000f, 94); | ||
1173 | P54_SET_QUEUE(priv->qos_params[2], 0x0003, 0x000f, 0x03ff, 0); | ||
1174 | P54_SET_QUEUE(priv->qos_params[3], 0x0007, 0x000f, 0x03ff, 0); | ||
1175 | err = p54_set_edcf(dev); | ||
1176 | if (!err) | ||
1177 | mod_timer(&priv->stats_timer, jiffies + HZ); | ||
1195 | 1178 | ||
1196 | p54_init_vdcf(dev); | ||
1197 | mod_timer(&priv->stats_timer, jiffies + HZ); | ||
1198 | return err; | 1179 | return err; |
1199 | } | 1180 | } |
1200 | 1181 | ||
@@ -1264,7 +1245,8 @@ static int p54_config(struct ieee80211_hw *dev, u32 changed) | |||
1264 | priv->rx_antenna = 2; /* automatic */ | 1245 | priv->rx_antenna = 2; /* automatic */ |
1265 | priv->output_power = conf->power_level << 2; | 1246 | priv->output_power = conf->power_level << 2; |
1266 | ret = p54_set_freq(dev, cpu_to_le16(conf->channel->center_freq)); | 1247 | ret = p54_set_freq(dev, cpu_to_le16(conf->channel->center_freq)); |
1267 | p54_set_vdcf(dev); | 1248 | if (!ret) |
1249 | ret = p54_set_edcf(dev); | ||
1268 | mutex_unlock(&priv->conf_mutex); | 1250 | mutex_unlock(&priv->conf_mutex); |
1269 | return ret; | 1251 | return ret; |
1270 | } | 1252 | } |
@@ -1319,20 +1301,14 @@ static int p54_conf_tx(struct ieee80211_hw *dev, u16 queue, | |||
1319 | const struct ieee80211_tx_queue_params *params) | 1301 | const struct ieee80211_tx_queue_params *params) |
1320 | { | 1302 | { |
1321 | struct p54_common *priv = dev->priv; | 1303 | struct p54_common *priv = dev->priv; |
1322 | struct p54_tx_control_vdcf *vdcf; | ||
1323 | |||
1324 | vdcf = (struct p54_tx_control_vdcf *)(((struct p54_control_hdr *) | ||
1325 | ((void *)priv->cached_vdcf + priv->tx_hdr_len))->data); | ||
1326 | 1304 | ||
1327 | if ((params) && !(queue > 4)) { | 1305 | if ((params) && !(queue > 4)) { |
1328 | P54_SET_QUEUE(vdcf->queue[queue], params->aifs, | 1306 | P54_SET_QUEUE(priv->qos_params[queue], params->aifs, |
1329 | params->cw_min, params->cw_max, params->txop); | 1307 | params->cw_min, params->cw_max, params->txop); |
1330 | } else | 1308 | } else |
1331 | return -EINVAL; | 1309 | return -EINVAL; |
1332 | 1310 | ||
1333 | p54_set_vdcf(dev); | 1311 | return p54_set_edcf(dev); |
1334 | |||
1335 | return 0; | ||
1336 | } | 1312 | } |
1337 | 1313 | ||
1338 | static int p54_init_xbow_synth(struct ieee80211_hw *dev) | 1314 | static int p54_init_xbow_synth(struct ieee80211_hw *dev) |
@@ -1418,7 +1394,7 @@ static void p54_bss_info_changed(struct ieee80211_hw *dev, | |||
1418 | 1394 | ||
1419 | if (changed & BSS_CHANGED_ERP_SLOT) { | 1395 | if (changed & BSS_CHANGED_ERP_SLOT) { |
1420 | priv->use_short_slot = info->use_short_slot; | 1396 | priv->use_short_slot = info->use_short_slot; |
1421 | p54_set_vdcf(dev); | 1397 | p54_set_edcf(dev); |
1422 | } | 1398 | } |
1423 | } | 1399 | } |
1424 | 1400 | ||
@@ -1499,7 +1475,6 @@ void p54_free_common(struct ieee80211_hw *dev) | |||
1499 | kfree(priv->iq_autocal); | 1475 | kfree(priv->iq_autocal); |
1500 | kfree(priv->output_limit); | 1476 | kfree(priv->output_limit); |
1501 | kfree(priv->curve_data); | 1477 | kfree(priv->curve_data); |
1502 | kfree(priv->cached_vdcf); | ||
1503 | } | 1478 | } |
1504 | EXPORT_SYMBOL_GPL(p54_free_common); | 1479 | EXPORT_SYMBOL_GPL(p54_free_common); |
1505 | 1480 | ||