>From Ivo van Doorn <[EMAIL PROTECTED]> Merge the data_entry structure for USB and PCI into a single structure. This means that all access to the data_addr and desc_addr should now be performed through the functions: rt2x00pci_desc_addr() rt2x00pci_data_addr() And for usb: rt2x00usb_urb() rt2x00usb_rxdata_addr() rt2x00usb_rxdesc_addr() rt2x00usb_txdata_addr() rt2x00usb_txdesc_addr()
Signed-off-by: Ivo van Doorn <[EMAIL PROTECTED]> diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2400pci.c wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2400pci.c --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 2006-07-23 22:41:51.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 2006-07-25 10:44:12.000000000 +0200 @@ -1039,7 +1039,7 @@ while (1) { entry = rt2x00_get_data_entry(ring); - rxd = entry->desc_addr; + rxd = rt2x00pci_desc_addr(entry); if (rt2x00_get_field32(rxd->word0, RXD_W0_OWNER_NIC)) break; @@ -1058,7 +1058,8 @@ skb_reserve(skb, NET_IP_ALIGN); - memcpy(skb_put(skb, size), entry->data_addr, size); + memcpy(skb_put(skb, size), rt2x00pci_data_addr(entry), + size); rt2x00dev->rx_params.ssi = rt2x00_get_field32(rxd->word2, RXD_W2_RSSI); @@ -1100,7 +1101,7 @@ while (!rt2x00_ring_empty(ring)) { entry = rt2x00_get_data_entry_done(ring); - txd = entry->desc_addr; + txd = rt2x00pci_desc_addr(entry); if (rt2x00_get_field32(txd->word0, TXD_W0_OWNER_NIC) || !rt2x00_get_field32(txd->word0, TXD_W0_VALID)) @@ -1237,10 +1238,10 @@ * DMA ring functions. */ static int rt2400pci_alloc_ring(struct rt2x00_dev *rt2x00dev, - struct data_ring *ring, void (*handler)(void *), + unsigned short type, void (*handler)(void *), const u16 max_entries, const u16 data_size, const u16 desc_size) { - struct data_entry *entry; + struct data_ring *ring = &rt2x00dev->ring[type]; unsigned int i; /* @@ -1261,15 +1262,15 @@ rt2x00_ring_index_clear(ring); + ring->type = type; ring->stats.limit = max_entries; - ring->entry_size = sizeof(struct data_entry); ring->data_size = data_size; ring->desc_size = desc_size; /* * Allocate all ring entries. */ - ring->entry = kmalloc(ring->stats.limit * ring->entry_size, + ring->entry = kmalloc(ring->stats.limit * sizeof(struct data_entry), GFP_KERNEL); if (!ring->entry) return -ENOMEM; @@ -1288,15 +1289,14 @@ * Initialize all ring entries to contain valid * addresses. */ - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - entry[i].skb = NULL; - entry[i].desc_addr = ring->data_addr + ring->entry[i].skb = NULL; + ring->entry[i].priv = ring->data_addr + (i * ring->desc_size); - entry[i].data_addr = ring->data_addr + ring->entry[i].data_addr = ring->data_addr + (ring->stats.limit * ring->desc_size) + (i * ring->data_size); - entry[i].data_dma = ring->data_dma + ring->entry[i].data_dma = ring->data_dma + (ring->stats.limit * ring->desc_size) + (i * ring->data_size); } @@ -1329,19 +1329,19 @@ SET_FLAG(rt2x00dev, DEVICE_SUPPORT_ATIM); if (rt2400pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_RX], rt2400pci_rxdone, + rt2x00dev, RING_RX, rt2400pci_rxdone, RX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct rxd)) || rt2400pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_TX], rt2400pci_txdone, + rt2x00dev, RING_TX, rt2400pci_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt2400pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_ATIM], rt2400pci_txdone, + rt2x00dev, RING_ATIM, rt2400pci_txdone, ATIM_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt2400pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_PRIO], rt2400pci_txdone, + rt2x00dev, RING_PRIO, rt2400pci_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt2400pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_BEACON], rt2400pci_beacondone, + rt2x00dev, RING_BEACON, rt2400pci_beacondone, BEACON_ENTRIES, MGMT_FRAME_SIZE, sizeof(struct txd))) { ERROR("DMA allocation failed.\n"); return -ENOMEM; @@ -1368,20 +1368,18 @@ static void rt2400pci_init_rxdesc(struct rt2x00_dev *rt2x00dev, struct data_ring *ring) { - struct data_entry *entry; struct rxd *rxd; unsigned int i; memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring)); - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - rxd = entry[i].desc_addr; + rxd = rt2x00pci_desc_addr(&ring->entry[i]); rt2x00_set_field32(&rxd->word2, RXD_W2_BUFFER_LENGTH, ring->data_size); rt2x00_set_field32(&rxd->word1, RXD_W1_BUFFER_ADDRESS, - entry[i].data_dma); + ring->entry[i].data_dma); rt2x00_set_field32(&rxd->word0, RXD_W0_OWNER_NIC, 1); } @@ -1391,20 +1389,18 @@ static void rt2400pci_init_txdesc(struct rt2x00_dev *rt2x00dev, struct data_ring *ring) { - struct data_entry *entry; struct txd *txd; unsigned int i; memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring)); - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - txd = entry[i].desc_addr; + txd = rt2x00pci_desc_addr(&ring->entry[i]); rt2x00_set_field32(&txd->word2, TXD_W2_BUFFER_LENGTH, ring->data_size); rt2x00_set_field32(&txd->word1, TXD_W1_BUFFER_ADDRESS, - entry[i].data_dma); + ring->entry[i].data_dma); rt2x00_set_field32(&txd->word0, TXD_W0_VALID, 0); rt2x00_set_field32(&txd->word0, TXD_W0_OWNER_NIC, 0); } @@ -1671,7 +1667,7 @@ } entry = rt2x00_get_data_entry(ring); - txd = entry->desc_addr; + txd = rt2x00pci_desc_addr(entry); if (rt2x00_get_field32(txd->word0, TXD_W0_OWNER_NIC) || rt2x00_get_field32(txd->word0, TXD_W0_VALID)) { @@ -1687,7 +1683,7 @@ */ rt2x00_set_sequence(skb, &rt2x00dev->interface.sequence); - memcpy(entry->data_addr, skb->data, skb->len); + memcpy(rt2x00pci_data_addr(entry), skb->data, skb->len); rt2400pci_write_tx_desc(rt2x00dev, txd, skb, control); if (WLAN_FC_GET_STYPE(frame_control) == WLAN_FC_STYPE_RTS) SET_FLAG(entry, ENTRY_RTS_FRAME); @@ -2286,8 +2282,9 @@ */ rt2x00_set_sequence(skb, &rt2x00dev->interface.sequence); - memcpy(entry->data_addr, skb->data, skb->len); - rt2400pci_write_tx_desc(rt2x00dev, entry->desc_addr, skb, control); + memcpy(rt2x00pci_data_addr(entry), skb->data, skb->len); + rt2400pci_write_tx_desc(rt2x00dev, rt2x00pci_desc_addr(entry), + skb, control); return 0; } diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2400pci.h wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2400pci.h --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2400pci.h 2006-07-23 17:15:44.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2400pci.h 2006-07-25 10:09:31.000000000 +0200 @@ -845,6 +845,20 @@ }; /* + * Small handlers to determine the descriptor and + * data address within each entry. + */ +static inline void* rt2x00pci_data_addr(struct data_entry *entry) +{ + return entry->data_addr; +} + +static inline void* rt2x00pci_desc_addr(struct data_entry *entry) +{ + return entry->priv; +} + +/* * Macro's for converting txpower from EEPROM to dscape value * and from dscape value to register value. * NOTE: Logics in rt2400pci for txpower are reversed diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2500pci.c wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2500pci.c --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 2006-07-23 22:59:00.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 2006-07-25 14:50:08.000000000 +0200 @@ -1137,7 +1137,7 @@ while (1) { entry = rt2x00_get_data_entry(ring); - rxd = entry->desc_addr; + rxd = rt2x00pci_desc_addr(entry); if (rt2x00_get_field32(rxd->word0, RXD_W0_OWNER_NIC)) break; @@ -1156,7 +1156,8 @@ skb_reserve(skb, NET_IP_ALIGN); - memcpy(skb_put(skb, size), entry->data_addr, size); + memcpy(skb_put(skb, size), rt2x00pci_data_addr(entry), + size); rt2x00dev->rx_params.ssi = rt2x00_get_field32(rxd->word2, RXD_W2_RSSI); @@ -1201,7 +1202,7 @@ while (!rt2x00_ring_empty(ring)) { entry = rt2x00_get_data_entry_done(ring); - txd = entry->desc_addr; + txd = rt2x00pci_desc_addr(entry); if (rt2x00_get_field32(txd->word0, TXD_W0_OWNER_NIC) || !rt2x00_get_field32(txd->word0, TXD_W0_VALID)) @@ -1338,10 +1339,10 @@ * DMA ring functions. */ static int rt2500pci_alloc_ring(struct rt2x00_dev *rt2x00dev, - struct data_ring *ring, void (*handler)(void *), + unsigned short type, void (*handler)(void *), const u16 max_entries, const u16 data_size, const u16 desc_size) { - struct data_entry *entry; + struct data_ring *ring = &rt2x00dev->ring[type]; unsigned int i; /* @@ -1363,15 +1364,15 @@ rt2x00_ring_index_clear(ring); + ring->type = type; ring->stats.limit = max_entries; - ring->entry_size = sizeof(struct data_entry); ring->data_size = data_size; ring->desc_size = desc_size; /* * Allocate all ring entries. */ - ring->entry = kmalloc(ring->stats.limit * ring->entry_size, + ring->entry = kmalloc(ring->stats.limit * sizeof(struct data_entry), GFP_KERNEL); if (!ring->entry) return -ENOMEM; @@ -1390,15 +1391,14 @@ * Initialize all ring entries to contain valid * addresses. */ - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - entry[i].skb = NULL; - entry[i].desc_addr = ring->data_addr + ring->entry[i].skb = NULL; + ring->entry[i].priv = ring->data_addr + (i * ring->desc_size); - entry[i].data_addr = ring->data_addr + ring->entry[i].data_addr = ring->data_addr + (ring->stats.limit * ring->desc_size) + (i * ring->data_size); - entry[i].data_dma = ring->data_dma + ring->entry[i].data_dma = ring->data_dma + (ring->stats.limit * ring->desc_size) + (i * ring->data_size); } @@ -1431,19 +1431,19 @@ SET_FLAG(rt2x00dev, DEVICE_SUPPORT_ATIM); if (rt2500pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_RX], rt2500pci_rxdone, + rt2x00dev, RING_RX, rt2500pci_rxdone, RX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct rxd)) || rt2500pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_TX], rt2500pci_txdone, + rt2x00dev, RING_TX, rt2500pci_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt2500pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_ATIM], rt2500pci_txdone, + rt2x00dev, RING_ATIM, rt2500pci_txdone, ATIM_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt2500pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_PRIO], rt2500pci_txdone, + rt2x00dev, RING_PRIO, rt2500pci_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt2500pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_BEACON], rt2500pci_beacondone, + rt2x00dev, RING_BEACON, rt2500pci_beacondone, BEACON_ENTRIES, MGMT_FRAME_SIZE, sizeof(struct txd))) { ERROR("DMA allocation failed.\n"); return -ENOMEM; @@ -1470,18 +1470,16 @@ static void rt2500pci_init_rxdesc(struct rt2x00_dev *rt2x00dev, struct data_ring *ring) { - struct data_entry *entry; struct rxd *rxd; unsigned int i; memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring)); - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - rxd = entry[i].desc_addr; + rxd = rt2x00pci_desc_addr(&ring->entry[i]); rt2x00_set_field32(&rxd->word1, RXD_W1_BUFFER_ADDRESS, - entry[i].data_dma); + ring->entry[i].data_dma); rt2x00_set_field32(&rxd->word0, RXD_W0_OWNER_NIC, 1); } @@ -1491,18 +1489,16 @@ static void rt2500pci_init_txdesc(struct rt2x00_dev *rt2x00dev, struct data_ring *ring) { - struct data_entry *entry; struct txd *txd; unsigned int i; memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring)); - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - txd = entry[i].desc_addr; + txd = rt2x00pci_desc_addr(&ring->entry[i]); rt2x00_set_field32(&txd->word1, TXD_W1_BUFFER_ADDRESS, - entry[i].data_dma); + ring->entry[i].data_dma); rt2x00_set_field32(&txd->word0, TXD_W0_VALID, 0); rt2x00_set_field32(&txd->word0, TXD_W0_OWNER_NIC, 0); } @@ -1807,7 +1803,7 @@ } entry = rt2x00_get_data_entry(ring); - txd = entry->desc_addr; + txd = rt2x00pci_desc_addr(entry); if (rt2x00_get_field32(txd->word0, TXD_W0_OWNER_NIC) || rt2x00_get_field32(txd->word0, TXD_W0_VALID)) { @@ -1823,7 +1819,7 @@ */ rt2x00_set_sequence(skb, &rt2x00dev->interface.sequence); - memcpy(entry->data_addr, skb->data, skb->len); + memcpy(rt2x00pci_data_addr(entry), skb->data, skb->len); rt2500pci_write_tx_desc(rt2x00dev, txd, skb, control); if (WLAN_FC_GET_STYPE(frame_control) == WLAN_FC_STYPE_RTS) SET_FLAG(entry, ENTRY_RTS_FRAME); @@ -2413,8 +2409,9 @@ */ rt2x00_set_sequence(skb, &rt2x00dev->interface.sequence); - memcpy(entry->data_addr, skb->data, skb->len); - rt2500pci_write_tx_desc(rt2x00dev, entry->desc_addr, skb, control); + memcpy(rt2x00pci_data_addr(entry), skb->data, skb->len); + rt2500pci_write_tx_desc(rt2x00dev, rt2x00pci_desc_addr(entry), + skb, control); return 0; } diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2500pci.h wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2500pci.h --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2500pci.h 2006-07-23 17:16:15.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2500pci.h 2006-07-25 10:09:39.000000000 +0200 @@ -1114,6 +1114,20 @@ }; /* + * Small handlers to determine the descriptor and + * data address within each entry. + */ +static inline void* rt2x00pci_data_addr(struct data_entry *entry) +{ + return entry->data_addr; +} + +static inline void* rt2x00pci_desc_addr(struct data_entry *entry) +{ + return entry->priv; +} + +/* * Macro's for converting txpower from EEPROM to dscape value * and from dscape value to register value. */ diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2500usb.c wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2500usb.c --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 2006-07-23 23:00:43.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 2006-07-25 15:37:14.000000000 +0200 @@ -949,6 +949,7 @@ struct data_entry *entry; struct sk_buff *skb; struct rxd *rxd; + struct urb *urb; u16 size; u8 rssi_count; char total_rssi; @@ -962,6 +963,7 @@ while (1) { entry = rt2x00_get_data_entry(ring); rxd = rt2x00usb_rxdesc_addr(entry); + urb = rt2x00usb_urb(entry); if (GET_FLAG(entry, ENTRY_OWNER_NIC)) break; @@ -969,9 +971,9 @@ /* * There has been a problem. Ignore packet. */ - if (entry->urb->status) { + if (urb->status) { SET_FLAG(entry, ENTRY_OWNER_NIC); - usb_submit_urb(entry->urb, GFP_ATOMIC); + usb_submit_urb(urb, GFP_ATOMIC); rt2x00_ring_index_inc(ring); continue; } @@ -1008,7 +1010,7 @@ } SET_FLAG(entry, ENTRY_OWNER_NIC); - usb_submit_urb(entry->urb, GFP_ATOMIC); + usb_submit_urb(urb, GFP_ATOMIC); rt2x00_ring_index_inc(ring); } @@ -1031,6 +1033,7 @@ struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(ring->net_dev); struct data_entry *entry; struct txd *txd; + struct urb *urb; int ack; int ring_full; @@ -1042,6 +1045,7 @@ while (!rt2x00_ring_empty(ring)) { entry = rt2x00_get_data_entry_done(ring); txd = rt2x00usb_txdesc_addr(entry); + urb = rt2x00usb_urb(entry); if (GET_FLAG(entry, ENTRY_OWNER_NIC)) break; @@ -1061,9 +1065,9 @@ * was succesfull. */ entry->tx_status.ack = 0; - if (ack && (entry->urb->status == TX_SUCCESS)) + if (ack && (urb->status == TX_SUCCESS)) entry->tx_status.ack = 1; - else if (ack && entry->urb->status == TX_FAIL_OTHER) { + else if (ack && urb->status == TX_FAIL_OTHER) { rt2x00dev->low_level_stats.dot11ACKFailureCount++; entry->tx_status.excessive_retries++; } @@ -1117,7 +1121,7 @@ if (urb->status) return; - if (GET_FLAG(entry, ENTRY_TYPE_RX)) + if (entry->ring->type == RING_RX) rt2500usb_activity_led(rt2x00dev, 1); queue_work(rt2x00dev->workqueue, &entry->ring->irq_work); @@ -1127,10 +1131,10 @@ * DMA ring functions. */ static int rt2500usb_alloc_ring(struct rt2x00_dev *rt2x00dev, - struct data_ring *ring, void (*handler)(void *), + unsigned short type, void (*handler)(void *), const u16 max_entries, const u16 data_size, const u16 desc_size) { - struct data_entry *entry; + struct data_ring *ring = &rt2x00dev->ring[type]; unsigned int i; int status; @@ -1153,15 +1157,15 @@ rt2x00_ring_index_clear(ring); + ring->type = type; ring->stats.limit = max_entries; - ring->entry_size = sizeof(struct data_entry); ring->data_size = data_size; ring->desc_size = desc_size; /* * Allocate all ring entries. */ - ring->entry = kmalloc(ring->stats.limit * ring->entry_size, + ring->entry = kmalloc(ring->stats.limit * sizeof(struct data_entry), GFP_KERNEL); if (!ring->entry) return -ENOMEM; @@ -1182,20 +1186,19 @@ * addresses. */ status = 0; - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - entry[i].ring = ring; + ring->entry[i].ring = ring; if (!status) - entry[i].urb = usb_alloc_urb(0, GFP_KERNEL); + ring->entry[i].priv = usb_alloc_urb(0, GFP_KERNEL); else - entry[i].urb = NULL; - if (!entry[i].urb) + ring->entry[i].priv = NULL; + if (!ring->entry[i].priv) status = -ENOMEM; - entry[i].skb = NULL; - entry[i].data_addr = ring->data_addr + ring->entry[i].skb = NULL; + ring->entry[i].data_addr = ring->data_addr + (i * ring->desc_size) + (i * ring->data_size); - entry[i].data_dma = ring->data_dma + ring->entry[i].data_dma = ring->data_dma + (i * ring->desc_size) + (i * ring->data_size); } @@ -1206,16 +1209,16 @@ static void rt2500usb_free_ring(struct rt2x00_dev *rt2x00dev, struct data_ring *ring) { - struct data_entry *entry; + struct urb *urb; unsigned int i; if (!ring->entry) goto exit; - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - usb_kill_urb(entry[i].urb); - usb_free_urb(entry[i].urb); + urb = rt2x00usb_urb(&ring->entry[i]); + usb_kill_urb(urb); + usb_free_urb(urb); } kfree(ring->entry); @@ -1242,19 +1245,19 @@ SET_FLAG(rt2x00dev, DEVICE_SUPPORT_ATIM); if (rt2500usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_RX], &rt2500usb_rxdone, + rt2x00dev, RING_RX, &rt2500usb_rxdone, RX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct rxd)) || rt2500usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_TX], &rt2500usb_txdone, + rt2x00dev, RING_TX, &rt2500usb_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt2500usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_ATIM], &rt2500usb_txdone, + rt2x00dev, RING_ATIM, &rt2500usb_txdone, ATIM_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt2500usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_PRIO], &rt2500usb_txdone, + rt2x00dev, RING_PRIO, &rt2500usb_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt2500usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_BEACON], &rt2500usb_beacondone, + rt2x00dev, RING_BEACON, &rt2500usb_beacondone, BEACON_ENTRIES, MGMT_FRAME_SIZE, sizeof(struct txd))) { ERROR("DMA allocation failed.\n"); return -ENOMEM; @@ -1283,37 +1286,37 @@ { struct usb_device *usb_dev = interface_to_usbdev(rt2x00dev_usb(rt2x00dev)); - struct data_entry *entry; + struct urb *urb; unsigned int i; - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - entry[i].urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - entry[i].urb->transfer_dma = entry[i].data_dma; + urb = rt2x00usb_urb(&ring->entry[i]); + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + urb->transfer_dma = ring->entry[i].data_dma; usb_fill_bulk_urb( - entry[i].urb, + urb, usb_dev, usb_rcvbulkpipe(usb_dev, 1), - entry[i].data_addr, + ring->entry[i].data_addr, ring->entry_size + ring->desc_size, rt2500usb_interrupt, - &entry[i]); - SET_FLAG(&entry[i], ENTRY_OWNER_NIC | ENTRY_TYPE_RX); - usb_submit_urb(entry[i].urb, GFP_ATOMIC); + &ring->entry[i]); + SET_FLAG(&ring->entry[i], ENTRY_OWNER_NIC); + usb_submit_urb(urb, GFP_ATOMIC); } } static void rt2500usb_init_txring(struct rt2x00_dev *rt2x00dev, struct data_ring *ring) { - struct data_entry *entry; + struct urb *urb; unsigned int i; - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - entry[i].urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - entry[i].urb->transfer_dma = entry[i].data_dma; - CLEAR_FLAGS(&entry[i]); + urb = rt2x00usb_urb(&ring->entry[i]); + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + urb->transfer_dma = ring->entry[i].data_dma; + CLEAR_FLAGS(&ring->entry[i]); } } @@ -1536,14 +1539,14 @@ SET_FLAG(entry, ENTRY_OWNER_NIC); usb_fill_bulk_urb( - entry->urb, + rt2x00usb_urb(entry), usb_dev, usb_sndbulkpipe(usb_dev, 1), entry->data_addr, skb->len + ring->desc_size, rt2500usb_interrupt, entry); - usb_submit_urb(entry->urb, GFP_ATOMIC); + usb_submit_urb(rt2x00usb_urb(entry), GFP_ATOMIC); rt2x00_ring_index_inc(ring); @@ -1555,12 +1558,10 @@ static inline void rt2500usb_reset_ring(struct data_ring *ring) { - struct data_entry *entry; unsigned int i; - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) - usb_kill_urb(entry[i].urb); + usb_kill_urb(ring->entry[i].urb); } static int rt2500usb_reset(struct net_device *net_dev) @@ -2050,14 +2051,14 @@ SET_FLAG(entry, ENTRY_OWNER_NIC); usb_fill_bulk_urb( - entry->urb, + rt2x00usb_urb(entry), usb_dev, usb_sndbulkpipe(usb_dev, 1), entry->data_addr, skb->len + rt2x00dev->ring[RING_BEACON].desc_size, rt2500usb_interrupt, entry); - usb_submit_urb(entry->urb, GFP_ATOMIC); + usb_submit_urb(rt2x00usb_urb(entry), GFP_ATOMIC); return 0; } diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2500usb.h wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2500usb.h --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2500usb.h 2006-07-23 17:16:31.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2500usb.h 2006-07-25 10:08:02.000000000 +0200 @@ -634,6 +634,37 @@ }; /* + * The location of the descriptor is variating and depends + * on the fact if it is a TX or RX ring and the length of the packet. + * We need some small handlers to properly access the descriptors. + */ +static inline struct urb* rt2x00usb_urb(struct data_entry *entry) +{ + return (struct urb*)entry->priv; +} + +static inline void* rt2x00usb_rxdata_addr(struct data_entry *entry) +{ + return entry->data_addr; +} + +static inline void* rt2x00usb_rxdesc_addr(struct data_entry *entry) +{ + return entry->data_addr + + (rt2x00usb_urb(entry)->actual_length - entry->ring->desc_size); +} + +static inline void* rt2x00usb_txdata_addr(struct data_entry *entry) +{ + return entry->data_addr + entry->ring->desc_size; +} + +static inline void* rt2x00usb_txdesc_addr(struct data_entry *entry) +{ + return entry->data_addr; +} + +/* * Macro's for converting txpower from EEPROM to dscape value * and from dscape value to register value. */ diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2x00.h wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2x00.h --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2x00.h 2006-07-23 22:32:51.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2x00.h 2006-07-25 10:15:58.000000000 +0200 @@ -445,6 +445,51 @@ } /* + * data_entry + * The data ring is a list of data entries. + * Each entry holds a reference to the descriptor + * and the data buffer. For TX rings the reference to the + * sk_buff of the packet being transmitted is also stored here. + */ +struct data_entry{ + /* + * Status flags + */ + unsigned int flags; +#define ENTRY_OWNER_NIC 0x00000001 +#define ENTRY_RTS_FRAME 0x00000002 + + /* + * Ring we belong to. + */ + struct data_ring *ring; + + /* + * sk_buff for the packet which is being transmitted + * in this entry (Only used with TX related rings). + */ + struct sk_buff *skb; + + /* + * Store a ieee80211_tx_status structure in each + * ring entry, this will optimize the txdone + * handler. + */ + struct ieee80211_tx_status tx_status; + + /* + * private pointer specific to driver. + */ + void *priv; + + /* + * Data address for this entry. + */ + void *data_addr; + dma_addr_t data_dma; +}; + +/* * data_ring * Data rings are used by the device to send and receive packets. * The data_addr is the base address of the data memory. @@ -465,7 +510,7 @@ /* * Base address for the device specific data entries. */ - void *entry; + struct data_entry *entry; /* * TX queue statistic info. @@ -490,9 +535,9 @@ u8 index_done; /* - * Size of device specific data entry structure. + * Ring type. */ - u16 entry_size; + u16 type; /* * Size of packet and descriptor in bytes. @@ -505,14 +550,16 @@ * Handlers to determine the address of the current device specific * data entry, where either index or index_done points to. */ -static inline void* rt2x00_get_data_entry(struct data_ring *ring) +static inline struct data_entry* rt2x00_get_data_entry( + struct data_ring *ring) { - return ring->entry + (ring->index * ring->entry_size); + return &ring->entry[ring->index]; } -static inline void* rt2x00_get_data_entry_done(struct data_ring *ring) +static inline struct data_entry* rt2x00_get_data_entry_done( + struct data_ring *ring) { - return ring->entry + (ring->index_done * ring->entry_size); + return &ring->entry[ring->index_done]; } /* @@ -899,7 +946,7 @@ /* * Initialize a ieee80211_entry by filling in all fields and correctly * construct the device specific val and val2 fields. - */ + */ static inline void device_rate_entry(struct ieee80211_rate *entry, int rate, int mask, int plcp, int flags) { diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2x00pci.h wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2x00pci.h --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2x00pci.h 2006-07-23 17:59:04.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2x00pci.h 2006-07-25 10:13:00.000000000 +0200 @@ -76,45 +76,6 @@ #endif /* CONFIG_RT2X00_BUTTON */ /* - * data_entry - * The data ring is a list of data entries. - * Each entry holds a reference to the descriptor - * and the data buffer. For TX rings the reference to the - * sk_buff of the packet being transmitted is also stored here. - */ -struct data_entry { - /* - * Status flag. - */ - unsigned int flags; -#define ENTRY_RTS_FRAME 0x00000001 - - /* - * sk_buff for the packet which is being transmitted - * in this entry (Only used with TX related rings). - */ - struct sk_buff *skb; - - /* - * Store a ieee80211_tx_status structure in each - * ring entry, this will optimize the txdone - * handler. - */ - struct ieee80211_tx_status tx_status; - - /* - * Descriptor address for this entry. - */ - void *desc_addr; - - /* - * Data address for this entry. - */ - void *data_addr; - dma_addr_t data_dma; -}; - -/* * HW button variables & functions. * The delay between each poll is set by the module parameter. */ diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2x00usb.h wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2x00usb.h --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt2x00usb.h 2006-07-23 17:58:43.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt2x00usb.h 2006-07-25 10:13:18.000000000 +0200 @@ -43,78 +43,6 @@ #define REGISTER_TIMEOUT_FIRMWARE 1000 /* - * data_entry - * The data ring is a list of data entries. - * Each entry holds a reference to the descriptor - * and the data buffer. For TX rings the reference to the - * sk_buff of the packet being transmitted is also stored here. - */ -struct data_entry { - /* - * Status flag. - */ - unsigned int flags; -#define ENTRY_OWNER_NIC 0x00000001 -#define ENTRY_TYPE_RX 0x00000002 -#define ENTRY_RTS_FRAME 0x00000004 - - /* - * Ring we belong to. - */ - struct data_ring *ring; - - /* - * URB for communication with device. - */ - struct urb *urb; - - /* - * sk_buff for the packet which is being transmitted - * in this entry (Only used with TX related rings). - */ - struct sk_buff *skb; - - /* - * Store a ieee80211_tx_status structure in each - * ring entry, this will optimize the txdone - * handler. - */ - struct ieee80211_tx_status tx_status; - - /* - * Data address for this entry. - */ - void *data_addr; - dma_addr_t data_dma; -}; - -/* - * The location of the descriptor is variating and depends - * on the fact if it is a TX or RX ring and the length of the packet. - * We need some small handlers to properly access the descriptors. - */ -static inline void* rt2x00usb_rxdata_addr(struct data_entry *entry) -{ - return entry->data_addr; -} - -static inline void* rt2x00usb_rxdesc_addr(struct data_entry *entry) -{ - return entry->data_addr + - (entry->urb->actual_length - entry->ring->desc_size); -} - -static inline void* rt2x00usb_txdata_addr(struct data_entry *entry) -{ - return entry->data_addr + entry->ring->desc_size; -} - -static inline void* rt2x00usb_txdesc_addr(struct data_entry *entry) -{ - return entry->data_addr; -} - -/* * USB request types. */ #define USB_VENDOR_REQUEST ( USB_TYPE_VENDOR | USB_RECIP_DEVICE ) diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt61pci.c wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt61pci.c --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt61pci.c 2006-07-23 23:19:17.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt61pci.c 2006-07-25 14:55:25.000000000 +0200 @@ -1424,7 +1424,7 @@ while (1) { entry = rt2x00_get_data_entry(ring); - rxd = entry->desc_addr; + rxd = rt2x00pci_desc_addr(entry); if (rt2x00_get_field32(rxd->word0, RXD_W0_OWNER_NIC)) break; @@ -1442,7 +1442,8 @@ skb_reserve(skb, NET_IP_ALIGN); - memcpy(skb_put(skb, size), entry->data_addr, size); + memcpy(skb_put(skb, size), rt2x00pci_data_addr(entry), + size); rt2x00dev->rx_params.ssi = rt2x00_get_field32(rxd->word1, RXD_W1_RSSI); @@ -1490,7 +1491,7 @@ while (!rt2x00_ring_empty(ring)) { entry = rt2x00_get_data_entry_done(ring); - txd = entry->desc_addr; + txd = rt2x00pci_desc_addr(entry); rt2x00_register_read(rt2x00dev, STA_CSR4, ®); @@ -1796,10 +1797,10 @@ * DMA ring functions. */ static int rt61pci_alloc_ring(struct rt2x00_dev *rt2x00dev, - struct data_ring *ring, void (*handler)(void *), + unsigned short type, void (*handler)(void *), const u16 max_entries, const u16 data_size, const u16 desc_size) { - struct data_entry *entry; + struct data_ring *ring = &rt2x00dev->ring[type]; unsigned int i; /* @@ -1821,15 +1822,15 @@ rt2x00_ring_index_clear(ring); + ring->type = type; ring->stats.limit = max_entries; - ring->entry_size = sizeof(struct data_entry); ring->data_size = data_size; ring->desc_size = desc_size; /* * Allocate all ring entries. */ - ring->entry = kmalloc(ring->stats.limit * ring->entry_size, + ring->entry = kmalloc(ring->stats.limit * sizeof(struct data_entry), GFP_KERNEL); if (!ring->entry) return -ENOMEM; @@ -1848,15 +1849,14 @@ * Initialize all ring entries to contain valid * addresses. */ - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - entry[i].skb = NULL; - entry[i].desc_addr = ring->data_addr + ring->entry[i].skb = NULL; + ring->entry[i].priv = ring->data_addr + (i * ring->desc_size); - entry[i].data_addr = ring->data_addr + ring->entry[i].data_addr = ring->data_addr + (ring->stats.limit * ring->desc_size) + (i * ring->data_size); - entry[i].data_dma = ring->data_dma + ring->entry[i].data_dma = ring->data_dma + (ring->stats.limit * ring->desc_size) + (i * ring->data_size); } @@ -1887,25 +1887,25 @@ } if (rt61pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_RX], rt61pci_rxdone, + rt2x00dev, RING_RX, rt61pci_rxdone, RX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct rxd)) || rt61pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_AC_BK], rt61pci_txdone, + rt2x00dev, RING_AC_BK, rt61pci_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt61pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_AC_BE], rt61pci_txdone, + rt2x00dev, RING_AC_BE, rt61pci_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt61pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_AC_VI], rt61pci_txdone, + rt2x00dev, RING_AC_VI, rt61pci_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt61pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_AC_VO], rt61pci_txdone, + rt2x00dev, RING_AC_VO, rt61pci_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt61pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_PRIO], rt61pci_txdone, + rt2x00dev, RING_PRIO, rt61pci_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt61pci_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_BEACON], rt61pci_beacondone, + rt2x00dev, RING_BEACON, rt61pci_beacondone, BEACON_ENTRIES, MGMT_FRAME_SIZE, sizeof(struct txd)) ) { ERROR("DMA allocation failed.\n"); return -ENOMEM; @@ -1934,19 +1934,17 @@ static void rt61pci_init_rxdesc(struct rt2x00_dev *rt2x00dev, struct data_ring *ring) { - struct data_entry *entry; struct rxd *rxd; unsigned int i; memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring)); - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - rxd = entry[i].desc_addr; + rxd = rt2x00pci_desc_addr(&ring->entry[i]); rt2x00_set_field32(&rxd->word0, RXD_W0_OWNER_NIC, 1); rt2x00_set_field32(&rxd->word5, RXD_W5_BUFFER_PHYSICAL_ADDRESS, - entry[i].data_dma); + ring->entry[i].data_dma); } rt2x00_ring_index_clear(ring); @@ -1955,21 +1953,19 @@ static void rt61pci_init_txdesc(struct rt2x00_dev *rt2x00dev, struct data_ring *ring) { - struct data_entry *entry; struct txd *txd; unsigned int i; memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring)); - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - txd = entry[i].desc_addr; + txd = rt2x00pci_desc_addr(&ring->entry[i]); rt2x00_set_field32(&txd->word0, TXD_W0_VALID, 0); rt2x00_set_field32(&txd->word0, TXD_W0_OWNER_NIC, 0); rt2x00_set_field32(&txd->word1, TXD_W1_BUFFER_COUNT, 1); rt2x00_set_field32(&txd->word6, TXD_W6_BUFFER_PHYSICAL_ADDRESS, - entry[i].data_dma); + ring->entry[i].data_dma); } rt2x00_ring_index_clear(ring); @@ -2271,7 +2267,7 @@ } entry = rt2x00_get_data_entry(ring); - txd = entry->desc_addr; + txd = rt2x00pci_desc_addr(entry); if (rt2x00_get_field32(txd->word0, TXD_W0_OWNER_NIC) || rt2x00_get_field32(txd->word0, TXD_W0_VALID)) { @@ -2282,7 +2278,7 @@ return NETDEV_TX_BUSY; } - memcpy(entry->data_addr, skb->data, skb->len); + memcpy(rt2x00pci_data_addr(entry), skb->data, skb->len); rt61pci_write_tx_desc(rt2x00dev, txd, skb, control); if (WLAN_FC_GET_STYPE(frame_control) == WLAN_FC_STYPE_RTS) SET_FLAG(entry, ENTRY_RTS_FRAME); @@ -2898,8 +2894,9 @@ */ control->queue = IEEE80211_TX_QUEUE_BEACON; - memcpy(entry->data_addr, skb->data, skb->len); - rt61pci_write_tx_desc(rt2x00dev, entry->desc_addr, skb, control); + memcpy(rt2x00pci_data_addr(entry), skb->data, skb->len); + rt61pci_write_tx_desc(rt2x00dev, rt2x00pci_desc_addr(entry), + skb, control); return 0; } diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt61pci.h wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt61pci.h --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt61pci.h 2006-07-23 23:21:39.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt61pci.h 2006-07-25 10:09:44.000000000 +0200 @@ -1330,6 +1330,20 @@ }; /* + * Small handlers to determine the descriptor and + * data address within each entry. + */ +static inline void* rt2x00pci_data_addr(struct data_entry *entry) +{ + return entry->data_addr; +} + +static inline void* rt2x00pci_desc_addr(struct data_entry *entry) +{ + return entry->priv; +} + +/* * Macro's for converting txpower from EEPROM to dscape value * and from dscape value to register value. */ diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt73usb.c wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt73usb.c --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt73usb.c 2006-07-23 23:17:42.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt73usb.c 2006-07-25 15:37:22.000000000 +0200 @@ -1128,6 +1128,7 @@ struct data_entry *entry; struct sk_buff *skb; struct rxd *rxd; + struct urb *urb; u16 size; u8 rssi_count; char total_rssi; @@ -1141,6 +1142,7 @@ while (1) { entry = rt2x00_get_data_entry(ring); rxd = rt2x00usb_rxdesc_addr(entry); + urb = rt2x00usb_urb(entry); if (GET_FLAG(entry, ENTRY_OWNER_NIC)) break; @@ -1148,9 +1150,9 @@ /* * There has been a problem. Ignore packet. */ - if (entry->urb->status) { + if (urb->status) { SET_FLAG(entry, ENTRY_OWNER_NIC); - usb_submit_urb(entry->urb, GFP_ATOMIC); + usb_submit_urb(urb, GFP_ATOMIC); rt2x00_ring_index_inc(ring); continue; } @@ -1187,7 +1189,7 @@ } SET_FLAG(entry, ENTRY_OWNER_NIC); - usb_submit_urb(entry->urb, GFP_ATOMIC); + usb_submit_urb(urb, GFP_ATOMIC); rt2x00_ring_index_inc(ring); } @@ -1212,6 +1214,7 @@ struct rt2x00_dev *rt2x00dev = ieee80211_dev_hw_data(ring->net_dev); struct data_entry *entry; struct txd *txd; + struct urb *urb; int ack; int ring_full; @@ -1222,7 +1225,8 @@ while (!rt2x00_ring_empty(ring)) { entry = rt2x00_get_data_entry_done(ring); - txd = rt2x00usb_txdesc_addr(entry);; + txd = rt2x00usb_txdesc_addr(entry); + urb = rt2x00usb_urb(entry); if (GET_FLAG(entry, ENTRY_OWNER_NIC)) break; @@ -1242,7 +1246,7 @@ * was succesfull. */ entry->tx_status.ack = 0; - if (ack && (entry->urb->status == TX_SUCCESS)) + if (ack && (urb->status == TX_SUCCESS)) entry->tx_status.ack = 1; else { rt2x00dev->low_level_stats.dot11ACKFailureCount++; @@ -1413,10 +1417,10 @@ * DMA ring functions. */ static int rt73usb_alloc_ring(struct rt2x00_dev *rt2x00dev, - struct data_ring *ring, void (*handler)(void *), + unsigned short type, void (*handler)(void *), const u16 max_entries, const u16 data_size, const u16 desc_size) { - struct data_entry *entry; + struct data_ring *ring = &rt2x00dev->ring[type]; unsigned int i; int status; @@ -1439,15 +1443,15 @@ rt2x00_ring_index_clear(ring); + ring->type = type; ring->stats.limit = max_entries; - ring->entry_size = sizeof(struct data_entry); ring->data_size = data_size; ring->desc_size = desc_size; /* * Allocate all ring entries. */ - ring->entry = kmalloc(ring->stats.limit * ring->entry_size, + ring->entry = kmalloc(ring->stats.limit * sizeof(struct data_entry), GFP_KERNEL); if (!ring->entry) return -ENOMEM; @@ -1468,20 +1472,19 @@ * addresses. */ status = 0; - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - entry[i].ring = ring; + ring->entry[i].ring = ring; if (!status) - entry[i].urb = usb_alloc_urb(0, GFP_KERNEL); + ring->entry[i].priv = usb_alloc_urb(0, GFP_KERNEL); else - entry[i].urb = NULL; - if (!entry[i].urb) + ring->entry[i].priv = NULL; + if (!ring->entry[i].priv) status = -ENOMEM; - entry[i].skb = NULL; - entry[i].data_addr = ring->data_addr + ring->entry[i].skb = NULL; + ring->entry[i].data_addr = ring->data_addr + (i * ring->desc_size) + (i * ring->data_size); - entry[i].data_dma = ring->data_dma + ring->entry[i].data_dma = ring->data_dma + (i * ring->desc_size) + (i * ring->data_size); } @@ -1492,16 +1495,16 @@ static void rt73usb_free_ring(struct rt2x00_dev *rt2x00dev, struct data_ring *ring) { - struct data_entry *entry; + struct urb *urb; unsigned int i; if (!ring->entry) goto exit; - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - usb_kill_urb(entry[i].urb); - usb_free_urb(entry[i].urb); + urb = rt2x00usb_urb(&ring->entry[i]); + usb_kill_urb(urb); + usb_free_urb(urb); } kfree(ring->entry); @@ -1526,25 +1529,25 @@ } if (rt73usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_RX], rt73usb_rxdone, + rt2x00dev, RING_RX, rt73usb_rxdone, RX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct rxd)) || rt73usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_AC_BK], rt73usb_txdone, + rt2x00dev, RING_AC_BK, rt73usb_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt73usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_AC_BE], rt73usb_txdone, + rt2x00dev, RING_AC_BE, rt73usb_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt73usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_AC_VI], rt73usb_txdone, + rt2x00dev, RING_AC_VI, rt73usb_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt73usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_AC_VO], rt73usb_txdone, + rt2x00dev, RING_AC_VO, rt73usb_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt73usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_PRIO], rt73usb_txdone, + rt2x00dev, RING_PRIO, rt73usb_txdone, TX_ENTRIES, DATA_FRAME_SIZE, sizeof(struct txd)) || rt73usb_alloc_ring( - rt2x00dev, &rt2x00dev->ring[RING_BEACON], rt73usb_beacondone, + rt2x00dev, RING_BEACON, rt73usb_beacondone, BEACON_ENTRIES, MGMT_FRAME_SIZE, sizeof(struct txd)) ) { ERROR("DMA allocation failed.\n"); return -ENOMEM; @@ -1575,37 +1578,37 @@ { struct usb_device *usb_dev = interface_to_usbdev(rt2x00dev_usb(rt2x00dev)); - struct data_entry *entry; + struct urb *urb; unsigned int i; - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - entry[i].urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - entry[i].urb->transfer_dma = entry[i].data_dma; + urb = rt2x00usb_urb(&ring->entry[i]); + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + urb->transfer_dma = ring->entry[i].data_dma; usb_fill_bulk_urb( - entry[i].urb, + urb, usb_dev, usb_rcvbulkpipe(usb_dev, 1), - entry[i].data_addr, + ring->entry[i].data_addr, ring->entry_size + ring->desc_size, rt73usb_interrupt, - &entry[i]); - SET_FLAG(&entry[i], ENTRY_OWNER_NIC | ENTRY_TYPE_RX); - usb_submit_urb(entry[i].urb, GFP_ATOMIC); + &ring->entry[i]); + SET_FLAG(&ring->entry[i], ENTRY_OWNER_NIC); + usb_submit_urb(urb, GFP_ATOMIC); } } static void rt73usb_init_txring(struct rt2x00_dev *rt2x00dev, struct data_ring *ring) { - struct data_entry *entry; + struct urb *urb; unsigned int i; - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) { - entry[i].urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; - entry[i].urb->transfer_dma = entry[i].data_dma; - CLEAR_FLAGS(&entry[i]); + urb = rt2x00usb_urb(&ring->entry[i]); + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + urb->transfer_dma = ring->entry[i].data_dma; + CLEAR_FLAGS(&ring->entry[i]); } } @@ -1847,14 +1850,14 @@ SET_FLAG(entry, ENTRY_OWNER_NIC); usb_fill_bulk_urb( - entry->urb, + rt2x00usb_urb(entry), usb_dev, usb_sndbulkpipe(usb_dev, 1), entry->data_addr, skb->len + ring->desc_size, rt73usb_interrupt, entry); - usb_submit_urb(entry->urb, GFP_ATOMIC); + usb_submit_urb(rt2x00usb_urb(entry), GFP_ATOMIC); rt2x00_ring_index_inc(ring); @@ -1866,12 +1869,10 @@ static inline void rt73usb_reset_ring(struct data_ring *ring) { - struct data_entry *entry; unsigned int i; - entry = ring->entry; for (i = 0; i < ring->stats.limit; i++) - usb_kill_urb(entry[i].urb); + usb_kill_urb(ring->entry[i].urb); } static int rt73usb_reset(struct net_device *net_dev) @@ -2408,14 +2409,14 @@ SET_FLAG(entry, ENTRY_OWNER_NIC); usb_fill_bulk_urb( - entry->urb, + rt2x00usb_urb(entry), usb_dev, usb_sndbulkpipe(usb_dev, 1), entry->data_addr, skb->len + rt2x00dev->ring[RING_BEACON].desc_size, rt73usb_interrupt, entry); - usb_submit_urb(entry->urb, GFP_ATOMIC); + usb_submit_urb(rt2x00usb_urb(entry), GFP_ATOMIC); return 0; } diff -rU3 wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt73usb.h wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt73usb.h --- wireless-dev-eeprom/drivers/net/wireless/d80211/rt2x00/rt73usb.h 2006-07-23 18:33:18.000000000 +0200 +++ wireless-dev-ringentry/drivers/net/wireless/d80211/rt2x00/rt73usb.h 2006-07-25 10:07:34.000000000 +0200 @@ -895,6 +895,36 @@ }; /* + * The location of the descriptor is variating and depends + * on the fact if it is a TX or RX ring and the length of the packet. + * We need some small handlers to properly access the descriptors. + */ +static inline struct urb* rt2x00usb_urb(struct data_entry *entry) +{ + return (struct urb*)entry->priv; +} + +static inline void* rt2x00usb_rxdata_addr(struct data_entry *entry) +{ + return entry->data_addr + entry->ring->desc_size; +} + +static inline void* rt2x00usb_rxdesc_addr(struct data_entry *entry) +{ + return entry->data_addr; +} + +static inline void* rt2x00usb_txdata_addr(struct data_entry *entry) +{ + return entry->data_addr + entry->ring->desc_size; +} + +static inline void* rt2x00usb_txdesc_addr(struct data_entry *entry) +{ + return entry->data_addr; +} + +/* * Macro's for converting txpower from EEPROM to dscape value * and from dscape value to register value. */ - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html