On Wed, Nov 19, 2008 at 2:07 AM, John W. Linville <linville@xxxxxxxxxxxxx> wrote: > Dave, > > Three fixes from Johannes, intended for 2.6.28... One fixes a 32/64 > issue in libertas_tf, another removes a mac80211 callback only used > by iwlwifi which is not obviously needed and which is causing locking > issues, and a final one fixes some mysterious DMA alignment problems > that have been plaguing iwlwifi for some time. > > Please let me know if there are problems! > > Thanks, > > John > > P.S. The libertas_tf is actually already in net-next-2.6. Also, > the other fixes cause merge conflicts with net-next-2.6 -- I'll > included a merge-test branch in wireless-next-2.6 to indicates how > those conflicts should be resolved. > > --- > > Individual patches are available here: > > http://www.kernel.org/pub/linux/kernel/people/linville/wireless-2.6/ > > --- > > The following changes since commit 5f9021cfdc3524a4c5e3d7ae2d049eb7adcd6776: > Johannes Berg (1): > rtnetlink: propagate error from dev_change_flags in do_setlink() > > are available in the git repository at: > > git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git master > > Johannes Berg (3): > libertas_tf: fix skb tail pointer > mac80211: remove ieee80211_notify_mac > iwlagn: fix RX skb alignment IMHO its premature pushing ttese 2 patches up, they came in yestrday and nobody here has run tthe code Tomas > > drivers/net/wireless/iwlwifi/iwl-agn.c | 7 +++---- > drivers/net/wireless/iwlwifi/iwl-dev.h | 3 ++- > drivers/net/wireless/iwlwifi/iwl-rx.c | 26 +++++++++++++++++--------- > drivers/net/wireless/iwlwifi/iwl3945-base.c | 1 - > drivers/net/wireless/libertas_tf/if_usb.c | 2 +- > include/net/mac80211.h | 20 -------------------- > net/mac80211/mlme.c | 22 ---------------------- > 7 files changed, 23 insertions(+), 58 deletions(-) > > diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c > index 8d690a0..444c5cc 100644 > --- a/drivers/net/wireless/iwlwifi/iwl-agn.c > +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c > @@ -1384,7 +1384,7 @@ void iwl_rx_handle(struct iwl_priv *priv) > > rxq->queue[i] = NULL; > > - pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr, > + pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->aligned_dma_addr, > priv->hw_params.rx_buf_size, > PCI_DMA_FROMDEVICE); > pkt = (struct iwl_rx_packet *)rxb->skb->data; > @@ -1436,8 +1436,8 @@ void iwl_rx_handle(struct iwl_priv *priv) > rxb->skb = NULL; > } > > - pci_unmap_single(priv->pci_dev, rxb->dma_addr, > - priv->hw_params.rx_buf_size, > + pci_unmap_single(priv->pci_dev, rxb->real_dma_addr, > + priv->hw_params.rx_buf_size + 256, > PCI_DMA_FROMDEVICE); > spin_lock_irqsave(&rxq->lock, flags); > list_add_tail(&rxb->list, &priv->rxq.rx_used); > @@ -2341,7 +2341,6 @@ static void iwl_bg_alive_start(struct work_struct *data) > mutex_lock(&priv->mutex); > iwl_alive_start(priv); > mutex_unlock(&priv->mutex); > - ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC); > } > > static void iwl4965_bg_rf_kill(struct work_struct *work) > diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h > index c018121..9966d4e 100644 > --- a/drivers/net/wireless/iwlwifi/iwl-dev.h > +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h > @@ -89,7 +89,8 @@ extern struct iwl_cfg iwl5100_abg_cfg; > #define DEFAULT_LONG_RETRY_LIMIT 4U > > struct iwl_rx_mem_buffer { > - dma_addr_t dma_addr; > + dma_addr_t real_dma_addr; > + dma_addr_t aligned_dma_addr; > struct sk_buff *skb; > struct list_head list; > }; > diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c > index 7cde9d7..0509c16 100644 > --- a/drivers/net/wireless/iwlwifi/iwl-rx.c > +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c > @@ -204,7 +204,7 @@ int iwl_rx_queue_restock(struct iwl_priv *priv) > list_del(element); > > /* Point to Rx buffer via next RBD in circular buffer */ > - rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->dma_addr); > + rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->aligned_dma_addr); > rxq->queue[rxq->write] = rxb; > rxq->write = (rxq->write + 1) & RX_QUEUE_MASK; > rxq->free_count--; > @@ -251,7 +251,7 @@ void iwl_rx_allocate(struct iwl_priv *priv) > rxb = list_entry(element, struct iwl_rx_mem_buffer, list); > > /* Alloc a new receive buffer */ > - rxb->skb = alloc_skb(priv->hw_params.rx_buf_size, > + rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256, > __GFP_NOWARN | GFP_ATOMIC); > if (!rxb->skb) { > if (net_ratelimit()) > @@ -266,9 +266,17 @@ void iwl_rx_allocate(struct iwl_priv *priv) > list_del(element); > > /* Get physical address of RB/SKB */ > - rxb->dma_addr = > - pci_map_single(priv->pci_dev, rxb->skb->data, > - priv->hw_params.rx_buf_size, PCI_DMA_FROMDEVICE); > + rxb->real_dma_addr = pci_map_single( > + priv->pci_dev, > + rxb->skb->data, > + priv->hw_params.rx_buf_size + 256, > + PCI_DMA_FROMDEVICE); > + /* dma address must be no more than 36 bits */ > + BUG_ON(rxb->real_dma_addr & ~DMA_BIT_MASK(36)); > + /* and also 256 byte aligned! */ > + rxb->aligned_dma_addr = ALIGN(rxb->real_dma_addr, 256); > + skb_reserve(rxb->skb, rxb->aligned_dma_addr - rxb->real_dma_addr); > + > list_add_tail(&rxb->list, &rxq->rx_free); > rxq->free_count++; > } > @@ -300,8 +308,8 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq) > for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) { > if (rxq->pool[i].skb != NULL) { > pci_unmap_single(priv->pci_dev, > - rxq->pool[i].dma_addr, > - priv->hw_params.rx_buf_size, > + rxq->pool[i].real_dma_addr, > + priv->hw_params.rx_buf_size + 256, > PCI_DMA_FROMDEVICE); > dev_kfree_skb(rxq->pool[i].skb); > } > @@ -354,8 +362,8 @@ void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq) > * to an SKB, so we need to unmap and free potential storage */ > if (rxq->pool[i].skb != NULL) { > pci_unmap_single(priv->pci_dev, > - rxq->pool[i].dma_addr, > - priv->hw_params.rx_buf_size, > + rxq->pool[i].real_dma_addr, > + priv->hw_params.rx_buf_size + 256, > PCI_DMA_FROMDEVICE); > priv->alloc_rxb_skb--; > dev_kfree_skb(rxq->pool[i].skb); > diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c > index 285b53e..45a6b0c 100644 > --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c > +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c > @@ -6012,7 +6012,6 @@ static void iwl3945_bg_alive_start(struct work_struct *data) > mutex_lock(&priv->mutex); > iwl3945_alive_start(priv); > mutex_unlock(&priv->mutex); > - ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC); > } > > static void iwl3945_bg_rf_kill(struct work_struct *work) > diff --git a/drivers/net/wireless/libertas_tf/if_usb.c b/drivers/net/wireless/libertas_tf/if_usb.c > index 1cc03a8..59634c3 100644 > --- a/drivers/net/wireless/libertas_tf/if_usb.c > +++ b/drivers/net/wireless/libertas_tf/if_usb.c > @@ -331,7 +331,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp, > /* Fill the receive configuration URB and initialise the Rx call back */ > usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, > usb_rcvbulkpipe(cardp->udev, cardp->ep_in), > - (void *) (skb->tail), > + skb_tail_pointer(skb), > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp); > > cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET; > diff --git a/include/net/mac80211.h b/include/net/mac80211.h > index 8856e2d..73d81bc 100644 > --- a/include/net/mac80211.h > +++ b/include/net/mac80211.h > @@ -74,14 +74,6 @@ > */ > > /** > - * enum ieee80211_notification_type - Low level driver notification > - * @IEEE80211_NOTIFY_RE_ASSOC: start the re-association sequence > - */ > -enum ieee80211_notification_types { > - IEEE80211_NOTIFY_RE_ASSOC, > -}; > - > -/** > * struct ieee80211_ht_bss_info - describing BSS's HT characteristics > * > * This structure describes most essential parameters needed > @@ -1798,18 +1790,6 @@ void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra, > u16 tid); > > /** > - * ieee80211_notify_mac - low level driver notification > - * @hw: pointer as obtained from ieee80211_alloc_hw(). > - * @notif_type: enum ieee80211_notification_types > - * > - * This function must be called by low level driver to inform mac80211 of > - * low level driver status change or force mac80211 to re-assoc for low > - * level driver internal error that require re-assoc. > - */ > -void ieee80211_notify_mac(struct ieee80211_hw *hw, > - enum ieee80211_notification_types notif_type); > - > -/** > * ieee80211_find_sta - find a station > * > * @hw: pointer as obtained from ieee80211_alloc_hw() > diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c > index 14d165f..409bb77 100644 > --- a/net/mac80211/mlme.c > +++ b/net/mac80211/mlme.c > @@ -2560,25 +2560,3 @@ void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local) > ieee80211_restart_sta_timer(sdata); > rcu_read_unlock(); > } > - > -/* driver notification call */ > -void ieee80211_notify_mac(struct ieee80211_hw *hw, > - enum ieee80211_notification_types notif_type) > -{ > - struct ieee80211_local *local = hw_to_local(hw); > - struct ieee80211_sub_if_data *sdata; > - > - switch (notif_type) { > - case IEEE80211_NOTIFY_RE_ASSOC: > - rtnl_lock(); > - list_for_each_entry(sdata, &local->interfaces, list) { > - if (sdata->vif.type != NL80211_IFTYPE_STATION) > - continue; > - > - ieee80211_sta_req_auth(sdata, &sdata->u.sta); > - } > - rtnl_unlock(); > - break; > - } > -} > -EXPORT_SYMBOL(ieee80211_notify_mac); > -- > John W. Linville Linux should be at the core > linville@xxxxxxxxxxxxx of your literate lifestyle. > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html