aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt73usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt73usb.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c134
1 files changed, 88 insertions, 46 deletions
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 416e44943e71..4e6466b13af1 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -1234,10 +1234,10 @@ static int rt73usb_set_device_state(struct rt2x00_dev *rt2x00dev,
1234 */ 1234 */
1235static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev, 1235static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1236 struct sk_buff *skb, 1236 struct sk_buff *skb,
1237 struct txdata_entry_desc *desc, 1237 struct txentry_desc *txdesc,
1238 struct ieee80211_tx_control *control) 1238 struct ieee80211_tx_control *control)
1239{ 1239{
1240 struct skb_desc *skbdesc = get_skb_desc(skb); 1240 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
1241 __le32 *txd = skbdesc->desc; 1241 __le32 *txd = skbdesc->desc;
1242 u32 word; 1242 u32 word;
1243 1243
@@ -1245,19 +1245,19 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1245 * Start writing the descriptor words. 1245 * Start writing the descriptor words.
1246 */ 1246 */
1247 rt2x00_desc_read(txd, 1, &word); 1247 rt2x00_desc_read(txd, 1, &word);
1248 rt2x00_set_field32(&word, TXD_W1_HOST_Q_ID, desc->queue); 1248 rt2x00_set_field32(&word, TXD_W1_HOST_Q_ID, txdesc->queue);
1249 rt2x00_set_field32(&word, TXD_W1_AIFSN, desc->aifs); 1249 rt2x00_set_field32(&word, TXD_W1_AIFSN, txdesc->aifs);
1250 rt2x00_set_field32(&word, TXD_W1_CWMIN, desc->cw_min); 1250 rt2x00_set_field32(&word, TXD_W1_CWMIN, txdesc->cw_min);
1251 rt2x00_set_field32(&word, TXD_W1_CWMAX, desc->cw_max); 1251 rt2x00_set_field32(&word, TXD_W1_CWMAX, txdesc->cw_max);
1252 rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, IEEE80211_HEADER); 1252 rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, IEEE80211_HEADER);
1253 rt2x00_set_field32(&word, TXD_W1_HW_SEQUENCE, 1); 1253 rt2x00_set_field32(&word, TXD_W1_HW_SEQUENCE, 1);
1254 rt2x00_desc_write(txd, 1, word); 1254 rt2x00_desc_write(txd, 1, word);
1255 1255
1256 rt2x00_desc_read(txd, 2, &word); 1256 rt2x00_desc_read(txd, 2, &word);
1257 rt2x00_set_field32(&word, TXD_W2_PLCP_SIGNAL, desc->signal); 1257 rt2x00_set_field32(&word, TXD_W2_PLCP_SIGNAL, txdesc->signal);
1258 rt2x00_set_field32(&word, TXD_W2_PLCP_SERVICE, desc->service); 1258 rt2x00_set_field32(&word, TXD_W2_PLCP_SERVICE, txdesc->service);
1259 rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_LOW, desc->length_low); 1259 rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_LOW, txdesc->length_low);
1260 rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_HIGH, desc->length_high); 1260 rt2x00_set_field32(&word, TXD_W2_PLCP_LENGTH_HIGH, txdesc->length_high);
1261 rt2x00_desc_write(txd, 2, word); 1261 rt2x00_desc_write(txd, 2, word);
1262 1262
1263 rt2x00_desc_read(txd, 5, &word); 1263 rt2x00_desc_read(txd, 5, &word);
@@ -1268,24 +1268,24 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1268 1268
1269 rt2x00_desc_read(txd, 0, &word); 1269 rt2x00_desc_read(txd, 0, &word);
1270 rt2x00_set_field32(&word, TXD_W0_BURST, 1270 rt2x00_set_field32(&word, TXD_W0_BURST,
1271 test_bit(ENTRY_TXD_BURST, &desc->flags)); 1271 test_bit(ENTRY_TXD_BURST, &txdesc->flags));
1272 rt2x00_set_field32(&word, TXD_W0_VALID, 1); 1272 rt2x00_set_field32(&word, TXD_W0_VALID, 1);
1273 rt2x00_set_field32(&word, TXD_W0_MORE_FRAG, 1273 rt2x00_set_field32(&word, TXD_W0_MORE_FRAG,
1274 test_bit(ENTRY_TXD_MORE_FRAG, &desc->flags)); 1274 test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags));
1275 rt2x00_set_field32(&word, TXD_W0_ACK, 1275 rt2x00_set_field32(&word, TXD_W0_ACK,
1276 test_bit(ENTRY_TXD_ACK, &desc->flags)); 1276 test_bit(ENTRY_TXD_ACK, &txdesc->flags));
1277 rt2x00_set_field32(&word, TXD_W0_TIMESTAMP, 1277 rt2x00_set_field32(&word, TXD_W0_TIMESTAMP,
1278 test_bit(ENTRY_TXD_REQ_TIMESTAMP, &desc->flags)); 1278 test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags));
1279 rt2x00_set_field32(&word, TXD_W0_OFDM, 1279 rt2x00_set_field32(&word, TXD_W0_OFDM,
1280 test_bit(ENTRY_TXD_OFDM_RATE, &desc->flags)); 1280 test_bit(ENTRY_TXD_OFDM_RATE, &txdesc->flags));
1281 rt2x00_set_field32(&word, TXD_W0_IFS, desc->ifs); 1281 rt2x00_set_field32(&word, TXD_W0_IFS, txdesc->ifs);
1282 rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, 1282 rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
1283 !!(control->flags & 1283 !!(control->flags &
1284 IEEE80211_TXCTL_LONG_RETRY_LIMIT)); 1284 IEEE80211_TXCTL_LONG_RETRY_LIMIT));
1285 rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, 0); 1285 rt2x00_set_field32(&word, TXD_W0_TKIP_MIC, 0);
1286 rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, skbdesc->data_len); 1286 rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, skbdesc->data_len);
1287 rt2x00_set_field32(&word, TXD_W0_BURST2, 1287 rt2x00_set_field32(&word, TXD_W0_BURST2,
1288 test_bit(ENTRY_TXD_BURST, &desc->flags)); 1288 test_bit(ENTRY_TXD_BURST, &txdesc->flags));
1289 rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE); 1289 rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE);
1290 rt2x00_desc_write(txd, 0, word); 1290 rt2x00_desc_write(txd, 0, word);
1291} 1291}
@@ -1377,37 +1377,57 @@ static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
1377 return rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_AGC) * 2 - offset; 1377 return rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_AGC) * 2 - offset;
1378} 1378}
1379 1379
1380static void rt73usb_fill_rxdone(struct data_entry *entry, 1380static void rt73usb_fill_rxdone(struct queue_entry *entry,
1381 struct rxdata_entry_desc *desc) 1381 struct rxdone_entry_desc *rxdesc)
1382{ 1382{
1383 struct skb_desc *skbdesc = get_skb_desc(entry->skb); 1383 struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
1384 __le32 *rxd = (__le32 *)entry->skb->data; 1384 __le32 *rxd = (__le32 *)entry->skb->data;
1385 struct ieee80211_hdr *hdr =
1386 (struct ieee80211_hdr *)entry->skb->data + entry->queue->desc_size;
1387 int header_size = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control));
1385 u32 word0; 1388 u32 word0;
1386 u32 word1; 1389 u32 word1;
1387 1390
1388 rt2x00_desc_read(rxd, 0, &word0); 1391 rt2x00_desc_read(rxd, 0, &word0);
1389 rt2x00_desc_read(rxd, 1, &word1); 1392 rt2x00_desc_read(rxd, 1, &word1);
1390 1393
1391 desc->flags = 0; 1394 rxdesc->flags = 0;
1392 if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR)) 1395 if (rt2x00_get_field32(word0, RXD_W0_CRC_ERROR))
1393 desc->flags |= RX_FLAG_FAILED_FCS_CRC; 1396 rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC;
1394 1397
1395 /* 1398 /*
1396 * Obtain the status about this packet. 1399 * Obtain the status about this packet.
1397 */ 1400 */
1398 desc->signal = rt2x00_get_field32(word1, RXD_W1_SIGNAL); 1401 rxdesc->signal = rt2x00_get_field32(word1, RXD_W1_SIGNAL);
1399 desc->rssi = rt73usb_agc_to_rssi(entry->ring->rt2x00dev, word1); 1402 rxdesc->rssi = rt73usb_agc_to_rssi(entry->queue->rt2x00dev, word1);
1400 desc->ofdm = rt2x00_get_field32(word0, RXD_W0_OFDM); 1403 rxdesc->ofdm = rt2x00_get_field32(word0, RXD_W0_OFDM);
1401 desc->size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT); 1404 rxdesc->size = rt2x00_get_field32(word0, RXD_W0_DATABYTE_COUNT);
1402 desc->my_bss = !!rt2x00_get_field32(word0, RXD_W0_MY_BSS); 1405 rxdesc->my_bss = !!rt2x00_get_field32(word0, RXD_W0_MY_BSS);
1406
1407 /*
1408 * The data behind the ieee80211 header must be
1409 * aligned on a 4 byte boundary.
1410 */
1411 if (header_size % 4 == 0) {
1412 skb_push(entry->skb, 2);
1413 memmove(entry->skb->data, entry->skb->data + 2,
1414 entry->skb->len - 2);
1415 }
1403 1416
1404 /* 1417 /*
1405 * Set descriptor and data pointer. 1418 * Set descriptor and data pointer.
1406 */ 1419 */
1420 skbdesc->data = entry->skb->data + entry->queue->desc_size;
1421 skbdesc->data_len = entry->queue->data_size;
1407 skbdesc->desc = entry->skb->data; 1422 skbdesc->desc = entry->skb->data;
1408 skbdesc->desc_len = entry->ring->desc_size; 1423 skbdesc->desc_len = entry->queue->desc_size;
1409 skbdesc->data = entry->skb->data + entry->ring->desc_size; 1424
1410 skbdesc->data_len = desc->size; 1425 /*
1426 * Remove descriptor from skb buffer and trim the whole thing
1427 * down to only contain data.
1428 */
1429 skb_pull(entry->skb, skbdesc->desc_len);
1430 skb_trim(entry->skb, rxdesc->size);
1411} 1431}
1412 1432
1413/* 1433/*
@@ -1967,9 +1987,9 @@ static int rt73usb_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,
1967 struct ieee80211_tx_control *control) 1987 struct ieee80211_tx_control *control)
1968{ 1988{
1969 struct rt2x00_dev *rt2x00dev = hw->priv; 1989 struct rt2x00_dev *rt2x00dev = hw->priv;
1970 struct skb_desc *desc; 1990 struct skb_frame_desc *skbdesc;
1971 struct data_ring *ring; 1991 struct data_queue *queue;
1972 struct data_entry *entry; 1992 struct queue_entry *entry;
1973 int timeout; 1993 int timeout;
1974 1994
1975 /* 1995 /*
@@ -1978,25 +1998,25 @@ static int rt73usb_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,
1978 * initialization. 1998 * initialization.
1979 */ 1999 */
1980 control->queue = IEEE80211_TX_QUEUE_BEACON; 2000 control->queue = IEEE80211_TX_QUEUE_BEACON;
1981 ring = rt2x00lib_get_ring(rt2x00dev, control->queue); 2001 queue = rt2x00queue_get_queue(rt2x00dev, control->queue);
1982 entry = rt2x00_get_data_entry(ring); 2002 entry = rt2x00queue_get_entry(queue, Q_INDEX);
1983 2003
1984 /* 2004 /*
1985 * Add the descriptor in front of the skb. 2005 * Add the descriptor in front of the skb.
1986 */ 2006 */
1987 skb_push(skb, ring->desc_size); 2007 skb_push(skb, queue->desc_size);
1988 memset(skb->data, 0, ring->desc_size); 2008 memset(skb->data, 0, queue->desc_size);
1989 2009
1990 /* 2010 /*
1991 * Fill in skb descriptor 2011 * Fill in skb descriptor
1992 */ 2012 */
1993 desc = get_skb_desc(skb); 2013 skbdesc = get_skb_frame_desc(skb);
1994 desc->desc_len = ring->desc_size; 2014 memset(skbdesc, 0, sizeof(*skbdesc));
1995 desc->data_len = skb->len - ring->desc_size; 2015 skbdesc->data = skb->data + queue->desc_size;
1996 desc->desc = skb->data; 2016 skbdesc->data_len = queue->data_size;
1997 desc->data = skb->data + ring->desc_size; 2017 skbdesc->desc = skb->data;
1998 desc->ring = ring; 2018 skbdesc->desc_len = queue->desc_size;
1999 desc->entry = entry; 2019 skbdesc->entry = entry;
2000 2020
2001 rt2x00lib_write_tx_desc(rt2x00dev, skb, control); 2021 rt2x00lib_write_tx_desc(rt2x00dev, skb, control);
2002 2022
@@ -2057,12 +2077,34 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = {
2057 .config = rt73usb_config, 2077 .config = rt73usb_config,
2058}; 2078};
2059 2079
2080static const struct data_queue_desc rt73usb_queue_rx = {
2081 .entry_num = RX_ENTRIES,
2082 .data_size = DATA_FRAME_SIZE,
2083 .desc_size = RXD_DESC_SIZE,
2084 .priv_size = sizeof(struct queue_entry_priv_usb_rx),
2085};
2086
2087static const struct data_queue_desc rt73usb_queue_tx = {
2088 .entry_num = TX_ENTRIES,
2089 .data_size = DATA_FRAME_SIZE,
2090 .desc_size = TXD_DESC_SIZE,
2091 .priv_size = sizeof(struct queue_entry_priv_usb_tx),
2092};
2093
2094static const struct data_queue_desc rt73usb_queue_bcn = {
2095 .entry_num = BEACON_ENTRIES,
2096 .data_size = MGMT_FRAME_SIZE,
2097 .desc_size = TXINFO_SIZE,
2098 .priv_size = sizeof(struct queue_entry_priv_usb_tx),
2099};
2100
2060static const struct rt2x00_ops rt73usb_ops = { 2101static const struct rt2x00_ops rt73usb_ops = {
2061 .name = KBUILD_MODNAME, 2102 .name = KBUILD_MODNAME,
2062 .rxd_size = RXD_DESC_SIZE,
2063 .txd_size = TXD_DESC_SIZE,
2064 .eeprom_size = EEPROM_SIZE, 2103 .eeprom_size = EEPROM_SIZE,
2065 .rf_size = RF_SIZE, 2104 .rf_size = RF_SIZE,
2105 .rx = &rt73usb_queue_rx,
2106 .tx = &rt73usb_queue_tx,
2107 .bcn = &rt73usb_queue_bcn,
2066 .lib = &rt73usb_rt2x00_ops, 2108 .lib = &rt73usb_rt2x00_ops,
2067 .hw = &rt73usb_mac80211_ops, 2109 .hw = &rt73usb_mac80211_ops,
2068#ifdef CONFIG_RT2X00_LIB_DEBUGFS 2110#ifdef CONFIG_RT2X00_LIB_DEBUGFS