aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/p54
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/p54')
-rw-r--r--drivers/net/wireless/p54/p54.h2
-rw-r--r--drivers/net/wireless/p54/p54common.c137
-rw-r--r--drivers/net/wireless/p54/p54common.h1
-rw-r--r--drivers/net/wireless/p54/p54pci.c2
4 files changed, 63 insertions, 79 deletions
diff --git a/drivers/net/wireless/p54/p54.h b/drivers/net/wireless/p54/p54.h
index 06d2c67f4c81..c6f27b9022f9 100644
--- a/drivers/net/wireless/p54/p54.h
+++ b/drivers/net/wireless/p54/p54.h
@@ -64,7 +64,7 @@ struct p54_common {
64 unsigned int tx_hdr_len; 64 unsigned int tx_hdr_len;
65 void *cached_vdcf; 65 void *cached_vdcf;
66 unsigned int fw_var; 66 unsigned int fw_var;
67 struct ieee80211_tx_queue_stats tx_stats; 67 struct ieee80211_tx_queue_stats tx_stats[4];
68}; 68};
69 69
70int p54_rx(struct ieee80211_hw *dev, struct sk_buff *skb); 70int p54_rx(struct ieee80211_hw *dev, struct sk_buff *skb);
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c
index 63f9badf3f52..9f7224de6fd1 100644
--- a/drivers/net/wireless/p54/p54common.c
+++ b/drivers/net/wireless/p54/p54common.c
@@ -146,10 +146,10 @@ void p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw)
146 146
147 if (priv->fw_var >= 0x300) { 147 if (priv->fw_var >= 0x300) {
148 /* Firmware supports QoS, use it! */ 148 /* Firmware supports QoS, use it! */
149 priv->tx_stats.data[0].limit = 3; 149 priv->tx_stats[0].limit = 3;
150 priv->tx_stats.data[1].limit = 4; 150 priv->tx_stats[1].limit = 4;
151 priv->tx_stats.data[2].limit = 3; 151 priv->tx_stats[2].limit = 3;
152 priv->tx_stats.data[3].limit = 1; 152 priv->tx_stats[3].limit = 1;
153 dev->queues = 4; 153 dev->queues = 4;
154 } 154 }
155} 155}
@@ -355,7 +355,7 @@ static void p54_rx_data(struct ieee80211_hw *dev, struct sk_buff *skb)
355 struct ieee80211_rx_status rx_status = {0}; 355 struct ieee80211_rx_status rx_status = {0};
356 u16 freq = le16_to_cpu(hdr->freq); 356 u16 freq = le16_to_cpu(hdr->freq);
357 357
358 rx_status.ssi = hdr->rssi; 358 rx_status.signal = hdr->rssi;
359 /* XX correct? */ 359 /* XX correct? */
360 rx_status.rate_idx = hdr->rate & 0xf; 360 rx_status.rate_idx = hdr->rate & 0xf;
361 rx_status.freq = freq; 361 rx_status.freq = freq;
@@ -375,11 +375,8 @@ static void inline p54_wake_free_queues(struct ieee80211_hw *dev)
375 struct p54_common *priv = dev->priv; 375 struct p54_common *priv = dev->priv;
376 int i; 376 int i;
377 377
378 /* ieee80211_start_queues is great if all queues are really empty.
379 * But, what if some are full? */
380
381 for (i = 0; i < dev->queues; i++) 378 for (i = 0; i < dev->queues; i++)
382 if (priv->tx_stats.data[i].len < priv->tx_stats.data[i].limit) 379 if (priv->tx_stats[i].len < priv->tx_stats[i].limit)
383 ieee80211_wake_queue(dev, i); 380 ieee80211_wake_queue(dev, i);
384} 381}
385 382
@@ -395,45 +392,42 @@ static void p54_rx_frame_sent(struct ieee80211_hw *dev, struct sk_buff *skb)
395 u32 last_addr = priv->rx_start; 392 u32 last_addr = priv->rx_start;
396 393
397 while (entry != (struct sk_buff *)&priv->tx_queue) { 394 while (entry != (struct sk_buff *)&priv->tx_queue) {
398 range = (struct memrecord *)&entry->cb; 395 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(entry);
396 range = (void *)info->driver_data;
399 if (range->start_addr == addr) { 397 if (range->start_addr == addr) {
400 struct ieee80211_tx_status status;
401 struct p54_control_hdr *entry_hdr; 398 struct p54_control_hdr *entry_hdr;
402 struct p54_tx_control_allocdata *entry_data; 399 struct p54_tx_control_allocdata *entry_data;
403 int pad = 0; 400 int pad = 0;
404 401
405 if (entry->next != (struct sk_buff *)&priv->tx_queue) 402 if (entry->next != (struct sk_buff *)&priv->tx_queue) {
406 freed = ((struct memrecord *)&entry->next->cb)->start_addr - last_addr; 403 struct ieee80211_tx_info *ni;
407 else 404 struct memrecord *mr;
405
406 ni = IEEE80211_SKB_CB(entry->next);
407 mr = (struct memrecord *)ni->driver_data;
408 freed = mr->start_addr - last_addr;
409 } else
408 freed = priv->rx_end - last_addr; 410 freed = priv->rx_end - last_addr;
409 411
410 last_addr = range->end_addr; 412 last_addr = range->end_addr;
411 __skb_unlink(entry, &priv->tx_queue); 413 __skb_unlink(entry, &priv->tx_queue);
412 if (!range->control) { 414 memset(&info->status, 0, sizeof(info->status));
413 kfree_skb(entry); 415 priv->tx_stats[skb_get_queue_mapping(skb)].len--;
414 break;
415 }
416 memset(&status, 0, sizeof(status));
417 memcpy(&status.control, range->control,
418 sizeof(status.control));
419 kfree(range->control);
420 priv->tx_stats.data[status.control.queue].len--;
421
422 entry_hdr = (struct p54_control_hdr *) entry->data; 416 entry_hdr = (struct p54_control_hdr *) entry->data;
423 entry_data = (struct p54_tx_control_allocdata *) entry_hdr->data; 417 entry_data = (struct p54_tx_control_allocdata *) entry_hdr->data;
424 if ((entry_hdr->magic1 & cpu_to_le16(0x4000)) != 0) 418 if ((entry_hdr->magic1 & cpu_to_le16(0x4000)) != 0)
425 pad = entry_data->align[0]; 419 pad = entry_data->align[0];
426 420
427 if (!(status.control.flags & IEEE80211_TXCTL_NO_ACK)) { 421 if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) {
428 if (!(payload->status & 0x01)) 422 if (!(payload->status & 0x01))
429 status.flags |= IEEE80211_TX_STATUS_ACK; 423 info->flags |= IEEE80211_TX_STAT_ACK;
430 else 424 else
431 status.excessive_retries = 1; 425 info->status.excessive_retries = 1;
432 } 426 }
433 status.retry_count = payload->retries - 1; 427 info->status.retry_count = payload->retries - 1;
434 status.ack_signal = le16_to_cpu(payload->ack_rssi); 428 info->status.ack_signal = le16_to_cpu(payload->ack_rssi);
435 skb_pull(entry, sizeof(*hdr) + pad + sizeof(*entry_data)); 429 skb_pull(entry, sizeof(*hdr) + pad + sizeof(*entry_data));
436 ieee80211_tx_status_irqsafe(dev, entry, &status); 430 ieee80211_tx_status_irqsafe(dev, entry);
437 break; 431 break;
438 } else 432 } else
439 last_addr = range->end_addr; 433 last_addr = range->end_addr;
@@ -498,13 +492,11 @@ EXPORT_SYMBOL_GPL(p54_rx);
498 * allocated areas. 492 * allocated areas.
499 */ 493 */
500static void p54_assign_address(struct ieee80211_hw *dev, struct sk_buff *skb, 494static void p54_assign_address(struct ieee80211_hw *dev, struct sk_buff *skb,
501 struct p54_control_hdr *data, u32 len, 495 struct p54_control_hdr *data, u32 len)
502 struct ieee80211_tx_control *control)
503{ 496{
504 struct p54_common *priv = dev->priv; 497 struct p54_common *priv = dev->priv;
505 struct sk_buff *entry = priv->tx_queue.next; 498 struct sk_buff *entry = priv->tx_queue.next;
506 struct sk_buff *target_skb = NULL; 499 struct sk_buff *target_skb = NULL;
507 struct memrecord *range;
508 u32 last_addr = priv->rx_start; 500 u32 last_addr = priv->rx_start;
509 u32 largest_hole = 0; 501 u32 largest_hole = 0;
510 u32 target_addr = priv->rx_start; 502 u32 target_addr = priv->rx_start;
@@ -516,7 +508,8 @@ static void p54_assign_address(struct ieee80211_hw *dev, struct sk_buff *skb,
516 left = skb_queue_len(&priv->tx_queue); 508 left = skb_queue_len(&priv->tx_queue);
517 while (left--) { 509 while (left--) {
518 u32 hole_size; 510 u32 hole_size;
519 range = (struct memrecord *)&entry->cb; 511 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(entry);
512 struct memrecord *range = (void *)info->driver_data;
520 hole_size = range->start_addr - last_addr; 513 hole_size = range->start_addr - last_addr;
521 if (!target_skb && hole_size >= len) { 514 if (!target_skb && hole_size >= len) {
522 target_skb = entry->prev; 515 target_skb = entry->prev;
@@ -531,17 +524,18 @@ static void p54_assign_address(struct ieee80211_hw *dev, struct sk_buff *skb,
531 target_skb = priv->tx_queue.prev; 524 target_skb = priv->tx_queue.prev;
532 largest_hole = max(largest_hole, priv->rx_end - last_addr - len); 525 largest_hole = max(largest_hole, priv->rx_end - last_addr - len);
533 if (!skb_queue_empty(&priv->tx_queue)) { 526 if (!skb_queue_empty(&priv->tx_queue)) {
534 range = (struct memrecord *)&target_skb->cb; 527 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(target_skb);
528 struct memrecord *range = (void *)info->driver_data;
535 target_addr = range->end_addr; 529 target_addr = range->end_addr;
536 } 530 }
537 } else 531 } else
538 largest_hole = max(largest_hole, priv->rx_end - last_addr); 532 largest_hole = max(largest_hole, priv->rx_end - last_addr);
539 533
540 if (skb) { 534 if (skb) {
541 range = (struct memrecord *)&skb->cb; 535 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
536 struct memrecord *range = (void *)info->driver_data;
542 range->start_addr = target_addr; 537 range->start_addr = target_addr;
543 range->end_addr = target_addr + len; 538 range->end_addr = target_addr + len;
544 range->control = control;
545 __skb_queue_after(&priv->tx_queue, target_skb, skb); 539 __skb_queue_after(&priv->tx_queue, target_skb, skb);
546 if (largest_hole < IEEE80211_MAX_RTS_THRESHOLD + 0x170 + 540 if (largest_hole < IEEE80211_MAX_RTS_THRESHOLD + 0x170 +
547 sizeof(struct p54_control_hdr)) 541 sizeof(struct p54_control_hdr))
@@ -552,32 +546,27 @@ static void p54_assign_address(struct ieee80211_hw *dev, struct sk_buff *skb,
552 data->req_id = cpu_to_le32(target_addr + 0x70); 546 data->req_id = cpu_to_le32(target_addr + 0x70);
553} 547}
554 548
555static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb, 549static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
556 struct ieee80211_tx_control *control)
557{ 550{
558 struct ieee80211_tx_queue_stats_data *current_queue; 551 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
552 struct ieee80211_tx_queue_stats *current_queue;
559 struct p54_common *priv = dev->priv; 553 struct p54_common *priv = dev->priv;
560 struct p54_control_hdr *hdr; 554 struct p54_control_hdr *hdr;
561 struct p54_tx_control_allocdata *txhdr; 555 struct p54_tx_control_allocdata *txhdr;
562 struct ieee80211_tx_control *control_copy;
563 size_t padding, len; 556 size_t padding, len;
564 u8 rate; 557 u8 rate;
565 558
566 current_queue = &priv->tx_stats.data[control->queue]; 559 current_queue = &priv->tx_stats[skb_get_queue_mapping(skb)];
567 if (unlikely(current_queue->len > current_queue->limit)) 560 if (unlikely(current_queue->len > current_queue->limit))
568 return NETDEV_TX_BUSY; 561 return NETDEV_TX_BUSY;
569 current_queue->len++; 562 current_queue->len++;
570 current_queue->count++; 563 current_queue->count++;
571 if (current_queue->len == current_queue->limit) 564 if (current_queue->len == current_queue->limit)
572 ieee80211_stop_queue(dev, control->queue); 565 ieee80211_stop_queue(dev, skb_get_queue_mapping(skb));
573 566
574 padding = (unsigned long)(skb->data - (sizeof(*hdr) + sizeof(*txhdr))) & 3; 567 padding = (unsigned long)(skb->data - (sizeof(*hdr) + sizeof(*txhdr))) & 3;
575 len = skb->len; 568 len = skb->len;
576 569
577 control_copy = kmalloc(sizeof(*control), GFP_ATOMIC);
578 if (control_copy)
579 memcpy(control_copy, control, sizeof(*control));
580
581 txhdr = (struct p54_tx_control_allocdata *) 570 txhdr = (struct p54_tx_control_allocdata *)
582 skb_push(skb, sizeof(*txhdr) + padding); 571 skb_push(skb, sizeof(*txhdr) + padding);
583 hdr = (struct p54_control_hdr *) skb_push(skb, sizeof(*hdr)); 572 hdr = (struct p54_control_hdr *) skb_push(skb, sizeof(*hdr));
@@ -587,35 +576,37 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
587 else 576 else
588 hdr->magic1 = cpu_to_le16(0x0010); 577 hdr->magic1 = cpu_to_le16(0x0010);
589 hdr->len = cpu_to_le16(len); 578 hdr->len = cpu_to_le16(len);
590 hdr->type = (control->flags & IEEE80211_TXCTL_NO_ACK) ? 0 : cpu_to_le16(1); 579 hdr->type = (info->flags & IEEE80211_TX_CTL_NO_ACK) ? 0 : cpu_to_le16(1);
591 hdr->retry1 = hdr->retry2 = control->retry_limit; 580 hdr->retry1 = hdr->retry2 = info->control.retry_limit;
592 p54_assign_address(dev, skb, hdr, skb->len, control_copy);
593 581
594 memset(txhdr->wep_key, 0x0, 16); 582 memset(txhdr->wep_key, 0x0, 16);
595 txhdr->padding = 0; 583 txhdr->padding = 0;
596 txhdr->padding2 = 0; 584 txhdr->padding2 = 0;
597 585
598 /* TODO: add support for alternate retry TX rates */ 586 /* TODO: add support for alternate retry TX rates */
599 rate = control->tx_rate->hw_value; 587 rate = ieee80211_get_tx_rate(dev, info)->hw_value;
600 if (control->flags & IEEE80211_TXCTL_SHORT_PREAMBLE) 588 if (info->flags & IEEE80211_TX_CTL_SHORT_PREAMBLE)
601 rate |= 0x10; 589 rate |= 0x10;
602 if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) 590 if (info->flags & IEEE80211_TX_CTL_USE_RTS_CTS)
603 rate |= 0x40; 591 rate |= 0x40;
604 else if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) 592 else if (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT)
605 rate |= 0x20; 593 rate |= 0x20;
606 memset(txhdr->rateset, rate, 8); 594 memset(txhdr->rateset, rate, 8);
607 txhdr->wep_key_present = 0; 595 txhdr->wep_key_present = 0;
608 txhdr->wep_key_len = 0; 596 txhdr->wep_key_len = 0;
609 txhdr->frame_type = cpu_to_le32(control->queue + 4); 597 txhdr->frame_type = cpu_to_le32(skb_get_queue_mapping(skb) + 4);
610 txhdr->magic4 = 0; 598 txhdr->magic4 = 0;
611 txhdr->antenna = (control->antenna_sel_tx == 0) ? 599 txhdr->antenna = (info->antenna_sel_tx == 0) ?
612 2 : control->antenna_sel_tx - 1; 600 2 : info->antenna_sel_tx - 1;
613 txhdr->output_power = 0x7f; // HW Maximum 601 txhdr->output_power = 0x7f; // HW Maximum
614 txhdr->magic5 = (control->flags & IEEE80211_TXCTL_NO_ACK) ? 602 txhdr->magic5 = (info->flags & IEEE80211_TX_CTL_NO_ACK) ?
615 0 : ((rate > 0x3) ? cpu_to_le32(0x33) : cpu_to_le32(0x23)); 603 0 : ((rate > 0x3) ? cpu_to_le32(0x33) : cpu_to_le32(0x23));
616 if (padding) 604 if (padding)
617 txhdr->align[0] = padding; 605 txhdr->align[0] = padding;
618 606
607 /* modifies skb->cb and with it info, so must be last! */
608 p54_assign_address(dev, skb, hdr, skb->len);
609
619 priv->tx(dev, hdr, skb->len, 0); 610 priv->tx(dev, hdr, skb->len, 0);
620 return 0; 611 return 0;
621} 612}
@@ -638,7 +629,7 @@ static int p54_set_filter(struct ieee80211_hw *dev, u16 filter_type,
638 filter = (struct p54_tx_control_filter *) hdr->data; 629 filter = (struct p54_tx_control_filter *) hdr->data;
639 hdr->magic1 = cpu_to_le16(0x8001); 630 hdr->magic1 = cpu_to_le16(0x8001);
640 hdr->len = cpu_to_le16(sizeof(*filter)); 631 hdr->len = cpu_to_le16(sizeof(*filter));
641 p54_assign_address(dev, NULL, hdr, sizeof(*hdr) + sizeof(*filter), NULL); 632 p54_assign_address(dev, NULL, hdr, sizeof(*hdr) + sizeof(*filter));
642 hdr->type = cpu_to_le16(P54_CONTROL_TYPE_FILTER_SET); 633 hdr->type = cpu_to_le16(P54_CONTROL_TYPE_FILTER_SET);
643 634
644 filter->filter_type = cpu_to_le16(filter_type); 635 filter->filter_type = cpu_to_le16(filter_type);
@@ -682,7 +673,7 @@ static int p54_set_freq(struct ieee80211_hw *dev, __le16 freq)
682 hdr->magic1 = cpu_to_le16(0x8001); 673 hdr->magic1 = cpu_to_le16(0x8001);
683 hdr->len = cpu_to_le16(sizeof(*chan)); 674 hdr->len = cpu_to_le16(sizeof(*chan));
684 hdr->type = cpu_to_le16(P54_CONTROL_TYPE_CHANNEL_CHANGE); 675 hdr->type = cpu_to_le16(P54_CONTROL_TYPE_CHANNEL_CHANGE);
685 p54_assign_address(dev, NULL, hdr, sizeof(*hdr) + payload_len, NULL); 676 p54_assign_address(dev, NULL, hdr, sizeof(*hdr) + payload_len);
686 677
687 chan->magic1 = cpu_to_le16(0x1); 678 chan->magic1 = cpu_to_le16(0x1);
688 chan->magic2 = cpu_to_le16(0x0); 679 chan->magic2 = cpu_to_le16(0x0);
@@ -755,7 +746,7 @@ static int p54_set_leds(struct ieee80211_hw *dev, int mode, int link, int act)
755 hdr->magic1 = cpu_to_le16(0x8001); 746 hdr->magic1 = cpu_to_le16(0x8001);
756 hdr->len = cpu_to_le16(sizeof(*led)); 747 hdr->len = cpu_to_le16(sizeof(*led));
757 hdr->type = cpu_to_le16(P54_CONTROL_TYPE_LED); 748 hdr->type = cpu_to_le16(P54_CONTROL_TYPE_LED);
758 p54_assign_address(dev, NULL, hdr, sizeof(*hdr) + sizeof(*led), NULL); 749 p54_assign_address(dev, NULL, hdr, sizeof(*hdr) + sizeof(*led));
759 750
760 led = (struct p54_tx_control_led *) hdr->data; 751 led = (struct p54_tx_control_led *) hdr->data;
761 led->mode = cpu_to_le16(mode); 752 led->mode = cpu_to_le16(mode);
@@ -805,7 +796,7 @@ static void p54_set_vdcf(struct ieee80211_hw *dev)
805 796
806 hdr = (void *)priv->cached_vdcf + priv->tx_hdr_len; 797 hdr = (void *)priv->cached_vdcf + priv->tx_hdr_len;
807 798
808 p54_assign_address(dev, NULL, hdr, sizeof(*hdr) + sizeof(*vdcf), NULL); 799 p54_assign_address(dev, NULL, hdr, sizeof(*hdr) + sizeof(*vdcf));
809 800
810 vdcf = (struct p54_tx_control_vdcf *) hdr->data; 801 vdcf = (struct p54_tx_control_vdcf *) hdr->data;
811 802
@@ -841,12 +832,8 @@ static void p54_stop(struct ieee80211_hw *dev)
841{ 832{
842 struct p54_common *priv = dev->priv; 833 struct p54_common *priv = dev->priv;
843 struct sk_buff *skb; 834 struct sk_buff *skb;
844 while ((skb = skb_dequeue(&priv->tx_queue))) { 835 while ((skb = skb_dequeue(&priv->tx_queue)))
845 struct memrecord *range = (struct memrecord *)&skb->cb;
846 if (range->control)
847 kfree(range->control);
848 kfree_skb(skb); 836 kfree_skb(skb);
849 }
850 priv->stop(dev); 837 priv->stop(dev);
851 priv->mode = IEEE80211_IF_TYPE_INVALID; 838 priv->mode = IEEE80211_IF_TYPE_INVALID;
852} 839}
@@ -936,7 +923,7 @@ static void p54_configure_filter(struct ieee80211_hw *dev,
936 } 923 }
937} 924}
938 925
939static int p54_conf_tx(struct ieee80211_hw *dev, int queue, 926static int p54_conf_tx(struct ieee80211_hw *dev, u16 queue,
940 const struct ieee80211_tx_queue_params *params) 927 const struct ieee80211_tx_queue_params *params)
941{ 928{
942 struct p54_common *priv = dev->priv; 929 struct p54_common *priv = dev->priv;
@@ -945,7 +932,7 @@ static int p54_conf_tx(struct ieee80211_hw *dev, int queue,
945 vdcf = (struct p54_tx_control_vdcf *)(((struct p54_control_hdr *) 932 vdcf = (struct p54_tx_control_vdcf *)(((struct p54_control_hdr *)
946 ((void *)priv->cached_vdcf + priv->tx_hdr_len))->data); 933 ((void *)priv->cached_vdcf + priv->tx_hdr_len))->data);
947 934
948 if ((params) && !((queue < 0) || (queue > 4))) { 935 if ((params) && !(queue > 4)) {
949 P54_SET_QUEUE(vdcf->queue[queue], params->aifs, 936 P54_SET_QUEUE(vdcf->queue[queue], params->aifs,
950 params->cw_min, params->cw_max, params->txop); 937 params->cw_min, params->cw_max, params->txop);
951 } else 938 } else
@@ -967,11 +954,8 @@ static int p54_get_tx_stats(struct ieee80211_hw *dev,
967 struct ieee80211_tx_queue_stats *stats) 954 struct ieee80211_tx_queue_stats *stats)
968{ 955{
969 struct p54_common *priv = dev->priv; 956 struct p54_common *priv = dev->priv;
970 unsigned int i;
971 957
972 for (i = 0; i < dev->queues; i++) 958 memcpy(stats, &priv->tx_stats, sizeof(stats[0]) * dev->queues);
973 memcpy(&stats->data[i], &priv->tx_stats.data[i],
974 sizeof(stats->data[i]));
975 959
976 return 0; 960 return 0;
977} 961}
@@ -1004,11 +988,12 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len)
1004 skb_queue_head_init(&priv->tx_queue); 988 skb_queue_head_init(&priv->tx_queue);
1005 dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &band_2GHz; 989 dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &band_2GHz;
1006 dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | /* not sure */ 990 dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | /* not sure */
1007 IEEE80211_HW_RX_INCLUDES_FCS; 991 IEEE80211_HW_RX_INCLUDES_FCS |
992 IEEE80211_HW_SIGNAL_UNSPEC;
1008 dev->channel_change_time = 1000; /* TODO: find actual value */ 993 dev->channel_change_time = 1000; /* TODO: find actual value */
1009 dev->max_rssi = 127; 994 dev->max_signal = 127;
1010 995
1011 priv->tx_stats.data[0].limit = 5; 996 priv->tx_stats[0].limit = 5;
1012 dev->queues = 1; 997 dev->queues = 1;
1013 998
1014 dev->extra_tx_headroom = sizeof(struct p54_control_hdr) + 4 + 999 dev->extra_tx_headroom = sizeof(struct p54_control_hdr) + 4 +
diff --git a/drivers/net/wireless/p54/p54common.h b/drivers/net/wireless/p54/p54common.h
index c15b56e1d75e..2245fcce92dc 100644
--- a/drivers/net/wireless/p54/p54common.h
+++ b/drivers/net/wireless/p54/p54common.h
@@ -152,7 +152,6 @@ struct pda_pa_curve_data {
152struct memrecord { 152struct memrecord {
153 u32 start_addr; 153 u32 start_addr;
154 u32 end_addr; 154 u32 end_addr;
155 struct ieee80211_tx_control *control;
156}; 155};
157 156
158struct p54_eeprom_lm86 { 157struct p54_eeprom_lm86 {
diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c
index fa527723fbe0..7dd4add4bf4e 100644
--- a/drivers/net/wireless/p54/p54pci.c
+++ b/drivers/net/wireless/p54/p54pci.c
@@ -665,7 +665,7 @@ static int p54p_resume(struct pci_dev *pdev)
665 665
666 if (priv->common.mode != IEEE80211_IF_TYPE_INVALID) { 666 if (priv->common.mode != IEEE80211_IF_TYPE_INVALID) {
667 p54p_open(dev); 667 p54p_open(dev);
668 ieee80211_start_queues(dev); 668 ieee80211_wake_queues(dev);
669 } 669 }
670 670
671 return 0; 671 return 0;