aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.c23
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c1
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00queue.h2
3 files changed, 26 insertions, 0 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index b3dffcfed83..ee953ca0c6a 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1087,14 +1087,20 @@ static void rt2400pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
1087static void rt2400pci_fill_rxdone(struct queue_entry *entry, 1087static void rt2400pci_fill_rxdone(struct queue_entry *entry,
1088 struct rxdone_entry_desc *rxdesc) 1088 struct rxdone_entry_desc *rxdesc)
1089{ 1089{
1090 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
1090 struct queue_entry_priv_pci *entry_priv = entry->priv_data; 1091 struct queue_entry_priv_pci *entry_priv = entry->priv_data;
1091 u32 word0; 1092 u32 word0;
1092 u32 word2; 1093 u32 word2;
1093 u32 word3; 1094 u32 word3;
1095 u32 word4;
1096 u64 tsf;
1097 u32 rx_low;
1098 u32 rx_high;
1094 1099
1095 rt2x00_desc_read(entry_priv->desc, 0, &word0); 1100 rt2x00_desc_read(entry_priv->desc, 0, &word0);
1096 rt2x00_desc_read(entry_priv->desc, 2, &word2); 1101 rt2x00_desc_read(entry_priv->desc, 2, &word2);
1097 rt2x00_desc_read(entry_priv->desc, 3, &word3); 1102 rt2x00_desc_read(entry_priv->desc, 3, &word3);
1103 rt2x00_desc_read(entry_priv->desc, 4, &word4);
1098 1104
1099 if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR)) 1105 if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR))
1100 rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC; 1106 rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC;
@@ -1102,10 +1108,27 @@ static void rt2400pci_fill_rxdone(struct queue_entry *entry,
1102 rxdesc->flags |= RX_FLAG_FAILED_PLCP_CRC; 1108 rxdesc->flags |= RX_FLAG_FAILED_PLCP_CRC;
1103 1109
1104 /* 1110 /*
1111 * We only get the lower 32bits from the timestamp,
1112 * to get the full 64bits we must complement it with
1113 * the timestamp from get_tsf().
1114 * Note that when a wraparound of the lower 32bits
1115 * has occurred between the frame arrival and the get_tsf()
1116 * call, we must decrease the higher 32bits with 1 to get
1117 * to correct value.
1118 */
1119 tsf = rt2x00dev->ops->hw->get_tsf(rt2x00dev->hw);
1120 rx_low = rt2x00_get_field32(word4, RXD_W4_RX_END_TIME);
1121 rx_high = upper_32_bits(tsf);
1122
1123 if ((u32)tsf <= rx_low)
1124 rx_high--;
1125
1126 /*
1105 * Obtain the status about this packet. 1127 * Obtain the status about this packet.
1106 * The signal is the PLCP value, and needs to be stripped 1128 * The signal is the PLCP value, and needs to be stripped
1107 * of the preamble bit (0x08). 1129 * of the preamble bit (0x08).
1108 */ 1130 */
1131 rxdesc->timestamp = ((u64)rx_high << 32) | rx_low;
1109 rxdesc->signal = rt2x00_get_field32(word2, RXD_W2_SIGNAL) & ~0x08; 1132 rxdesc->signal = rt2x00_get_field32(word2, RXD_W2_SIGNAL) & ~0x08;
1110 rxdesc->rssi = rt2x00_get_field32(word2, RXD_W3_RSSI) - 1133 rxdesc->rssi = rt2x00_get_field32(word2, RXD_W3_RSSI) -
1111 entry->queue->rt2x00dev->rssi_offset; 1134 entry->queue->rt2x00dev->rssi_offset;
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index 8086263e5fa..b48c04e80a3 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -664,6 +664,7 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev,
664 664
665 rt2x00dev->link.qual.rx_success++; 665 rt2x00dev->link.qual.rx_success++;
666 666
667 rx_status->mactime = rxdesc.timestamp;
667 rx_status->rate_idx = idx; 668 rx_status->rate_idx = idx;
668 rx_status->qual = 669 rx_status->qual =
669 rt2x00lib_calculate_link_signal(rt2x00dev, rxdesc.rssi); 670 rt2x00lib_calculate_link_signal(rt2x00dev, rxdesc.rssi);
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h
index 5dd9cca3c62..8945945c892 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.h
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
@@ -146,6 +146,7 @@ enum rxdone_entry_desc_flags {
146 * 146 *
147 * Summary of information that has been read from the RX frame descriptor. 147 * Summary of information that has been read from the RX frame descriptor.
148 * 148 *
149 * @timestamp: RX Timestamp
149 * @signal: Signal of the received frame. 150 * @signal: Signal of the received frame.
150 * @rssi: RSSI of the received frame. 151 * @rssi: RSSI of the received frame.
151 * @size: Data size of the received frame. 152 * @size: Data size of the received frame.
@@ -154,6 +155,7 @@ enum rxdone_entry_desc_flags {
154 155
155 */ 156 */
156struct rxdone_entry_desc { 157struct rxdone_entry_desc {
158 u64 timestamp;
157 int signal; 159 int signal;
158 int rssi; 160 int rssi;
159 int size; 161 int size;