aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2008-04-18 02:56:30 -0400
committerDavid S. Miller <davem@davemloft.net>2008-04-18 02:56:30 -0400
commit1e42198609d73ed1a9adcba2af275c24c2678420 (patch)
tree32fd4d9073bfc0f3909af8f9fb4bcff38951d01a /drivers/net/wireless
parent794eb6bf20ebf992c040ea831cd3a9c64b0c1f7a (diff)
parent4b119e21d0c66c22e8ca03df05d9de623d0eb50f (diff)
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/b43/dma.c27
-rw-r--r--drivers/net/wireless/b43legacy/dma.c55
-rw-r--r--drivers/net/wireless/b43legacy/main.c2
-rw-r--r--drivers/net/wireless/rtl8187_dev.c3
4 files changed, 50 insertions, 37 deletions
diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c
index f1b983cb9c1f..21c886a9a1d9 100644
--- a/drivers/net/wireless/b43/dma.c
+++ b/drivers/net/wireless/b43/dma.c
@@ -328,10 +328,10 @@ static inline
328 dma_addr_t dmaaddr; 328 dma_addr_t dmaaddr;
329 329
330 if (tx) { 330 if (tx) {
331 dmaaddr = dma_map_single(ring->dev->dev->dev, 331 dmaaddr = dma_map_single(ring->dev->dev->dma_dev,
332 buf, len, DMA_TO_DEVICE); 332 buf, len, DMA_TO_DEVICE);
333 } else { 333 } else {
334 dmaaddr = dma_map_single(ring->dev->dev->dev, 334 dmaaddr = dma_map_single(ring->dev->dev->dma_dev,
335 buf, len, DMA_FROM_DEVICE); 335 buf, len, DMA_FROM_DEVICE);
336 } 336 }
337 337
@@ -343,9 +343,10 @@ static inline
343 dma_addr_t addr, size_t len, int tx) 343 dma_addr_t addr, size_t len, int tx)
344{ 344{
345 if (tx) { 345 if (tx) {
346 dma_unmap_single(ring->dev->dev->dev, addr, len, DMA_TO_DEVICE); 346 dma_unmap_single(ring->dev->dev->dma_dev,
347 addr, len, DMA_TO_DEVICE);
347 } else { 348 } else {
348 dma_unmap_single(ring->dev->dev->dev, 349 dma_unmap_single(ring->dev->dev->dma_dev,
349 addr, len, DMA_FROM_DEVICE); 350 addr, len, DMA_FROM_DEVICE);
350 } 351 }
351} 352}
@@ -355,7 +356,7 @@ static inline
355 dma_addr_t addr, size_t len) 356 dma_addr_t addr, size_t len)
356{ 357{
357 B43_WARN_ON(ring->tx); 358 B43_WARN_ON(ring->tx);
358 dma_sync_single_for_cpu(ring->dev->dev->dev, 359 dma_sync_single_for_cpu(ring->dev->dev->dma_dev,
359 addr, len, DMA_FROM_DEVICE); 360 addr, len, DMA_FROM_DEVICE);
360} 361}
361 362
@@ -364,7 +365,7 @@ static inline
364 dma_addr_t addr, size_t len) 365 dma_addr_t addr, size_t len)
365{ 366{
366 B43_WARN_ON(ring->tx); 367 B43_WARN_ON(ring->tx);
367 dma_sync_single_for_device(ring->dev->dev->dev, 368 dma_sync_single_for_device(ring->dev->dev->dma_dev,
368 addr, len, DMA_FROM_DEVICE); 369 addr, len, DMA_FROM_DEVICE);
369} 370}
370 371
@@ -380,7 +381,7 @@ static inline
380 381
381static int alloc_ringmemory(struct b43_dmaring *ring) 382static int alloc_ringmemory(struct b43_dmaring *ring)
382{ 383{
383 struct device *dev = ring->dev->dev->dev; 384 struct device *dma_dev = ring->dev->dev->dma_dev;
384 gfp_t flags = GFP_KERNEL; 385 gfp_t flags = GFP_KERNEL;
385 386
386 /* The specs call for 4K buffers for 30- and 32-bit DMA with 4K 387 /* The specs call for 4K buffers for 30- and 32-bit DMA with 4K
@@ -394,7 +395,7 @@ static int alloc_ringmemory(struct b43_dmaring *ring)
394 */ 395 */
395 if (ring->type == B43_DMA_64BIT) 396 if (ring->type == B43_DMA_64BIT)
396 flags |= GFP_DMA; 397 flags |= GFP_DMA;
397 ring->descbase = dma_alloc_coherent(dev, B43_DMA_RINGMEMSIZE, 398 ring->descbase = dma_alloc_coherent(dma_dev, B43_DMA_RINGMEMSIZE,
398 &(ring->dmabase), flags); 399 &(ring->dmabase), flags);
399 if (!ring->descbase) { 400 if (!ring->descbase) {
400 b43err(ring->dev->wl, "DMA ringmemory allocation failed\n"); 401 b43err(ring->dev->wl, "DMA ringmemory allocation failed\n");
@@ -407,9 +408,9 @@ static int alloc_ringmemory(struct b43_dmaring *ring)
407 408
408static void free_ringmemory(struct b43_dmaring *ring) 409static void free_ringmemory(struct b43_dmaring *ring)
409{ 410{
410 struct device *dev = ring->dev->dev->dev; 411 struct device *dma_dev = ring->dev->dev->dma_dev;
411 412
412 dma_free_coherent(dev, B43_DMA_RINGMEMSIZE, 413 dma_free_coherent(dma_dev, B43_DMA_RINGMEMSIZE,
413 ring->descbase, ring->dmabase); 414 ring->descbase, ring->dmabase);
414} 415}
415 416
@@ -818,7 +819,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
818 goto err_kfree_meta; 819 goto err_kfree_meta;
819 820
820 /* test for ability to dma to txhdr_cache */ 821 /* test for ability to dma to txhdr_cache */
821 dma_test = dma_map_single(dev->dev->dev, 822 dma_test = dma_map_single(dev->dev->dma_dev,
822 ring->txhdr_cache, 823 ring->txhdr_cache,
823 b43_txhdr_size(dev), 824 b43_txhdr_size(dev),
824 DMA_TO_DEVICE); 825 DMA_TO_DEVICE);
@@ -833,7 +834,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
833 if (!ring->txhdr_cache) 834 if (!ring->txhdr_cache)
834 goto err_kfree_meta; 835 goto err_kfree_meta;
835 836
836 dma_test = dma_map_single(dev->dev->dev, 837 dma_test = dma_map_single(dev->dev->dma_dev,
837 ring->txhdr_cache, 838 ring->txhdr_cache,
838 b43_txhdr_size(dev), 839 b43_txhdr_size(dev),
839 DMA_TO_DEVICE); 840 DMA_TO_DEVICE);
@@ -847,7 +848,7 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,
847 } 848 }
848 } 849 }
849 850
850 dma_unmap_single(dev->dev->dev, 851 dma_unmap_single(dev->dev->dma_dev,
851 dma_test, b43_txhdr_size(dev), 852 dma_test, b43_txhdr_size(dev),
852 DMA_TO_DEVICE); 853 DMA_TO_DEVICE);
853 } 854 }
diff --git a/drivers/net/wireless/b43legacy/dma.c b/drivers/net/wireless/b43legacy/dma.c
index e87b427d5e43..c990f87b107a 100644
--- a/drivers/net/wireless/b43legacy/dma.c
+++ b/drivers/net/wireless/b43legacy/dma.c
@@ -393,11 +393,11 @@ dma_addr_t map_descbuffer(struct b43legacy_dmaring *ring,
393 dma_addr_t dmaaddr; 393 dma_addr_t dmaaddr;
394 394
395 if (tx) 395 if (tx)
396 dmaaddr = dma_map_single(ring->dev->dev->dev, 396 dmaaddr = dma_map_single(ring->dev->dev->dma_dev,
397 buf, len, 397 buf, len,
398 DMA_TO_DEVICE); 398 DMA_TO_DEVICE);
399 else 399 else
400 dmaaddr = dma_map_single(ring->dev->dev->dev, 400 dmaaddr = dma_map_single(ring->dev->dev->dma_dev,
401 buf, len, 401 buf, len,
402 DMA_FROM_DEVICE); 402 DMA_FROM_DEVICE);
403 403
@@ -411,11 +411,11 @@ void unmap_descbuffer(struct b43legacy_dmaring *ring,
411 int tx) 411 int tx)
412{ 412{
413 if (tx) 413 if (tx)
414 dma_unmap_single(ring->dev->dev->dev, 414 dma_unmap_single(ring->dev->dev->dma_dev,
415 addr, len, 415 addr, len,
416 DMA_TO_DEVICE); 416 DMA_TO_DEVICE);
417 else 417 else
418 dma_unmap_single(ring->dev->dev->dev, 418 dma_unmap_single(ring->dev->dev->dma_dev,
419 addr, len, 419 addr, len,
420 DMA_FROM_DEVICE); 420 DMA_FROM_DEVICE);
421} 421}
@@ -427,7 +427,7 @@ void sync_descbuffer_for_cpu(struct b43legacy_dmaring *ring,
427{ 427{
428 B43legacy_WARN_ON(ring->tx); 428 B43legacy_WARN_ON(ring->tx);
429 429
430 dma_sync_single_for_cpu(ring->dev->dev->dev, 430 dma_sync_single_for_cpu(ring->dev->dev->dma_dev,
431 addr, len, DMA_FROM_DEVICE); 431 addr, len, DMA_FROM_DEVICE);
432} 432}
433 433
@@ -438,7 +438,7 @@ void sync_descbuffer_for_device(struct b43legacy_dmaring *ring,
438{ 438{
439 B43legacy_WARN_ON(ring->tx); 439 B43legacy_WARN_ON(ring->tx);
440 440
441 dma_sync_single_for_device(ring->dev->dev->dev, 441 dma_sync_single_for_device(ring->dev->dev->dma_dev,
442 addr, len, DMA_FROM_DEVICE); 442 addr, len, DMA_FROM_DEVICE);
443} 443}
444 444
@@ -458,9 +458,9 @@ void free_descriptor_buffer(struct b43legacy_dmaring *ring,
458 458
459static int alloc_ringmemory(struct b43legacy_dmaring *ring) 459static int alloc_ringmemory(struct b43legacy_dmaring *ring)
460{ 460{
461 struct device *dev = ring->dev->dev->dev; 461 struct device *dma_dev = ring->dev->dev->dma_dev;
462 462
463 ring->descbase = dma_alloc_coherent(dev, B43legacy_DMA_RINGMEMSIZE, 463 ring->descbase = dma_alloc_coherent(dma_dev, B43legacy_DMA_RINGMEMSIZE,
464 &(ring->dmabase), GFP_KERNEL); 464 &(ring->dmabase), GFP_KERNEL);
465 if (!ring->descbase) { 465 if (!ring->descbase) {
466 b43legacyerr(ring->dev->wl, "DMA ringmemory allocation" 466 b43legacyerr(ring->dev->wl, "DMA ringmemory allocation"
@@ -474,9 +474,9 @@ static int alloc_ringmemory(struct b43legacy_dmaring *ring)
474 474
475static void free_ringmemory(struct b43legacy_dmaring *ring) 475static void free_ringmemory(struct b43legacy_dmaring *ring)
476{ 476{
477 struct device *dev = ring->dev->dev->dev; 477 struct device *dma_dev = ring->dev->dev->dma_dev;
478 478
479 dma_free_coherent(dev, B43legacy_DMA_RINGMEMSIZE, 479 dma_free_coherent(dma_dev, B43legacy_DMA_RINGMEMSIZE,
480 ring->descbase, ring->dmabase); 480 ring->descbase, ring->dmabase);
481} 481}
482 482
@@ -585,8 +585,9 @@ static int b43legacy_dmacontroller_tx_reset(struct b43legacy_wldev *dev,
585 585
586/* Check if a DMA mapping address is invalid. */ 586/* Check if a DMA mapping address is invalid. */
587static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring, 587static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring,
588 dma_addr_t addr, 588 dma_addr_t addr,
589 size_t buffersize) 589 size_t buffersize,
590 bool dma_to_device)
590{ 591{
591 if (unlikely(dma_mapping_error(addr))) 592 if (unlikely(dma_mapping_error(addr)))
592 return 1; 593 return 1;
@@ -594,11 +595,11 @@ static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring,
594 switch (ring->type) { 595 switch (ring->type) {
595 case B43legacy_DMA_30BIT: 596 case B43legacy_DMA_30BIT:
596 if ((u64)addr + buffersize > (1ULL << 30)) 597 if ((u64)addr + buffersize > (1ULL << 30))
597 return 1; 598 goto address_error;
598 break; 599 break;
599 case B43legacy_DMA_32BIT: 600 case B43legacy_DMA_32BIT:
600 if ((u64)addr + buffersize > (1ULL << 32)) 601 if ((u64)addr + buffersize > (1ULL << 32))
601 return 1; 602 goto address_error;
602 break; 603 break;
603 case B43legacy_DMA_64BIT: 604 case B43legacy_DMA_64BIT:
604 /* Currently we can't have addresses beyond 64 bits in the kernel. */ 605 /* Currently we can't have addresses beyond 64 bits in the kernel. */
@@ -607,6 +608,12 @@ static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring,
607 608
608 /* The address is OK. */ 609 /* The address is OK. */
609 return 0; 610 return 0;
611
612address_error:
613 /* We can't support this address. Unmap it again. */
614 unmap_descbuffer(ring, addr, buffersize, dma_to_device);
615
616 return 1;
610} 617}
611 618
612static int setup_rx_descbuffer(struct b43legacy_dmaring *ring, 619static int setup_rx_descbuffer(struct b43legacy_dmaring *ring,
@@ -626,7 +633,7 @@ static int setup_rx_descbuffer(struct b43legacy_dmaring *ring,
626 return -ENOMEM; 633 return -ENOMEM;
627 dmaaddr = map_descbuffer(ring, skb->data, 634 dmaaddr = map_descbuffer(ring, skb->data,
628 ring->rx_buffersize, 0); 635 ring->rx_buffersize, 0);
629 if (b43legacy_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize)) { 636 if (b43legacy_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
630 /* ugh. try to realloc in zone_dma */ 637 /* ugh. try to realloc in zone_dma */
631 gfp_flags |= GFP_DMA; 638 gfp_flags |= GFP_DMA;
632 639
@@ -639,7 +646,7 @@ static int setup_rx_descbuffer(struct b43legacy_dmaring *ring,
639 ring->rx_buffersize, 0); 646 ring->rx_buffersize, 0);
640 } 647 }
641 648
642 if (b43legacy_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize)) { 649 if (b43legacy_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
643 dev_kfree_skb_any(skb); 650 dev_kfree_skb_any(skb);
644 return -EIO; 651 return -EIO;
645 } 652 }
@@ -886,12 +893,12 @@ struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev,
886 goto err_kfree_meta; 893 goto err_kfree_meta;
887 894
888 /* test for ability to dma to txhdr_cache */ 895 /* test for ability to dma to txhdr_cache */
889 dma_test = dma_map_single(dev->dev->dev, ring->txhdr_cache, 896 dma_test = dma_map_single(dev->dev->dma_dev, ring->txhdr_cache,
890 sizeof(struct b43legacy_txhdr_fw3), 897 sizeof(struct b43legacy_txhdr_fw3),
891 DMA_TO_DEVICE); 898 DMA_TO_DEVICE);
892 899
893 if (b43legacy_dma_mapping_error(ring, dma_test, 900 if (b43legacy_dma_mapping_error(ring, dma_test,
894 sizeof(struct b43legacy_txhdr_fw3))) { 901 sizeof(struct b43legacy_txhdr_fw3), 1)) {
895 /* ugh realloc */ 902 /* ugh realloc */
896 kfree(ring->txhdr_cache); 903 kfree(ring->txhdr_cache);
897 ring->txhdr_cache = kcalloc(nr_slots, 904 ring->txhdr_cache = kcalloc(nr_slots,
@@ -900,17 +907,17 @@ struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev,
900 if (!ring->txhdr_cache) 907 if (!ring->txhdr_cache)
901 goto err_kfree_meta; 908 goto err_kfree_meta;
902 909
903 dma_test = dma_map_single(dev->dev->dev, 910 dma_test = dma_map_single(dev->dev->dma_dev,
904 ring->txhdr_cache, 911 ring->txhdr_cache,
905 sizeof(struct b43legacy_txhdr_fw3), 912 sizeof(struct b43legacy_txhdr_fw3),
906 DMA_TO_DEVICE); 913 DMA_TO_DEVICE);
907 914
908 if (b43legacy_dma_mapping_error(ring, dma_test, 915 if (b43legacy_dma_mapping_error(ring, dma_test,
909 sizeof(struct b43legacy_txhdr_fw3))) 916 sizeof(struct b43legacy_txhdr_fw3), 1))
910 goto err_kfree_txhdr_cache; 917 goto err_kfree_txhdr_cache;
911 } 918 }
912 919
913 dma_unmap_single(dev->dev->dev, 920 dma_unmap_single(dev->dev->dma_dev,
914 dma_test, sizeof(struct b43legacy_txhdr_fw3), 921 dma_test, sizeof(struct b43legacy_txhdr_fw3),
915 DMA_TO_DEVICE); 922 DMA_TO_DEVICE);
916 } 923 }
@@ -1235,7 +1242,7 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring,
1235 meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header, 1242 meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header,
1236 sizeof(struct b43legacy_txhdr_fw3), 1); 1243 sizeof(struct b43legacy_txhdr_fw3), 1);
1237 if (b43legacy_dma_mapping_error(ring, meta_hdr->dmaaddr, 1244 if (b43legacy_dma_mapping_error(ring, meta_hdr->dmaaddr,
1238 sizeof(struct b43legacy_txhdr_fw3))) { 1245 sizeof(struct b43legacy_txhdr_fw3), 1)) {
1239 ring->current_slot = old_top_slot; 1246 ring->current_slot = old_top_slot;
1240 ring->used_slots = old_used_slots; 1247 ring->used_slots = old_used_slots;
1241 return -EIO; 1248 return -EIO;
@@ -1254,7 +1261,7 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring,
1254 1261
1255 meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); 1262 meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
1256 /* create a bounce buffer in zone_dma on mapping failure. */ 1263 /* create a bounce buffer in zone_dma on mapping failure. */
1257 if (b43legacy_dma_mapping_error(ring, meta->dmaaddr, skb->len)) { 1264 if (b43legacy_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) {
1258 bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA); 1265 bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA);
1259 if (!bounce_skb) { 1266 if (!bounce_skb) {
1260 ring->current_slot = old_top_slot; 1267 ring->current_slot = old_top_slot;
@@ -1268,7 +1275,7 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring,
1268 skb = bounce_skb; 1275 skb = bounce_skb;
1269 meta->skb = skb; 1276 meta->skb = skb;
1270 meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); 1277 meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
1271 if (b43legacy_dma_mapping_error(ring, meta->dmaaddr, skb->len)) { 1278 if (b43legacy_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) {
1272 ring->current_slot = old_top_slot; 1279 ring->current_slot = old_top_slot;
1273 ring->used_slots = old_used_slots; 1280 ring->used_slots = old_used_slots;
1274 err = -EIO; 1281 err = -EIO;
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
index 2422a5dab1d2..ef829ee8ffd4 100644
--- a/drivers/net/wireless/b43legacy/main.c
+++ b/drivers/net/wireless/b43legacy/main.c
@@ -1516,6 +1516,7 @@ static int b43legacy_request_firmware(struct b43legacy_wldev *dev)
1516 } 1516 }
1517 if (!fw->initvals) { 1517 if (!fw->initvals) {
1518 switch (dev->phy.type) { 1518 switch (dev->phy.type) {
1519 case B43legacy_PHYTYPE_B:
1519 case B43legacy_PHYTYPE_G: 1520 case B43legacy_PHYTYPE_G:
1520 if ((rev >= 5) && (rev <= 10)) 1521 if ((rev >= 5) && (rev <= 10))
1521 filename = "b0g0initvals5"; 1522 filename = "b0g0initvals5";
@@ -1533,6 +1534,7 @@ static int b43legacy_request_firmware(struct b43legacy_wldev *dev)
1533 } 1534 }
1534 if (!fw->initvals_band) { 1535 if (!fw->initvals_band) {
1535 switch (dev->phy.type) { 1536 switch (dev->phy.type) {
1537 case B43legacy_PHYTYPE_B:
1536 case B43legacy_PHYTYPE_G: 1538 case B43legacy_PHYTYPE_G:
1537 if ((rev >= 5) && (rev <= 10)) 1539 if ((rev >= 5) && (rev <= 10))
1538 filename = "b0g0bsinitvals5"; 1540 filename = "b0g0bsinitvals5";
diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c
index c03834d5cb0b..d5787b37e1fb 100644
--- a/drivers/net/wireless/rtl8187_dev.c
+++ b/drivers/net/wireless/rtl8187_dev.c
@@ -546,6 +546,8 @@ static int rtl8187_add_interface(struct ieee80211_hw *dev,
546 return -EOPNOTSUPP; 546 return -EOPNOTSUPP;
547 } 547 }
548 548
549 priv->vif = conf->vif;
550
549 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); 551 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG);
550 for (i = 0; i < ETH_ALEN; i++) 552 for (i = 0; i < ETH_ALEN; i++)
551 rtl818x_iowrite8(priv, &priv->map->MAC[i], 553 rtl818x_iowrite8(priv, &priv->map->MAC[i],
@@ -560,6 +562,7 @@ static void rtl8187_remove_interface(struct ieee80211_hw *dev,
560{ 562{
561 struct rtl8187_priv *priv = dev->priv; 563 struct rtl8187_priv *priv = dev->priv;
562 priv->mode = IEEE80211_IF_TYPE_MNTR; 564 priv->mode = IEEE80211_IF_TYPE_MNTR;
565 priv->vif = NULL;
563} 566}
564 567
565static int rtl8187_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) 568static int rtl8187_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf)