diff options
Diffstat (limited to 'drivers/net/wireless/rtl8187_dev.c')
-rw-r--r-- | drivers/net/wireless/rtl8187_dev.c | 92 |
1 files changed, 64 insertions, 28 deletions
diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c index f44505994a0e..c03834d5cb0b 100644 --- a/drivers/net/wireless/rtl8187_dev.c +++ b/drivers/net/wireless/rtl8187_dev.c | |||
@@ -45,6 +45,38 @@ static struct usb_device_id rtl8187_table[] __devinitdata = { | |||
45 | 45 | ||
46 | MODULE_DEVICE_TABLE(usb, rtl8187_table); | 46 | MODULE_DEVICE_TABLE(usb, rtl8187_table); |
47 | 47 | ||
48 | static const struct ieee80211_rate rtl818x_rates[] = { | ||
49 | { .bitrate = 10, .hw_value = 0, }, | ||
50 | { .bitrate = 20, .hw_value = 1, }, | ||
51 | { .bitrate = 55, .hw_value = 2, }, | ||
52 | { .bitrate = 110, .hw_value = 3, }, | ||
53 | { .bitrate = 60, .hw_value = 4, }, | ||
54 | { .bitrate = 90, .hw_value = 5, }, | ||
55 | { .bitrate = 120, .hw_value = 6, }, | ||
56 | { .bitrate = 180, .hw_value = 7, }, | ||
57 | { .bitrate = 240, .hw_value = 8, }, | ||
58 | { .bitrate = 360, .hw_value = 9, }, | ||
59 | { .bitrate = 480, .hw_value = 10, }, | ||
60 | { .bitrate = 540, .hw_value = 11, }, | ||
61 | }; | ||
62 | |||
63 | static const struct ieee80211_channel rtl818x_channels[] = { | ||
64 | { .center_freq = 2412 }, | ||
65 | { .center_freq = 2417 }, | ||
66 | { .center_freq = 2422 }, | ||
67 | { .center_freq = 2427 }, | ||
68 | { .center_freq = 2432 }, | ||
69 | { .center_freq = 2437 }, | ||
70 | { .center_freq = 2442 }, | ||
71 | { .center_freq = 2447 }, | ||
72 | { .center_freq = 2452 }, | ||
73 | { .center_freq = 2457 }, | ||
74 | { .center_freq = 2462 }, | ||
75 | { .center_freq = 2467 }, | ||
76 | { .center_freq = 2472 }, | ||
77 | { .center_freq = 2484 }, | ||
78 | }; | ||
79 | |||
48 | static void rtl8187_iowrite_async_cb(struct urb *urb) | 80 | static void rtl8187_iowrite_async_cb(struct urb *urb) |
49 | { | 81 | { |
50 | kfree(urb->context); | 82 | kfree(urb->context); |
@@ -146,17 +178,23 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
146 | 178 | ||
147 | flags = skb->len; | 179 | flags = skb->len; |
148 | flags |= RTL8187_TX_FLAG_NO_ENCRYPT; | 180 | flags |= RTL8187_TX_FLAG_NO_ENCRYPT; |
149 | flags |= control->rts_cts_rate << 19; | 181 | |
150 | flags |= control->tx_rate << 24; | 182 | BUG_ON(!control->tx_rate); |
183 | |||
184 | flags |= control->tx_rate->hw_value << 24; | ||
151 | if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb->data)) | 185 | if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb->data)) |
152 | flags |= RTL8187_TX_FLAG_MORE_FRAG; | 186 | flags |= RTL8187_TX_FLAG_MORE_FRAG; |
153 | if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) { | 187 | if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) { |
188 | BUG_ON(!control->rts_cts_rate); | ||
154 | flags |= RTL8187_TX_FLAG_RTS; | 189 | flags |= RTL8187_TX_FLAG_RTS; |
190 | flags |= control->rts_cts_rate->hw_value << 19; | ||
155 | rts_dur = ieee80211_rts_duration(dev, priv->vif, | 191 | rts_dur = ieee80211_rts_duration(dev, priv->vif, |
156 | skb->len, control); | 192 | skb->len, control); |
157 | } | 193 | } else if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) { |
158 | if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) | 194 | BUG_ON(!control->rts_cts_rate); |
159 | flags |= RTL8187_TX_FLAG_CTS; | 195 | flags |= RTL8187_TX_FLAG_CTS; |
196 | flags |= control->rts_cts_rate->hw_value << 19; | ||
197 | } | ||
160 | 198 | ||
161 | hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr)); | 199 | hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr)); |
162 | hdr->flags = cpu_to_le32(flags); | 200 | hdr->flags = cpu_to_le32(flags); |
@@ -225,10 +263,9 @@ static void rtl8187_rx_cb(struct urb *urb) | |||
225 | rx_status.antenna = (hdr->signal >> 7) & 1; | 263 | rx_status.antenna = (hdr->signal >> 7) & 1; |
226 | rx_status.signal = 64 - min(hdr->noise, (u8)64); | 264 | rx_status.signal = 64 - min(hdr->noise, (u8)64); |
227 | rx_status.ssi = signal; | 265 | rx_status.ssi = signal; |
228 | rx_status.rate = rate; | 266 | rx_status.rate_idx = rate; |
229 | rx_status.freq = dev->conf.freq; | 267 | rx_status.freq = dev->conf.channel->center_freq; |
230 | rx_status.channel = dev->conf.channel; | 268 | rx_status.band = dev->conf.channel->band; |
231 | rx_status.phymode = dev->conf.phymode; | ||
232 | rx_status.mactime = le64_to_cpu(hdr->mac_time); | 269 | rx_status.mactime = le64_to_cpu(hdr->mac_time); |
233 | rx_status.flag |= RX_FLAG_TSFT; | 270 | rx_status.flag |= RX_FLAG_TSFT; |
234 | if (flags & (1 << 13)) | 271 | if (flags & (1 << 13)) |
@@ -682,19 +719,22 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
682 | usb_get_dev(udev); | 719 | usb_get_dev(udev); |
683 | 720 | ||
684 | skb_queue_head_init(&priv->rx_queue); | 721 | skb_queue_head_init(&priv->rx_queue); |
722 | |||
723 | BUILD_BUG_ON(sizeof(priv->channels) != sizeof(rtl818x_channels)); | ||
724 | BUILD_BUG_ON(sizeof(priv->rates) != sizeof(rtl818x_rates)); | ||
725 | |||
685 | memcpy(priv->channels, rtl818x_channels, sizeof(rtl818x_channels)); | 726 | memcpy(priv->channels, rtl818x_channels, sizeof(rtl818x_channels)); |
686 | memcpy(priv->rates, rtl818x_rates, sizeof(rtl818x_rates)); | 727 | memcpy(priv->rates, rtl818x_rates, sizeof(rtl818x_rates)); |
687 | priv->map = (struct rtl818x_csr *)0xFF00; | 728 | priv->map = (struct rtl818x_csr *)0xFF00; |
688 | priv->modes[0].mode = MODE_IEEE80211G; | 729 | |
689 | priv->modes[0].num_rates = ARRAY_SIZE(rtl818x_rates); | 730 | priv->band.band = IEEE80211_BAND_2GHZ; |
690 | priv->modes[0].rates = priv->rates; | 731 | priv->band.channels = priv->channels; |
691 | priv->modes[0].num_channels = ARRAY_SIZE(rtl818x_channels); | 732 | priv->band.n_channels = ARRAY_SIZE(rtl818x_channels); |
692 | priv->modes[0].channels = priv->channels; | 733 | priv->band.bitrates = priv->rates; |
693 | priv->modes[1].mode = MODE_IEEE80211B; | 734 | priv->band.n_bitrates = ARRAY_SIZE(rtl818x_rates); |
694 | priv->modes[1].num_rates = 4; | 735 | dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &priv->band; |
695 | priv->modes[1].rates = priv->rates; | 736 | |
696 | priv->modes[1].num_channels = ARRAY_SIZE(rtl818x_channels); | 737 | |
697 | priv->modes[1].channels = priv->channels; | ||
698 | priv->mode = IEEE80211_IF_TYPE_MNTR; | 738 | priv->mode = IEEE80211_IF_TYPE_MNTR; |
699 | dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | | 739 | dev->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING | |
700 | IEEE80211_HW_RX_INCLUDES_FCS; | 740 | IEEE80211_HW_RX_INCLUDES_FCS; |
@@ -703,10 +743,6 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
703 | dev->max_rssi = 65; | 743 | dev->max_rssi = 65; |
704 | dev->max_signal = 64; | 744 | dev->max_signal = 64; |
705 | 745 | ||
706 | for (i = 0; i < 2; i++) | ||
707 | if ((err = ieee80211_register_hwmode(dev, &priv->modes[i]))) | ||
708 | goto err_free_dev; | ||
709 | |||
710 | eeprom.data = dev; | 746 | eeprom.data = dev; |
711 | eeprom.register_read = rtl8187_eeprom_register_read; | 747 | eeprom.register_read = rtl8187_eeprom_register_read; |
712 | eeprom.register_write = rtl8187_eeprom_register_write; | 748 | eeprom.register_write = rtl8187_eeprom_register_write; |
@@ -730,20 +766,20 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
730 | for (i = 0; i < 3; i++) { | 766 | for (i = 0; i < 3; i++) { |
731 | eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_1 + i, | 767 | eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_1 + i, |
732 | &txpwr); | 768 | &txpwr); |
733 | (*channel++).val = txpwr & 0xFF; | 769 | (*channel++).hw_value = txpwr & 0xFF; |
734 | (*channel++).val = txpwr >> 8; | 770 | (*channel++).hw_value = txpwr >> 8; |
735 | } | 771 | } |
736 | for (i = 0; i < 2; i++) { | 772 | for (i = 0; i < 2; i++) { |
737 | eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_4 + i, | 773 | eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_4 + i, |
738 | &txpwr); | 774 | &txpwr); |
739 | (*channel++).val = txpwr & 0xFF; | 775 | (*channel++).hw_value = txpwr & 0xFF; |
740 | (*channel++).val = txpwr >> 8; | 776 | (*channel++).hw_value = txpwr >> 8; |
741 | } | 777 | } |
742 | for (i = 0; i < 2; i++) { | 778 | for (i = 0; i < 2; i++) { |
743 | eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_6 + i, | 779 | eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_6 + i, |
744 | &txpwr); | 780 | &txpwr); |
745 | (*channel++).val = txpwr & 0xFF; | 781 | (*channel++).hw_value = txpwr & 0xFF; |
746 | (*channel++).val = txpwr >> 8; | 782 | (*channel++).hw_value = txpwr >> 8; |
747 | } | 783 | } |
748 | 784 | ||
749 | eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_BASE, | 785 | eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_BASE, |