diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.c | 29 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800pci.c | 24 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800usb.c | 22 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 6 |
7 files changed, 50 insertions, 52 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 8ff7db853286..529a37364eb0 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -245,6 +245,25 @@ void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev, | |||
245 | } | 245 | } |
246 | EXPORT_SYMBOL_GPL(rt2800_mcu_request); | 246 | EXPORT_SYMBOL_GPL(rt2800_mcu_request); |
247 | 247 | ||
248 | int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev) | ||
249 | { | ||
250 | unsigned int i; | ||
251 | u32 reg; | ||
252 | |||
253 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | ||
254 | rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®); | ||
255 | if (!rt2x00_get_field32(reg, WPDMA_GLO_CFG_TX_DMA_BUSY) && | ||
256 | !rt2x00_get_field32(reg, WPDMA_GLO_CFG_RX_DMA_BUSY)) | ||
257 | return 0; | ||
258 | |||
259 | msleep(1); | ||
260 | } | ||
261 | |||
262 | ERROR(rt2x00dev, "WPDMA TX/RX busy, aborting.\n"); | ||
263 | return -EACCES; | ||
264 | } | ||
265 | EXPORT_SYMBOL_GPL(rt2800_wait_wpdma_ready); | ||
266 | |||
248 | #ifdef CONFIG_RT2X00_LIB_DEBUGFS | 267 | #ifdef CONFIG_RT2X00_LIB_DEBUGFS |
249 | const struct rt2x00debug rt2800_rt2x00debug = { | 268 | const struct rt2x00debug rt2800_rt2x00debug = { |
250 | .owner = THIS_MODULE, | 269 | .owner = THIS_MODULE, |
@@ -339,7 +358,7 @@ static int rt2800_blink_set(struct led_classdev *led_cdev, | |||
339 | rt2x00_set_field32(®, LED_CFG_OFF_PERIOD, *delay_off); | 358 | rt2x00_set_field32(®, LED_CFG_OFF_PERIOD, *delay_off); |
340 | rt2x00_set_field32(®, LED_CFG_SLOW_BLINK_PERIOD, 3); | 359 | rt2x00_set_field32(®, LED_CFG_SLOW_BLINK_PERIOD, 3); |
341 | rt2x00_set_field32(®, LED_CFG_R_LED_MODE, 3); | 360 | rt2x00_set_field32(®, LED_CFG_R_LED_MODE, 3); |
342 | rt2x00_set_field32(®, LED_CFG_G_LED_MODE, 12); | 361 | rt2x00_set_field32(®, LED_CFG_G_LED_MODE, 3); |
343 | rt2x00_set_field32(®, LED_CFG_Y_LED_MODE, 3); | 362 | rt2x00_set_field32(®, LED_CFG_Y_LED_MODE, 3); |
344 | rt2x00_set_field32(®, LED_CFG_LED_POLAR, 1); | 363 | rt2x00_set_field32(®, LED_CFG_LED_POLAR, 1); |
345 | rt2800_register_write(led->rt2x00dev, LED_CFG, reg); | 364 | rt2800_register_write(led->rt2x00dev, LED_CFG, reg); |
@@ -347,7 +366,7 @@ static int rt2800_blink_set(struct led_classdev *led_cdev, | |||
347 | return 0; | 366 | return 0; |
348 | } | 367 | } |
349 | 368 | ||
350 | void rt2800_init_led(struct rt2x00_dev *rt2x00dev, | 369 | static void rt2800_init_led(struct rt2x00_dev *rt2x00dev, |
351 | struct rt2x00_led *led, enum led_type type) | 370 | struct rt2x00_led *led, enum led_type type) |
352 | { | 371 | { |
353 | led->rt2x00dev = rt2x00dev; | 372 | led->rt2x00dev = rt2x00dev; |
@@ -356,7 +375,6 @@ void rt2800_init_led(struct rt2x00_dev *rt2x00dev, | |||
356 | led->led_dev.blink_set = rt2800_blink_set; | 375 | led->led_dev.blink_set = rt2800_blink_set; |
357 | led->flags = LED_INITIALIZED; | 376 | led->flags = LED_INITIALIZED; |
358 | } | 377 | } |
359 | EXPORT_SYMBOL_GPL(rt2800_init_led); | ||
360 | #endif /* CONFIG_RT2X00_LIB_LEDS */ | 378 | #endif /* CONFIG_RT2X00_LIB_LEDS */ |
361 | 379 | ||
362 | /* | 380 | /* |
@@ -1862,7 +1880,8 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev) | |||
1862 | !rt2x00_rf(rt2x00dev, RF3020) && | 1880 | !rt2x00_rf(rt2x00dev, RF3020) && |
1863 | !rt2x00_rf(rt2x00dev, RF2020) && | 1881 | !rt2x00_rf(rt2x00dev, RF2020) && |
1864 | !rt2x00_rf(rt2x00dev, RF3021) && | 1882 | !rt2x00_rf(rt2x00dev, RF3021) && |
1865 | !rt2x00_rf(rt2x00dev, RF3022)) { | 1883 | !rt2x00_rf(rt2x00dev, RF3022) && |
1884 | !rt2x00_rf(rt2x00dev, RF3052)) { | ||
1866 | ERROR(rt2x00dev, "Invalid RF chipset detected.\n"); | 1885 | ERROR(rt2x00dev, "Invalid RF chipset detected.\n"); |
1867 | return -ENODEV; | 1886 | return -ENODEV; |
1868 | } | 1887 | } |
@@ -2047,7 +2066,7 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | |||
2047 | 2066 | ||
2048 | if (rt2x00_rf(rt2x00dev, RF2820) || | 2067 | if (rt2x00_rf(rt2x00dev, RF2820) || |
2049 | rt2x00_rf(rt2x00dev, RF2720) || | 2068 | rt2x00_rf(rt2x00dev, RF2720) || |
2050 | (rt2x00_intf_is_pci(rt2x00dev) && rt2x00_rf(rt2x00dev, RF3052))) { | 2069 | rt2x00_rf(rt2x00dev, RF3052)) { |
2051 | spec->num_channels = 14; | 2070 | spec->num_channels = 14; |
2052 | spec->channels = rf_vals; | 2071 | spec->channels = rf_vals; |
2053 | } else if (rt2x00_rf(rt2x00dev, RF2850) || rt2x00_rf(rt2x00dev, RF2750)) { | 2072 | } else if (rt2x00_rf(rt2x00dev, RF2850) || rt2x00_rf(rt2x00dev, RF2750)) { |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.h b/drivers/net/wireless/rt2x00/rt2800lib.h index 535ce22f2ac8..ebabeae62d1b 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.h +++ b/drivers/net/wireless/rt2x00/rt2800lib.h | |||
@@ -114,8 +114,6 @@ void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev, | |||
114 | extern const struct rt2x00debug rt2800_rt2x00debug; | 114 | extern const struct rt2x00debug rt2800_rt2x00debug; |
115 | 115 | ||
116 | int rt2800_rfkill_poll(struct rt2x00_dev *rt2x00dev); | 116 | int rt2800_rfkill_poll(struct rt2x00_dev *rt2x00dev); |
117 | void rt2800_init_led(struct rt2x00_dev *rt2x00dev, | ||
118 | struct rt2x00_led *led, enum led_type type); | ||
119 | int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev, | 117 | int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev, |
120 | struct rt2x00lib_crypto *crypto, | 118 | struct rt2x00lib_crypto *crypto, |
121 | struct ieee80211_key_conf *key); | 119 | struct ieee80211_key_conf *key); |
@@ -139,6 +137,7 @@ void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual, | |||
139 | int rt2800_init_registers(struct rt2x00_dev *rt2x00dev); | 137 | int rt2800_init_registers(struct rt2x00_dev *rt2x00dev); |
140 | int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev); | 138 | int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev); |
141 | int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev); | 139 | int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev); |
140 | int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev); | ||
142 | 141 | ||
143 | int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev); | 142 | int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev); |
144 | void rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev); | 143 | void rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev); |
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c index 99095e1ee13b..d64181cbc9cb 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c | |||
@@ -453,24 +453,6 @@ static void rt2800pci_toggle_irq(struct rt2x00_dev *rt2x00dev, | |||
453 | rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg); | 453 | rt2800_register_write(rt2x00dev, INT_MASK_CSR, reg); |
454 | } | 454 | } |
455 | 455 | ||
456 | static int rt2800pci_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev) | ||
457 | { | ||
458 | unsigned int i; | ||
459 | u32 reg; | ||
460 | |||
461 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | ||
462 | rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®); | ||
463 | if (!rt2x00_get_field32(reg, WPDMA_GLO_CFG_TX_DMA_BUSY) && | ||
464 | !rt2x00_get_field32(reg, WPDMA_GLO_CFG_RX_DMA_BUSY)) | ||
465 | return 0; | ||
466 | |||
467 | msleep(1); | ||
468 | } | ||
469 | |||
470 | ERROR(rt2x00dev, "WPDMA TX/RX busy, aborting.\n"); | ||
471 | return -EACCES; | ||
472 | } | ||
473 | |||
474 | static int rt2800pci_enable_radio(struct rt2x00_dev *rt2x00dev) | 456 | static int rt2800pci_enable_radio(struct rt2x00_dev *rt2x00dev) |
475 | { | 457 | { |
476 | u32 reg; | 458 | u32 reg; |
@@ -479,10 +461,10 @@ static int rt2800pci_enable_radio(struct rt2x00_dev *rt2x00dev) | |||
479 | /* | 461 | /* |
480 | * Initialize all registers. | 462 | * Initialize all registers. |
481 | */ | 463 | */ |
482 | if (unlikely(rt2800pci_wait_wpdma_ready(rt2x00dev) || | 464 | if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev) || |
483 | rt2800pci_init_queues(rt2x00dev) || | 465 | rt2800pci_init_queues(rt2x00dev) || |
484 | rt2800_init_registers(rt2x00dev) || | 466 | rt2800_init_registers(rt2x00dev) || |
485 | rt2800pci_wait_wpdma_ready(rt2x00dev) || | 467 | rt2800_wait_wpdma_ready(rt2x00dev) || |
486 | rt2800_init_bbp(rt2x00dev) || | 468 | rt2800_init_bbp(rt2x00dev) || |
487 | rt2800_init_rfcsr(rt2x00dev))) | 469 | rt2800_init_rfcsr(rt2x00dev))) |
488 | return -EIO; | 470 | return -EIO; |
@@ -562,7 +544,7 @@ static void rt2800pci_disable_radio(struct rt2x00_dev *rt2x00dev) | |||
562 | rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00); | 544 | rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00); |
563 | 545 | ||
564 | /* Wait for DMA, ignore error */ | 546 | /* Wait for DMA, ignore error */ |
565 | rt2800pci_wait_wpdma_ready(rt2x00dev); | 547 | rt2800_wait_wpdma_ready(rt2x00dev); |
566 | } | 548 | } |
567 | 549 | ||
568 | static int rt2800pci_set_state(struct rt2x00_dev *rt2x00dev, | 550 | static int rt2800pci_set_state(struct rt2x00_dev *rt2x00dev, |
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 0510f020dcf5..82755cf8b73e 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
@@ -248,24 +248,6 @@ static void rt2800usb_toggle_rx(struct rt2x00_dev *rt2x00dev, | |||
248 | rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); | 248 | rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); |
249 | } | 249 | } |
250 | 250 | ||
251 | static int rt2800usb_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev) | ||
252 | { | ||
253 | unsigned int i; | ||
254 | u32 reg; | ||
255 | |||
256 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | ||
257 | rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®); | ||
258 | if (!rt2x00_get_field32(reg, WPDMA_GLO_CFG_TX_DMA_BUSY) && | ||
259 | !rt2x00_get_field32(reg, WPDMA_GLO_CFG_RX_DMA_BUSY)) | ||
260 | return 0; | ||
261 | |||
262 | msleep(1); | ||
263 | } | ||
264 | |||
265 | ERROR(rt2x00dev, "WPDMA TX/RX busy, aborting.\n"); | ||
266 | return -EACCES; | ||
267 | } | ||
268 | |||
269 | static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev) | 251 | static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev) |
270 | { | 252 | { |
271 | u32 reg; | 253 | u32 reg; |
@@ -274,7 +256,7 @@ static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev) | |||
274 | /* | 256 | /* |
275 | * Initialize all registers. | 257 | * Initialize all registers. |
276 | */ | 258 | */ |
277 | if (unlikely(rt2800usb_wait_wpdma_ready(rt2x00dev) || | 259 | if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev) || |
278 | rt2800_init_registers(rt2x00dev) || | 260 | rt2800_init_registers(rt2x00dev) || |
279 | rt2800_init_bbp(rt2x00dev) || | 261 | rt2800_init_bbp(rt2x00dev) || |
280 | rt2800_init_rfcsr(rt2x00dev))) | 262 | rt2800_init_rfcsr(rt2x00dev))) |
@@ -344,7 +326,7 @@ static void rt2800usb_disable_radio(struct rt2x00_dev *rt2x00dev) | |||
344 | rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0); | 326 | rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0); |
345 | 327 | ||
346 | /* Wait for DMA, ignore error */ | 328 | /* Wait for DMA, ignore error */ |
347 | rt2800usb_wait_wpdma_ready(rt2x00dev); | 329 | rt2800_wait_wpdma_ready(rt2x00dev); |
348 | 330 | ||
349 | rt2x00usb_disable_radio(rt2x00dev); | 331 | rt2x00usb_disable_radio(rt2x00dev); |
350 | } | 332 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index b4c6e0a6d7e0..096da85a66fa 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
@@ -119,6 +119,12 @@ | |||
119 | ( ((unsigned long)((__skb)->data + (__header))) & 3 ) | 119 | ( ((unsigned long)((__skb)->data + (__header))) & 3 ) |
120 | 120 | ||
121 | /* | 121 | /* |
122 | * Constants for extra TX headroom for alignment purposes. | ||
123 | */ | ||
124 | #define RT2X00_ALIGN_SIZE 4 /* Only whole frame needs alignment */ | ||
125 | #define RT2X00_L2PAD_SIZE 8 /* Both header & payload need alignment */ | ||
126 | |||
127 | /* | ||
122 | * Standard timing and size defines. | 128 | * Standard timing and size defines. |
123 | * These values should follow the ieee80211 specifications. | 129 | * These values should follow the ieee80211 specifications. |
124 | */ | 130 | */ |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index d7711e4d4751..b93731b79903 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -688,7 +688,17 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
688 | /* | 688 | /* |
689 | * Initialize extra TX headroom required. | 689 | * Initialize extra TX headroom required. |
690 | */ | 690 | */ |
691 | rt2x00dev->hw->extra_tx_headroom = rt2x00dev->ops->extra_tx_headroom; | 691 | rt2x00dev->hw->extra_tx_headroom = |
692 | max_t(unsigned int, IEEE80211_TX_STATUS_HEADROOM, | ||
693 | rt2x00dev->ops->extra_tx_headroom); | ||
694 | |||
695 | /* | ||
696 | * Take TX headroom required for alignment into account. | ||
697 | */ | ||
698 | if (test_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags)) | ||
699 | rt2x00dev->hw->extra_tx_headroom += RT2X00_L2PAD_SIZE; | ||
700 | else if (test_bit(DRIVER_REQUIRE_DMA, &rt2x00dev->flags)) | ||
701 | rt2x00dev->hw->extra_tx_headroom += RT2X00_ALIGN_SIZE; | ||
692 | 702 | ||
693 | /* | 703 | /* |
694 | * Register HW. | 704 | * Register HW. |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 3d8fb684b4eb..0b4801a14601 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -104,7 +104,7 @@ void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb) | |||
104 | * is also mapped to the DMA so it can be used for transfering | 104 | * is also mapped to the DMA so it can be used for transfering |
105 | * additional descriptor information to the hardware. | 105 | * additional descriptor information to the hardware. |
106 | */ | 106 | */ |
107 | skb_push(skb, rt2x00dev->hw->extra_tx_headroom); | 107 | skb_push(skb, rt2x00dev->ops->extra_tx_headroom); |
108 | 108 | ||
109 | skbdesc->skb_dma = | 109 | skbdesc->skb_dma = |
110 | dma_map_single(rt2x00dev->dev, skb->data, skb->len, DMA_TO_DEVICE); | 110 | dma_map_single(rt2x00dev->dev, skb->data, skb->len, DMA_TO_DEVICE); |
@@ -112,7 +112,7 @@ void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb) | |||
112 | /* | 112 | /* |
113 | * Restore data pointer to original location again. | 113 | * Restore data pointer to original location again. |
114 | */ | 114 | */ |
115 | skb_pull(skb, rt2x00dev->hw->extra_tx_headroom); | 115 | skb_pull(skb, rt2x00dev->ops->extra_tx_headroom); |
116 | 116 | ||
117 | skbdesc->flags |= SKBDESC_DMA_MAPPED_TX; | 117 | skbdesc->flags |= SKBDESC_DMA_MAPPED_TX; |
118 | } | 118 | } |
@@ -134,7 +134,7 @@ void rt2x00queue_unmap_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb) | |||
134 | * by the driver, but it was actually mapped to DMA. | 134 | * by the driver, but it was actually mapped to DMA. |
135 | */ | 135 | */ |
136 | dma_unmap_single(rt2x00dev->dev, skbdesc->skb_dma, | 136 | dma_unmap_single(rt2x00dev->dev, skbdesc->skb_dma, |
137 | skb->len + rt2x00dev->hw->extra_tx_headroom, | 137 | skb->len + rt2x00dev->ops->extra_tx_headroom, |
138 | DMA_TO_DEVICE); | 138 | DMA_TO_DEVICE); |
139 | skbdesc->flags &= ~SKBDESC_DMA_MAPPED_TX; | 139 | skbdesc->flags &= ~SKBDESC_DMA_MAPPED_TX; |
140 | } | 140 | } |