Commit 788c0a53 authored by David S. Miller's avatar David S. Miller

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/linville/wireless-next-2.6

Conflicts:

	drivers/net/ps3_gelic_wireless.c
	drivers/net/wireless/libertas/main.c
parents e64bda89 78cf0747
...@@ -2284,6 +2284,19 @@ config GELIC_WIRELESS ...@@ -2284,6 +2284,19 @@ config GELIC_WIRELESS
the driver automatically distinguishes the models, you can the driver automatically distinguishes the models, you can
safely enable this option even if you have a wireless-less model. safely enable this option even if you have a wireless-less model.
config GELIC_WIRELESS_OLD_PSK_INTERFACE
bool "PS3 Wireless private PSK interface (OBSOLETE)"
depends on GELIC_WIRELESS
help
This option retains the obsolete private interface to pass
the PSK from user space programs to the driver. The PSK
stands for 'Pre Shared Key' and is used for WPA[2]-PSK
(WPA-Personal) environment.
If WPA[2]-PSK is used and you need to use old programs that
support only this old interface, say Y. Otherwise N.
If unsure, say N.
config GIANFAR config GIANFAR
tristate "Gianfar Ethernet" tristate "Gianfar Ethernet"
depends on FSL_SOC depends on FSL_SOC
......
This diff is collapsed.
...@@ -288,9 +288,6 @@ struct gelic_wl_info { ...@@ -288,9 +288,6 @@ struct gelic_wl_info {
u8 active_bssid[ETH_ALEN]; /* associated bssid */ u8 active_bssid[ETH_ALEN]; /* associated bssid */
unsigned int essid_len; unsigned int essid_len;
/* buffer for hypervisor IO */
void *buf;
struct iw_public_data wireless_data; struct iw_public_data wireless_data;
struct iw_statistics iwstat; struct iw_statistics iwstat;
}; };
......
...@@ -324,7 +324,7 @@ static void adm8211_interrupt_tci(struct ieee80211_hw *dev) ...@@ -324,7 +324,7 @@ static void adm8211_interrupt_tci(struct ieee80211_hw *dev)
for (dirty_tx = priv->dirty_tx; priv->cur_tx - dirty_tx; dirty_tx++) { for (dirty_tx = priv->dirty_tx; priv->cur_tx - dirty_tx; dirty_tx++) {
unsigned int entry = dirty_tx % priv->tx_ring_size; unsigned int entry = dirty_tx % priv->tx_ring_size;
u32 status = le32_to_cpu(priv->tx_ring[entry].status); u32 status = le32_to_cpu(priv->tx_ring[entry].status);
struct ieee80211_tx_status tx_status; struct ieee80211_tx_info *txi;
struct adm8211_tx_ring_info *info; struct adm8211_tx_ring_info *info;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -334,24 +334,23 @@ static void adm8211_interrupt_tci(struct ieee80211_hw *dev) ...@@ -334,24 +334,23 @@ static void adm8211_interrupt_tci(struct ieee80211_hw *dev)
info = &priv->tx_buffers[entry]; info = &priv->tx_buffers[entry];
skb = info->skb; skb = info->skb;
txi = IEEE80211_SKB_CB(skb);
/* TODO: check TDES0_STATUS_TUF and TDES0_STATUS_TRO */ /* TODO: check TDES0_STATUS_TUF and TDES0_STATUS_TRO */
pci_unmap_single(priv->pdev, info->mapping, pci_unmap_single(priv->pdev, info->mapping,
info->skb->len, PCI_DMA_TODEVICE); info->skb->len, PCI_DMA_TODEVICE);
memset(&tx_status, 0, sizeof(tx_status)); memset(&txi->status, 0, sizeof(txi->status));
skb_pull(skb, sizeof(struct adm8211_tx_hdr)); skb_pull(skb, sizeof(struct adm8211_tx_hdr));
memcpy(skb_push(skb, info->hdrlen), skb->cb, info->hdrlen); memcpy(skb_push(skb, info->hdrlen), skb->cb, info->hdrlen);
memcpy(&tx_status.control, &info->tx_control, if (!(txi->flags & IEEE80211_TX_CTL_NO_ACK)) {
sizeof(tx_status.control));
if (!(tx_status.control.flags & IEEE80211_TXCTL_NO_ACK)) {
if (status & TDES0_STATUS_ES) if (status & TDES0_STATUS_ES)
tx_status.excessive_retries = 1; txi->status.excessive_retries = 1;
else else
tx_status.flags |= IEEE80211_TX_STATUS_ACK; txi->flags |= IEEE80211_TX_STAT_ACK;
} }
ieee80211_tx_status_irqsafe(dev, skb, &tx_status); ieee80211_tx_status_irqsafe(dev, skb);
info->skb = NULL; info->skb = NULL;
} }
...@@ -1638,7 +1637,6 @@ static void adm8211_calc_durations(int *dur, int *plcp, size_t payload_len, int ...@@ -1638,7 +1637,6 @@ static void adm8211_calc_durations(int *dur, int *plcp, size_t payload_len, int
/* Transmit skb w/adm8211_tx_hdr (802.11 header created by hardware) */ /* Transmit skb w/adm8211_tx_hdr (802.11 header created by hardware) */
static void adm8211_tx_raw(struct ieee80211_hw *dev, struct sk_buff *skb, static void adm8211_tx_raw(struct ieee80211_hw *dev, struct sk_buff *skb,
u16 plcp_signal, u16 plcp_signal,
struct ieee80211_tx_control *control,
size_t hdrlen) size_t hdrlen)
{ {
struct adm8211_priv *priv = dev->priv; struct adm8211_priv *priv = dev->priv;
...@@ -1664,7 +1662,6 @@ static void adm8211_tx_raw(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -1664,7 +1662,6 @@ static void adm8211_tx_raw(struct ieee80211_hw *dev, struct sk_buff *skb,
priv->tx_buffers[entry].skb = skb; priv->tx_buffers[entry].skb = skb;
priv->tx_buffers[entry].mapping = mapping; priv->tx_buffers[entry].mapping = mapping;
memcpy(&priv->tx_buffers[entry].tx_control, control, sizeof(*control));
priv->tx_buffers[entry].hdrlen = hdrlen; priv->tx_buffers[entry].hdrlen = hdrlen;
priv->tx_ring[entry].buffer1 = cpu_to_le32(mapping); priv->tx_ring[entry].buffer1 = cpu_to_le32(mapping);
...@@ -1685,18 +1682,18 @@ static void adm8211_tx_raw(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -1685,18 +1682,18 @@ static void adm8211_tx_raw(struct ieee80211_hw *dev, struct sk_buff *skb,
} }
/* Put adm8211_tx_hdr on skb and transmit */ /* Put adm8211_tx_hdr on skb and transmit */
static int adm8211_tx(struct ieee80211_hw *dev, struct sk_buff *skb, static int adm8211_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
struct ieee80211_tx_control *control)
{ {
struct adm8211_tx_hdr *txhdr; struct adm8211_tx_hdr *txhdr;
u16 fc; u16 fc;
size_t payload_len, hdrlen; size_t payload_len, hdrlen;
int plcp, dur, len, plcp_signal, short_preamble; int plcp, dur, len, plcp_signal, short_preamble;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_rate *txrate = ieee80211_get_tx_rate(dev, info);
short_preamble = !!(control->tx_rate->flags & short_preamble = !!(txrate->flags & IEEE80211_TX_CTL_SHORT_PREAMBLE);
IEEE80211_TXCTL_SHORT_PREAMBLE); plcp_signal = txrate->bitrate;
plcp_signal = control->tx_rate->bitrate;
hdr = (struct ieee80211_hdr *)skb->data; hdr = (struct ieee80211_hdr *)skb->data;
fc = le16_to_cpu(hdr->frame_control) & ~IEEE80211_FCTL_PROTECTED; fc = le16_to_cpu(hdr->frame_control) & ~IEEE80211_FCTL_PROTECTED;
...@@ -1730,15 +1727,15 @@ static int adm8211_tx(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -1730,15 +1727,15 @@ static int adm8211_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
if (short_preamble) if (short_preamble)
txhdr->header_control |= cpu_to_le16(ADM8211_TXHDRCTL_SHORT_PREAMBLE); txhdr->header_control |= cpu_to_le16(ADM8211_TXHDRCTL_SHORT_PREAMBLE);
if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) if (info->flags & IEEE80211_TX_CTL_USE_RTS_CTS)
txhdr->header_control |= cpu_to_le16(ADM8211_TXHDRCTL_ENABLE_RTS); txhdr->header_control |= cpu_to_le16(ADM8211_TXHDRCTL_ENABLE_RTS);
if (fc & IEEE80211_FCTL_PROTECTED) if (fc & IEEE80211_FCTL_PROTECTED)
txhdr->header_control |= cpu_to_le16(ADM8211_TXHDRCTL_ENABLE_WEP_ENGINE); txhdr->header_control |= cpu_to_le16(ADM8211_TXHDRCTL_ENABLE_WEP_ENGINE);
txhdr->retry_limit = control->retry_limit; txhdr->retry_limit = info->control.retry_limit;
adm8211_tx_raw(dev, skb, plcp_signal, control, hdrlen); adm8211_tx_raw(dev, skb, plcp_signal, hdrlen);
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
...@@ -2015,7 +2012,7 @@ static int adm8211_resume(struct pci_dev *pdev) ...@@ -2015,7 +2012,7 @@ static int adm8211_resume(struct pci_dev *pdev)
if (priv->mode != IEEE80211_IF_TYPE_INVALID) { if (priv->mode != IEEE80211_IF_TYPE_INVALID) {
adm8211_start(dev); adm8211_start(dev);
ieee80211_start_queues(dev); ieee80211_wake_queues(dev);
} }
return 0; return 0;
......
...@@ -443,7 +443,6 @@ struct adm8211_rx_ring_info { ...@@ -443,7 +443,6 @@ struct adm8211_rx_ring_info {
struct adm8211_tx_ring_info { struct adm8211_tx_ring_info {
struct sk_buff *skb; struct sk_buff *skb;
dma_addr_t mapping; dma_addr_t mapping;
struct ieee80211_tx_control tx_control;
size_t hdrlen; size_t hdrlen;
}; };
......
...@@ -167,8 +167,7 @@ static struct pci_driver ath5k_pci_driver = { ...@@ -167,8 +167,7 @@ static struct pci_driver ath5k_pci_driver = {
/* /*
* Prototypes - MAC 802.11 stack related functions * Prototypes - MAC 802.11 stack related functions
*/ */
static int ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb, static int ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb);
struct ieee80211_tx_control *ctl);
static int ath5k_reset(struct ieee80211_hw *hw); static int ath5k_reset(struct ieee80211_hw *hw);
static int ath5k_start(struct ieee80211_hw *hw); static int ath5k_start(struct ieee80211_hw *hw);
static void ath5k_stop(struct ieee80211_hw *hw); static void ath5k_stop(struct ieee80211_hw *hw);
...@@ -196,8 +195,7 @@ static int ath5k_get_tx_stats(struct ieee80211_hw *hw, ...@@ -196,8 +195,7 @@ static int ath5k_get_tx_stats(struct ieee80211_hw *hw,
static u64 ath5k_get_tsf(struct ieee80211_hw *hw); static u64 ath5k_get_tsf(struct ieee80211_hw *hw);
static void ath5k_reset_tsf(struct ieee80211_hw *hw); static void ath5k_reset_tsf(struct ieee80211_hw *hw);
static int ath5k_beacon_update(struct ieee80211_hw *hw, static int ath5k_beacon_update(struct ieee80211_hw *hw,
struct sk_buff *skb, struct sk_buff *skb);
struct ieee80211_tx_control *ctl);
static struct ieee80211_ops ath5k_hw_ops = { static struct ieee80211_ops ath5k_hw_ops = {
.tx = ath5k_tx, .tx = ath5k_tx,
...@@ -251,9 +249,7 @@ static void ath5k_desc_free(struct ath5k_softc *sc, ...@@ -251,9 +249,7 @@ static void ath5k_desc_free(struct ath5k_softc *sc,
static int ath5k_rxbuf_setup(struct ath5k_softc *sc, static int ath5k_rxbuf_setup(struct ath5k_softc *sc,
struct ath5k_buf *bf); struct ath5k_buf *bf);
static int ath5k_txbuf_setup(struct ath5k_softc *sc, static int ath5k_txbuf_setup(struct ath5k_softc *sc,
struct ath5k_buf *bf, struct ath5k_buf *bf);
struct ieee80211_tx_control *ctl);
static inline void ath5k_txbuf_free(struct ath5k_softc *sc, static inline void ath5k_txbuf_free(struct ath5k_softc *sc,
struct ath5k_buf *bf) struct ath5k_buf *bf)
{ {
...@@ -289,8 +285,7 @@ static void ath5k_tx_processq(struct ath5k_softc *sc, ...@@ -289,8 +285,7 @@ static void ath5k_tx_processq(struct ath5k_softc *sc,
static void ath5k_tasklet_tx(unsigned long data); static void ath5k_tasklet_tx(unsigned long data);
/* Beacon handling */ /* Beacon handling */
static int ath5k_beacon_setup(struct ath5k_softc *sc, static int ath5k_beacon_setup(struct ath5k_softc *sc,
struct ath5k_buf *bf, struct ath5k_buf *bf);
struct ieee80211_tx_control *ctl);
static void ath5k_beacon_send(struct ath5k_softc *sc); static void ath5k_beacon_send(struct ath5k_softc *sc);
static void ath5k_beacon_config(struct ath5k_softc *sc); static void ath5k_beacon_config(struct ath5k_softc *sc);
static void ath5k_beacon_update_timers(struct ath5k_softc *sc, u64 bc_tsf); static void ath5k_beacon_update_timers(struct ath5k_softc *sc, u64 bc_tsf);
...@@ -1295,36 +1290,36 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) ...@@ -1295,36 +1290,36 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
} }
static int static int
ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf, ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
struct ieee80211_tx_control *ctl)
{ {
struct ath5k_hw *ah = sc->ah; struct ath5k_hw *ah = sc->ah;
struct ath5k_txq *txq = sc->txq; struct ath5k_txq *txq = sc->txq;
struct ath5k_desc *ds = bf->desc; struct ath5k_desc *ds = bf->desc;
struct sk_buff *skb = bf->skb; struct sk_buff *skb = bf->skb;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
unsigned int pktlen, flags, keyidx = AR5K_TXKEYIX_INVALID; unsigned int pktlen, flags, keyidx = AR5K_TXKEYIX_INVALID;
int ret; int ret;
flags = AR5K_TXDESC_INTREQ | AR5K_TXDESC_CLRDMASK; flags = AR5K_TXDESC_INTREQ | AR5K_TXDESC_CLRDMASK;
bf->ctl = *ctl;
/* XXX endianness */ /* XXX endianness */
bf->skbaddr = pci_map_single(sc->pdev, skb->data, skb->len, bf->skbaddr = pci_map_single(sc->pdev, skb->data, skb->len,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
if (ctl->flags & IEEE80211_TXCTL_NO_ACK) if (info->flags & IEEE80211_TX_CTL_NO_ACK)
flags |= AR5K_TXDESC_NOACK; flags |= AR5K_TXDESC_NOACK;
pktlen = skb->len; pktlen = skb->len;
if (!(ctl->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT)) { if (!(info->flags & IEEE80211_TX_CTL_DO_NOT_ENCRYPT)) {
keyidx = ctl->hw_key->hw_key_idx; keyidx = info->control.hw_key->hw_key_idx;
pktlen += ctl->icv_len; pktlen += info->control.icv_len;
} }
ret = ah->ah_setup_tx_desc(ah, ds, pktlen, ret = ah->ah_setup_tx_desc(ah, ds, pktlen,
ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL, ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL,
(sc->power_level * 2), ctl->tx_rate->hw_value, (sc->power_level * 2),
ctl->retry_limit, keyidx, 0, flags, 0, 0); ieee80211_get_tx_rate(sc->hw, info)->hw_value,
info->control.retry_limit, keyidx, 0, flags, 0, 0);
if (ret) if (ret)
goto err_unmap; goto err_unmap;
...@@ -1599,7 +1594,7 @@ ath5k_txq_cleanup(struct ath5k_softc *sc) ...@@ -1599,7 +1594,7 @@ ath5k_txq_cleanup(struct ath5k_softc *sc)
sc->txqs[i].link); sc->txqs[i].link);
} }
} }
ieee80211_start_queues(sc->hw); /* XXX move to callers */ ieee80211_wake_queues(sc->hw); /* XXX move to callers */
for (i = 0; i < ARRAY_SIZE(sc->txqs); i++) for (i = 0; i < ARRAY_SIZE(sc->txqs); i++)
if (sc->txqs[i].setup) if (sc->txqs[i].setup)
...@@ -1926,11 +1921,11 @@ ath5k_tasklet_rx(unsigned long data) ...@@ -1926,11 +1921,11 @@ ath5k_tasklet_rx(unsigned long data)
static void static void
ath5k_tx_processq(struct ath5k_softc *sc, struct ath5k_txq *txq) ath5k_tx_processq(struct ath5k_softc *sc, struct ath5k_txq *txq)
{ {
struct ieee80211_tx_status txs = {};
struct ath5k_tx_status ts = {}; struct ath5k_tx_status ts = {};
struct ath5k_buf *bf, *bf0; struct ath5k_buf *bf, *bf0;
struct ath5k_desc *ds; struct ath5k_desc *ds;
struct sk_buff *skb; struct sk_buff *skb;
struct ieee80211_tx_info *info;
int ret; int ret;
spin_lock(&txq->lock); spin_lock(&txq->lock);
...@@ -1950,24 +1945,25 @@ ath5k_tx_processq(struct ath5k_softc *sc, struct ath5k_txq *txq) ...@@ -1950,24 +1945,25 @@ ath5k_tx_processq(struct ath5k_softc *sc, struct ath5k_txq *txq)
} }
skb = bf->skb; skb = bf->skb;
info = IEEE80211_SKB_CB(skb);
bf->skb = NULL; bf->skb = NULL;
pci_unmap_single(sc->pdev, bf->skbaddr, skb->len, pci_unmap_single(sc->pdev, bf->skbaddr, skb->len,
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
txs.control = bf->ctl; info->status.retry_count = ts.ts_shortretry + ts.ts_longretry / 6;
txs.retry_count = ts.ts_shortretry + ts.ts_longretry / 6;
if (unlikely(ts.ts_status)) { if (unlikely(ts.ts_status)) {
sc->ll_stats.dot11ACKFailureCount++; sc->ll_stats.dot11ACKFailureCount++;
if (ts.ts_status & AR5K_TXERR_XRETRY) if (ts.ts_status & AR5K_TXERR_XRETRY)
txs.excessive_retries = 1; info->status.excessive_retries = 1;
else if (ts.ts_status & AR5K_TXERR_FILT) else if (ts.ts_status & AR5K_TXERR_FILT)
txs.flags |= IEEE80211_TX_STATUS_TX_FILTERED; info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
} else { } else {
txs.flags |= IEEE80211_TX_STATUS_ACK; info->flags |= IEEE80211_TX_STAT_ACK;
txs.ack_signal = ts.ts_rssi; info->status.ack_signal = ts.ts_rssi;
} }
ieee80211_tx_status(sc->hw, skb, &txs); ieee80211_tx_status(sc->hw, skb);
sc->tx_stats[txq->qnum].count++; sc->tx_stats[txq->qnum].count++;
spin_lock(&sc->txbuflock); spin_lock(&sc->txbuflock);
...@@ -2004,10 +2000,10 @@ ath5k_tasklet_tx(unsigned long data) ...@@ -2004,10 +2000,10 @@ ath5k_tasklet_tx(unsigned long data)
* Setup the beacon frame for transmit. * Setup the beacon frame for transmit.
*/ */
static int static int
ath5k_beacon_setup(struct ath5k_softc *sc, struct ath5k_buf *bf, ath5k_beacon_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
struct ieee80211_tx_control *ctl)
{ {
struct sk_buff *skb = bf->skb; struct sk_buff *skb = bf->skb;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ath5k_hw *ah = sc->ah; struct ath5k_hw *ah = sc->ah;
struct ath5k_desc *ds; struct ath5k_desc *ds;
int ret, antenna = 0; int ret, antenna = 0;
...@@ -2046,7 +2042,8 @@ ath5k_beacon_setup(struct ath5k_softc *sc, struct ath5k_buf *bf, ...@@ -2046,7 +2042,8 @@ ath5k_beacon_setup(struct ath5k_softc *sc, struct ath5k_buf *bf,
ret = ah->ah_setup_tx_desc(ah, ds, skb->len, ret = ah->ah_setup_tx_desc(ah, ds, skb->len,
ieee80211_get_hdrlen_from_skb(skb), ieee80211_get_hdrlen_from_skb(skb),
AR5K_PKT_TYPE_BEACON, (sc->power_level * 2), AR5K_PKT_TYPE_BEACON, (sc->power_level * 2),
ctl->tx_rate->hw_value, 1, AR5K_TXKEYIX_INVALID, ieee80211_get_tx_rate(sc->hw, info)->hw_value,
1, AR5K_TXKEYIX_INVALID,
antenna, flags, 0, 0); antenna, flags, 0, 0);
if (ret) if (ret)
goto err_unmap; goto err_unmap;
...@@ -2624,11 +2621,11 @@ ath5k_led_event(struct ath5k_softc *sc, int event) ...@@ -2624,11 +2621,11 @@ ath5k_led_event(struct ath5k_softc *sc, int event)
\********************/ \********************/
static int static int
ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb, ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
struct ieee80211_tx_control *ctl)
{ {
struct ath5k_softc *sc = hw->priv; struct ath5k_softc *sc = hw->priv;
struct ath5k_buf *bf; struct ath5k_buf *bf;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
unsigned long flags; unsigned long flags;
int hdrlen; int hdrlen;
int pad; int pad;
...@@ -2654,13 +2651,13 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb, ...@@ -2654,13 +2651,13 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
memmove(skb->data, skb->data+pad, hdrlen); memmove(skb->data, skb->data+pad, hdrlen);
} }
sc->led_txrate = ctl->tx_rate->hw_value; sc->led_txrate = ieee80211_get_tx_rate(hw, info)->hw_value;
spin_lock_irqsave(&sc->txbuflock, flags); spin_lock_irqsave(&sc->txbuflock, flags);
if (list_empty(&sc->txbuf)) { if (list_empty(&sc->txbuf)) {
ATH5K_ERR(sc, "no further txbuf available, dropping packet\n"); ATH5K_ERR(sc, "no further txbuf available, dropping packet\n");
spin_unlock_irqrestore(&sc->txbuflock, flags); spin_unlock_irqrestore(&sc->txbuflock, flags);
ieee80211_stop_queue(hw, ctl->queue); ieee80211_stop_queue(hw, skb_get_queue_mapping(skb));
return -1; return -1;
} }
bf = list_first_entry(&sc->txbuf, struct ath5k_buf, list); bf = list_first_entry(&sc->txbuf, struct ath5k_buf, list);
...@@ -2672,7 +2669,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb, ...@@ -2672,7 +2669,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
bf->skb = skb; bf->skb = skb;
if (ath5k_txbuf_setup(sc, bf, ctl)) { if (ath5k_txbuf_setup(sc, bf)) {
bf->skb = NULL; bf->skb = NULL;
spin_lock_irqsave(&sc->txbuflock, flags); spin_lock_irqsave(&sc->txbuflock, flags);
list_add_tail(&bf->list, &sc->txbuf); list_add_tail(&bf->list, &sc->txbuf);
...@@ -3050,8 +3047,7 @@ ath5k_reset_tsf(struct ieee80211_hw *hw) ...@@ -3050,8 +3047,7 @@ ath5k_reset_tsf(struct ieee80211_hw *hw)
} }
static int static int
ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
struct ieee80211_tx_control *ctl)
{ {
struct ath5k_softc *sc = hw->priv; struct ath5k_softc *sc = hw->priv;
int ret; int ret;
...@@ -3067,7 +3063,7 @@ ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, ...@@ -3067,7 +3063,7 @@ ath5k_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,
ath5k_txbuf_free(sc, sc->bbuf); ath5k_txbuf_free(sc, sc->bbuf);
sc->bbuf->skb = skb; sc->bbuf->skb = skb;
ret = ath5k_beacon_setup(sc, sc->bbuf, ctl); ret = ath5k_beacon_setup(sc, sc->bbuf);
if (ret) if (ret)
sc->bbuf->skb = NULL; sc->bbuf->skb = NULL;
else else
......
...@@ -60,7 +60,6 @@ struct ath5k_buf { ...@@ -60,7 +60,6 @@ struct ath5k_buf {
dma_addr_t daddr; /* physical addr of desc */ dma_addr_t daddr; /* physical addr of desc */
struct sk_buff *skb; /* skbuff for buf */ struct sk_buff *skb; /* skbuff for buf */
dma_addr_t skbaddr;/* physical addr of skb data */ dma_addr_t skbaddr;/* physical addr of skb data */
struct ieee80211_tx_control ctl;
}; };
/* /*
......
...@@ -422,6 +422,26 @@ enum { ...@@ -422,6 +422,26 @@ enum {
B43_IRQ_RFKILL | \ B43_IRQ_RFKILL | \
B43_IRQ_TX_OK) B43_IRQ_TX_OK)
/* The firmware register to fetch the debug-IRQ reason from. */
#define B43_DEBUGIRQ_REASON_REG 63
/* Debug-IRQ reasons. */
#define B43_DEBUGIRQ_PANIC 0 /* The firmware panic'ed */
#define B43_DEBUGIRQ_DUMP_SHM 1 /* Dump shared SHM */
#define B43_DEBUGIRQ_DUMP_REGS 2 /* Dump the microcode registers */
#define B43_DEBUGIRQ_MARKER 3 /* A "marker" was thrown by the firmware. */
#define B43_DEBUGIRQ_ACK 0xFFFF /* The host writes that to ACK the IRQ */
/* The firmware register that contains the "marker" line. */
#define B43_MARKER_ID_REG 2
#define B43_MARKER_LINE_REG 3
/* The firmware register to fetch the panic reason from. */
#define B43_FWPANIC_REASON_REG 3
/* Firmware panic reason codes */
#define B43_FWPANIC_DIE 0 /* Firmware died. Don't auto-restart it. */
#define B43_FWPANIC_RESTART 1 /* Firmware died. Schedule a controller reset. */
/* Device specific rate values. /* Device specific rate values.
* The actual values defined here are (rate_in_mbps * 2). * The actual values defined here are (rate_in_mbps * 2).
* Some code depends on this. Don't change it. */ * Some code depends on this. Don't change it. */
...@@ -733,7 +753,6 @@ struct b43_wl { ...@@ -733,7 +753,6 @@ struct b43_wl {
/* The beacon we are currently using (AP or IBSS mode). /* The beacon we are currently using (AP or IBSS mode).
* This beacon stuff is protected by the irq_lock. */ * This beacon stuff is protected by the irq_lock. */
struct sk_buff *current_beacon; struct sk_buff *current_beacon;
struct ieee80211_tx_control beacon_txctl;
bool beacon0_uploaded; bool beacon0_uploaded;
bool beacon1_uploaded; bool beacon1_uploaded;
struct work_struct beacon_update_trigger; struct work_struct beacon_update_trigger;
...@@ -766,6 +785,13 @@ struct b43_firmware { ...@@ -766,6 +785,13 @@ struct b43_firmware {
u16 rev; u16 rev;
/* Firmware patchlevel */ /* Firmware patchlevel */
u16 patch; u16 patch;
/* Set to true, if we are using an opensource firmware. */
bool opensource;
/* Set to true, if the core needs a PCM firmware, but
* we failed to load one. This is always false for
* core rev > 10, as these don't need PCM firmware. */
bool pcm_request_failed;
}; };
/* Device (802.11 core) initialization status. */ /* Device (802.11 core) initialization status. */
......
...@@ -1131,10 +1131,10 @@ struct b43_dmaring *parse_cookie(struct b43_wldev *dev, u16 cookie, int *slot) ...@@ -1131,10 +1131,10 @@ struct b43_dmaring *parse_cookie(struct b43_wldev *dev, u16 cookie, int *slot)
} }
static int dma_tx_fragment(struct b43_dmaring *ring, static int dma_tx_fragment(struct b43_dmaring *ring,
struct sk_buff *skb, struct sk_buff *skb)
struct ieee80211_tx_control *ctl)
{ {
const struct b43_dma_ops *ops = ring->ops; const struct b43_dma_ops *ops = ring->ops;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
u8 *header; u8 *header;
int slot, old_top_slot, old_used_slots; int slot, old_top_slot, old_used_slots;
int err; int err;
...@@ -1158,7 +1158,7 @@ static int dma_tx_fragment(struct b43_dmaring *ring, ...@@ -1158,7 +1158,7 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
header = &(ring->txhdr_cache[slot * hdrsize]); header = &(ring->txhdr_cache[slot * hdrsize]);
cookie = generate_cookie(ring, slot); cookie = generate_cookie(ring, slot);
err = b43_generate_txhdr(ring->dev, header, err = b43_generate_txhdr(ring->dev, header,
skb->data, skb->len, ctl, cookie); skb->data, skb->len, info, cookie);
if (unlikely(err)) { if (unlikely(err)) {
ring->current_slot = old_top_slot; ring->current_slot = old_top_slot;
ring->used_slots = old_used_slots; ring->used_slots = old_used_slots;
...@@ -1180,7 +1180,6 @@ static int dma_tx_fragment(struct b43_dmaring *ring, ...@@ -1180,7 +1180,6 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
desc = ops->idx2desc(ring, slot, &meta); desc = ops->idx2desc(ring, slot, &meta);
memset(meta, 0, sizeof(*meta)); memset(meta, 0, sizeof(*meta));
memcpy(&meta->txstat.control, ctl, sizeof(*ctl));
meta->skb = skb; meta->skb = skb;
meta->is_last_fragment = 1; meta->is_last_fragment = 1;
...@@ -1210,7 +1209,7 @@ static int dma_tx_fragment(struct b43_dmaring *ring, ...@@ -1210,7 +1209,7 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
ops->fill_descriptor(ring, desc, meta->dmaaddr, skb->len, 0, 1, 1); ops->fill_descriptor(ring, desc, meta->dmaaddr, skb->len, 0, 1, 1);
if (ctl->flags & IEEE80211_TXCTL_SEND_AFTER_DTIM) { if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) {
/* Tell the firmware about the cookie of the last /* Tell the firmware about the cookie of the last
* mcast frame, so it can clear the more-data bit in it. */ * mcast frame, so it can clear the more-data bit in it. */
b43_shm_write16(ring->dev, B43_SHM_SHARED, b43_shm_write16(ring->dev, B43_SHM_SHARED,
...@@ -1281,16 +1280,16 @@ static struct b43_dmaring * select_ring_by_priority(struct b43_wldev *dev, ...@@ -1281,16 +1280,16 @@ static struct b43_dmaring * select_ring_by_priority(struct b43_wldev *dev,
return ring; return ring;
} }
int b43_dma_tx(struct b43_wldev *dev, int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb)
struct sk_buff *skb, struct ieee80211_tx_control *ctl)
{ {
struct b43_dmaring *ring; struct b43_dmaring *ring;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
int err = 0; int err = 0;
unsigned long flags; unsigned long flags;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
hdr = (struct ieee80211_hdr *)skb->data; hdr = (struct ieee80211_hdr *)skb->data;
if (ctl->flags & IEEE80211_TXCTL_SEND_AFTER_DTIM) { if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) {
/* The multicast ring will be sent after the DTIM */ /* The multicast ring will be sent after the DTIM */
ring = dev->dma.tx_ring_mcast; ring = dev->dma.tx_ring_mcast;
/* Set the more-data bit. Ucode will clear it on /* Set the more-data bit. Ucode will clear it on
...@@ -1298,7 +1297,8 @@ int b43_dma_tx(struct b43_wldev *dev, ...@@ -1298,7 +1297,8 @@ int b43_dma_tx(struct b43_wldev *dev,
hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA); hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA);
} else { } else {
/* Decide by priority where to put this frame. */ /* Decide by priority where to put this frame. */
ring = select_ring_by_priority(dev, ctl->queue); ring = select_ring_by_priority(
dev, skb_get_queue_mapping(skb));
} }
spin_lock_irqsave(&ring->lock, flags); spin_lock_irqsave(&ring->lock, flags);
...@@ -1316,9 +1316,9 @@ int b43_dma_tx(struct b43_wldev *dev, ...@@ -1316,9 +1316,9 @@ int b43_dma_tx(struct b43_wldev *dev,
/* Assign the queue number to the ring (if not already done before) /* Assign the queue number to the ring (if not already done before)
* so TX status handling can use it. The queue to ring mapping is * so TX status handling can use it. The queue to ring mapping is
* static, so we don't need to store it per frame. */ * static, so we don't need to store it per frame. */
ring->queue_prio = ctl->queue; ring->queue_prio = skb_get_queue_mapping(skb);
err = dma_tx_fragment(ring, skb, ctl); err = dma_tx_fragment(ring, skb);
if (unlikely(err == -ENOKEY)) { if (unlikely(err == -ENOKEY)) {
/* Drop this packet, as we don't have the encryption key /* Drop this packet, as we don't have the encryption key
* anymore and must not transmit it unencrypted. */ * anymore and must not transmit it unencrypted. */
...@@ -1334,7 +1334,7 @@ int b43_dma_tx(struct b43_wldev *dev, ...@@ -1334,7 +1334,7 @@ int b43_dma_tx(struct b43_wldev *dev,
if ((free_slots(ring) < SLOTS_PER_PACKET) || if ((free_slots(ring) < SLOTS_PER_PACKET) ||
should_inject_overflow(ring)) { should_inject_overflow(ring)) {
/* This TX ring is full. */ /* This TX ring is full. */
ieee80211_stop_queue(dev->wl->hw, ctl->queue); ieee80211_stop_queue(dev->wl->hw, skb_get_queue_mapping(skb));
ring->stopped = 1; ring->stopped = 1;
if (b43_debug(dev, B43_DBG_DMAVERBOSE)) { if (b43_debug(dev, B43_DBG_DMAVERBOSE)) {
b43dbg(dev->wl, "Stopped TX ring %d\n", ring->index); b43dbg(dev->wl, "Stopped TX ring %d\n", ring->index);
...@@ -1377,13 +1377,19 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, ...@@ -1377,13 +1377,19 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev,
b43_txhdr_size(dev), 1); b43_txhdr_size(dev), 1);
if (meta->is_last_fragment) { if (meta->is_last_fragment) {
B43_WARN_ON(!meta->skb); struct ieee80211_tx_info *info;
/* Call back to inform the ieee80211 subsystem about the
* status of the transmission. BUG_ON(!meta->skb);
* Some fields of txstat are already filled in dma_tx().
info = IEEE80211_SKB_CB(meta->skb);
memset(&info->status, 0, sizeof(info->status));
/*
* Call back to inform the ieee80211 subsystem about
* the status of the transmission.
*/ */
frame_succeed = b43_fill_txstatus_report( frame_succeed = b43_fill_txstatus_report(info, status);
&(meta->txstat), status);
#ifdef CONFIG_B43_DEBUG #ifdef CONFIG_B43_DEBUG
if (frame_succeed) if (frame_succeed)
ring->nr_succeed_tx_packets++; ring->nr_succeed_tx_packets++;
...@@ -1391,8 +1397,8 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, ...@@ -1391,8 +1397,8 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev,
ring->nr_failed_tx_packets++; ring->nr_failed_tx_packets++;
ring->nr_total_packet_tries += status->frame_count; ring->nr_total_packet_tries += status->frame_count;
#endif /* DEBUG */ #endif /* DEBUG */
ieee80211_tx_status_irqsafe(dev->wl->hw, meta->skb, ieee80211_tx_status_irqsafe(dev->wl->hw, meta->skb);
&(meta->txstat));
/* skb is freed by ieee80211_tx_status_irqsafe() */ /* skb is freed by ieee80211_tx_status_irqsafe() */
meta->skb = NULL; meta->skb = NULL;
} else { } else {
......
...@@ -181,7 +181,6 @@ struct b43_dmadesc_meta { ...@@ -181,7 +181,6 @@ struct b43_dmadesc_meta {
dma_addr_t dmaaddr; dma_addr_t dmaaddr;
/* ieee80211 TX status. Only used once per 802.11 frag. */ /* ieee80211 TX status. Only used once per 802.11 frag. */
bool is_last_fragment; bool is_last_fragment;
struct ieee80211_tx_status txstat;
}; };
struct b43_dmaring; struct b43_dmaring;
...@@ -285,7 +284,7 @@ void b43_dma_get_tx_stats(struct b43_wldev *dev, ...@@ -285,7 +284,7 @@ void b43_dma_get_tx_stats(struct b43_wldev *dev,
struct ieee80211_tx_queue_stats *stats); struct ieee80211_tx_queue_stats *stats);
int b43_dma_tx(struct b43_wldev *dev, int b43_dma_tx(struct b43_wldev *dev,
struct sk_buff *skb, struct ieee80211_tx_control *ctl); struct sk_buff *skb);
void b43_dma_handle_txstatus(struct b43_wldev *dev, void b43_dma_handle_txstatus(struct b43_wldev *dev,
const struct b43_txstatus *status); const struct b43_txstatus *status);
......
This diff is collapsed.
...@@ -446,29 +446,27 @@ static void pio_tx_frame_4byte_queue(struct b43_pio_txpacket *pack, ...@@ -446,29 +446,27 @@ static void pio_tx_frame_4byte_queue(struct b43_pio_txpacket *pack,
} }
static int pio_tx_frame(struct b43_pio_txqueue *q, static int pio_tx_frame(struct b43_pio_txqueue *q,
struct sk_buff *skb, struct sk_buff *skb)
struct ieee80211_tx_control *ctl)
{ {
struct b43_pio_txpacket *pack; struct b43_pio_txpacket *pack;
struct b43_txhdr txhdr; struct b43_txhdr txhdr;
u16 cookie; u16 cookie;
int err; int err;
unsigned int hdrlen; unsigned int hdrlen;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
B43_WARN_ON(list_empty(&q->packets_list)); B43_WARN_ON(list_empty(&q->packets_list));
pack = list_entry(q->packets_list.next, pack = list_entry(q->packets_list.next,
struct b43_pio_txpacket, list); struct b43_pio_txpacket, list);
memset(&pack->txstat, 0, sizeof(pack->txstat));
memcpy(&pack->txstat.control, ctl, sizeof(*ctl));
cookie = generate_cookie(q, pack); cookie = generate_cookie(q, pack);
hdrlen = b43_txhdr_size(q->dev); hdrlen = b43_txhdr_size(q->dev);
err = b43_generate_txhdr(q->dev, (u8 *)&txhdr, skb->data, err = b43_generate_txhdr(q->dev, (u8 *)&txhdr, skb->data,
skb->len, ctl, cookie); skb->len, info, cookie);
if (err) if (err)
return err; return err;
if (ctl->flags & IEEE80211_TXCTL_SEND_AFTER_DTIM) { if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) {
/* Tell the firmware about the cookie of the last /* Tell the firmware about the cookie of the last
* mcast frame, so it can clear the more-data bit in it. */ * mcast frame, so it can clear the more-data bit in it. */
b43_shm_write16(q->dev, B43_SHM_SHARED, b43_shm_write16(q->dev, B43_SHM_SHARED,
...@@ -492,17 +490,18 @@ static int pio_tx_frame(struct b43_pio_txqueue *q, ...@@ -492,17 +490,18 @@ static int pio_tx_frame(struct b43_pio_txqueue *q,
return 0; return 0;
} }
int b43_pio_tx(struct b43_wldev *dev, int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb)
struct sk_buff *skb, struct ieee80211_tx_control *ctl)
{ {
struct b43_pio_txqueue *q; struct b43_pio_txqueue *q;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
unsigned long flags; unsigned long flags;
unsigned int hdrlen, total_len; unsigned int hdrlen, total_len;
int err = 0; int err = 0;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
hdr = (struct ieee80211_hdr *)skb->data; hdr = (struct ieee80211_hdr *)skb->data;
if (ctl->flags & IEEE80211_TXCTL_SEND_AFTER_DTIM) {
if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) {
/* The multicast queue will be sent after the DTIM. */ /* The multicast queue will be sent after the DTIM. */
q = dev->pio.tx_queue_mcast; q = dev->pio.tx_queue_mcast;
/* Set the frame More-Data bit. Ucode will clear it /* Set the frame More-Data bit. Ucode will clear it
...@@ -510,7 +509,7 @@ int b43_pio_tx(struct b43_wldev *dev, ...@@ -510,7 +509,7 @@ int b43_pio_tx(struct b43_wldev *dev,
hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA); hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA);
} else { } else {
/* Decide by priority where to put this frame. */ /* Decide by priority where to put this frame. */
q = select_queue_by_priority(dev, ctl->queue); q = select_queue_by_priority(dev, skb_get_queue_mapping(skb));
} }
spin_lock_irqsave(&q->lock, flags); spin_lock_irqsave(&q->lock, flags);
...@@ -533,7 +532,7 @@ int b43_pio_tx(struct b43_wldev *dev, ...@@ -533,7 +532,7 @@ int b43_pio_tx(struct b43_wldev *dev,
if (total_len > (q->buffer_size - q->buffer_used)) { if (total_len > (q->buffer_size - q->buffer_used)) {
/* Not enough memory on the queue. */ /* Not enough memory on the queue. */
err = -EBUSY; err = -EBUSY;
ieee80211_stop_queue(dev->wl->hw, ctl->queue); ieee80211_stop_queue(dev->wl->hw, skb_get_queue_mapping(skb));
q->stopped = 1; q->stopped = 1;
goto out_unlock; goto out_unlock;
} }
...@@ -541,9 +540,9 @@ int b43_pio_tx(struct b43_wldev *dev, ...@@ -541,9 +540,9 @@ int b43_pio_tx(struct b43_wldev *dev,
/* Assign the queue number to the ring (if not already done before) /* Assign the queue number to the ring (if not already done before)
* so TX status handling can use it. The mac80211-queue to b43-queue * so TX status handling can use it. The mac80211-queue to b43-queue
* mapping is static, so we don't need to store it per frame. */ * mapping is static, so we don't need to store it per frame. */
q->queue_prio = ctl->queue; q->queue_prio = skb_get_queue_mapping(skb);
err = pio_tx_frame(q, skb, ctl); err = pio_tx_frame(q, skb);
if (unlikely(err == -ENOKEY)) { if (unlikely(err == -ENOKEY)) {
/* Drop this packet, as we don't have the encryption key /* Drop this packet, as we don't have the encryption key
* anymore and must not transmit it unencrypted. */ * anymore and must not transmit it unencrypted. */
...@@ -561,7 +560,7 @@ int b43_pio_tx(struct b43_wldev *dev, ...@@ -561,7 +560,7 @@ int b43_pio_tx(struct b43_wldev *dev,
if (((q->buffer_size - q->buffer_used) < roundup(2 + 2 + 6, 4)) || if (((q->buffer_size - q->buffer_used) < roundup(2 + 2 + 6, 4)) ||
(q->free_packet_slots == 0)) { (q->free_packet_slots == 0)) {
/* The queue is full. */ /* The queue is full. */
ieee80211_stop_queue(dev->wl->hw, ctl->queue); ieee80211_stop_queue(dev->wl->hw, skb_get_queue_mapping(skb));
q->stopped = 1; q->stopped = 1;
} }
...@@ -578,6 +577,7 @@ void b43_pio_handle_txstatus(struct b43_wldev *dev, ...@@ -578,6 +577,7 @@ void b43_pio_handle_txstatus(struct b43_wldev *dev,
struct b43_pio_txqueue *q; struct b43_pio_txqueue *q;
struct b43_pio_txpacket *pack = NULL; struct b43_pio_txpacket *pack = NULL;
unsigned int total_len; unsigned int total_len;
struct ieee80211_tx_info *info;
q = parse_cookie(dev, status->cookie, &pack); q = parse_cookie(dev, status->cookie, &pack);
if (unlikely(!q)) if (unlikely(!q))
...@@ -586,15 +586,17 @@ void b43_pio_handle_txstatus(struct b43_wldev *dev, ...@@ -586,15 +586,17 @@ void b43_pio_handle_txstatus(struct b43_wldev *dev,
spin_lock(&q->lock); /* IRQs are already disabled. */ spin_lock(&q->lock); /* IRQs are already disabled. */
b43_fill_txstatus_report(&(pack->txstat), status); info = (void *)pack->skb;
memset(&info->status, 0, sizeof(info->status));
b43_fill_txstatus_report(info, status);
total_len = pack->skb->len + b43_txhdr_size(dev); total_len = pack->skb->len + b43_txhdr_size(dev);
total_len = roundup(total_len, 4); total_len = roundup(total_len, 4);
q->buffer_used -= total_len; q->buffer_used -= total_len;
q->free_packet_slots += 1; q->free_packet_slots += 1;
ieee80211_tx_status_irqsafe(dev->wl->hw, pack->skb, ieee80211_tx_status_irqsafe(dev->wl->hw, pack->skb);
&(pack->txstat));
pack->skb = NULL; pack->skb = NULL;
list_add(&pack->list, &q->packets_list); list_add(&pack->list, &q->packets_list);
......
...@@ -62,8 +62,6 @@ struct b43_pio_txpacket { ...@@ -62,8 +62,6 @@ struct b43_pio_txpacket {
struct b43_pio_txqueue *queue; struct b43_pio_txqueue *queue;
/* The TX data packet. */ /* The TX data packet. */
struct sk_buff *skb; struct sk_buff *skb;
/* The status meta data. */
struct ieee80211_tx_status txstat;
/* Index in the (struct b43_pio_txqueue)->packets array. */ /* Index in the (struct b43_pio_txqueue)->packets array. */
u8 index; u8 index;
...@@ -167,8 +165,7 @@ int b43_pio_init(struct b43_wldev *dev); ...@@ -167,8 +165,7 @@ int b43_pio_init(struct b43_wldev *dev);
void b43_pio_stop(struct b43_wldev *dev); void b43_pio_stop(struct b43_wldev *dev);
void b43_pio_free(struct b43_wldev *dev); void b43_pio_free(struct b43_wldev *dev);
int b43_pio_tx(struct b43_wldev *dev, int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb);
struct sk_buff *skb, struct ieee80211_tx_control *ctl);
void b43_pio_handle_txstatus(struct b43_wldev *dev, void b43_pio_handle_txstatus(struct b43_wldev *dev,
const struct b43_txstatus *status); const struct b43_txstatus *status);
void b43_pio_get_tx_stats(struct b43_wldev *dev, void b43_pio_get_tx_stats(struct b43_wldev *dev,
...@@ -193,8 +190,7 @@ static inline void b43_pio_stop(struct b43_wldev *dev) ...@@ -193,8 +190,7 @@ static inline void b43_pio_stop(struct b43_wldev *dev)
{ {
} }
static inline int b43_pio_tx(struct b43_wldev *dev, static inline int b43_pio_tx(struct b43_wldev *dev,
struct sk_buff *skb, struct sk_buff *skb)
struct ieee80211_tx_control *ctl)
{ {
return 0; return 0;
} }
......
...@@ -185,14 +185,14 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -185,14 +185,14 @@ int b43_generate_txhdr(struct b43_wldev *dev,
u8 *_txhdr, u8 *_txhdr,
const unsigned char *fragment_data, const unsigned char *fragment_data,
unsigned int fragment_len, unsigned int fragment_len,
const struct ieee80211_tx_control *txctl, const struct ieee80211_tx_info *info,
u16 cookie) u16 cookie)
{ {
struct b43_txhdr *txhdr = (struct b43_txhdr *)_txhdr; struct b43_txhdr *txhdr = (struct b43_txhdr *)_txhdr;
const struct b43_phy *phy = &dev->phy; const struct b43_phy *phy = &dev->phy;
const struct ieee80211_hdr *wlhdr = const struct ieee80211_hdr *wlhdr =
(const struct ieee80211_hdr *)fragment_data; (const struct ieee80211_hdr *)fragment_data;
int use_encryption = (!(txctl->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT)); int use_encryption = (!(info->flags & IEEE80211_TX_CTL_DO_NOT_ENCRYPT));
u16 fctl = le16_to_cpu(wlhdr->frame_control); u16 fctl = le16_to_cpu(wlhdr->frame_control);
struct ieee80211_rate *fbrate; struct ieee80211_rate *fbrate;
u8 rate, rate_fb; u8 rate, rate_fb;
...@@ -201,13 +201,14 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -201,13 +201,14 @@ int b43_generate_txhdr(struct b43_wldev *dev,
u32 mac_ctl = 0; u32 mac_ctl = 0;
u16 phy_ctl = 0; u16 phy_ctl = 0;
u8 extra_ft = 0; u8 extra_ft = 0;
struct ieee80211_rate *txrate;
memset(txhdr, 0, sizeof(*txhdr)); memset(txhdr, 0, sizeof(*txhdr));
WARN_ON(!txctl->tx_rate); txrate = ieee80211_get_tx_rate(dev->wl->hw, info);
rate = txctl->tx_rate ? txctl->tx_rate->hw_value : B43_CCK_RATE_1MB; rate = txrate ? txrate->hw_value : B43_CCK_RATE_1MB;
rate_ofdm = b43_is_ofdm_rate(rate); rate_ofdm = b43_is_ofdm_rate(rate);
fbrate = txctl->alt_retry_rate ? : txctl->tx_rate; fbrate = ieee80211_get_alt_retry_rate(dev->wl->hw, info) ? : txrate;
rate_fb = fbrate->hw_value; rate_fb = fbrate->hw_value;
rate_fb_ofdm = b43_is_ofdm_rate(rate_fb); rate_fb_ofdm = b43_is_ofdm_rate(rate_fb);
...@@ -227,15 +228,13 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -227,15 +228,13 @@ int b43_generate_txhdr(struct b43_wldev *dev,
* use the original dur_id field. */ * use the original dur_id field. */
txhdr->dur_fb = wlhdr->duration_id; txhdr->dur_fb = wlhdr->duration_id;
} else { } else {
txhdr->dur_fb = ieee80211_generic_frame_duration(dev->wl->hw, txhdr->dur_fb = ieee80211_generic_frame_duration(
txctl->vif, dev->wl->hw, info->control.vif, fragment_len, fbrate);
fragment_len,
fbrate);
} }
plcp_fragment_len = fragment_len + FCS_LEN; plcp_fragment_len = fragment_len + FCS_LEN;
if (use_encryption) { if (use_encryption) {
u8 key_idx = txctl->hw_key->hw_key_idx; u8 key_idx = info->control.hw_key->hw_key_idx;
struct b43_key *key; struct b43_key *key;
int wlhdr_len; int wlhdr_len;
size_t iv_len; size_t iv_len;
...@@ -253,7 +252,7 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -253,7 +252,7 @@ int b43_generate_txhdr(struct b43_wldev *dev,
} }
/* Hardware appends ICV. */ /* Hardware appends ICV. */
plcp_fragment_len += txctl->icv_len; plcp_fragment_len += info->control.icv_len;
key_idx = b43_kidx_to_fw(dev, key_idx); key_idx = b43_kidx_to_fw(dev, key_idx);
mac_ctl |= (key_idx << B43_TXH_MAC_KEYIDX_SHIFT) & mac_ctl |= (key_idx << B43_TXH_MAC_KEYIDX_SHIFT) &
...@@ -261,7 +260,7 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -261,7 +260,7 @@ int b43_generate_txhdr(struct b43_wldev *dev,
mac_ctl |= (key->algorithm << B43_TXH_MAC_KEYALG_SHIFT) & mac_ctl |= (key->algorithm << B43_TXH_MAC_KEYALG_SHIFT) &
B43_TXH_MAC_KEYALG; B43_TXH_MAC_KEYALG;
wlhdr_len = ieee80211_get_hdrlen(fctl); wlhdr_len = ieee80211_get_hdrlen(fctl);
iv_len = min((size_t) txctl->iv_len, iv_len = min((size_t) info->control.iv_len,
ARRAY_SIZE(txhdr->iv)); ARRAY_SIZE(txhdr->iv));
memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len); memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len);
} }
...@@ -292,10 +291,10 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -292,10 +291,10 @@ int b43_generate_txhdr(struct b43_wldev *dev,
phy_ctl |= B43_TXH_PHY_ENC_OFDM; phy_ctl |= B43_TXH_PHY_ENC_OFDM;
else else
phy_ctl |= B43_TXH_PHY_ENC_CCK; phy_ctl |= B43_TXH_PHY_ENC_CCK;
if (txctl->flags & IEEE80211_TXCTL_SHORT_PREAMBLE) if (info->flags & IEEE80211_TX_CTL_SHORT_PREAMBLE)
phy_ctl |= B43_TXH_PHY_SHORTPRMBL; phy_ctl |= B43_TXH_PHY_SHORTPRMBL;
switch (b43_ieee80211_antenna_sanitize(dev, txctl->antenna_sel_tx)) { switch (b43_ieee80211_antenna_sanitize(dev, info->antenna_sel_tx)) {
case 0: /* Default */ case 0: /* Default */
phy_ctl |= B43_TXH_PHY_ANT01AUTO; phy_ctl |= B43_TXH_PHY_ANT01AUTO;
break; break;
...@@ -316,34 +315,36 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -316,34 +315,36 @@ int b43_generate_txhdr(struct b43_wldev *dev,
} }
/* MAC control */ /* MAC control */
if (!(txctl->flags & IEEE80211_TXCTL_NO_ACK)) if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
mac_ctl |= B43_TXH_MAC_ACK; mac_ctl |= B43_TXH_MAC_ACK;
if (!(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) && if (!(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) &&
((fctl & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL))) ((fctl & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL)))
mac_ctl |= B43_TXH_MAC_HWSEQ; mac_ctl |= B43_TXH_MAC_HWSEQ;
if (txctl->flags & IEEE80211_TXCTL_FIRST_FRAGMENT) if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
mac_ctl |= B43_TXH_MAC_STMSDU; mac_ctl |= B43_TXH_MAC_STMSDU;
if (phy->type == B43_PHYTYPE_A) if (phy->type == B43_PHYTYPE_A)
mac_ctl |= B43_TXH_MAC_5GHZ; mac_ctl |= B43_TXH_MAC_5GHZ;
if (txctl->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT) if (info->flags & IEEE80211_TX_CTL_LONG_RETRY_LIMIT)
mac_ctl |= B43_TXH_MAC_LONGFRAME; mac_ctl |= B43_TXH_MAC_LONGFRAME;
/* Generate the RTS or CTS-to-self frame */ /* Generate the RTS or CTS-to-self frame */
if ((txctl->flags & IEEE80211_TXCTL_USE_RTS_CTS) || if ((info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) ||
(txctl->flags & IEEE80211_TXCTL_USE_CTS_PROTECT)) { (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT)) {
unsigned int len; unsigned int len;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
int rts_rate, rts_rate_fb; int rts_rate, rts_rate_fb;
int rts_rate_ofdm, rts_rate_fb_ofdm; int rts_rate_ofdm, rts_rate_fb_ofdm;
struct b43_plcp_hdr6 *plcp; struct b43_plcp_hdr6 *plcp;
struct ieee80211_rate *rts_cts_rate;
WARN_ON(!txctl->rts_cts_rate); rts_cts_rate = ieee80211_get_rts_cts_rate(dev->wl->hw, info);
rts_rate = txctl->rts_cts_rate ? txctl->rts_cts_rate->hw_value : B43_CCK_RATE_1MB;
rts_rate = rts_cts_rate ? rts_cts_rate->hw_value : B43_CCK_RATE_1MB;
rts_rate_ofdm = b43_is_ofdm_rate(rts_rate); rts_rate_ofdm = b43_is_ofdm_rate(rts_rate);
rts_rate_fb = b43_calc_fallback_rate(rts_rate); rts_rate_fb = b43_calc_fallback_rate(rts_rate);
rts_rate_fb_ofdm = b43_is_ofdm_rate(rts_rate_fb); rts_rate_fb_ofdm = b43_is_ofdm_rate(rts_rate_fb);
if (txctl->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) { if (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT) {
struct ieee80211_cts *cts; struct ieee80211_cts *cts;
if (b43_is_old_txhdr_format(dev)) { if (b43_is_old_txhdr_format(dev)) {
...@@ -353,9 +354,9 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -353,9 +354,9 @@ int b43_generate_txhdr(struct b43_wldev *dev,
cts = (struct ieee80211_cts *) cts = (struct ieee80211_cts *)
(txhdr->new_format.rts_frame); (txhdr->new_format.rts_frame);
} }
ieee80211_ctstoself_get(dev->wl->hw, txctl->vif, ieee80211_ctstoself_get(dev->wl->hw, info->control.vif,
fragment_data, fragment_len, fragment_data, fragment_len,
txctl, cts); info, cts);
mac_ctl |= B43_TXH_MAC_SENDCTS; mac_ctl |= B43_TXH_MAC_SENDCTS;
len = sizeof(struct ieee80211_cts); len = sizeof(struct ieee80211_cts);
} else { } else {
...@@ -368,9 +369,9 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -368,9 +369,9 @@ int b43_generate_txhdr(struct b43_wldev *dev,
rts = (struct ieee80211_rts *) rts = (struct ieee80211_rts *)
(txhdr->new_format.rts_frame); (txhdr->new_format.rts_frame);
} }
ieee80211_rts_get(dev->wl->hw, txctl->vif, ieee80211_rts_get(dev->wl->hw, info->control.vif,
fragment_data, fragment_len, fragment_data, fragment_len,
txctl, rts); info, rts);
mac_ctl |= B43_TXH_MAC_SENDRTS; mac_ctl |= B43_TXH_MAC_SENDRTS;
len = sizeof(struct ieee80211_rts); len = sizeof(struct ieee80211_rts);
} }
...@@ -684,27 +685,27 @@ void b43_handle_txstatus(struct b43_wldev *dev, ...@@ -684,27 +685,27 @@ void b43_handle_txstatus(struct b43_wldev *dev,
/* Fill out the mac80211 TXstatus report based on the b43-specific /* Fill out the mac80211 TXstatus report based on the b43-specific
* txstatus report data. This returns a boolean whether the frame was * txstatus report data. This returns a boolean whether the frame was
* successfully transmitted. */ * successfully transmitted. */
bool b43_fill_txstatus_report(struct ieee80211_tx_status *report, bool b43_fill_txstatus_report(struct ieee80211_tx_info *report,
const struct b43_txstatus *status) const struct b43_txstatus *status)
{ {
bool frame_success = 1; bool frame_success = 1;
if (status->acked) { if (status->acked) {
/* The frame was ACKed. */ /* The frame was ACKed. */
report->flags |= IEEE80211_TX_STATUS_ACK; report->flags |= IEEE80211_TX_STAT_ACK;
} else { } else {
/* The frame was not ACKed... */ /* The frame was not ACKed... */
if (!(report->control.flags & IEEE80211_TXCTL_NO_ACK)) { if (!(report->flags & IEEE80211_TX_CTL_NO_ACK)) {
/* ...but we expected an ACK. */ /* ...but we expected an ACK. */
frame_success = 0; frame_success = 0;
report->excessive_retries = 1; report->status.excessive_retries = 1;
} }
} }
if (status->frame_count == 0) { if (status->frame_count == 0) {
/* The frame was not transmitted at all. */ /* The frame was not transmitted at all. */
report->retry_count = 0; report->status.retry_count = 0;
} else } else
report->retry_count = status->frame_count - 1; report->status.retry_count = status->frame_count - 1;
return frame_success; return frame_success;
} }
......
...@@ -178,7 +178,7 @@ int b43_generate_txhdr(struct b43_wldev *dev, ...@@ -178,7 +178,7 @@ int b43_generate_txhdr(struct b43_wldev *dev,
u8 * txhdr, u8 * txhdr,
const unsigned char *fragment_data, const unsigned char *fragment_data,
unsigned int fragment_len, unsigned int fragment_len,
const struct ieee80211_tx_control *txctl, u16 cookie); const struct ieee80211_tx_info *txctl, u16 cookie);
/* Transmit Status */ /* Transmit Status */
struct b43_txstatus { struct b43_txstatus {
...@@ -294,7 +294,7 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr); ...@@ -294,7 +294,7 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr);
void b43_handle_txstatus(struct b43_wldev *dev, void b43_handle_txstatus(struct b43_wldev *dev,
const struct b43_txstatus *status); const struct b43_txstatus *status);
bool b43_fill_txstatus_report(struct ieee80211_tx_status *report, bool b43_fill_txstatus_report(struct ieee80211_tx_info *report,
const struct b43_txstatus *status); const struct b43_txstatus *status);
void b43_tx_suspend(struct b43_wldev *dev); void b43_tx_suspend(struct b43_wldev *dev);
......
...@@ -1205,10 +1205,10 @@ struct b43legacy_dmaring *parse_cookie(struct b43legacy_wldev *dev, ...@@ -1205,10 +1205,10 @@ struct b43legacy_dmaring *parse_cookie(struct b43legacy_wldev *dev,
} }
static int dma_tx_fragment(struct b43legacy_dmaring *ring, static int dma_tx_fragment(struct b43legacy_dmaring *ring,
struct sk_buff *skb, struct sk_buff *skb)
struct ieee80211_tx_control *ctl)
{ {
const struct b43legacy_dma_ops *ops = ring->ops; const struct b43legacy_dma_ops *ops = ring->ops;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
u8 *header; u8 *header;
int slot, old_top_slot, old_used_slots; int slot, old_top_slot, old_used_slots;
int err; int err;
...@@ -1231,7 +1231,7 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring, ...@@ -1231,7 +1231,7 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring,
header = &(ring->txhdr_cache[slot * sizeof( header = &(ring->txhdr_cache[slot * sizeof(
struct b43legacy_txhdr_fw3)]); struct b43legacy_txhdr_fw3)]);
err = b43legacy_generate_txhdr(ring->dev, header, err = b43legacy_generate_txhdr(ring->dev, header,
skb->data, skb->len, ctl, skb->data, skb->len, info,
generate_cookie(ring, slot)); generate_cookie(ring, slot));
if (unlikely(err)) { if (unlikely(err)) {
ring->current_slot = old_top_slot; ring->current_slot = old_top_slot;
...@@ -1255,7 +1255,6 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring, ...@@ -1255,7 +1255,6 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring,
desc = ops->idx2desc(ring, slot, &meta); desc = ops->idx2desc(ring, slot, &meta);
memset(meta, 0, sizeof(*meta)); memset(meta, 0, sizeof(*meta));
memcpy(&meta->txstat.control, ctl, sizeof(*ctl));
meta->skb = skb; meta->skb = skb;
meta->is_last_fragment = 1; meta->is_last_fragment = 1;
...@@ -1323,14 +1322,13 @@ int should_inject_overflow(struct b43legacy_dmaring *ring) ...@@ -1323,14 +1322,13 @@ int should_inject_overflow(struct b43legacy_dmaring *ring)
} }
int b43legacy_dma_tx(struct b43legacy_wldev *dev, int b43legacy_dma_tx(struct b43legacy_wldev *dev,
struct sk_buff *skb, struct sk_buff *skb)
struct ieee80211_tx_control *ctl)
{ {
struct b43legacy_dmaring *ring; struct b43legacy_dmaring *ring;
int err = 0; int err = 0;
unsigned long flags; unsigned long flags;
ring = priority_to_txring(dev, ctl->queue); ring = priority_to_txring(dev, skb_get_queue_mapping(skb));
spin_lock_irqsave(&ring->lock, flags); spin_lock_irqsave(&ring->lock, flags);
B43legacy_WARN_ON(!ring->tx); B43legacy_WARN_ON(!ring->tx);
if (unlikely(free_slots(ring) < SLOTS_PER_PACKET)) { if (unlikely(free_slots(ring) < SLOTS_PER_PACKET)) {
...@@ -1343,7 +1341,7 @@ int b43legacy_dma_tx(struct b43legacy_wldev *dev, ...@@ -1343,7 +1341,7 @@ int b43legacy_dma_tx(struct b43legacy_wldev *dev,
* That would be a mac80211 bug. */ * That would be a mac80211 bug. */
B43legacy_BUG_ON(ring->stopped); B43legacy_BUG_ON(ring->stopped);
err = dma_tx_fragment(ring, skb, ctl); err = dma_tx_fragment(ring, skb);
if (unlikely(err == -ENOKEY)) { if (unlikely(err == -ENOKEY)) {
/* Drop this packet, as we don't have the encryption key /* Drop this packet, as we don't have the encryption key
* anymore and must not transmit it unencrypted. */ * anymore and must not transmit it unencrypted. */
...@@ -1401,26 +1399,29 @@ void b43legacy_dma_handle_txstatus(struct b43legacy_wldev *dev, ...@@ -1401,26 +1399,29 @@ void b43legacy_dma_handle_txstatus(struct b43legacy_wldev *dev,
1); 1);
if (meta->is_last_fragment) { if (meta->is_last_fragment) {
B43legacy_WARN_ON(!meta->skb); struct ieee80211_tx_info *info;
BUG_ON(!meta->skb);
info = IEEE80211_SKB_CB(meta->skb);
/* Call back to inform the ieee80211 subsystem about the /* Call back to inform the ieee80211 subsystem about the
* status of the transmission. * status of the transmission.
* Some fields of txstat are already filled in dma_tx(). * Some fields of txstat are already filled in dma_tx().
*/ */
memset(&info->status, 0, sizeof(info->status));
if (status->acked) { if (status->acked) {
meta->txstat.flags |= IEEE80211_TX_STATUS_ACK; info->flags |= IEEE80211_TX_STAT_ACK;
} else { } else {
if (!(meta->txstat.control.flags if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
& IEEE80211_TXCTL_NO_ACK)) info->status.excessive_retries = 1;
meta->txstat.excessive_retries = 1;
} }
if (status->frame_count == 0) { if (status->frame_count == 0) {
/* The frame was not transmitted at all. */ /* The frame was not transmitted at all. */
meta->txstat.retry_count = 0; info->status.retry_count = 0;
} else } else
meta->txstat.retry_count = status->frame_count info->status.retry_count = status->frame_count
- 1; - 1;
ieee80211_tx_status_irqsafe(dev->wl->hw, meta->skb, ieee80211_tx_status_irqsafe(dev->wl->hw, meta->skb);
&(meta->txstat));
/* skb is freed by ieee80211_tx_status_irqsafe() */ /* skb is freed by ieee80211_tx_status_irqsafe() */
meta->skb = NULL; meta->skb = NULL;
} else { } else {
......
...@@ -195,7 +195,6 @@ struct b43legacy_dmadesc_meta { ...@@ -195,7 +195,6 @@ struct b43legacy_dmadesc_meta {
dma_addr_t dmaaddr; dma_addr_t dmaaddr;
/* ieee80211 TX status. Only used once per 802.11 frag. */ /* ieee80211 TX status. Only used once per 802.11 frag. */
bool is_last_fragment; bool is_last_fragment;
struct ieee80211_tx_status txstat;
}; };
struct b43legacy_dmaring; struct b43legacy_dmaring;
...@@ -297,8 +296,7 @@ void b43legacy_dma_get_tx_stats(struct b43legacy_wldev *dev, ...@@ -297,8 +296,7 @@ void b43legacy_dma_get_tx_stats(struct b43legacy_wldev *dev,
struct ieee80211_tx_queue_stats *stats); struct ieee80211_tx_queue_stats *stats);
int b43legacy_dma_tx(struct b43legacy_wldev *dev, int b43legacy_dma_tx(struct b43legacy_wldev *dev,
struct sk_buff *skb, struct sk_buff *skb);
struct ieee80211_tx_control *ctl);
void b43legacy_dma_handle_txstatus(struct b43legacy_wldev *dev, void b43legacy_dma_handle_txstatus(struct b43legacy_wldev *dev,
const struct b43legacy_txstatus *status); const struct b43legacy_txstatus *status);
...@@ -323,8 +321,7 @@ void b43legacy_dma_get_tx_stats(struct b43legacy_wldev *dev, ...@@ -323,8 +321,7 @@ void b43legacy_dma_get_tx_stats(struct b43legacy_wldev *dev,
} }
static inline static inline
int b43legacy_dma_tx(struct b43legacy_wldev *dev, int b43legacy_dma_tx(struct b43legacy_wldev *dev,
struct sk_buff *skb, struct sk_buff *skb)
struct ieee80211_tx_control *ctl)
{ {
return 0; return 0;
} }
......
...@@ -2358,8 +2358,7 @@ static int b43legacy_rng_init(struct b43legacy_wl *wl) ...@@ -2358,8 +2358,7 @@ static int b43legacy_rng_init(struct b43legacy_wl *wl)
} }
static int b43legacy_op_tx(struct ieee80211_hw *hw, static int b43legacy_op_tx(struct ieee80211_hw *hw,
struct sk_buff *skb, struct sk_buff *skb)
struct ieee80211_tx_control *ctl)
{ {
struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw); struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw);
struct b43legacy_wldev *dev = wl->current_dev; struct b43legacy_wldev *dev = wl->current_dev;
...@@ -2373,10 +2372,10 @@ static int b43legacy_op_tx(struct ieee80211_hw *hw, ...@@ -2373,10 +2372,10 @@ static int b43legacy_op_tx(struct ieee80211_hw *hw,
/* DMA-TX is done without a global lock. */ /* DMA-TX is done without a global lock. */
if (b43legacy_using_pio(dev)) { if (b43legacy_using_pio(dev)) {
spin_lock_irqsave(&wl->irq_lock, flags); spin_lock_irqsave(&wl->irq_lock, flags);
err = b43legacy_pio_tx(dev, skb, ctl); err = b43legacy_pio_tx(dev, skb);
spin_unlock_irqrestore(&wl->irq_lock, flags); spin_unlock_irqrestore(&wl->irq_lock, flags);
} else } else
err = b43legacy_dma_tx(dev, skb, ctl); err = b43legacy_dma_tx(dev, skb);
out: out:
if (unlikely(err)) if (unlikely(err))
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
...@@ -2794,7 +2793,6 @@ static int b43legacy_wireless_core_start(struct b43legacy_wldev *dev) ...@@ -2794,7 +2793,6 @@ static int b43legacy_wireless_core_start(struct b43legacy_wldev *dev)
/* Start data flow (TX/RX) */ /* Start data flow (TX/RX) */
b43legacy_mac_enable(dev); b43legacy_mac_enable(dev);
b43legacy_interrupt_enable(dev, dev->irq_savedstate); b43legacy_interrupt_enable(dev, dev->irq_savedstate);
ieee80211_start_queues(dev->wl->hw);
/* Start maintenance work */ /* Start maintenance work */
b43legacy_periodic_tasks_setup(dev); b43legacy_periodic_tasks_setup(dev);
...@@ -3410,7 +3408,7 @@ static int b43legacy_op_beacon_set_tim(struct ieee80211_hw *hw, ...@@ -3410,7 +3408,7 @@ static int b43legacy_op_beacon_set_tim(struct ieee80211_hw *hw,
* field, but that would probably require resizing and moving of data * field, but that would probably require resizing and moving of data
* within the beacon template. Simply request a new beacon and let * within the beacon template. Simply request a new beacon and let
* mac80211 do the hard work. */ * mac80211 do the hard work. */
beacon = ieee80211_beacon_get(hw, wl->vif, NULL); beacon = ieee80211_beacon_get(hw, wl->vif);
if (unlikely(!beacon)) if (unlikely(!beacon))
return -ENOMEM; return -ENOMEM;
spin_lock_irqsave(&wl->irq_lock, flags); spin_lock_irqsave(&wl->irq_lock, flags);
...@@ -3421,8 +3419,7 @@ static int b43legacy_op_beacon_set_tim(struct ieee80211_hw *hw, ...@@ -3421,8 +3419,7 @@ static int b43legacy_op_beacon_set_tim(struct ieee80211_hw *hw,
} }
static int b43legacy_op_ibss_beacon_update(struct ieee80211_hw *hw, static int b43legacy_op_ibss_beacon_update(struct ieee80211_hw *hw,
struct sk_buff *beacon, struct sk_buff *beacon)
struct ieee80211_tx_control *ctl)
{ {
struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw); struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw);
unsigned long flags; unsigned long flags;
......
...@@ -196,7 +196,7 @@ static int pio_tx_write_fragment(struct b43legacy_pioqueue *queue, ...@@ -196,7 +196,7 @@ static int pio_tx_write_fragment(struct b43legacy_pioqueue *queue,
B43legacy_WARN_ON(skb_shinfo(skb)->nr_frags != 0); B43legacy_WARN_ON(skb_shinfo(skb)->nr_frags != 0);
err = b43legacy_generate_txhdr(queue->dev, err = b43legacy_generate_txhdr(queue->dev,
txhdr, skb->data, skb->len, txhdr, skb->data, skb->len,
&packet->txstat.control, IEEE80211_SKB_CB(skb),
generate_cookie(queue, packet)); generate_cookie(queue, packet));
if (err) if (err)
return err; return err;
...@@ -463,8 +463,7 @@ int b43legacy_pio_init(struct b43legacy_wldev *dev) ...@@ -463,8 +463,7 @@ int b43legacy_pio_init(struct b43legacy_wldev *dev)
} }
int b43legacy_pio_tx(struct b43legacy_wldev *dev, int b43legacy_pio_tx(struct b43legacy_wldev *dev,
struct sk_buff *skb, struct sk_buff *skb)
struct ieee80211_tx_control *ctl)
{ {
struct b43legacy_pioqueue *queue = dev->pio.queue1; struct b43legacy_pioqueue *queue = dev->pio.queue1;
struct b43legacy_pio_txpacket *packet; struct b43legacy_pio_txpacket *packet;
...@@ -476,9 +475,6 @@ int b43legacy_pio_tx(struct b43legacy_wldev *dev, ...@@ -476,9 +475,6 @@ int b43legacy_pio_tx(struct b43legacy_wldev *dev,
list); list);
packet->skb = skb; packet->skb = skb;
memset(&packet->txstat, 0, sizeof(packet->txstat));
memcpy(&packet->txstat.control, ctl, sizeof(*ctl));
list_move_tail(&packet->list, &queue->txqueue); list_move_tail(&packet->list, &queue->txqueue);
queue->nr_txfree--; queue->nr_txfree--;
queue->nr_tx_packets++; queue->nr_tx_packets++;
...@@ -494,6 +490,7 @@ void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev, ...@@ -494,6 +490,7 @@ void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev,
{ {
struct b43legacy_pioqueue *queue; struct b43legacy_pioqueue *queue;
struct b43legacy_pio_txpacket *packet; struct b43legacy_pio_txpacket *packet;
struct ieee80211_tx_info *info;
queue = parse_cookie(dev, status->cookie, &packet); queue = parse_cookie(dev, status->cookie, &packet);
B43legacy_WARN_ON(!queue); B43legacy_WARN_ON(!queue);
...@@ -505,11 +502,13 @@ void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev, ...@@ -505,11 +502,13 @@ void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev,
queue->tx_devq_used -= (packet->skb->len + queue->tx_devq_used -= (packet->skb->len +
sizeof(struct b43legacy_txhdr_fw3)); sizeof(struct b43legacy_txhdr_fw3));
info = IEEE80211_SKB_CB(packet->skb);
memset(&info->status, 0, sizeof(info->status));
if (status->acked) if (status->acked)
packet->txstat.flags |= IEEE80211_TX_STATUS_ACK; info->flags |= IEEE80211_TX_STAT_ACK;
packet->txstat.retry_count = status->frame_count - 1; info->status.retry_count = status->frame_count - 1;
ieee80211_tx_status_irqsafe(dev->wl->hw, packet->skb, ieee80211_tx_status_irqsafe(dev->wl->hw, packet->skb);
&(packet->txstat));
packet->skb = NULL; packet->skb = NULL;
free_txpacket(packet, 1); free_txpacket(packet, 1);
......
...@@ -41,7 +41,6 @@ struct b43legacy_xmitstatus; ...@@ -41,7 +41,6 @@ struct b43legacy_xmitstatus;
struct b43legacy_pio_txpacket { struct b43legacy_pio_txpacket {
struct b43legacy_pioqueue *queue; struct b43legacy_pioqueue *queue;
struct sk_buff *skb; struct sk_buff *skb;
struct ieee80211_tx_status txstat;
struct list_head list; struct list_head list;
}; };
...@@ -104,8 +103,7 @@ int b43legacy_pio_init(struct b43legacy_wldev *dev); ...@@ -104,8 +103,7 @@ int b43legacy_pio_init(struct b43legacy_wldev *dev);
void b43legacy_pio_free(struct b43legacy_wldev *dev); void b43legacy_pio_free(struct b43legacy_wldev *dev);
int b43legacy_pio_tx(struct b43legacy_wldev *dev, int b43legacy_pio_tx(struct b43legacy_wldev *dev,
struct sk_buff *skb, struct sk_buff *skb);
struct ieee80211_tx_control *ctl);
void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev, void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev,
const struct b43legacy_txstatus *status); const struct b43legacy_txstatus *status);
void b43legacy_pio_get_tx_stats(struct b43legacy_wldev *dev, void b43legacy_pio_get_tx_stats(struct b43legacy_wldev *dev,
...@@ -132,8 +130,7 @@ void b43legacy_pio_free(struct b43legacy_wldev *dev) ...@@ -132,8 +130,7 @@ void b43legacy_pio_free(struct b43legacy_wldev *dev)
} }
static inline static inline
int b43legacy_pio_tx(struct b43legacy_wldev *dev, int b43legacy_pio_tx(struct b43legacy_wldev *dev,
struct sk_buff *skb, struct sk_buff *skb)
struct ieee80211_tx_control *ctl)
{ {
return 0; return 0;
} }
......
...@@ -188,11 +188,11 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, ...@@ -188,11 +188,11 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
struct b43legacy_txhdr_fw3 *txhdr, struct b43legacy_txhdr_fw3 *txhdr,
const unsigned char *fragment_data, const unsigned char *fragment_data,
unsigned int fragment_len, unsigned int fragment_len,
const struct ieee80211_tx_control *txctl, const struct ieee80211_tx_info *info,
u16 cookie) u16 cookie)
{ {
const struct ieee80211_hdr *wlhdr; const struct ieee80211_hdr *wlhdr;
int use_encryption = (!(txctl->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT)); int use_encryption = (!(info->flags & IEEE80211_TX_CTL_DO_NOT_ENCRYPT));
u16 fctl; u16 fctl;
u8 rate; u8 rate;
struct ieee80211_rate *rate_fb; struct ieee80211_rate *rate_fb;
...@@ -201,15 +201,18 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, ...@@ -201,15 +201,18 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
unsigned int plcp_fragment_len; unsigned int plcp_fragment_len;
u32 mac_ctl = 0; u32 mac_ctl = 0;
u16 phy_ctl = 0; u16 phy_ctl = 0;
struct ieee80211_rate *tx_rate;
wlhdr = (const struct ieee80211_hdr *)fragment_data; wlhdr = (const struct ieee80211_hdr *)fragment_data;
fctl = le16_to_cpu(wlhdr->frame_control); fctl = le16_to_cpu(wlhdr->frame_control);
memset(txhdr, 0, sizeof(*txhdr)); memset(txhdr, 0, sizeof(*txhdr));
rate = txctl->tx_rate->hw_value; tx_rate = ieee80211_get_tx_rate(dev->wl->hw, info);
rate = tx_rate->hw_value;
rate_ofdm = b43legacy_is_ofdm_rate(rate); rate_ofdm = b43legacy_is_ofdm_rate(rate);
rate_fb = txctl->alt_retry_rate ? : txctl->tx_rate; rate_fb = ieee80211_get_alt_retry_rate(dev->wl->hw, info) ? : tx_rate;
rate_fb_ofdm = b43legacy_is_ofdm_rate(rate_fb->hw_value); rate_fb_ofdm = b43legacy_is_ofdm_rate(rate_fb->hw_value);
txhdr->mac_frame_ctl = wlhdr->frame_control; txhdr->mac_frame_ctl = wlhdr->frame_control;
...@@ -225,14 +228,14 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, ...@@ -225,14 +228,14 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
txhdr->dur_fb = wlhdr->duration_id; txhdr->dur_fb = wlhdr->duration_id;
} else { } else {
txhdr->dur_fb = ieee80211_generic_frame_duration(dev->wl->hw, txhdr->dur_fb = ieee80211_generic_frame_duration(dev->wl->hw,
txctl->vif, info->control.vif,
fragment_len, fragment_len,
rate_fb); rate_fb);
} }
plcp_fragment_len = fragment_len + FCS_LEN; plcp_fragment_len = fragment_len + FCS_LEN;
if (use_encryption) { if (use_encryption) {
u8 key_idx = txctl->hw_key->hw_key_idx; u8 key_idx = info->control.hw_key->hw_key_idx;
struct b43legacy_key *key; struct b43legacy_key *key;
int wlhdr_len; int wlhdr_len;
size_t iv_len; size_t iv_len;
...@@ -242,7 +245,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, ...@@ -242,7 +245,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
if (key->enabled) { if (key->enabled) {
/* Hardware appends ICV. */ /* Hardware appends ICV. */
plcp_fragment_len += txctl->icv_len; plcp_fragment_len += info->control.icv_len;
key_idx = b43legacy_kidx_to_fw(dev, key_idx); key_idx = b43legacy_kidx_to_fw(dev, key_idx);
mac_ctl |= (key_idx << B43legacy_TX4_MAC_KEYIDX_SHIFT) & mac_ctl |= (key_idx << B43legacy_TX4_MAC_KEYIDX_SHIFT) &
...@@ -251,7 +254,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, ...@@ -251,7 +254,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
B43legacy_TX4_MAC_KEYALG_SHIFT) & B43legacy_TX4_MAC_KEYALG_SHIFT) &
B43legacy_TX4_MAC_KEYALG; B43legacy_TX4_MAC_KEYALG;
wlhdr_len = ieee80211_get_hdrlen(fctl); wlhdr_len = ieee80211_get_hdrlen(fctl);
iv_len = min((size_t)txctl->iv_len, iv_len = min((size_t)info->control.iv_len,
ARRAY_SIZE(txhdr->iv)); ARRAY_SIZE(txhdr->iv));
memcpy(txhdr->iv, ((u8 *)wlhdr) + wlhdr_len, iv_len); memcpy(txhdr->iv, ((u8 *)wlhdr) + wlhdr_len, iv_len);
} else { } else {
...@@ -275,7 +278,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, ...@@ -275,7 +278,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
phy_ctl |= B43legacy_TX4_PHY_OFDM; phy_ctl |= B43legacy_TX4_PHY_OFDM;
if (dev->short_preamble) if (dev->short_preamble)
phy_ctl |= B43legacy_TX4_PHY_SHORTPRMBL; phy_ctl |= B43legacy_TX4_PHY_SHORTPRMBL;
switch (txctl->antenna_sel_tx) { switch (info->antenna_sel_tx) {
case 0: case 0:
phy_ctl |= B43legacy_TX4_PHY_ANTLAST; phy_ctl |= B43legacy_TX4_PHY_ANTLAST;
break; break;
...@@ -290,21 +293,21 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, ...@@ -290,21 +293,21 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
} }
/* MAC control */ /* MAC control */
if (!(txctl->flags & IEEE80211_TXCTL_NO_ACK)) if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
mac_ctl |= B43legacy_TX4_MAC_ACK; mac_ctl |= B43legacy_TX4_MAC_ACK;
if (!(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) && if (!(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) &&
((fctl & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL))) ((fctl & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL)))
mac_ctl |= B43legacy_TX4_MAC_HWSEQ; mac_ctl |= B43legacy_TX4_MAC_HWSEQ;
if (txctl->flags & IEEE80211_TXCTL_FIRST_FRAGMENT) if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
mac_ctl |= B43legacy_TX4_MAC_STMSDU; mac_ctl |= B43legacy_TX4_MAC_STMSDU;
if (rate_fb_ofdm) if (rate_fb_ofdm)
mac_ctl |= B43legacy_TX4_MAC_FALLBACKOFDM; mac_ctl |= B43legacy_TX4_MAC_FALLBACKOFDM;
if (txctl->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT) if (info->flags & IEEE80211_TX_CTL_LONG_RETRY_LIMIT)
mac_ctl |= B43legacy_TX4_MAC_LONGFRAME; mac_ctl |= B43legacy_TX4_MAC_LONGFRAME;
/* Generate the RTS or CTS-to-self frame */ /* Generate the RTS or CTS-to-self frame */
if ((txctl->flags & IEEE80211_TXCTL_USE_RTS_CTS) || if ((info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) ||
(txctl->flags & IEEE80211_TXCTL_USE_CTS_PROTECT)) { (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT)) {
unsigned int len; unsigned int len;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
int rts_rate; int rts_rate;
...@@ -312,26 +315,26 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, ...@@ -312,26 +315,26 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
int rts_rate_ofdm; int rts_rate_ofdm;
int rts_rate_fb_ofdm; int rts_rate_fb_ofdm;
rts_rate = txctl->rts_cts_rate->hw_value; rts_rate = ieee80211_get_rts_cts_rate(dev->wl->hw, info)->hw_value;
rts_rate_ofdm = b43legacy_is_ofdm_rate(rts_rate); rts_rate_ofdm = b43legacy_is_ofdm_rate(rts_rate);
rts_rate_fb = b43legacy_calc_fallback_rate(rts_rate); rts_rate_fb = b43legacy_calc_fallback_rate(rts_rate);
rts_rate_fb_ofdm = b43legacy_is_ofdm_rate(rts_rate_fb); rts_rate_fb_ofdm = b43legacy_is_ofdm_rate(rts_rate_fb);
if (rts_rate_fb_ofdm) if (rts_rate_fb_ofdm)
mac_ctl |= B43legacy_TX4_MAC_CTSFALLBACKOFDM; mac_ctl |= B43legacy_TX4_MAC_CTSFALLBACKOFDM;
if (txctl->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) { if (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT) {
ieee80211_ctstoself_get(dev->wl->hw, ieee80211_ctstoself_get(dev->wl->hw,
txctl->vif, info->control.vif,
fragment_data, fragment_data,
fragment_len, txctl, fragment_len, info,
(struct ieee80211_cts *) (struct ieee80211_cts *)
(txhdr->rts_frame)); (txhdr->rts_frame));
mac_ctl |= B43legacy_TX4_MAC_SENDCTS; mac_ctl |= B43legacy_TX4_MAC_SENDCTS;
len = sizeof(struct ieee80211_cts); len = sizeof(struct ieee80211_cts);
} else { } else {
ieee80211_rts_get(dev->wl->hw, ieee80211_rts_get(dev->wl->hw,
txctl->vif, info->control.vif,
fragment_data, fragment_len, txctl, fragment_data, fragment_len, info,
(struct ieee80211_rts *) (struct ieee80211_rts *)
(txhdr->rts_frame)); (txhdr->rts_frame));
mac_ctl |= B43legacy_TX4_MAC_SENDRTS; mac_ctl |= B43legacy_TX4_MAC_SENDRTS;
...@@ -362,12 +365,12 @@ int b43legacy_generate_txhdr(struct b43legacy_wldev *dev, ...@@ -362,12 +365,12 @@ int b43legacy_generate_txhdr(struct b43legacy_wldev *dev,
u8 *txhdr, u8 *txhdr,
const unsigned char *fragment_data, const unsigned char *fragment_data,
unsigned int fragment_len, unsigned int fragment_len,
const struct ieee80211_tx_control *txctl, const struct ieee80211_tx_info *info,
u16 cookie) u16 cookie)
{ {
return generate_txhdr_fw3(dev, (struct b43legacy_txhdr_fw3 *)txhdr, return generate_txhdr_fw3(dev, (struct b43legacy_txhdr_fw3 *)txhdr,
fragment_data, fragment_len, fragment_data, fragment_len,
txctl, cookie); info, cookie);
} }
static s8 b43legacy_rssi_postprocess(struct b43legacy_wldev *dev, static s8 b43legacy_rssi_postprocess(struct b43legacy_wldev *dev,
......
...@@ -80,7 +80,7 @@ int b43legacy_generate_txhdr(struct b43legacy_wldev *dev, ...@@ -80,7 +80,7 @@ int b43legacy_generate_txhdr(struct b43legacy_wldev *dev,
u8 *txhdr, u8 *txhdr,
const unsigned char *fragment_data, const unsigned char *fragment_data,
unsigned int fragment_len, unsigned int fragment_len,
const struct ieee80211_tx_control *txctl, const struct ieee80211_tx_info *info,
u16 cookie); u16 cookie);
......
...@@ -445,8 +445,7 @@ static int rs_adjust_next_rate(struct iwl3945_priv *priv, int rate) ...@@ -445,8 +445,7 @@ static int rs_adjust_next_rate(struct iwl3945_priv *priv, int rate)
*/ */
static void rs_tx_status(void *priv_rate, static void rs_tx_status(void *priv_rate,
struct net_device *dev, struct net_device *dev,
struct sk_buff *skb, struct sk_buff *skb)
struct ieee80211_tx_status *tx_resp)
{ {
u8 retries, current_count; u8 retries, current_count;
int scale_rate_index, first_index, last_index; int scale_rate_index, first_index, last_index;
...@@ -457,14 +456,15 @@ static void rs_tx_status(void *priv_rate, ...@@ -457,14 +456,15 @@ static void rs_tx_status(void *priv_rate,
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
struct iwl3945_rs_sta *rs_sta; struct iwl3945_rs_sta *rs_sta;
struct ieee80211_supported_band *sband; struct ieee80211_supported_band *sband;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
IWL_DEBUG_RATE("enter\n"); IWL_DEBUG_RATE("enter\n");
sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
retries = tx_resp->retry_count; retries = info->status.retry_count;
first_index = tx_resp->control.tx_rate->hw_value; first_index = sband->bitrates[info->tx_rate_idx].hw_value;
if ((first_index < 0) || (first_index >= IWL_RATE_COUNT)) { if ((first_index < 0) || (first_index >= IWL_RATE_COUNT)) {
IWL_DEBUG_RATE("leave: Rate out of bounds: %d\n", first_index); IWL_DEBUG_RATE("leave: Rate out of bounds: %d\n", first_index);
return; return;
...@@ -525,11 +525,11 @@ static void rs_tx_status(void *priv_rate, ...@@ -525,11 +525,11 @@ static void rs_tx_status(void *priv_rate,
/* Update the last index window with success/failure based on ACK */ /* Update the last index window with success/failure based on ACK */
IWL_DEBUG_RATE("Update rate %d with %s.\n", IWL_DEBUG_RATE("Update rate %d with %s.\n",
last_index, last_index,
(tx_resp->flags & IEEE80211_TX_STATUS_ACK) ? (info->flags & IEEE80211_TX_STAT_ACK) ?
"success" : "failure"); "success" : "failure");
iwl3945_collect_tx_data(rs_sta, iwl3945_collect_tx_data(rs_sta,
&rs_sta->win[last_index], &rs_sta->win[last_index],
tx_resp->flags & IEEE80211_TX_STATUS_ACK, 1); info->flags & IEEE80211_TX_STAT_ACK, 1);
/* We updated the rate scale window -- if its been more than /* We updated the rate scale window -- if its been more than
* flush_time since the last run, schedule the flush * flush_time since the last run, schedule the flush
...@@ -669,7 +669,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev, ...@@ -669,7 +669,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,
is_multicast_ether_addr(hdr->addr1) || is_multicast_ether_addr(hdr->addr1) ||
!sta || !sta->rate_ctrl_priv) { !sta || !sta->rate_ctrl_priv) {
IWL_DEBUG_RATE("leave: No STA priv data to update!\n"); IWL_DEBUG_RATE("leave: No STA priv data to update!\n");
sel->rate = rate_lowest(local, sband, sta); sel->rate_idx = rate_lowest_index(local, sband, sta);
rcu_read_unlock(); rcu_read_unlock();
return; return;
} }
...@@ -813,7 +813,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev, ...@@ -813,7 +813,7 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,
IWL_DEBUG_RATE("leave: %d\n", index); IWL_DEBUG_RATE("leave: %d\n", index);
sel->rate = &sband->bitrates[sta->txrate_idx]; sel->rate_idx = sta->txrate_idx;
} }
static struct rate_control_ops rs_ops = { static struct rate_control_ops rs_ops = {
......
...@@ -283,8 +283,7 @@ static void iwl3945_tx_queue_reclaim(struct iwl3945_priv *priv, ...@@ -283,8 +283,7 @@ static void iwl3945_tx_queue_reclaim(struct iwl3945_priv *priv,
q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) { q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) {
tx_info = &txq->txb[txq->q.read_ptr]; tx_info = &txq->txb[txq->q.read_ptr];
ieee80211_tx_status_irqsafe(priv->hw, tx_info->skb[0], ieee80211_tx_status_irqsafe(priv->hw, tx_info->skb[0]);
&tx_info->status);
tx_info->skb[0] = NULL; tx_info->skb[0] = NULL;
iwl3945_hw_txq_free_tfd(priv, txq); iwl3945_hw_txq_free_tfd(priv, txq);
} }
...@@ -306,7 +305,7 @@ static void iwl3945_rx_reply_tx(struct iwl3945_priv *priv, ...@@ -306,7 +305,7 @@ static void iwl3945_rx_reply_tx(struct iwl3945_priv *priv,
int txq_id = SEQ_TO_QUEUE(sequence); int txq_id = SEQ_TO_QUEUE(sequence);
int index = SEQ_TO_INDEX(sequence); int index = SEQ_TO_INDEX(sequence);
struct iwl3945_tx_queue *txq = &priv->txq[txq_id]; struct iwl3945_tx_queue *txq = &priv->txq[txq_id];
struct ieee80211_tx_status *tx_status; struct ieee80211_tx_info *info;
struct iwl3945_tx_resp *tx_resp = (void *)&pkt->u.raw[0]; struct iwl3945_tx_resp *tx_resp = (void *)&pkt->u.raw[0];
u32 status = le32_to_cpu(tx_resp->status); u32 status = le32_to_cpu(tx_resp->status);
int rate_idx; int rate_idx;
...@@ -319,19 +318,22 @@ static void iwl3945_rx_reply_tx(struct iwl3945_priv *priv, ...@@ -319,19 +318,22 @@ static void iwl3945_rx_reply_tx(struct iwl3945_priv *priv,
return; return;
} }
tx_status = &(txq->txb[txq->q.read_ptr].status); info = IEEE80211_SKB_CB(txq->txb[txq->q.read_ptr].skb[0]);
memset(&info->status, 0, sizeof(info->status));
tx_status->retry_count = tx_resp->failure_frame; info->status.retry_count = tx_resp->failure_frame;
/* tx_status->rts_retry_count = tx_resp->failure_rts; */ /* tx_status->rts_retry_count = tx_resp->failure_rts; */
tx_status->flags = ((status & TX_STATUS_MSK) == TX_STATUS_SUCCESS) ? info->flags |= ((status & TX_STATUS_MSK) == TX_STATUS_SUCCESS) ?
IEEE80211_TX_STATUS_ACK : 0; IEEE80211_TX_STAT_ACK : 0;
IWL_DEBUG_TX("Tx queue %d Status %s (0x%08x) plcp rate %d retries %d\n", IWL_DEBUG_TX("Tx queue %d Status %s (0x%08x) plcp rate %d retries %d\n",
txq_id, iwl3945_get_tx_fail_reason(status), status, txq_id, iwl3945_get_tx_fail_reason(status), status,
tx_resp->rate, tx_resp->failure_frame); tx_resp->rate, tx_resp->failure_frame);
rate_idx = iwl3945_hwrate_to_plcp_idx(tx_resp->rate); rate_idx = iwl3945_hwrate_to_plcp_idx(tx_resp->rate);
tx_status->control.tx_rate = &priv->ieee_rates[rate_idx]; if (info->band == IEEE80211_BAND_5GHZ)
rate_idx -= IWL_FIRST_OFDM_RATE;
info->tx_rate_idx = rate_idx;
IWL_DEBUG_TX_REPLY("Tx queue reclaim %d\n", index); IWL_DEBUG_TX_REPLY("Tx queue reclaim %d\n", index);
iwl3945_tx_queue_reclaim(priv, txq_id, index); iwl3945_tx_queue_reclaim(priv, txq_id, index);
...@@ -958,11 +960,12 @@ u8 iwl3945_hw_find_station(struct iwl3945_priv *priv, const u8 *addr) ...@@ -958,11 +960,12 @@ u8 iwl3945_hw_find_station(struct iwl3945_priv *priv, const u8 *addr)
*/ */
void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv, void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv,
struct iwl3945_cmd *cmd, struct iwl3945_cmd *cmd,
struct ieee80211_tx_control *ctrl, struct ieee80211_tx_info *info,
struct ieee80211_hdr *hdr, int sta_id, int tx_id) struct ieee80211_hdr *hdr, int sta_id, int tx_id)
{ {
unsigned long flags; unsigned long flags;
u16 rate_index = min(ctrl->tx_rate->hw_value & 0xffff, IWL_RATE_COUNT - 1); u16 hw_value = ieee80211_get_tx_rate(priv->hw, info)->hw_value;
u16 rate_index = min(hw_value & 0xffff, IWL_RATE_COUNT - 1);
u16 rate_mask; u16 rate_mask;
int rate; int rate;
u8 rts_retry_limit; u8 rts_retry_limit;
...@@ -974,7 +977,7 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv, ...@@ -974,7 +977,7 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv,
tx_flags = cmd->cmd.tx.tx_flags; tx_flags = cmd->cmd.tx.tx_flags;
/* We need to figure out how to get the sta->supp_rates while /* We need to figure out how to get the sta->supp_rates while
* in this running context; perhaps encoding into ctrl->tx_rate? */ * in this running context */
rate_mask = IWL_RATES_MASK; rate_mask = IWL_RATES_MASK;
spin_lock_irqsave(&priv->sta_lock, flags); spin_lock_irqsave(&priv->sta_lock, flags);
......
...@@ -124,7 +124,6 @@ int iwl3945_x2_queue_used(const struct iwl3945_queue *q, int i); ...@@ -124,7 +124,6 @@ int iwl3945_x2_queue_used(const struct iwl3945_queue *q, int i);
/* One for each TFD */ /* One for each TFD */
struct iwl3945_tx_info { struct iwl3945_tx_info {
struct ieee80211_tx_status status;
struct sk_buff *skb[MAX_NUM_OF_TBS]; struct sk_buff *skb[MAX_NUM_OF_TBS];
}; };
...@@ -645,7 +644,7 @@ extern unsigned int iwl3945_hw_get_beacon_cmd(struct iwl3945_priv *priv, ...@@ -645,7 +644,7 @@ extern unsigned int iwl3945_hw_get_beacon_cmd(struct iwl3945_priv *priv,
extern int iwl3945_hw_get_rx_read(struct iwl3945_priv *priv); extern int iwl3945_hw_get_rx_read(struct iwl3945_priv *priv);
extern void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv, extern void iwl3945_hw_build_tx_cmd_rate(struct iwl3945_priv *priv,
struct iwl3945_cmd *cmd, struct iwl3945_cmd *cmd,
struct ieee80211_tx_control *ctrl, struct ieee80211_tx_info *info,
struct ieee80211_hdr *hdr, struct ieee80211_hdr *hdr,
int sta_id, int tx_id); int sta_id, int tx_id);
extern int iwl3945_hw_reg_send_txpower(struct iwl3945_priv *priv); extern int iwl3945_hw_reg_send_txpower(struct iwl3945_priv *priv);
...@@ -836,8 +835,6 @@ struct iwl3945_priv { ...@@ -836,8 +835,6 @@ struct iwl3945_priv {
u8 mac80211_registered; u8 mac80211_registered;
u32 notif_missed_beacons;
/* Rx'd packet timing information */ /* Rx'd packet timing information */
u32 last_beacon_time; u32 last_beacon_time;
u64 last_tsf; u64 last_tsf;
......
...@@ -100,9 +100,14 @@ ...@@ -100,9 +100,14 @@
#include "iwl-commands.h" #include "iwl-commands.h"
#define PCI_LINK_CTRL 0x0F0 /* PCI registers */
#define PCI_LINK_CTRL 0x0F0 /* 1 byte */
#define PCI_POWER_SOURCE 0x0C8 #define PCI_POWER_SOURCE 0x0C8
#define PCI_REG_WUM8 0x0E8 #define PCI_REG_WUM8 0x0E8
/* PCI register values */
#define PCI_LINK_VAL_L0S_EN 0x01
#define PCI_LINK_VAL_L1_EN 0x02
#define PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT (0x80000000) #define PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT (0x80000000)
#define TFD_QUEUE_SIZE_MAX (256) #define TFD_QUEUE_SIZE_MAX (256)
......
This diff is collapsed.
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include "iwl-dev.h" #include "iwl-dev.h"
struct iwl4965_rate_info { struct iwl_rate_info {
u8 plcp; /* uCode API: IWL_RATE_6M_PLCP, etc. */ u8 plcp; /* uCode API: IWL_RATE_6M_PLCP, etc. */
u8 plcp_siso; /* uCode API: IWL_RATE_SISO_6M_PLCP, etc. */ u8 plcp_siso; /* uCode API: IWL_RATE_SISO_6M_PLCP, etc. */
u8 plcp_mimo2; /* uCode API: IWL_RATE_MIMO2_6M_PLCP, etc. */ u8 plcp_mimo2; /* uCode API: IWL_RATE_MIMO2_6M_PLCP, etc. */
...@@ -45,7 +45,7 @@ struct iwl4965_rate_info { ...@@ -45,7 +45,7 @@ struct iwl4965_rate_info {
/* /*
* These serve as indexes into * These serve as indexes into
* struct iwl4965_rate_info iwl4965_rates[IWL_RATE_COUNT]; * struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
*/ */
enum { enum {
IWL_RATE_1M_INDEX = 0, IWL_RATE_1M_INDEX = 0,
...@@ -240,7 +240,7 @@ enum { ...@@ -240,7 +240,7 @@ enum {
#define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING) #define TID_MAX_TIME_DIFF ((TID_QUEUE_MAX_SIZE - 1) * TID_QUEUE_CELL_SPACING)
#define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y)) #define TIME_WRAP_AROUND(x, y) (((y) > (x)) ? (y) - (x) : (0-(x)) + (y))
extern const struct iwl4965_rate_info iwl4965_rates[IWL_RATE_COUNT]; extern const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT];
enum iwl_table_type { enum iwl_table_type {
LQ_NONE, LQ_NONE,
...@@ -279,7 +279,7 @@ static inline u8 num_of_ant(u8 mask) ...@@ -279,7 +279,7 @@ static inline u8 num_of_ant(u8 mask)
static inline u8 iwl4965_get_prev_ieee_rate(u8 rate_index) static inline u8 iwl4965_get_prev_ieee_rate(u8 rate_index)
{ {
u8 rate = iwl4965_rates[rate_index].prev_ieee; u8 rate = iwl_rates[rate_index].prev_ieee;
if (rate == IWL_RATE_INVALID) if (rate == IWL_RATE_INVALID)
rate = rate_index; rate = rate_index;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -146,6 +146,7 @@ struct iwl_eeprom_channel { ...@@ -146,6 +146,7 @@ struct iwl_eeprom_channel {
/*5000 calibrations */ /*5000 calibrations */
#define EEPROM_5000_CALIB_ALL (INDIRECT_ADDRESS | INDIRECT_CALIBRATION) #define EEPROM_5000_CALIB_ALL (INDIRECT_ADDRESS | INDIRECT_CALIBRATION)
#define EEPROM_5000_XTAL ((2*0x128) | EEPROM_5000_CALIB_ALL)
/* 5000 links */ /* 5000 links */
#define EEPROM_5000_LINK_HOST (2*0x64) #define EEPROM_5000_LINK_HOST (2*0x64)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment