All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ivo van Doorn <ivdoorn@gmail.com>
To: netdev@vger.kernel.org
Cc: rt2x00-devel@lfcorreia.dyndns.org
Subject: [PATCH 25/32] rt2x00: Add flag handlers
Date: Fri, 28 Apr 2006 00:03:16 +0200	[thread overview]
Message-ID: <200604280003.16688.IvDoorn@gmail.com> (raw)

[-- 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(&reg, 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(&reg, 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(&reg, 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 --]

                 reply	other threads:[~2006-04-27 22:02 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200604280003.16688.IvDoorn@gmail.com \
    --to=ivdoorn@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=rt2x00-devel@lfcorreia.dyndns.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.