diff options
Diffstat (limited to 'drivers/net/wireless/p54')
-rw-r--r-- | drivers/net/wireless/p54/p54.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/p54/p54common.c | 137 | ||||
-rw-r--r-- | drivers/net/wireless/p54/p54common.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/p54/p54pci.c | 2 |
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 | ||
70 | int p54_rx(struct ieee80211_hw *dev, struct sk_buff *skb); | 70 | int 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 | */ |
500 | static void p54_assign_address(struct ieee80211_hw *dev, struct sk_buff *skb, | 494 | static 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 | ||
555 | static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb, | 549 | static 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 | ||
939 | static int p54_conf_tx(struct ieee80211_hw *dev, int queue, | 926 | static 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 { | |||
152 | struct memrecord { | 152 | struct 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 | ||
158 | struct p54_eeprom_lm86 { | 157 | struct 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; |