* [PATCH 25/32] rt2x00: Add flag handlers
@ 2006-04-27 22:03 Ivo van Doorn
0 siblings, 0 replies; only message in thread
From: Ivo van Doorn @ 2006-04-27 22:03 UTC (permalink / raw)
To: netdev; +Cc: rt2x00-devel
[-- Attachment #1: Type: text/plain, Size: 12734 bytes --]
From: Ivo van Doorn <IvDoorn@gmail.com>
Add flag handlers to set the state and capabilities of
the driver.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2400pci.c wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2400pci.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 2006-04-27 21:53:13.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2400pci.c 2006-04-27 21:56:05.000000000 +0200
@@ -1099,7 +1099,7 @@ rt2400pci_allocate_rings(struct rt2x00_p
return -ENOMEM;
}
- rt2x00pci->atim_available = 1;
+ SET_FLAG(rt2x00pci, ATIM_AVAILABLE);
if (rt2400pci_alloc_ring(
rt2x00pci, &rt2x00pci->ring[RING_RX], rt2400pci_rxdone,
@@ -1549,6 +1549,8 @@ rt2400pci_open(struct net_device *net_de
rt2x00_set_field32(®, CSR8_RXDONE, 0);
rt2x00_register_write(rt2x00pci, CSR8, reg);
+ SET_FLAG(rt2x00pci, RADIO_ENABLED);
+
return 0;
exit_fail:
@@ -1563,6 +1565,8 @@ rt2400pci_stop(struct net_device *net_de
struct rt2x00_pci *rt2x00pci = ieee80211_dev_hw_data(net_dev);
u32 reg;
+ CLEAR_FLAG(rt2x00pci, RADIO_ENABLED);
+
rt2x00_register_write(rt2x00pci, PWRCSR0, 0);
/*
@@ -1972,16 +1976,11 @@ rt2400pci_init_eeprom(struct rt2x00_pci
rt2x00pci->led_mode = rt2x00_get_field16(eeprom,
EEPROM_ANTENNA_LED_MODE);
-#ifdef CONFIG_RT2400PCI_BUTTON
/*
* 6 - Detect if this device has an hardware controlled radio.
- * If this device is not hardware controlled, disable polling timer.
*/
if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO))
- rt2x00pci->button_status = BUTTON_STATUS_OFF;
- else
- rt2x00pci->button_status = BUTTON_STATUS_UNAVAILABLE;
-#endif /* CONFIG_RT2400PCI_BUTTON */
+ SET_FLAG(rt2x00pci, HARDWARE_BUTTON);
/*
* 7 - Read BBP data from EEPROM and store in private structure.
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2400pci.h wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2400pci.h
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2400pci.h 2006-04-27 21:53:13.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2400pci.h 2006-04-27 21:56:05.000000000 +0200
@@ -868,6 +868,11 @@ struct data_entry{
* Device specific structure.
*/
struct rt2x00_pci{
+ /*
+ * Device flags.
+ */
+ unsigned int flags;
+
#ifdef CONFIG_RT2400PCI_BUTTON
/*
* ACPI device for generation of ACPI events.
@@ -935,8 +940,6 @@ struct rt2x00_pci{
*/
int false_cca;
- int atim_available;
-
/*
* EEPROM bus width.
*/
@@ -987,7 +990,7 @@ rt2x00pci_get_ring(struct rt2x00_pci *rt
{
u8 atim;
- atim = rt2x00pci->atim_available;
+ atim = GET_FLAG(rt2x00pci, ATIM_AVAILABLE);
/*
* Check if the rings have been allocated.
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500pci.c wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500pci.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 2006-04-27 21:53:13.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500pci.c 2006-04-27 21:56:05.000000000 +0200
@@ -1180,7 +1180,7 @@ rt2500pci_allocate_rings(struct rt2x00_p
return -ENOMEM;
}
- rt2x00pci->atim_available = 1;
+ SET_FLAG(rt2x00pci, ATIM_AVAILABLE);
if (rt2500pci_alloc_ring(
rt2x00pci, &rt2x00pci->ring[RING_RX], rt2500pci_rxdone,
@@ -1657,6 +1657,8 @@ rt2500pci_open(struct net_device *net_de
rt2x00_set_field32(®, CSR8_RXDONE, 0);
rt2x00_register_write(rt2x00pci, CSR8, reg);
+ SET_FLAG(rt2x00pci, RADIO_ENABLED);
+
return 0;
exit_fail:
@@ -1671,6 +1673,8 @@ rt2500pci_stop(struct net_device *net_de
struct rt2x00_pci *rt2x00pci = ieee80211_dev_hw_data(net_dev);
u32 reg;
+ CLEAR_FLAG(rt2x00pci, RADIO_ENABLED);
+
rt2x00_register_write(rt2x00pci, PWRCSR0, 0);
/*
@@ -1929,7 +1933,7 @@ rt2500pci_conf_tx(struct net_device *net
/*
* The passed variables are stored as real value ((2^n)-1).
- * RT2400 registers require to know the bit number 'n'.
+ * RT2500 registers require to know the bit number 'n'.
*/
if (params->cw_min)
ring->tx_params.cw_min = HIGHEST_BIT16(params->cw_min) + 1;
@@ -2075,16 +2079,11 @@ rt2500pci_init_eeprom(struct rt2x00_pci
rt2x00pci->led_mode = rt2x00_get_field16(eeprom,
EEPROM_ANTENNA_LED_MODE);
-#ifdef CONFIG_RT2500PCI_BUTTON
/*
* 6 - Detect if this device has an hardware controlled radio.
- * If this device is not hardware controlled, disable polling timer.
*/
if (rt2x00_get_field16(eeprom, EEPROM_ANTENNA_HARDWARE_RADIO))
- rt2x00pci->button_status = BUTTON_STATUS_OFF;
- else
- rt2x00pci->button_status = BUTTON_STATUS_UNAVAILABLE;
-#endif /* CONFIG_RT2500PCI_BUTTON */
+ SET_FLAG(rt2x00pci, HARDWARE_BUTTON);
/*
* 7 - Read BBP data from EEPROM and store in private structure.
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500pci.h wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500pci.h
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500pci.h 2006-04-27 21:53:13.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500pci.h 2006-04-27 21:56:05.000000000 +0200
@@ -1137,6 +1137,11 @@ struct data_entry{
* Device specific structure.
*/
struct rt2x00_pci{
+ /*
+ * Device flags.
+ */
+ unsigned int flags;
+
#ifdef CONFIG_RT2500PCI_BUTTON
/*
* ACPI device for generation of ACPI events.
@@ -1200,8 +1205,6 @@ struct rt2x00_pci{
*/
struct ieee80211_rx_status rx_params;
- u16 atim_available;
-
/*
* EEPROM bus width.
*/
@@ -1252,7 +1255,7 @@ rt2x00pci_get_ring(struct rt2x00_pci *rt
{
u8 atim;
- atim = rt2x00pci->atim_available;
+ atim = GET_FLAG(rt2x00pci, ATIM_AVAILABLE);
/*
* Check if the rings have been allocated.
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500usb.c wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500usb.c
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 2006-04-27 21:55:14.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500usb.c 2006-04-27 21:56:05.000000000 +0200
@@ -742,10 +742,14 @@ rt2500usb_rxdone(void *data)
entry = rt2x00_get_data_entry(ring);
rxd = rt2x00usb_rxdesc_addr(entry);
+ if (GET_FLAG(entry, ENTRY_OWNER_NIC))
+ break;
+
/*
- * There has been a problem. Ignore packet.
- */
+ * There has been a problem. Ignore packet.
+ */
if (entry->urb->status) {
+ SET_FLAG(entry, ENTRY_OWNER_NIC);
usb_submit_urb(entry->urb, GFP_ATOMIC);
rt2x00_ring_index_inc(ring);
continue;
@@ -782,6 +786,7 @@ rt2500usb_rxdone(void *data)
total_rssi += rt2x00usb->rx_params.ssi;
}
+ SET_FLAG(entry, ENTRY_OWNER_NIC);
usb_submit_urb(entry->urb, GFP_ATOMIC);
rt2x00_ring_index_inc(ring);
@@ -808,6 +813,9 @@ rt2500usb_txdone(void *data)
entry = rt2x00_get_data_entry_done(ring);
txd = rt2x00usb_txdesc_addr(entry);
+ if (GET_FLAG(entry, ENTRY_OWNER_NIC))
+ break;
+
ack = rt2x00_get_field32(txd->word0, TXD_W0_ACK);
/*
@@ -861,6 +869,9 @@ rt2500usb_interrupt(struct urb *urb, str
struct rt2x00_usb *rt2x00usb =
ieee80211_dev_hw_data(entry->ring->net_dev);
+ if (!GET_FLAG(rt2x00usb, RADIO_ENABLED))
+ return;
+
if (urb->status)
return;
@@ -989,7 +1000,7 @@ rt2500usb_allocate_rings(struct rt2x00_u
return -ENOMEM;
}
- rt2x00usb->atim_available = 1;
+ SET_FLAG(rt2x00usb, ATIM_AVAILABLE);
if (rt2500usb_alloc_ring(
rt2x00usb, &rt2x00usb->ring[RING_RX], &rt2500usb_rxdone,
@@ -1049,6 +1060,7 @@ rt2500usb_init_rxring(struct rt2x00_usb
ring->entry_size + ring->desc_size,
rt2500usb_interrupt,
&entry[counter]);
+ SET_FLAG(&entry[counter], ENTRY_OWNER_NIC | ENTRY_TYPE_RX);
usb_submit_urb(entry[counter].urb, GFP_ATOMIC);
}
}
@@ -1063,6 +1075,7 @@ rt2500usb_init_txring(struct rt2x00_usb
for (counter = 0; counter < ring->stats.limit; counter++) {
entry[counter].urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
entry[counter].urb->transfer_dma = entry[counter].data_dma;
+ CLEAR_FLAGS(&entry[counter]);
}
}
@@ -1223,6 +1236,8 @@ rt2500usb_tx(struct net_device *net_dev,
struct sk_buff *skb, struct ieee80211_tx_control *control)
{
struct rt2x00_usb *rt2x00usb = ieee80211_dev_hw_data(net_dev);
+ struct usb_devive *usb_dev =
+ interface_to_usbdev(rt2x00usb->usb_intf);
struct data_ring *ring;
struct data_entry *entry;
struct txd *txd;
@@ -1247,6 +1262,7 @@ rt2500usb_tx(struct net_device *net_dev,
rt2500usb_write_tx_desc(rt2x00usb, txd, skb, control);
entry->skb = skb;
+ SET_FLAG(entry, ENTRY_OWNER_NIC);
usb_fill_bulk_urb(
entry->urb,
usb_dev,
@@ -1320,6 +1336,8 @@ rt2500usb_open(struct net_device *net_de
rt2x00_set_field16_nb(®, TXRX_CSR2_DISABLE_RX, 0);
rt2x00_register_write(rt2x00usb, TXRX_CSR2, reg);
+ SET_FLAG(rt2x00usb, RADIO_ENABLED);
+
return 0;
exit_fail:
@@ -1336,6 +1354,8 @@ rt2500usb_stop(struct net_device *net_de
int counter;
u16 reg;
+ CLEAR_FLAG(rt2x00usb, RADIO_ENABLED);
+
/*
* Cancel RX.
*/
@@ -1609,6 +1629,8 @@ rt2500usb_beacon_update(struct net_devic
struct sk_buff *skb, struct ieee80211_tx_control *control)
{
struct rt2x00_usb *rt2x00usb = ieee80211_dev_hw_data(net_dev);
+ struct usb_devive *usb_dev =
+ interface_to_usbdev(rt2x00usb->usb_intf);
struct data_entry *entry;
entry = rt2x00_get_data_entry(&rt2x00usb->ring[RING_BEACON]);
@@ -1624,6 +1646,7 @@ rt2500usb_beacon_update(struct net_devic
rt2500usb_write_tx_desc(rt2x00usb,
rt2x00usb_txdesc_addr(entry), skb, control);
+ SET_FLAG(entry, ENTRY_OWNER_NIC);
usb_fill_bulk_urb(
entry->urb,
usb_dev,
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500usb.h wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500usb.h
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2500usb.h 2006-04-27 21:55:14.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2500usb.h 2006-04-27 21:56:05.000000000 +0200
@@ -648,6 +648,13 @@ struct rxd{
*/
struct data_entry{
/*
+ * Status flag.
+ */
+ unsigned int flags;
+#define ENTRY_OWNER_NIC 0x00000001
+#define ENTRY_TYPE_RX 0x00000002
+
+ /*
* Ring we belong to.
*/
struct data_ring *ring;
@@ -717,6 +724,11 @@ rt2x00usb_txdesc_addr(struct data_entry
*/
struct rt2x00_usb{
/*
+ * Device flags.
+ */
+ unsigned int flags;
+
+ /*
* PCI device structure.
*/
struct usb_interface *usb_intf;
@@ -748,8 +760,6 @@ struct rt2x00_usb{
*/
struct ieee80211_rx_status rx_params;
- u8 atim_available;
-
/*
* Alignment.
*/
@@ -798,7 +808,7 @@ rt2x00usb_get_ring(struct rt2x00_usb *rt
{
u8 atim;
- atim = rt2x00usb->atim_available;
+ atim = GET_FLAG(rt2x00usb, ATIM_AVAILABLE);
/*
* Check if the rings have been allocated.
diff -uprN wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2x00.h wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2x00.h
--- wireless-dev-rt2x00/drivers/net/wireless/d80211/rt2x00/rt2x00.h 2006-04-27 21:52:01.000000000 +0200
+++ wireless-dev-rt2x00-patch/drivers/net/wireless/d80211/rt2x00/rt2x00.h 2006-04-27 21:56:05.000000000 +0200
@@ -93,6 +93,32 @@ static int rt2x00_debug_level = 0;
#define BEACON_ENTRIES 1
/*
+ * Flag handlers
+ */
+#define SET_FLAG(__dev, __flag) ( (__dev)->flags |= (__flag) )
+#define GET_FLAG(__dev, __flag) ( !!((__dev)->flags & (__flag)) )
+#define CLEAR_FLAG(__dev, __flag) ( (__dev)->flags &= ~(__flag) )
+#define CLEAR_FLAGS(__dev) ( (__dev)->flags = 0 )
+
+/*
+ * Device flags
+ */
+#define INTERFACE_INITIALIZED 0x00000001
+#define INTERFACE_PROMISC 0x00000002
+#define FIRMWARE_FAILED 0x00000004
+#define FIRMWARE_LOADED 0x00000008
+#define RADIO_ENABLED 0x00000010
+#define RADIO_RESUME 0x00000020
+#define ATIM_AVAILABLE 0x00000040
+#define FRAME_TYPE 0x00000080
+#define EXTERNAL_LNA 0x00000100
+#define EXTERNAL_LNA_A 0x00000200
+#define EXTERNAL_LNA_BG 0x00000400
+#define RF_SEQUENCE 0x00000800
+#define DOUBLE_ANTENNA 0x00001000
+#define HARDWARE_BUTTON 0x00002000
+
+/*
* TX result flags.
*/
enum TX_STATUS {
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2006-04-27 22:02 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-04-27 22:03 [PATCH 25/32] rt2x00: Add flag handlers Ivo van Doorn
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.