diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-17 23:53:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-17 23:53:52 -0400 |
commit | f205ce83a766c08965ec78342f138cdc00631fba (patch) | |
tree | 7a9d2db6c16594ef7c730ca93a87131cf0abca41 /drivers/net/wireless/iwlwifi/iwl-rx.c | |
parent | 3dc95666df0e1ae5b7381a8ec97a583bb3ce4306 (diff) | |
parent | b31c50a7f9e93a61d14740dedcbbf2c376998bc7 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (66 commits)
be2net: fix some cmds to use mccq instead of mbox
atl1e: fix 2.6.31-git4 -- ATL1E 0000:03:00.0: DMA-API: device driver frees DMA
pkt_sched: Fix qstats.qlen updating in dump_stats
ipv6: Log the affected address when DAD failure occurs
wl12xx: Fix print_mac() conversion.
af_iucv: fix race when queueing skbs on the backlog queue
af_iucv: do not call iucv_sock_kill() twice
af_iucv: handle non-accepted sockets after resuming from suspend
af_iucv: fix race in __iucv_sock_wait()
iucv: use correct output register in iucv_query_maxconn()
iucv: fix iucv_buffer_cpumask check when calling IUCV functions
iucv: suspend/resume error msg for left over pathes
wl12xx: switch to %pM to print the mac address
b44: the poll handler b44_poll must not enable IRQ unconditionally
ipv6: Ignore route option with ROUTER_PREF_INVALID
bonding: make ab_arp select active slaves as other modes
cfg80211: fix SME connect
rc80211_minstrel: fix contention window calculation
ssb/sdio: fix printk format warnings
p54usb: add Zcomax XG-705A usbid
...
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-rx.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-rx.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index 8150c5c3a16b..b90adcb73b06 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
@@ -239,26 +239,22 @@ void iwl_rx_allocate(struct iwl_priv *priv, gfp_t priority) | |||
239 | struct iwl_rx_queue *rxq = &priv->rxq; | 239 | struct iwl_rx_queue *rxq = &priv->rxq; |
240 | struct list_head *element; | 240 | struct list_head *element; |
241 | struct iwl_rx_mem_buffer *rxb; | 241 | struct iwl_rx_mem_buffer *rxb; |
242 | struct sk_buff *skb; | ||
242 | unsigned long flags; | 243 | unsigned long flags; |
243 | 244 | ||
244 | while (1) { | 245 | while (1) { |
245 | spin_lock_irqsave(&rxq->lock, flags); | 246 | spin_lock_irqsave(&rxq->lock, flags); |
246 | |||
247 | if (list_empty(&rxq->rx_used)) { | 247 | if (list_empty(&rxq->rx_used)) { |
248 | spin_unlock_irqrestore(&rxq->lock, flags); | 248 | spin_unlock_irqrestore(&rxq->lock, flags); |
249 | return; | 249 | return; |
250 | } | 250 | } |
251 | element = rxq->rx_used.next; | ||
252 | rxb = list_entry(element, struct iwl_rx_mem_buffer, list); | ||
253 | list_del(element); | ||
254 | |||
255 | spin_unlock_irqrestore(&rxq->lock, flags); | 251 | spin_unlock_irqrestore(&rxq->lock, flags); |
256 | 252 | ||
257 | /* Alloc a new receive buffer */ | 253 | /* Alloc a new receive buffer */ |
258 | rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256, | 254 | skb = alloc_skb(priv->hw_params.rx_buf_size + 256, |
259 | priority); | 255 | priority); |
260 | 256 | ||
261 | if (!rxb->skb) { | 257 | if (!skb) { |
262 | IWL_CRIT(priv, "Can not allocate SKB buffers\n"); | 258 | IWL_CRIT(priv, "Can not allocate SKB buffers\n"); |
263 | /* We don't reschedule replenish work here -- we will | 259 | /* We don't reschedule replenish work here -- we will |
264 | * call the restock method and if it still needs | 260 | * call the restock method and if it still needs |
@@ -266,6 +262,20 @@ void iwl_rx_allocate(struct iwl_priv *priv, gfp_t priority) | |||
266 | break; | 262 | break; |
267 | } | 263 | } |
268 | 264 | ||
265 | spin_lock_irqsave(&rxq->lock, flags); | ||
266 | |||
267 | if (list_empty(&rxq->rx_used)) { | ||
268 | spin_unlock_irqrestore(&rxq->lock, flags); | ||
269 | dev_kfree_skb_any(skb); | ||
270 | return; | ||
271 | } | ||
272 | element = rxq->rx_used.next; | ||
273 | rxb = list_entry(element, struct iwl_rx_mem_buffer, list); | ||
274 | list_del(element); | ||
275 | |||
276 | spin_unlock_irqrestore(&rxq->lock, flags); | ||
277 | |||
278 | rxb->skb = skb; | ||
269 | /* Get physical address of RB/SKB */ | 279 | /* Get physical address of RB/SKB */ |
270 | rxb->real_dma_addr = pci_map_single( | 280 | rxb->real_dma_addr = pci_map_single( |
271 | priv->pci_dev, | 281 | priv->pci_dev, |