b43: Add QOS support
PATCH 1/1 b43: Add QOS support
This adds QOS support to the b43 driver.
QOS can be disabled on driver level with a module parameter for debugging purposes.
Signed-off-by Michael Buesch <[email protected]>
---
For 2.6.26
drivers/net/wireless/b43/b43.h +37 -0
@@ -96,12 +96,14 @@#define B43_MMIO_TSF_CFP_START_HIGH 0x606#define B43_MMIO_TSF_0 0x632/* core rev < 3 only */ #define B43_MMIO_TSF_1 0x634/* core rev < 3 only */ #define B43_MMIO_TSF_2 0x636/* core rev < 3 only */ #define B43_MMIO_TSF_3 0x638/* core rev < 3 only */ #define B43_MMIO_RNG 0x65A +#define B43_MMIO_IFSCTL 0x688/* Interframe space control */ +#define B43_MMIO_IFSCTL_USE_EDCF 0x0004#define B43_MMIO_POWERUP_DELAY 0x6A8/* SPROM boardflags_lo values */ #define B43_BFL_BTCOEXIST 0x0001/* implements Bluetooth coexistance */ #define B43_BFL_PACTRL 0x0002/* GPIO 9 controlling the PA */ #define B43_BFL_AIRLINEMODE 0x0004/* implements GPIO 13 radio disable indication */
@@ -618,12 +620,41 @@ struct b43_key {* keyconf is a cookie. Don't derefenrence it outside of the set_key * path, because b43 doesn't own it. */ struct ieee80211_key_conf *keyconf;u8 algorithm; }; +/* SHM offsets to the QOS data structures for the 4 different queues. */ +#define B43_QOS_PARAMS (queue) (B43_SHM_SH_EDCFQ + \ + (B43_NR_QOSPARAMS * sizeof(u16) * (queue))) +#define B43_QOS_BACKGROUND B43_QOS_PARAMS(0) +#define B43_QOS_BESTEFFORT B43_QOS_PARAMS(1) +#define B43_QOS_VIDEO B43_QOS_PARAMS(2) +#define B43_QOS_VOICE B43_QOS_PARAMS(3) + +/* QOS parameter hardware data structure offsets. */ +#define B43_NR_QOSPARAMS 22 +enum { +B43_QOSPARAM_TXOP =0 , +B43_QOSPARAM_CWMIN , +B43_QOSPARAM_CWMAX , +B43_QOSPARAM_CWCUR , +B43_QOSPARAM_AIFS , +B43_QOSPARAM_BSLOTS , +B43_QOSPARAM_REGGAP , +B43_QOSPARAM_STATUS , +}; + +/* QOS parameters for a queue. */ +struct b43_qos_params { +/* The QOS parameters */ +struct ieee80211_tx_queue_params p; +/* Does this need to get uploaded to hardware? */ +bool need_hw_update; +}; +struct b43_wldev ;/* Data structure for the WLAN parts (802.11 cores) of the b43 chip. */ struct b43_wl {/* Pointer to the active wireless device on this chip */ struct b43_wldev *current_dev;
@@ -670,12 +701,18 @@ struct b43_wl {/* The beacon we are currently using (AP or IBSS mode). * This beacon stuff is protected by the irq_lock. */ struct sk_buff *current_beacon;bool beacon0_uploaded;bool beacon1_uploaded; + +/* The current QOS parameters for the 4 queues. +* This is protected by the irq_lock. */ +struct b43_qos_params qos_params[4 ]; +/* Workqueue for updating QOS parameters in hardware. */ +struct work_struct qos_update_work; };/* In-memory representation of a cached microcode file. */ struct b43_firmware_file {const char *filename;const struct firmware *data;
drivers/net/wireless/b43/dma.c +40 -50
174 lines not on this page · raw message
drivers/net/wireless/b43/main.c +178 -2
255 lines not on this page · raw message
drivers/net/wireless/b43/xmit.c +0 -27
@@ -702,33 +702,6 @@ void b43_tx_suspend(struct b43_wldev *de/* Resume any TX operation on the device (resume the hardware queues) */ void b43_tx_resume (struct b43_wldev *dev) {b43_dma_tx_resume (dev); } - -#if 0 -static void upload_qos_parms (struct b43_wldev *dev, -const u16 * parms,u16 offset) -{ -int i; - -for (i =0 ; i <B43_NR_QOSPARMS ; i++) { -b43_shm_write16 (dev,B43_SHM_SHARED , - offset + (i *2 ), parms[i]); - } -} -#endif - -/* Initialize the QoS parameters */ -void b43_qos_init (struct b43_wldev *dev) -{ -/* FIXME: This function must probably be called from the mac80211 -* config callback. */ -return ; - -b43_hf_write (dev,b43_hf_read (dev) |B43_HF_EDCF ); -//FIXME kill magic -b43_write16 (dev,0x688 ,b43_read16 (dev,0x688 ) |0x4 ); - -/*TODO: We might need some stack support here to get the values. */ -}
drivers/net/wireless/b43/xmit.h +0 -12
@@ -299,24 +299,12 @@ void b43_handle_txstatus(struct b43_wldevoid b43_handle_hwtxstatus (struct b43_wldev *dev,const struct b43_hwtxstatus *hw);void b43_tx_suspend (struct b43_wldev *dev);void b43_tx_resume (struct b43_wldev *dev); -#define B43_NR_QOSPARMS 22 -enum { -B43_QOSPARM_TXOP =0 , -B43_QOSPARM_CWMIN , -B43_QOSPARM_CWMAX , -B43_QOSPARM_CWCUR , -B43_QOSPARM_AIFS , -B43_QOSPARM_BSLOTS , -B43_QOSPARM_REGGAP , -B43_QOSPARM_STATUS , -}; -void b43_qos_init (struct b43_wldev *dev);/* Helper functions for converting the key-table index from "firmware-format" * to "raw-format" and back. The firmware API changed for this at some revision. * We need to account for that here. */ static inline int b43_new_kidx_api (struct b43_wldev *dev) {
drivers/net/wireless/b43/dma.h +3 -0
@@ -242,12 +242,15 @@ struct b43_dmaring {/* Boolean. Is this a TX ring? */ bool tx;/* The type of DMA engine used. */ enum b43_dmatype type;/* Boolean. Is this ring stopped at ieee80211 level? */ bool stopped; +/* The QOS priority assigned to this ring. Only used for TX rings. +* This is the mac80211 "queue" value. */ +u8 queue_prio;/* Lock, only used for TX. */ spinlock_t lock;struct b43_wldev *dev;#ifdef CONFIG_B43_DEBUG /* Maximum number of used slots. */ int max_used_slots;
drivers/net/wireless/b43/main.h +4 -0
@@ -35,12 +35,16 @@#define P4D_BYT3S (magic, nr_bytes) u8 __p4dding##magic[nr_bytes]#define P4D_BYTES (line, nr_bytes) P4D_BYT3S(line, nr_bytes)/* Magic helper macro to pad structures. Ignore those above. It's magic. */ #define PAD_BYTES (nr_bytes) P4D_BYTES( __LINE__ , (nr_bytes)) + +extern int b43_modparam_qos; + +/* Lightweight function to convert a frequency (in Mhz) to a channel number. */ static inline u8 b43_freq_to_channel_5ghz (int freq) {return ((freq -5000 ) /5 ); }static inline u8 b43_freq_to_channel_2ghz (int freq)