2007-09-26 04:57:13 +04:00
/*
2008-02-03 17:42:53 +03:00
Copyright ( C ) 2004 - 2008 rt2x00 SourceForge Project
2007-09-26 04:57:13 +04:00
< http : //rt2x00.serialmonkey.com>
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the
Free Software Foundation , Inc . ,
59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*/
/*
Module : rt2x00usb
Abstract : Data structures for the rt2x00usb module .
*/
# ifndef RT2X00USB_H
# define RT2X00USB_H
2008-06-16 21:57:11 +04:00
# define to_usb_device_intf(d) \
( { \
struct usb_interface * intf = to_usb_interface ( d ) ; \
interface_to_usbdev ( intf ) ; \
} )
2007-09-26 04:57:13 +04:00
/*
* This variable should be used with the
* usb_driver structure initialization .
*/
# define USB_DEVICE_DATA(__ops) .driver_info = (kernel_ulong_t)(__ops)
/*
* Register defines .
* Some registers require multiple attempts before success ,
* in those cases REGISTER_BUSY_COUNT attempts should be
* taken with a REGISTER_BUSY_DELAY interval .
* For USB vendor requests we need to pass a timeout
* time in ms , for this we use the REGISTER_TIMEOUT ,
* however when loading firmware a higher value is
* required . In that case we use the REGISTER_TIMEOUT_FIRMWARE .
*/
# define REGISTER_BUSY_COUNT 5
# define REGISTER_BUSY_DELAY 100
2007-09-25 22:54:20 +04:00
# define REGISTER_TIMEOUT 500
2007-09-26 04:57:13 +04:00
# define REGISTER_TIMEOUT_FIRMWARE 1000
2008-04-21 21:01:58 +04:00
/**
* REGISTER_TIMEOUT16 - Determine the timeout for 16 bit register access
* @ __datalen : Data length
*/
# define REGISTER_TIMEOUT16(__datalen) \
( REGISTER_TIMEOUT * ( ( __datalen ) / sizeof ( u16 ) ) )
/**
* REGISTER_TIMEOUT32 - Determine the timeout for 32 bit register access
* @ __datalen : Data length
*/
# define REGISTER_TIMEOUT32(__datalen) \
( REGISTER_TIMEOUT * ( ( __datalen ) / sizeof ( u32 ) ) )
2007-09-26 04:57:13 +04:00
/*
* Cache size
*/
# define CSR_CACHE_SIZE 8
# define CSR_CACHE_SIZE_FIRMWARE 64
/*
* USB request types .
*/
# define USB_VENDOR_REQUEST ( USB_TYPE_VENDOR | USB_RECIP_DEVICE )
# define USB_VENDOR_REQUEST_IN ( USB_DIR_IN | USB_VENDOR_REQUEST )
# define USB_VENDOR_REQUEST_OUT ( USB_DIR_OUT | USB_VENDOR_REQUEST )
2008-02-03 17:54:11 +03:00
/**
* enum rt2x00usb_vendor_request : USB vendor commands .
2007-09-26 04:57:13 +04:00
*/
2008-02-03 17:54:11 +03:00
enum rt2x00usb_vendor_request {
USB_DEVICE_MODE = 1 ,
USB_SINGLE_WRITE = 2 ,
USB_SINGLE_READ = 3 ,
USB_MULTI_WRITE = 6 ,
USB_MULTI_READ = 7 ,
USB_EEPROM_WRITE = 8 ,
USB_EEPROM_READ = 9 ,
USB_LED_CONTROL = 10 , /* RT73USB */
USB_RX_CONTROL = 12 ,
} ;
/**
* enum rt2x00usb_mode_offset : Device modes offset .
*/
enum rt2x00usb_mode_offset {
USB_MODE_RESET = 1 ,
USB_MODE_UNPLUG = 2 ,
USB_MODE_FUNCTION = 3 ,
USB_MODE_TEST = 4 ,
USB_MODE_SLEEP = 7 , /* RT73USB */
USB_MODE_FIRMWARE = 8 , /* RT73USB */
USB_MODE_WAKEUP = 9 , /* RT73USB */
} ;
/**
* rt2x00usb_vendor_request - Send register command to device
* @ rt2x00dev : Pointer to & struct rt2x00_dev
* @ request : USB vendor command ( See & enum rt2x00usb_vendor_request )
* @ requesttype : Request type & USB_VENDOR_REQUEST_ *
* @ offset : Register offset to perform action on
* @ value : Value to write to device
* @ buffer : Buffer where information will be read / written to by device
* @ buffer_length : Size of & buffer
* @ timeout : Operation timeout
*
2007-09-26 04:57:13 +04:00
* This is the main function to communicate with the device ,
2008-02-03 17:54:11 +03:00
* the & buffer argument _must_ either be NULL or point to
2007-09-26 04:57:13 +04:00
* a buffer allocated by kmalloc . Failure to do so can lead
* to unexpected behavior depending on the architecture .
*/
2007-10-27 15:41:25 +04:00
int rt2x00usb_vendor_request ( struct rt2x00_dev * rt2x00dev ,
2007-09-26 04:57:13 +04:00
const u8 request , const u8 requesttype ,
const u16 offset , const u16 value ,
void * buffer , const u16 buffer_length ,
2007-09-25 22:54:20 +04:00
const int timeout ) ;
2007-09-26 04:57:13 +04:00
2008-02-03 17:54:11 +03:00
/**
* rt2x00usb_vendor_request_buff - Send register command to device ( buffered )
* @ rt2x00dev : Pointer to & struct rt2x00_dev
* @ request : USB vendor command ( See & enum rt2x00usb_vendor_request )
* @ requesttype : Request type & USB_VENDOR_REQUEST_ *
* @ offset : Register offset to perform action on
* @ buffer : Buffer where information will be read / written to by device
* @ buffer_length : Size of & buffer
* @ timeout : Operation timeout
*
2007-09-26 04:57:13 +04:00
* This function will use a previously with kmalloc allocated cache
* to communicate with the device . The contents of the buffer pointer
* will be copied to this cache when writing , or read from the cache
* when reading .
2008-02-03 17:54:11 +03:00
* Buffers send to & rt2x00usb_vendor_request _must_ be allocated with
2007-09-26 04:57:13 +04:00
* kmalloc . Hence the reason for using a previously allocated cache
* which has been allocated properly .
*/
2007-10-27 15:41:25 +04:00
int rt2x00usb_vendor_request_buff ( struct rt2x00_dev * rt2x00dev ,
2007-09-26 04:57:13 +04:00
const u8 request , const u8 requesttype ,
const u16 offset , void * buffer ,
2007-09-25 22:54:20 +04:00
const u16 buffer_length , const int timeout ) ;
2007-09-26 04:57:13 +04:00
2008-02-03 17:54:11 +03:00
/**
* rt2x00usb_vendor_request_buff - Send register command to device ( buffered )
* @ rt2x00dev : Pointer to & struct rt2x00_dev
* @ request : USB vendor command ( See & enum rt2x00usb_vendor_request )
* @ requesttype : Request type & USB_VENDOR_REQUEST_ *
* @ offset : Register offset to perform action on
* @ buffer : Buffer where information will be read / written to by device
* @ buffer_length : Size of & buffer
* @ timeout : Operation timeout
*
* A version of & rt2x00usb_vendor_request_buff which must be called
* if the usb_cache_mutex is already held .
*/
2007-10-27 15:43:29 +04:00
int rt2x00usb_vendor_req_buff_lock ( struct rt2x00_dev * rt2x00dev ,
const u8 request , const u8 requesttype ,
const u16 offset , void * buffer ,
const u16 buffer_length , const int timeout ) ;
2008-02-03 17:54:11 +03:00
/**
* rt2x00usb_vendor_request_sw - Send single register command to device
* @ rt2x00dev : Pointer to & struct rt2x00_dev
* @ request : USB vendor command ( See & enum rt2x00usb_vendor_request )
* @ offset : Register offset to perform action on
* @ value : Value to write to device
* @ timeout : Operation timeout
*
2007-09-26 04:57:13 +04:00
* Simple wrapper around rt2x00usb_vendor_request to write a single
* command to the device . Since we don ' t use the buffer argument we
* don ' t have to worry about kmalloc here .
*/
2007-10-27 15:41:25 +04:00
static inline int rt2x00usb_vendor_request_sw ( struct rt2x00_dev * rt2x00dev ,
2007-09-26 04:57:13 +04:00
const u8 request ,
const u16 offset ,
const u16 value ,
2007-09-25 22:54:20 +04:00
const int timeout )
2007-09-26 04:57:13 +04:00
{
return rt2x00usb_vendor_request ( rt2x00dev , request ,
USB_VENDOR_REQUEST_OUT , offset ,
value , NULL , 0 , timeout ) ;
}
2008-02-03 17:54:11 +03:00
/**
* rt2x00usb_eeprom_read - Read eeprom from device
* @ rt2x00dev : Pointer to & struct rt2x00_dev
* @ eeprom : Pointer to eeprom array to store the information in
* @ length : Number of bytes to read from the eeprom
*
2007-09-26 04:57:13 +04:00
* Simple wrapper around rt2x00usb_vendor_request to read the eeprom
* from the device . Note that the eeprom argument _must_ be allocated using
* kmalloc for correct handling inside the kernel USB layer .
*/
2007-10-27 15:41:25 +04:00
static inline int rt2x00usb_eeprom_read ( struct rt2x00_dev * rt2x00dev ,
2008-04-21 21:02:17 +04:00
__le16 * eeprom , const u16 length )
2007-09-26 04:57:13 +04:00
{
return rt2x00usb_vendor_request ( rt2x00dev , USB_EEPROM_READ ,
2008-02-03 17:54:11 +03:00
USB_VENDOR_REQUEST_IN , 0 , 0 ,
2008-04-21 21:02:17 +04:00
eeprom , length ,
REGISTER_TIMEOUT16 ( length ) ) ;
2007-09-26 04:57:13 +04:00
}
/*
* Radio handlers
*/
void rt2x00usb_disable_radio ( struct rt2x00_dev * rt2x00dev ) ;
2008-06-07 00:50:28 +04:00
/**
* rt2x00usb_write_tx_data - Initialize URB for TX operation
* @ entry : The entry where the frame is located
*
* This function will initialize the URB and skb descriptor
* to prepare the entry for the actual TX operation .
2007-09-26 04:57:13 +04:00
*/
2008-06-07 00:50:28 +04:00
int rt2x00usb_write_tx_data ( struct queue_entry * entry ) ;
2007-09-26 04:57:13 +04:00
2008-02-06 00:42:23 +03:00
/**
2008-05-10 15:46:03 +04:00
* struct queue_entry_priv_usb : Per entry USB specific information
2008-02-06 00:42:23 +03:00
*
* @ urb : Urb structure used for device communication .
*/
2008-05-10 15:46:03 +04:00
struct queue_entry_priv_usb {
2008-02-06 00:42:23 +03:00
struct urb * urb ;
} ;
/**
2008-05-10 15:46:03 +04:00
* struct queue_entry_priv_usb_bcn : Per TX entry USB specific information
2008-02-06 00:42:23 +03:00
*
2008-05-10 15:46:03 +04:00
* The first section should match & struct queue_entry_priv_usb exactly .
2008-02-06 00:42:23 +03:00
* rt2500usb can use this structure to send a guardian byte when working
* with beacons .
*
* @ urb : Urb structure used for device communication .
* @ guardian_data : Set to 0 , used for sending the guardian data .
* @ guardian_urb : Urb structure used to send the guardian data .
*/
struct queue_entry_priv_usb_bcn {
struct urb * urb ;
unsigned int guardian_data ;
struct urb * guardian_urb ;
} ;
2008-06-07 00:47:39 +04:00
/**
* rt2x00usb_kick_tx_queue - Kick data queue
* @ rt2x00dev : Pointer to & struct rt2x00_dev
* @ qid : Data queue to kick
*
* This will walk through all entries of the queue and push all pending
* frames to the hardware as a single burst .
*/
void rt2x00usb_kick_tx_queue ( struct rt2x00_dev * rt2x00dev ,
const enum data_queue_qid qid ) ;
2007-09-26 04:57:13 +04:00
/*
* Device initialization handlers .
*/
2008-01-07 01:41:45 +03:00
void rt2x00usb_init_rxentry ( struct rt2x00_dev * rt2x00dev ,
2008-02-06 00:42:23 +03:00
struct queue_entry * entry ) ;
2008-01-07 01:41:45 +03:00
void rt2x00usb_init_txentry ( struct rt2x00_dev * rt2x00dev ,
2008-02-06 00:42:23 +03:00
struct queue_entry * entry ) ;
2007-09-26 04:57:13 +04:00
int rt2x00usb_initialize ( struct rt2x00_dev * rt2x00dev ) ;
void rt2x00usb_uninitialize ( struct rt2x00_dev * rt2x00dev ) ;
/*
* USB driver handlers .
*/
int rt2x00usb_probe ( struct usb_interface * usb_intf ,
const struct usb_device_id * id ) ;
void rt2x00usb_disconnect ( struct usb_interface * usb_intf ) ;
# ifdef CONFIG_PM
int rt2x00usb_suspend ( struct usb_interface * usb_intf , pm_message_t state ) ;
int rt2x00usb_resume ( struct usb_interface * usb_intf ) ;
# else
# define rt2x00usb_suspend NULL
# define rt2x00usb_resume NULL
# endif /* CONFIG_PM */
# endif /* RT2X00USB_H */