diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00pci.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 31 |
3 files changed, 18 insertions, 29 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 9929b15e28ba..61510c519351 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -1028,8 +1028,10 @@ static int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev) | |||
1028 | * Initialize the device. | 1028 | * Initialize the device. |
1029 | */ | 1029 | */ |
1030 | status = rt2x00dev->ops->lib->initialize(rt2x00dev); | 1030 | status = rt2x00dev->ops->lib->initialize(rt2x00dev); |
1031 | if (status) | 1031 | if (status) { |
1032 | goto exit; | 1032 | rt2x00queue_uninitialize(rt2x00dev); |
1033 | return status; | ||
1034 | } | ||
1033 | 1035 | ||
1034 | __set_bit(DEVICE_INITIALIZED, &rt2x00dev->flags); | 1036 | __set_bit(DEVICE_INITIALIZED, &rt2x00dev->flags); |
1035 | 1037 | ||
@@ -1039,11 +1041,6 @@ static int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev) | |||
1039 | rt2x00rfkill_register(rt2x00dev); | 1041 | rt2x00rfkill_register(rt2x00dev); |
1040 | 1042 | ||
1041 | return 0; | 1043 | return 0; |
1042 | |||
1043 | exit: | ||
1044 | rt2x00lib_uninitialize(rt2x00dev); | ||
1045 | |||
1046 | return status; | ||
1047 | } | 1044 | } |
1048 | 1045 | ||
1049 | int rt2x00lib_start(struct rt2x00_dev *rt2x00dev) | 1046 | int rt2x00lib_start(struct rt2x00_dev *rt2x00dev) |
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index 9e5d94e44c5c..c17078eac197 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c | |||
@@ -314,13 +314,14 @@ int rt2x00pci_initialize(struct rt2x00_dev *rt2x00dev) | |||
314 | if (status) { | 314 | if (status) { |
315 | ERROR(rt2x00dev, "IRQ %d allocation failed (error %d).\n", | 315 | ERROR(rt2x00dev, "IRQ %d allocation failed (error %d).\n", |
316 | pci_dev->irq, status); | 316 | pci_dev->irq, status); |
317 | return status; | 317 | goto exit; |
318 | } | 318 | } |
319 | 319 | ||
320 | return 0; | 320 | return 0; |
321 | 321 | ||
322 | exit: | 322 | exit: |
323 | rt2x00pci_uninitialize(rt2x00dev); | 323 | queue_for_each(rt2x00dev, queue) |
324 | rt2x00pci_free_queue_dma(rt2x00dev, queue); | ||
324 | 325 | ||
325 | return status; | 326 | return status; |
326 | } | 327 | } |
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index 98af4d26583d..b64f2f5d0d53 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -2362,6 +2362,7 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2362 | { | 2362 | { |
2363 | struct rt2x00_dev *rt2x00dev = hw->priv; | 2363 | struct rt2x00_dev *rt2x00dev = hw->priv; |
2364 | struct rt2x00_intf *intf = vif_to_intf(control->vif); | 2364 | struct rt2x00_intf *intf = vif_to_intf(control->vif); |
2365 | struct queue_entry_priv_pci_tx *priv_tx; | ||
2365 | struct skb_frame_desc *skbdesc; | 2366 | struct skb_frame_desc *skbdesc; |
2366 | unsigned int beacon_base; | 2367 | unsigned int beacon_base; |
2367 | u32 reg; | 2368 | u32 reg; |
@@ -2369,21 +2370,8 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2369 | if (unlikely(!intf->beacon)) | 2370 | if (unlikely(!intf->beacon)) |
2370 | return -ENOBUFS; | 2371 | return -ENOBUFS; |
2371 | 2372 | ||
2372 | /* | 2373 | priv_tx = intf->beacon->priv_data; |
2373 | * We need to append the descriptor in front of the | 2374 | memset(priv_tx->desc, 0, intf->beacon->queue->desc_size); |
2374 | * beacon frame. | ||
2375 | */ | ||
2376 | if (skb_headroom(skb) < intf->beacon->queue->desc_size) { | ||
2377 | if (pskb_expand_head(skb, intf->beacon->queue->desc_size, | ||
2378 | 0, GFP_ATOMIC)) | ||
2379 | return -ENOMEM; | ||
2380 | } | ||
2381 | |||
2382 | /* | ||
2383 | * Add the descriptor in front of the skb. | ||
2384 | */ | ||
2385 | skb_push(skb, intf->beacon->queue->desc_size); | ||
2386 | memset(skb->data, 0, intf->beacon->queue->desc_size); | ||
2387 | 2375 | ||
2388 | /* | 2376 | /* |
2389 | * Fill in skb descriptor | 2377 | * Fill in skb descriptor |
@@ -2391,9 +2379,9 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2391 | skbdesc = get_skb_frame_desc(skb); | 2379 | skbdesc = get_skb_frame_desc(skb); |
2392 | memset(skbdesc, 0, sizeof(*skbdesc)); | 2380 | memset(skbdesc, 0, sizeof(*skbdesc)); |
2393 | skbdesc->flags |= FRAME_DESC_DRIVER_GENERATED; | 2381 | skbdesc->flags |= FRAME_DESC_DRIVER_GENERATED; |
2394 | skbdesc->data = skb->data + intf->beacon->queue->desc_size; | 2382 | skbdesc->data = skb->data; |
2395 | skbdesc->data_len = skb->len - intf->beacon->queue->desc_size; | 2383 | skbdesc->data_len = skb->len; |
2396 | skbdesc->desc = skb->data; | 2384 | skbdesc->desc = priv_tx->desc; |
2397 | skbdesc->desc_len = intf->beacon->queue->desc_size; | 2385 | skbdesc->desc_len = intf->beacon->queue->desc_size; |
2398 | skbdesc->entry = intf->beacon; | 2386 | skbdesc->entry = intf->beacon; |
2399 | 2387 | ||
@@ -2414,7 +2402,10 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2414 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | 2402 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); |
2415 | beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx); | 2403 | beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx); |
2416 | rt2x00pci_register_multiwrite(rt2x00dev, beacon_base, | 2404 | rt2x00pci_register_multiwrite(rt2x00dev, beacon_base, |
2417 | skb->data, skb->len); | 2405 | skbdesc->desc, skbdesc->desc_len); |
2406 | rt2x00pci_register_multiwrite(rt2x00dev, | ||
2407 | beacon_base + skbdesc->desc_len, | ||
2408 | skbdesc->data, skbdesc->data_len); | ||
2418 | rt61pci_kick_tx_queue(rt2x00dev, QID_BEACON); | 2409 | rt61pci_kick_tx_queue(rt2x00dev, QID_BEACON); |
2419 | 2410 | ||
2420 | return 0; | 2411 | return 0; |
@@ -2479,7 +2470,7 @@ static const struct data_queue_desc rt61pci_queue_tx = { | |||
2479 | 2470 | ||
2480 | static const struct data_queue_desc rt61pci_queue_bcn = { | 2471 | static const struct data_queue_desc rt61pci_queue_bcn = { |
2481 | .entry_num = 4 * BEACON_ENTRIES, | 2472 | .entry_num = 4 * BEACON_ENTRIES, |
2482 | .data_size = MGMT_FRAME_SIZE, | 2473 | .data_size = 0, /* No DMA required for beacons */ |
2483 | .desc_size = TXINFO_SIZE, | 2474 | .desc_size = TXINFO_SIZE, |
2484 | .priv_size = sizeof(struct queue_entry_priv_pci_tx), | 2475 | .priv_size = sizeof(struct queue_entry_priv_pci_tx), |
2485 | }; | 2476 | }; |