From: Christian Lamparter <chunkeey@web.de>
To: linux-wireless@vger.kernel.org
Cc: Kalle Valo <kalle.valo@nokia.com>,
Larry Finger <Larry.Finger@lwfinger.net>,
Johannes Berg <johannes@sipsolutions.net>,
John W Linville <linville@tuxdriver.com>,
"Luis R. Rodriguez" <mcgrof@gmail.com>,
tim.dewaal@yahoo.com
Subject: [RFC][PATCH 5/5] p54: integrate parts of lmac_longbow.h and stlc45xx
Date: Sun, 5 Oct 2008 02:39:44 +0200 [thread overview]
Message-ID: <200810050239.44845.chunkeey@web.de> (raw)
This patch removes most/all? of the "magic" numbers and unknown structure
variables inside the code and replaces them with meaningful prototypes.
Therefore this patch got quite big.
However, I'm not really sure what "(C)" I should put in and where exactly.
But I hope ST's/Nokia's Legal Department or someone else who understands the
laws good enough can give us a green light.
---
diff -Nurp a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c
--- a/drivers/net/wireless/p54/p54common.c 2008-10-05 01:45:25.000000000 +0200
+++ b/drivers/net/wireless/p54/p54common.c 2008-10-05 01:45:44.000000000 +0200
@@ -5,8 +5,11 @@
* Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
* Copyright (c) 2007, Christian Lamparter <chunkeey@web.de>
*
- * Based on the islsm (softmac prism54) driver, which is:
- * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
+ * Based on:
+ * - the islsm (softmac prism54) driver, which is:
+ * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
+ * - stlc45xx driver
+ * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -490,13 +493,13 @@ static int p54_rssi_to_dbm(struct ieee80
static int p54_rx_data(struct ieee80211_hw *dev, struct sk_buff *skb)
{
struct p54_common *priv = dev->priv;
- struct p54_rx_hdr *hdr = (struct p54_rx_hdr *) skb->data;
+ struct p54_rx_data *hdr = (struct p54_rx_data *) skb->data;
struct ieee80211_rx_status rx_status = {0};
u16 freq = le16_to_cpu(hdr->freq);
size_t header_len = sizeof(*hdr);
u32 tsf32;
- if (!(hdr->magic & cpu_to_le16(0x0001))) {
+ if (!(hdr->flags & cpu_to_le16(P54_HDR_FLAG_DATA_IN_FCS_GOOD))) {
if (priv->filter_flags & FIF_FCSFAIL)
rx_status.flag |= RX_FLAG_FAILED_FCS_CRC;
else
@@ -521,7 +524,7 @@ static int p54_rx_data(struct ieee80211_
rx_status.flag |= RX_FLAG_TSFT;
- if (hdr->magic & cpu_to_le16(0x4000))
+ if (hdr->flags & cpu_to_le16(P54_HDR_FLAG_DATA_ALIGN))
header_len += hdr->align[0];
skb_pull(skb, header_len);
@@ -626,7 +629,7 @@ void p54_free_skb(struct ieee80211_hw *d
kfree_skb(skb);
if (freed >= IEEE80211_MAX_RTS_THRESHOLD + priv->headroom +
- priv->tailroom + sizeof(struct p54_control_hdr))
+ priv->tailroom + sizeof(struct p54_hdr))
p54_wake_free_queues(dev);
}
EXPORT_SYMBOL(p54_free_skb);
@@ -634,7 +637,7 @@ EXPORT_SYMBOL(p54_free_skb);
static void p54_rx_frame_sent(struct ieee80211_hw *dev, struct sk_buff *skb)
{
struct p54_common *priv = dev->priv;
- struct p54_control_hdr *hdr = (struct p54_control_hdr *) skb->data;
+ struct p54_hdr *hdr = (struct p54_hdr *) skb->data;
struct p54_frame_sent_hdr *payload = (struct p54_frame_sent_hdr *) hdr->data;
struct sk_buff *entry = (struct sk_buff *) priv->tx_queue.next;
u32 addr = le32_to_cpu(hdr->req_id) - priv->headroom;
@@ -646,8 +649,8 @@ static void p54_rx_frame_sent(struct iee
spin_lock_irqsave(&priv->tx_queue.lock, flags);
while (entry != (struct sk_buff *)&priv->tx_queue) {
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(entry);
- struct p54_control_hdr *entry_hdr;
- struct p54_tx_control_allocdata *entry_data;
+ struct p54_hdr *entry_hdr;
+ struct p54_tx_data *entry_data;
int pad = 0;
range = (void *)info->driver_data;
@@ -672,21 +675,25 @@ static void p54_rx_frame_sent(struct iee
spin_unlock_irqrestore(&priv->tx_queue.lock, flags);
memset(&info->status, 0, sizeof(info->status));
- entry_hdr = (struct p54_control_hdr *) entry->data;
- entry_data = (struct p54_tx_control_allocdata *)entry_hdr->data;
- if (entry_hdr->magic1 & cpu_to_le16(0x4000))
+ entry_hdr = (struct p54_hdr *) entry->data;
+ entry_data = (struct p54_tx_data *) entry_hdr->data;
+ if (entry_hdr->flags & cpu_to_le16(P54_HDR_FLAG_DATA_ALIGN))
pad = entry_data->align[0];
priv->tx_stats[entry_data->hw_queue].len--;
if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) {
- if (!(payload->status & 0x01))
+ if (!(payload->status & P54_TX_FAILED))
info->flags |= IEEE80211_TX_STAT_ACK;
- else
+ else {
info->status.excessive_retries = 1;
+ priv->stats.dot11ACKFailureCount++;
+ }
}
+ if (payload->status & P54_TX_PSM)
+ info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
info->status.retry_count = payload->retries - 1;
info->status.ack_signal = p54_rssi_to_dbm(dev,
- le16_to_cpu(payload->ack_rssi));
+ payload->ack_rssi);
skb_pull(entry, sizeof(*hdr) + pad + sizeof(*entry_data));
ieee80211_tx_status_irqsafe(dev, entry);
goto out;
@@ -695,14 +702,14 @@ static void p54_rx_frame_sent(struct iee
out:
if (freed >= IEEE80211_MAX_RTS_THRESHOLD + priv->headroom +
- priv->tailroom + sizeof(struct p54_control_hdr))
+ priv->tailroom + sizeof(struct p54_hdr))
p54_wake_free_queues(dev);
}
static void p54_rx_eeprom_readback(struct ieee80211_hw *dev,
struct sk_buff *skb)
{
- struct p54_control_hdr *hdr = (struct p54_control_hdr *) skb->data;
+ struct p54_hdr *hdr = (struct p54_hdr *) skb->data;
struct p54_eeprom_lm86 *eeprom = (struct p54_eeprom_lm86 *) hdr->data;
struct p54_common *priv = dev->priv;
@@ -717,7 +724,7 @@ static void p54_rx_eeprom_readback(struc
static void p54_rx_stats(struct ieee80211_hw *dev, struct sk_buff *skb)
{
struct p54_common *priv = dev->priv;
- struct p54_control_hdr *hdr = (struct p54_control_hdr *) skb->data;
+ struct p54_hdr *hdr = (struct p54_hdr *) skb->data;
struct p54_statistics *stats = (struct p54_statistics *) hdr->data;
u32 tsf32 = le32_to_cpu(stats->tsf32);
@@ -737,7 +744,7 @@ static void p54_rx_stats(struct ieee8021
static int p54_rx_control(struct ieee80211_hw *dev, struct sk_buff *skb)
{
- struct p54_control_hdr *hdr = (struct p54_control_hdr *) skb->data;
+ struct p54_hdr *hdr = (struct p54_hdr *) skb->data;
switch (le16_to_cpu(hdr->type)) {
case P54_CONTROL_TYPE_TXDONE:
@@ -763,9 +770,9 @@ static int p54_rx_control(struct ieee802
/* returns zero if skb can be reused */
int p54_rx(struct ieee80211_hw *dev, struct sk_buff *skb)
{
- u8 type = le16_to_cpu(*((__le16 *)skb->data)) >> 8;
+ u16 type = le16_to_cpu(*((__le16 *)skb->data));
- if (type == 0x80)
+ if (type & P54_HDR_FLAG_CONTROL)
return p54_rx_control(dev, skb);
else
return p54_rx_data(dev, skb);
@@ -782,7 +789,7 @@ EXPORT_SYMBOL_GPL(p54_rx);
* allocated areas.
*/
static void p54_assign_address(struct ieee80211_hw *dev, struct sk_buff *skb,
- struct p54_control_hdr *data, u32 len)
+ struct p54_hdr *data, u32 len)
{
struct p54_common *priv = dev->priv;
struct sk_buff *entry = priv->tx_queue.next;
@@ -831,8 +838,7 @@ static void p54_assign_address(struct ie
range->dev = dev;
__skb_queue_after(&priv->tx_queue, target_skb, skb);
if (largest_hole < priv->rx_mtu + priv->headroom +
- priv->tailroom +
- sizeof(struct p54_control_hdr))
+ priv->tailroom + sizeof(struct p54_hdr))
ieee80211_stop_queues(dev);
}
spin_unlock_irqrestore(&priv->tx_queue.lock, flags);
@@ -843,7 +849,7 @@ static void p54_assign_address(struct ie
int p54_read_eeprom(struct ieee80211_hw *dev)
{
struct p54_common *priv = dev->priv;
- struct p54_control_hdr *hdr = NULL;
+ struct p54_hdr *hdr = NULL;
struct p54_eeprom_lm86 *eeprom_hdr;
struct sk_buff *skb;
size_t eeprom_size = 0x2020, offset = 0, blocksize;
@@ -856,7 +862,7 @@ int p54_read_eeprom(struct ieee80211_hw
if (!skb)
goto free;
skb_reserve(skb, priv->tx_hdr_len);
- hdr = (struct p54_control_hdr *) skb_put(skb, sizeof(*hdr));
+ hdr = (struct p54_hdr *) skb_put(skb, sizeof(*hdr));
priv->eeprom = kzalloc(EEPROM_READBACK_LEN, GFP_KERNEL);
if (!priv->eeprom)
goto free;
@@ -865,9 +871,9 @@ int p54_read_eeprom(struct ieee80211_hw
if (!eeprom)
goto free;
- hdr->magic1 = cpu_to_le16(0x8000);
+ hdr->flags = cpu_to_le16(P54_HDR_FLAG_CONTROL);
hdr->type = cpu_to_le16(P54_CONTROL_TYPE_EEPROM_READBACK);
- hdr->retry1 = hdr->retry2 = 0;
+ hdr->rts_retries = hdr->retries = 0;
eeprom_hdr = (struct p54_eeprom_lm86 *) skb_put(skb,
sizeof(*eeprom_hdr) + EEPROM_READBACK_LEN);
@@ -909,9 +915,9 @@ static int p54_tx(struct ieee80211_hw *d
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_tx_queue_stats *current_queue;
struct p54_common *priv = dev->priv;
- struct p54_control_hdr *hdr;
+ struct p54_hdr *hdr;
struct ieee80211_hdr *ieee80211hdr = (struct ieee80211_hdr *)skb->data;
- struct p54_tx_control_allocdata *txhdr;
+ struct p54_tx_data *txhdr;
size_t padding, len;
u8 rate;
u8 cts_rate = 0x20;
@@ -927,17 +933,16 @@ static int p54_tx(struct ieee80211_hw *d
padding = (unsigned long)(skb->data - (sizeof(*hdr) + sizeof(*txhdr))) & 3;
len = skb->len;
- txhdr = (struct p54_tx_control_allocdata *)
- skb_push(skb, sizeof(*txhdr) + padding);
- hdr = (struct p54_control_hdr *) skb_push(skb, sizeof(*hdr));
+ txhdr = (struct p54_tx_data *) skb_push(skb, sizeof(*txhdr) + padding);
+ hdr = (struct p54_hdr *) skb_push(skb, sizeof(*hdr));
if (padding)
- hdr->magic1 = cpu_to_le16(0x4010);
+ hdr->flags = cpu_to_le16(P54_HDR_FLAG_DATA_ALIGN);
else
- hdr->magic1 = cpu_to_le16(0x0010);
+ hdr->flags = cpu_to_le16(0);
hdr->len = cpu_to_le16(len);
hdr->type = (info->flags & IEEE80211_TX_CTL_NO_ACK) ? 0 : cpu_to_le16(1);
- hdr->retry1 = hdr->retry2 = info->control.retry_limit;
+ hdr->rts_retries = hdr->retries = info->control.retry_limit;
/* TODO: add support for alternate retry TX rates */
rate = ieee80211_get_tx_rate(dev, info)->hw_value;
@@ -951,11 +956,14 @@ static int p54_tx(struct ieee80211_hw *d
} else if (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT) {
rate |= 0x20;
cts_rate |= ieee80211_get_rts_cts_rate(dev, info)->hw_value;
- }
+ } else
+ hdr->flags |= cpu_to_le16(P54_HDR_FLAG_DATA_OUT_BURST);
+
memset(txhdr->rateset, rate, 8);
- memset(txhdr->unalloc0, 0, sizeof(txhdr->unalloc0));
- memset(txhdr->unalloc1, 0, sizeof(txhdr->unalloc1));
- memset(txhdr->unalloc2, 0, sizeof(txhdr->unalloc2));
+ memset(txhdr->durations, 0, sizeof(txhdr->durations));
+ txhdr->rts_rate_idx = 0;
+ txhdr->crypt_offset = 0;
+ txhdr->backlog = 32;
txhdr->key_type = 0;
txhdr->key_len = 0;
txhdr->hw_queue = skb_get_queue_mapping(skb) + 4;
@@ -987,89 +995,97 @@ static int p54_tx(struct ieee80211_hw *d
return 0;
}
-static int p54_set_filter(struct ieee80211_hw *dev, u16 filter_type,
+static int p54_mac_setup(struct ieee80211_hw *dev, u16 mac_mode,
const u8 *bssid)
{
struct p54_common *priv = dev->priv;
- struct p54_control_hdr *hdr;
+ struct p54_hdr *hdr;
struct sk_buff *skb;
- struct p54_tx_control_filter *filter;
+ struct p54_setup_mac *setup;
size_t data_len;
- skb = __dev_alloc_skb(sizeof(*hdr) + sizeof(*filter) +
+ skb = __dev_alloc_skb(sizeof(*hdr) + sizeof(*setup) +
priv->tx_hdr_len, GFP_ATOMIC);
if (!skb)
return -ENOMEM;
-
skb_reserve(skb, priv->tx_hdr_len);
- hdr = (struct p54_control_hdr *) skb_put(skb, sizeof(*hdr));
- hdr->magic1 = cpu_to_le16(0x8001);
- hdr->type = cpu_to_le16(P54_CONTROL_TYPE_FILTER_SET);
- hdr->retry1 = hdr->retry2 = 0;
-
- filter = (struct p54_tx_control_filter *) skb_put(skb, sizeof(*filter));
- filter->filter_type = priv->filter_type = cpu_to_le16(filter_type);
- memcpy(filter->mac_addr, priv->mac_addr, ETH_ALEN);
+
+ priv->mac_mode = mac_mode;
+ hdr = (struct p54_hdr *) skb_put(skb, sizeof(*hdr));
+ hdr->flags = cpu_to_le16(P54_HDR_FLAG_CONTROL_OPSET);
+ hdr->type = cpu_to_le16(P54_CONTROL_TYPE_SETUP);
+ hdr->rts_retries = hdr->retries = 0;
+
+ setup = (struct p54_setup_mac *) skb_put(skb, sizeof(*setup));
+ setup->mac_mode = cpu_to_le16(mac_mode);
+ memcpy(setup->mac_addr, priv->mac_addr, ETH_ALEN);
if (!bssid)
- memset(filter->bssid, ~0, ETH_ALEN);
+ memset(setup->bssid, ~0, ETH_ALEN);
else
- memcpy(filter->bssid, bssid, ETH_ALEN);
+ memcpy(setup->bssid, bssid, ETH_ALEN);
- filter->rx_antenna = priv->rx_antenna;
+ setup->rx_antenna = priv->rx_antenna;
+ setup->rx_align = 0;
if (priv->fw_var < 0x500) {
- data_len = P54_TX_CONTROL_FILTER_V1_LEN;
- filter->v1.basic_rate_mask = cpu_to_le32(0x15F);
- filter->v1.rx_addr = cpu_to_le32(priv->rx_end);
- filter->v1.max_rx = cpu_to_le16(priv->rx_mtu);
- filter->v1.rxhw = cpu_to_le16(priv->rxhw);
- filter->v1.wakeup_timer = cpu_to_le16(500);
+ data_len = P54_SETUP_V1_LEN;
+ setup->v1.basic_rate_mask = cpu_to_le32(0x15f);
+ memset(setup->v1.rts_rates, 0, sizeof(setup->v1.rts_rates));
+ setup->v1.rx_addr = cpu_to_le32(priv->rx_end);
+ setup->v1.max_rx = cpu_to_le16(priv->rx_mtu);
+ setup->v1.rxhw = cpu_to_le16(priv->rxhw);
+ setup->v1.wakeup_timer = cpu_to_le16(500);
} else {
- data_len = P54_TX_CONTROL_FILTER_V2_LEN;
- filter->v2.rx_addr = cpu_to_le32(priv->rx_end);
- filter->v2.max_rx = cpu_to_le16(priv->rx_mtu);
- filter->v2.rxhw = cpu_to_le16(priv->rxhw);
- filter->v2.timer = cpu_to_le16(1000);
+ data_len = P54_SETUP_V2_LEN;
+ setup->v2.rx_addr = cpu_to_le32(priv->rx_end);
+ setup->v2.max_rx = cpu_to_le16(priv->rx_mtu);
+ setup->v2.rxhw = cpu_to_le16(priv->rxhw);
+ setup->v2.timer = cpu_to_le16(1000);
+ setup->v2.basic_rate_mask = cpu_to_le32(0x15f);
+ setup->v2.truncate = cpu_to_le16(48896);
+ setup->v2.mcast_window = 0;
+ setup->v2.sbss_offset = 0;
+ setup->v2.ref_clock = cpu_to_le32(644245094);
+ setup->v2.lpf_bandwidth = cpu_to_le16(65535);
+ setup->v2.osc_start_delay = cpu_to_le16(65535);
+
}
hdr->len = cpu_to_le16(data_len);
p54_assign_address(dev, skb, hdr, sizeof(*hdr) + data_len);
-
priv->tx(dev, hdr, skb, sizeof(*hdr) + data_len, 1);
return 0;
}
-static int p54_set_freq(struct ieee80211_hw *dev, __le16 freq)
+static int p54_scan(struct ieee80211_hw *dev, __le16 freq)
{
struct p54_common *priv = dev->priv;
struct sk_buff *skb;
- struct p54_control_hdr *hdr;
- struct p54_tx_control_channel *chan;
+ struct p54_hdr *hdr;
+ struct p54_scan *scan;
unsigned int i;
size_t data_len;
void *entry;
- skb = dev_alloc_skb(priv->tx_hdr_len + sizeof(*hdr) + sizeof(*chan));
-
+ skb = dev_alloc_skb(priv->tx_hdr_len + sizeof(*hdr) + sizeof(*scan));
if (!skb)
return -ENOMEM;
-
skb_reserve(skb, priv->tx_hdr_len);
- hdr = (struct p54_control_hdr *)skb_put(skb, sizeof(*hdr));
- hdr->magic1 = cpu_to_le16(0x8001);
- hdr->type = cpu_to_le16(P54_CONTROL_TYPE_CHANNEL_CHANGE);
- hdr->retry1 = hdr->retry2 = 0;
- chan = (struct p54_tx_control_channel *) skb_put(skb, sizeof(*chan));
- memset(chan->padding1, 0, sizeof(chan->padding1));
- chan->flags = cpu_to_le16(0x1);
- chan->dwell = cpu_to_le16(0x0);
+ hdr = (struct p54_hdr *) skb_put(skb, sizeof(*hdr));
+ hdr->flags = cpu_to_le16(P54_HDR_FLAG_CONTROL_OPSET);
+ hdr->type = cpu_to_le16(P54_CONTROL_TYPE_SCAN);
+ hdr->rts_retries = hdr->retries = 0;
+ scan = (struct p54_scan *) skb_put(skb, sizeof(*scan));
+ memset(scan->padding, 0, sizeof(scan->padding));
+ scan->mode = cpu_to_le16(0x1);
+ scan->dwell = cpu_to_le16(0x0);
for (i = 0; i < priv->iq_autocal_len; i++) {
if (priv->iq_autocal[i].freq != freq)
continue;
- memcpy(&chan->iq_autocal, &priv->iq_autocal[i],
+ memcpy(&scan->iq_autocal, &priv->iq_autocal[i],
sizeof(*priv->iq_autocal));
break;
}
@@ -1080,14 +1096,14 @@ static int p54_set_freq(struct ieee80211
if (priv->output_limit[i].freq != freq)
continue;
- chan->val_barker = 0x38;
- chan->val_bpsk = chan->dup_bpsk =
+ scan->val_barker = 0x38;
+ scan->val_bpsk = scan->dup_bpsk =
priv->output_limit[i].val_bpsk;
- chan->val_qpsk = chan->dup_qpsk =
+ scan->val_qpsk = scan->dup_qpsk =
priv->output_limit[i].val_qpsk;
- chan->val_16qam = chan->dup_16qam =
+ scan->val_16qam = scan->dup_16qam =
priv->output_limit[i].val_16qam;
- chan->val_64qam = chan->dup_64qam =
+ scan->val_64qam = scan->dup_64qam =
priv->output_limit[i].val_64qam;
break;
}
@@ -1096,6 +1112,7 @@ static int p54_set_freq(struct ieee80211
entry = priv->curve_data->data;
for (i = 0; i < priv->curve_data->channels; i++) {
+ u8 j;
if (*((__le16 *)entry) != freq) {
entry += sizeof(__le16);
entry += sizeof(struct p54_pa_curve_data_sample) *
@@ -1104,23 +1121,23 @@ static int p54_set_freq(struct ieee80211
}
entry += sizeof(__le16);
- chan->pa_points_per_curve =
- min(priv->curve_data->points_per_channel, (u8) 8);
+ j = min(priv->curve_data->points_per_channel, (u8) 8);
+ scan->pa_points_per_curve = 8;
- memcpy(chan->curve_data, entry, sizeof(*chan->curve_data) *
- chan->pa_points_per_curve);
+ memcpy(scan->curve_data, entry, sizeof(*scan->curve_data) * j);
break;
}
if (priv->fw_var < 0x500) {
- data_len = P54_TX_CONTROL_CHANNEL_V1_LEN;
- chan->v1.rssical_mul = cpu_to_le16(130);
- chan->v1.rssical_add = cpu_to_le16(0xfe70);
+ data_len = P54_SCAN_V1_LEN;
+ scan->v1.rssical_mul = cpu_to_le16(130);
+ scan->v1.rssical_add = cpu_to_le16(0xfe70);
} else {
- data_len = P54_TX_CONTROL_CHANNEL_V2_LEN;
- chan->v2.rssical_mul = cpu_to_le16(130);
- chan->v2.rssical_add = cpu_to_le16(0xfe70);
- chan->v2.basic_rate_mask = cpu_to_le32(0x15f);
+ data_len = P54_SCAN_V2_LEN;
+ scan->v2.rssical_mul = cpu_to_le16(130);
+ scan->v2.rssical_add = cpu_to_le16(0xfe70);
+ scan->v2.basic_rate_mask = cpu_to_le32(0x15f);
+ memset(scan->v2.rts_rates, 0, sizeof(scan->v2.rts_rates));
}
hdr->len = cpu_to_le16(data_len);
@@ -1138,23 +1155,22 @@ static int p54_set_leds(struct ieee80211
{
struct p54_common *priv = dev->priv;
struct sk_buff *skb;
- struct p54_control_hdr *hdr;
- struct p54_tx_control_led *led;
+ struct p54_hdr *hdr;
+ struct p54_led *led;
skb = dev_alloc_skb(sizeof(*hdr) + sizeof(*led) +
priv->tx_hdr_len);
if (!skb)
return -ENOMEM;
-
skb_reserve(skb, priv->tx_hdr_len);
- hdr = (void *)skb_put(skb, sizeof(*hdr) + sizeof(*led));
- hdr->magic1 = cpu_to_le16(0x8001);
+ hdr = (struct p54_hdr *)skb_put(skb, sizeof(*hdr) + sizeof(*led));
+ hdr->flags = cpu_to_le16(P54_HDR_FLAG_CONTROL_OPSET);
hdr->len = cpu_to_le16(sizeof(*led));
hdr->type = cpu_to_le16(P54_CONTROL_TYPE_LED);
- hdr->retry1 = hdr->retry2 = 0;
+ hdr->rts_retries = hdr->retries = 0;
- led = (struct p54_tx_control_led *) hdr->data;
+ led = (struct p54_led *) hdr->data;
led->mode = cpu_to_le16(mode);
led->led_permanent = cpu_to_le16(link);
led->led_temporary = cpu_to_le16(act);
@@ -1162,7 +1178,6 @@ static int p54_set_leds(struct ieee80211
p54_assign_address(dev, skb, hdr, skb->len);
priv->tx(dev, hdr, skb, skb->len, 1);
-
return 0;
}
@@ -1174,42 +1189,40 @@ do { \
queue.txop = cpu_to_le16(_txop); \
} while(0)
-static int p54_set_vdcf(struct ieee80211_hw *dev)
+static int p54_set_edcf(struct ieee80211_hw *dev)
{
struct p54_common *priv = dev->priv;
- struct p54_control_hdr *hdr;
- struct p54_tx_control_vdcf *vdcf;
+ struct p54_hdr *hdr;
+ struct p54_edcf *edcf;
struct sk_buff *skb;
- skb = dev_alloc_skb(priv->tx_hdr_len +
- sizeof(struct p54_control_hdr) +
- sizeof(struct p54_tx_control_vdcf));
-
+ skb = dev_alloc_skb(priv->tx_hdr_len + sizeof(struct p54_hdr) +
+ sizeof(struct p54_edcf));
if (!skb)
return -ENOMEM;
skb_reserve(skb, priv->tx_hdr_len);
- hdr = (struct p54_control_hdr *) skb_put(skb, sizeof(*hdr));
- hdr->magic1 = cpu_to_le16(0x8001);
- hdr->len = cpu_to_le16(sizeof(*vdcf));
+ hdr = (struct p54_hdr *) skb_put(skb, sizeof(*hdr));
+ hdr->flags = cpu_to_le16(P54_HDR_FLAG_CONTROL_OPSET);
+ hdr->len = cpu_to_le16(sizeof(*edcf));
hdr->type = cpu_to_le16(P54_CONTROL_TYPE_DCFINIT);
- hdr->retry1 = hdr->retry2 = 0;
+ hdr->rts_retries = hdr->retries = 0;
- vdcf = (struct p54_tx_control_vdcf *) skb_put(skb, sizeof(*vdcf));
- vdcf->round_trip_delay = cpu_to_le16(0);
- memset(vdcf->mapping, 0, sizeof(vdcf->mapping));
- memcpy(vdcf->queue, priv->qos_params, sizeof(vdcf->queue));
+ edcf = (struct p54_edcf *) skb_put(skb, sizeof(*edcf));
+ edcf->round_trip_delay = cpu_to_le16(0);
+ memset(edcf->mapping, 0, sizeof(edcf->mapping));
+ memcpy(edcf->queue, priv->qos_params, sizeof(edcf->queue));
if (dev->conf.flags & IEEE80211_CONF_SHORT_SLOT_TIME) {
- vdcf->slottime = 9;
- vdcf->sifs = 0x10;
- vdcf->eofpad = 0x00;
+ edcf->slottime = 9;
+ edcf->sifs = 0x10;
+ edcf->eofpad = 0x00;
} else {
- vdcf->slottime = 20;
- vdcf->sifs = 0x0a;
- vdcf->eofpad = 0x06;
+ edcf->slottime = 20;
+ edcf->sifs = 0x0a;
+ edcf->eofpad = 0x06;
}
/* (see prism54/isl_oid.h for further details) */
- vdcf->frameburst = cpu_to_le16(0);
+ edcf->frameburst = cpu_to_le16(0);
p54_assign_address(dev, skb, hdr, skb->len);
priv->tx(dev, hdr, skb, skb->len, 1);
@@ -1219,11 +1232,11 @@ static int p54_set_vdcf(struct ieee80211
static int p54_init_stats(struct ieee80211_hw *dev)
{
struct p54_common *priv = dev->priv;
- struct p54_control_hdr *hdr;
+ struct p54_hdr *hdr;
struct p54_statistics *stats;
priv->cached_stats = dev_alloc_skb(priv->tx_hdr_len +
- sizeof(struct p54_control_hdr) +
+ sizeof(struct p54_hdr) +
sizeof(struct p54_statistics));
if (!priv->cached_stats)
@@ -1231,18 +1244,17 @@ static int p54_init_stats(struct ieee802
skb_reserve(priv->cached_stats, priv->tx_hdr_len);
- hdr = (void *) skb_put(priv->cached_stats, sizeof(*hdr));
- hdr->magic1 = cpu_to_le16(0x8000);
+ hdr = (struct p54_hdr *) skb_put(priv->cached_stats, sizeof(*hdr));
+ hdr->flags = cpu_to_le16(P54_HDR_FLAG_CONTROL);
hdr->len = cpu_to_le16(sizeof(*stats));
hdr->type = cpu_to_le16(P54_CONTROL_TYPE_STAT_READBACK);
- hdr->retry1 = hdr->retry2 = 0;
- stats = (void *) skb_put(priv->cached_stats, sizeof(*stats));
+ hdr->rts_retries = hdr->retries = 0;
+ stats = (struct p54_statistics *)
+ skb_put(priv->cached_stats, sizeof(*stats));
p54_assign_address(dev, priv->cached_stats,
hdr, priv->cached_stats->len);
-
mod_timer(&priv->stats_timer, jiffies + HZ);
-
return 0;
}
@@ -1259,7 +1271,7 @@ static int p54_start(struct ieee80211_hw
P54_SET_QUEUE(priv->qos_params[1], 0x0002, 0x0007, 0x000f, 94);
P54_SET_QUEUE(priv->qos_params[2], 0x0003, 0x000f, 0x03ff, 0);
P54_SET_QUEUE(priv->qos_params[3], 0x0007, 0x000f, 0x03ff, 0);
- err = p54_set_vdcf(dev);
+ err = p54_set_edcf(dev);
if (!err)
err = p54_init_stats(dev);
@@ -1300,11 +1312,11 @@ static int p54_add_interface(struct ieee
memcpy(priv->mac_addr, conf->mac_addr, ETH_ALEN);
- p54_set_filter(dev, 0, NULL);
+ p54_mac_setup(dev, P54_FILTER_TYPE_NONE, NULL);
switch (conf->type) {
case NL80211_IFTYPE_STATION:
- p54_set_filter(dev, 1, NULL);
+ p54_mac_setup(dev, P54_FILTER_TYPE_STATION, NULL);
break;
default:
BUG(); /* impossible */
@@ -1322,7 +1334,7 @@ static void p54_remove_interface(struct
struct p54_common *priv = dev->priv;
priv->mode = NL80211_IFTYPE_MONITOR;
memset(priv->mac_addr, 0, ETH_ALEN);
- p54_set_filter(dev, 0, NULL);
+ p54_mac_setup(dev, P54_FILTER_TYPE_NONE, NULL);
}
static int p54_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf)
@@ -1334,9 +1346,9 @@ static int p54_config(struct ieee80211_h
priv->rx_antenna = (conf->antenna_sel_rx == 0) ?
2 : conf->antenna_sel_tx - 1;
priv->output_power = conf->power_level << 2;
- ret = p54_set_freq(dev, cpu_to_le16(conf->channel->center_freq));
+ ret = p54_scan(dev, cpu_to_le16(conf->channel->center_freq));
if (!ret)
- ret = p54_set_vdcf(dev);
+ ret = p54_set_edcf(dev);
mutex_unlock(&priv->conf_mutex);
return ret;
}
@@ -1348,7 +1360,7 @@ static int p54_config_interface(struct i
struct p54_common *priv = dev->priv;
mutex_lock(&priv->conf_mutex);
- p54_set_filter(dev, 0, conf->bssid);
+ p54_mac_setup(dev, P54_FILTER_TYPE_STATION, conf->bssid);
p54_set_leds(dev, 1, !is_multicast_ether_addr(conf->bssid), 0);
memcpy(priv->bssid, conf->bssid, ETH_ALEN);
mutex_unlock(&priv->conf_mutex);
@@ -1370,20 +1382,20 @@ static void p54_configure_filter(struct
if (changed_flags & FIF_BCN_PRBRESP_PROMISC) {
if (*total_flags & FIF_BCN_PRBRESP_PROMISC)
- p54_set_filter(dev, le16_to_cpu(priv->filter_type),
+ p54_mac_setup(dev, priv->mac_mode,
NULL);
else
- p54_set_filter(dev, le16_to_cpu(priv->filter_type),
+ p54_mac_setup(dev, priv->mac_mode,
priv->bssid);
}
if (changed_flags & FIF_PROMISC_IN_BSS) {
if (*total_flags & FIF_PROMISC_IN_BSS)
- p54_set_filter(dev, le16_to_cpu(priv->filter_type) |
- 0x8, NULL);
+ p54_mac_setup(dev, priv->mac_mode |
+ P54_FILTER_TYPE_TRANSPARENT, NULL);
else
- p54_set_filter(dev, le16_to_cpu(priv->filter_type) &
- ~0x8, priv->bssid);
+ p54_mac_setup(dev, priv->mac_mode &
+ ~P54_FILTER_TYPE_TRANSPARENT, priv->bssid);
}
}
@@ -1398,31 +1410,30 @@ static int p54_conf_tx(struct ieee80211_
} else
return -EINVAL;
- return p54_set_vdcf(dev);
+ return p54_set_edcf(dev);
}
static int p54_init_xbow_synth(struct ieee80211_hw *dev)
{
struct p54_common *priv = dev->priv;
struct sk_buff *skb;
- struct p54_control_hdr *hdr;
- struct p54_tx_control_xbow_synth *xbow;
+ struct p54_hdr *hdr;
+ struct p54_xbow_synth *xbow;
skb = dev_alloc_skb(priv->tx_hdr_len + sizeof(*hdr) + sizeof(*xbow));
if (!skb)
return -ENOMEM;
skb_reserve(skb, priv->tx_hdr_len);
- hdr = (struct p54_control_hdr *)skb_put(skb, sizeof(*hdr));
- hdr->magic1 = cpu_to_le16(0x8001);
+ hdr = (struct p54_hdr *) skb_put(skb, sizeof(*hdr));
+ hdr->flags = cpu_to_le16(P54_HDR_FLAG_CONTROL_OPSET);
hdr->len = cpu_to_le16(sizeof(*xbow));
hdr->type = cpu_to_le16(P54_CONTROL_TYPE_XBOW_SYNTH_CFG);
- hdr->retry1 = hdr->retry2 = 0;
- xbow = (struct p54_tx_control_xbow_synth *)skb_put(skb, sizeof(*xbow));
+ hdr->rts_retries = hdr->retries = 0;
+ xbow = (struct p54_xbow_synth *) skb_put(skb, sizeof(*xbow));
xbow->magic1 = cpu_to_le16(0x1);
xbow->magic2 = cpu_to_le16(0x2);
xbow->freq = cpu_to_le16(5390);
- memset(xbow->padding, 0, sizeof(xbow->padding));
p54_assign_address(dev, skb, hdr, sizeof(*hdr) + sizeof(*xbow));
priv->tx(dev, hdr, skb, sizeof(*hdr) + sizeof(*xbow), 1);
@@ -1433,11 +1444,11 @@ static void p54_statistics_timer(unsigne
{
struct ieee80211_hw *dev = (struct ieee80211_hw *) data;
struct p54_common *priv = dev->priv;
- struct p54_control_hdr *hdr;
+ struct p54_hdr *hdr;
BUG_ON(!priv->cached_stats);
- hdr = (struct p54_control_hdr *)priv->cached_stats->data;
+ hdr = (struct p54_hdr *)priv->cached_stats->data;
priv->tx(dev, hdr, priv->cached_stats, priv->cached_stats->len, 0);
}
@@ -1512,8 +1523,8 @@ struct ieee80211_hw *p54_init_common(siz
priv->tx_stats[4].limit = 5;
dev->queues = 1;
priv->noise = -94;
- dev->extra_tx_headroom = sizeof(struct p54_control_hdr) + 4 +
- sizeof(struct p54_tx_control_allocdata);
+ dev->extra_tx_headroom = sizeof(struct p54_hdr) + 4 +
+ sizeof(struct p54_tx_data);
mutex_init(&priv->conf_mutex);
init_completion(&priv->eeprom_comp);
diff -Nurp a/drivers/net/wireless/p54/p54common.h b/drivers/net/wireless/p54/p54common.h
--- a/drivers/net/wireless/p54/p54common.h 2008-10-04 01:03:45.000000000 +0200
+++ b/drivers/net/wireless/p54/p54common.h 2008-10-05 01:21:01.000000000 +0200
@@ -34,6 +34,13 @@ struct bootrec_exp_if {
__le16 top_compat;
} __attribute__((packed));
+#define BR_DESC_PRIV_CAP_WEP BIT(0)
+#define BR_DESC_PRIV_CAP_TKIP BIT(1)
+#define BR_DESC_PRIV_CAP_MICHAEL BIT(2)
+#define BR_DESC_PRIV_CAP_CCX_CP BIT(3)
+#define BR_DESC_PRIV_CAP_CCX_MIC BIT(4)
+#define BR_DESC_PRIV_CAP_AESCCMP BIT(5)
+
struct bootrec_desc {
__le16 modes;
__le16 flags;
@@ -41,7 +48,12 @@ struct bootrec_desc {
__le32 rx_end;
u8 headroom;
u8 tailroom;
- u8 unimportant[6];
+ u8 tx_queues;
+ u8 tx_depth;
+ u8 privacy_caps;
+ u8 rx_keycache_size;
+ u8 time_size;
+ u8 padding;
u8 rates[16];
} __attribute__((packed));
@@ -55,6 +67,34 @@ struct bootrec_desc {
#define BR_CODE_END_OF_BRA 0xFF0000FF
#define LEGACY_BR_CODE_END_OF_BRA 0xFFFFFFFF
+#define P54_HDR_FLAG_CONTROL BIT(15)
+#define P54_HDR_FLAG_CONTROL_OPSET (BIT(15) + BIT(0))
+
+#define P54_HDR_FLAG_DATA_ALIGN BIT(14)
+#define P54_HDR_FLAG_DATA_OUT_PROMISC BIT(0)
+#define P54_HDR_FLAG_DATA_OUT_TIMESTAMP BIT(1)
+#define P54_HDR_FLAG_DATA_OUT_SEQNR BIT(2)
+#define P54_HDR_FLAG_DATA_OUT_BIT3 BIT(3)
+#define P54_HDR_FLAG_DATA_OUT_BURST BIT(4)
+#define P54_HDR_FLAG_DATA_OUT_NOCANCEL BIT(5)
+#define P54_HDR_FLAG_DATA_OUT_CLEARTIM BIT(6)
+#define P54_HDR_FLAG_DATA_OUT_HITCHHIKE BIT(7)
+#define P54_HDR_FLAG_DATA_OUT_COMPRESS BIT(8)
+#define P54_HDR_FLAG_DATA_OUT_CONCAT BIT(9)
+#define P54_HDR_FLAG_DATA_OUT_PCS_ACCEPT BIT(10)
+#define P54_HDR_FLAG_DATA_OUT_WAITEOSP BIT(11)
+
+#define P54_HDR_FLAG_DATA_IN_FCS_GOOD BIT(0)
+#define P54_HDR_FLAG_DATA_IN_MATCH_MAC BIT(1)
+#define P54_HDR_FLAG_DATA_IN_MCBC BIT(2)
+#define P54_HDR_FLAG_DATA_IN_BEACON BIT(3)
+#define P54_HDR_FLAG_DATA_IN_MATCH_BSS BIT(4)
+#define P54_HDR_FLAG_DATA_IN_BCAST_BSS BIT(5)
+#define P54_HDR_FLAG_DATA_IN_DATA BIT(6)
+#define P54_HDR_FLAG_DATA_IN_TRUNCATED BIT(7)
+#define P54_HDR_FLAG_DATA_IN_BIT8 BIT(8)
+#define P54_HDR_FLAG_DATA_IN_TRANSPARENT BIT(9)
+
/* PDA defines are Copyright (C) 2005 Nokia Corporation (taken from islsm_pda.h) */
struct pda_entry {
@@ -175,36 +215,91 @@ struct p54_eeprom_lm86 {
u8 data[0];
} __attribute__ ((packed));
-struct p54_rx_hdr {
- __le16 magic;
+enum p54_rx_decrypt_status {
+ P54_DECRYPT_NONE = 0,
+ P54_DECRYPT_OK,
+ P54_DECRYPT_NOKEY,
+ P54_DECRYPT_NOMICHAEL,
+ P54_DECRYPT_NOCKIPMIC,
+ P54_DECRYPT_FAIL_WEP,
+ P54_DECRYPT_FAIL_TKIP,
+ P54_DECRYPT_FAIL_MICAHEL,
+ P54_DECRYPT_FAIL_CKIPKP,
+ P54_DECRYPT_FAIL_CKIPMIC,
+ P54_DECRYPT_FAIL_AESCCMP
+};
+
+struct p54_rx_data {
+ __le16 flags;
__le16 len;
__le16 freq;
u8 antenna;
u8 rate;
u8 rssi;
u8 quality;
- u16 unknown2;
+ u8 decrypt_status;
+ u8 rssi_raw;
__le32 tsf32;
__le32 unalloc0;
u8 align[0];
} __attribute__ ((packed));
+enum p54_trap_type {
+ P54_TRAP_SCAN = 0,
+ P54_TRAP_TIMER,
+ P54_TRAP_BEACON_TX,
+ P54_TRAP_FAA_RADIO_ON,
+ P54_TRAP_FAA_RADIO_OFF,
+ P54_TRAP_RADAR,
+ P54_TRAP_NO_BEACON,
+ P54_TRAP_TBTT,
+ P54_TRAP_SCO_ENTER,
+ P54_TRAP_SCO_EXIT
+};
+
+struct p54_trap {
+ __le16 event;
+ __le16 frequency;
+} __attribute__ ((packed));
+
+enum p54_frame_sent_status {
+ P54_TX_OK = 0,
+ P54_TX_FAILED,
+ P54_TX_PSM,
+ P54_TX_PSM_CANCELLED
+};
+
struct p54_frame_sent_hdr {
u8 status;
u8 retries;
- __le16 ack_rssi;
+ u8 ack_rssi;
+ u8 quality;
__le16 seq;
- u16 rate;
+ u8 antenna;
+ u8 padding;
} __attribute__ ((packed));
-struct p54_tx_control_allocdata {
+enum p54_tx_data_crypt {
+ P54_CRYPTO_NONE = 0,
+ P54_CRYPTO_WEP,
+ P54_CRYPTO_TKIP,
+ P54_CRYPTO_TKIPMICHAEL,
+ P54_CRYPTO_CCX_WEPMIC,
+ P54_CRYPTO_CCX_KPMIC,
+ P54_CRYPTO_CCX_KP,
+ P54_CRYPTO_AESCCMP
+};
+
+struct p54_tx_data {
u8 rateset[8];
- u8 unalloc0[2];
+ u8 rts_rate_idx;
+ u8 crypt_offset;
u8 key_type;
u8 key_len;
u8 key[16];
u8 hw_queue;
- u8 unalloc1[9];
+ u8 backlog;
+ __le16 durations[4];
u8 tx_antenna;
u8 output_power;
u8 cts_rate;
@@ -212,8 +307,18 @@ struct p54_tx_control_allocdata {
u8 align[0];
} __attribute__ ((packed));
-struct p54_tx_control_filter {
- __le16 filter_type;
+#define P54_FILTER_TYPE_NONE 0
+#define P54_FILTER_TYPE_STATION BIT(0)
+#define P54_FILTER_TYPE_IBSS BIT(1)
+#define P54_FILTER_TYPE_AP BIT(2)
+#define P54_FILTER_TYPE_TRANSPARENT BIT(3)
+#define P54_FILTER_TYPE_PROMISCUOUS BIT(4)
+#define P54_FILTER_TYPE_HIBERNATE BIT(5)
+#define P54_FILTER_TYPE_NOACK BIT(6)
+#define P54_FILTER_TYPE_RX_DISABLED BIT(7)
+
+struct p54_setup_mac {
+ __le16 mac_mode;
u8 mac_addr[ETH_ALEN];
u8 bssid[ETH_ALEN];
u8 rx_antenna;
@@ -233,19 +338,31 @@ struct p54_tx_control_filter {
__le16 max_rx;
__le16 rxhw;
__le16 timer;
- __le16 unalloc0;
- __le32 unalloc1;
+ __le16 truncate;
+ __le32 basic_rate_mask;
+ u8 sbss_offset;
+ u8 mcast_window;
+ u8 rx_rssi_threshold;
+ u8 rx_ed_threshold;
+ __le32 ref_clock;
+ __le16 lpf_bandwidth;
+ __le16 osc_start_delay;
} v2 __attribute__ ((packed));
} __attribute__ ((packed));
} __attribute__ ((packed));
-#define P54_TX_CONTROL_FILTER_V1_LEN (sizeof(struct p54_tx_control_filter))
-#define P54_TX_CONTROL_FILTER_V2_LEN (sizeof(struct p54_tx_control_filter)-8)
+#define P54_SETUP_V1_LEN 40
+#define P54_SETUP_V2_LEN (sizeof(struct p54_setup_mac))
-struct p54_tx_control_channel {
- __le16 flags;
+#define P54_SCAN_EXIT BIT(0)
+#define P54_SCAN_TRAP BIT(1)
+#define P54_SCAN_ACTIVE BIT(2)
+#define P54_SCAN_FILTER BIT(3)
+
+struct p54_scan {
+ __le16 mode;
__le16 dwell;
- u8 padding1[20];
+ u8 padding[20];
struct pda_iq_autocal_entry iq_autocal;
u8 pa_points_per_curve;
u8 val_barker;
@@ -266,29 +383,29 @@ struct p54_tx_control_channel {
struct {
__le32 basic_rate_mask;
- u8 rts_rates[8];
+ u8 rts_rates[8];
__le16 rssical_mul;
__le16 rssical_add;
} v2 __attribute__ ((packed));
} __attribute__ ((packed));
} __attribute__ ((packed));
-#define P54_TX_CONTROL_CHANNEL_V1_LEN (sizeof(struct p54_tx_control_channel)-12)
-#define P54_TX_CONTROL_CHANNEL_V2_LEN (sizeof(struct p54_tx_control_channel))
+#define P54_SCAN_V1_LEN (sizeof(struct p54_scan)-12)
+#define P54_SCAN_V2_LEN (sizeof(struct p54_scan))
-struct p54_tx_control_led {
+struct p54_led {
__le16 mode;
__le16 led_temporary;
__le16 led_permanent;
__le16 duration;
} __attribute__ ((packed));
-struct p54_tx_control_vdcf {
+struct p54_edcf {
u8 flags;
u8 slottime;
u8 sifs;
u8 eofpad;
- struct p54_tx_vdcf_queues queue[8];
+ struct p54_edcf_queue_param queue[8];
u8 mapping[4];
__le16 frameburst;
__le16 round_trip_delay;
@@ -304,14 +421,103 @@ struct p54_statistics {
__le32 tsf32;
__le32 airtime;
__le32 noise;
- __le32 unkn[10]; /* CCE / CCA / RADAR */
+ __le32 sample_noise[8];
+ __le32 sample_cca;
+ __le32 sample_tx;
} __attribute__ ((packed));
-struct p54_tx_control_xbow_synth {
+struct p54_xbow_synth {
__le16 magic1;
__le16 magic2;
__le16 freq;
u32 padding[5];
} __attribute__ ((packed));
+struct p54_timer {
+ __le32 interval;
+} __attribute__ ((packed));
+
+struct p54_keycache {
+ u8 entry;
+ u8 key_id;
+ u8 mac[ETH_ALEN];
+ u8 padding[2];
+ u8 key_type;
+ u8 key_len;
+ u8 key[24];
+} __attribute__ ((packed));
+
+struct p54_burst {
+ u8 flags;
+ u8 queue;
+ u8 backlog;
+ u8 pad;
+ __le16 durations[32];
+} __attribute__ ((packed));
+
+struct p54_psm_interval {
+ __le16 interval;
+ __le16 periods;
+} __attribute__ ((packed));
+
+#define P54_PSM BIT(0)
+#define P54_PSM_DTIM BIT(1)
+#define P54_PSM_MCBC BIT(2)
+#define P54_PSM_CHECKSUM BIT(3)
+#define P54_PSM_SKIP_MORE_DATA BIT(4)
+#define P54_PSM_BEACON_TIMEOUT BIT(5)
+#define P54_PSM_HFOSLEEP BIT(6)
+#define P54_PSM_AUTOSWITCH_SLEEP BIT(7)
+#define P54_PSM_LPIT BIT(8)
+#define P54_PSM_BF_UCAST_SKIP BIT(9)
+#define P54_PSM_BF_MCAST_SKIP BIT(10)
+
+struct p54_psm {
+ __le16 mode;
+ __le16 aid;
+ struct p54_psm_interval intervals[4];
+ u8 beacon_rssi_skip_max;
+ u8 rssi_delta_threshold;
+ u8 nr;
+ u8 exclude[1];
+} __attribute__ ((packed));
+
+#define MC_FILTER_ADDRESS_NUM 4
+
+struct p54_group_address_table {
+ __le16 filter_enable;
+ __le16 num_address;
+ u8 mac_list[MC_FILTER_ADDRESS_NUM][ETH_ALEN];
+} __attribute__ ((packed));
+
+struct p54_txcancel {
+ __le32 req_id;
+} __attribute__ ((packed));
+
+struct p54_sta_unlock {
+ u8 addr[ETH_ALEN];
+ u16 padding;
+} __attribute__ ((packed));
+
+#define P54_TIM_CLEAR BIT(15)
+struct p54_tx_control_tim {
+ u8 count;
+ u8 padding[3];
+ __le16 entry[8];
+} __attribute__ ((packed));
+
+struct p54_cce_quiet {
+ __le32 period;
+} __attribute__ ((packed));
+
+struct p54_bt_balancer {
+ __le16 prio_thresh;
+ __le16 acl_thresh;
+} __attribute__ ((packed));
+
+struct p54_arp_table {
+ __le16 filter_enable;
+ u8 ipv4_addr[4];
+} __attribute__ ((packed));
+
#endif /* P54COMMON_H */
diff -Nurp a/drivers/net/wireless/p54/p54.h b/drivers/net/wireless/p54/p54.h
--- a/drivers/net/wireless/p54/p54.h 2008-10-04 01:03:43.000000000 +0200
+++ b/drivers/net/wireless/p54/p54.h 2008-10-04 19:28:43.000000000 +0200
@@ -14,17 +14,17 @@
* published by the Free Software Foundation.
*/
-enum control_frame_types {
- P54_CONTROL_TYPE_FILTER_SET = 0,
- P54_CONTROL_TYPE_CHANNEL_CHANGE,
- P54_CONTROL_TYPE_FREQDONE,
+enum p54_control_frame_types {
+ P54_CONTROL_TYPE_SETUP = 0,
+ P54_CONTROL_TYPE_SCAN,
+ P54_CONTROL_TYPE_TRAP,
P54_CONTROL_TYPE_DCFINIT,
- P54_CONTROL_TYPE_ENCRYPTION,
+ P54_CONTROL_TYPE_RX_KEYCACHE,
P54_CONTROL_TYPE_TIM,
- P54_CONTROL_TYPE_POWERMGT,
- P54_CONTROL_TYPE_FREEQUEUE,
+ P54_CONTROL_TYPE_PSM,
+ P54_CONTROL_TYPE_TXCANCEL,
P54_CONTROL_TYPE_TXDONE,
- P54_CONTROL_TYPE_PING,
+ P54_CONTROL_TYPE_BURST,
P54_CONTROL_TYPE_STAT_READBACK,
P54_CONTROL_TYPE_BBP,
P54_CONTROL_TYPE_EEPROM_READBACK,
@@ -37,19 +37,24 @@ enum control_frame_types {
P54_CONTROL_TYPE_XBOW_SYNTH_CFG,
P54_CONTROL_TYPE_CCE_QUIET,
P54_CONTROL_TYPE_PSM_STA_UNLOCK,
+ P54_CONTROL_TYPE_PCS,
+ P54_CONTROL_TYPE_BT_BALANCER = 28,
+ P54_CONTROL_TYPE_GROUP_ADDRESS_TABLE = 30,
+ P54_CONTROL_TYPE_ARPTABLE = 31,
+ P54_CONTROL_TYPE_BT_OPTIONS = 35
};
-struct p54_control_hdr {
- __le16 magic1;
+struct p54_hdr {
+ __le16 flags;
__le16 len;
__le32 req_id;
- __le16 type; /* enum control_frame_types */
- u8 retry1;
- u8 retry2;
+ __le16 type; /* enum p54_control_frame_types */
+ u8 rts_retries;
+ u8 retries;
u8 data[0];
} __attribute__ ((packed));
-struct p54_tx_vdcf_queues {
+struct p54_edcf_queue_param {
u8 aifs;
u8 padding;
__le16 cwmin;
@@ -77,7 +82,7 @@ struct p54_common {
u32 rx_start;
u32 rx_end;
struct sk_buff_head tx_queue;
- void (*tx)(struct ieee80211_hw *dev, struct p54_control_hdr *data,
+ void (*tx)(struct ieee80211_hw *dev, struct p54_hdr *data,
struct sk_buff *skb, size_t len, int free_on_tx);
int (*open)(struct ieee80211_hw *dev);
void (*stop)(struct ieee80211_hw *dev);
@@ -89,7 +94,7 @@ struct p54_common {
struct mutex conf_mutex;
u8 mac_addr[ETH_ALEN];
u8 bssid[ETH_ALEN];
- __le16 filter_type;
+ u16 mac_mode;
struct pda_iq_autocal_entry *iq_autocal;
unsigned int iq_autocal_len;
struct pda_channel_output_limit *output_limit;
@@ -106,7 +111,7 @@ struct p54_common {
u32 tsf_low32;
u32 tsf_high32;
struct ieee80211_tx_queue_stats tx_stats[8];
- struct p54_tx_vdcf_queues qos_params[8];
+ struct p54_edcf_queue_param qos_params[8];
struct ieee80211_low_level_stats stats;
struct timer_list stats_timer;
struct completion stats_comp;
diff -Nurp a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c
--- a/drivers/net/wireless/p54/p54pci.c 2008-10-02 03:21:13.000000000 +0200
+++ b/drivers/net/wireless/p54/p54pci.c 2008-10-04 02:05:13.000000000 +0200
@@ -306,7 +306,7 @@ static irqreturn_t p54p_interrupt(int ir
return reg ? IRQ_HANDLED : IRQ_NONE;
}
-static void p54p_tx(struct ieee80211_hw *dev, struct p54_control_hdr *data,
+static void p54p_tx(struct ieee80211_hw *dev, struct p54_hdr *data,
struct sk_buff *skb, size_t len, int free_on_tx)
{
struct p54p_priv *priv = dev->priv;
diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c
--- a/drivers/net/wireless/p54/p54usb.c 2008-10-04 01:02:41.000000000 +0200
+++ b/drivers/net/wireless/p54/p54usb.c 2008-10-04 02:05:29.000000000 +0200
@@ -213,7 +213,7 @@ static void p54u_free_urbs(struct ieee80
}
}
-static void p54u_tx_3887(struct ieee80211_hw *dev, struct p54_control_hdr *data,
+static void p54u_tx_3887(struct ieee80211_hw *dev, struct p54_hdr *data,
struct sk_buff *skb, size_t len, int free_on_tx)
{
struct p54u_priv *priv = dev->priv;
@@ -253,7 +253,7 @@ static __le32 p54u_lm87_chksum(const u32
return cpu_to_le32(chk);
}
-static void p54u_tx_lm87(struct ieee80211_hw *dev, struct p54_control_hdr *data,
+static void p54u_tx_lm87(struct ieee80211_hw *dev, struct p54_hdr *data,
struct sk_buff *skb, size_t len, int free_on_tx)
{
struct p54u_priv *priv = dev->priv;
@@ -276,7 +276,7 @@ static void p54u_tx_lm87(struct ieee8021
usb_submit_urb(data_urb, GFP_ATOMIC);
}
-static void p54u_tx_net2280(struct ieee80211_hw *dev, struct p54_control_hdr *data,
+static void p54u_tx_net2280(struct ieee80211_hw *dev, struct p54_hdr *data,
struct sk_buff *skb, size_t len, int free_on_tx)
{
struct p54u_priv *priv = dev->priv;
next reply other threads:[~2008-10-05 0:35 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-05 0:39 Christian Lamparter [this message]
2008-10-06 18:30 ` [RFC][PATCH 5/5] p54: integrate parts of lmac_longbow.h and stlc45xx John W. Linville
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200810050239.44845.chunkeey@web.de \
--to=chunkeey@web.de \
--cc=Larry.Finger@lwfinger.net \
--cc=johannes@sipsolutions.net \
--cc=kalle.valo@nokia.com \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
--cc=mcgrof@gmail.com \
--cc=tim.dewaal@yahoo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.