rt2x00: Add flag handlers
Subsystems (3)
PATCH 25/32 rt2x00: Add flag handlers
From: Ivo van Doorn <[email protected]>
Add flag handlers to set the state and capabilities of the driver.
Signed-off-by Ivo van Doorn <[email protected]>
drivers/net/wireless/d80211/rt2x00/rt2400pci.c +6 -7
@@ -1099,7 +1099,7 @@ rt2400pci_allocate_rings(struct rt2x00_preturn -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_dert2x00_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_destruct 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.
drivers/net/wireless/d80211/rt2x00/rt2400pci.h +6 -3
@@ -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.
drivers/net/wireless/d80211/rt2x00/rt2500pci.c +7 -8
@@ -1180,7 +1180,7 @@ rt2500pci_allocate_rings(struct rt2x00_preturn -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_dert2x00_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_destruct 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.
drivers/net/wireless/d80211/rt2x00/rt2500pci.h +6 -3
@@ -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.
drivers/net/wireless/d80211/rt2x00/rt2500usb.c +26 -3
@@ -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, strstruct 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_ureturn -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_usbfor (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_dert2x00_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_deint 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_devicrt2500usb_write_tx_desc (rt2x00usb,rt2x00usb_txdesc_addr (entry), skb, control); +SET_FLAG (entry,ENTRY_OWNER_NIC ); usb_fill_bulk_urb( entry->urb, usb_dev,
drivers/net/wireless/d80211/rt2x00/rt2500usb.h +13 -3
@@ -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.
drivers/net/wireless/d80211/rt2x00/rt2x00.h +26 -0
@@ -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 {