return 0;
 }
 
-#define P54_SET_QUEUE(queue, ai_fs, cw_min, cw_max, burst)     \
+#define P54_SET_QUEUE(queue, ai_fs, cw_min, cw_max, _txop)     \
 do {                                                           \
        queue.aifs = cpu_to_le16(ai_fs);                        \
        queue.cwmin = cpu_to_le16(cw_min);                      \
        queue.cwmax = cpu_to_le16(cw_max);                      \
-       queue.txop = (burst == 0) ?                             \
-               0 : cpu_to_le16((burst * 100) / 32 + 1);        \
+       queue.txop = cpu_to_le16(_txop);                        \
 } while(0)
 
 static void p54_init_vdcf(struct ieee80211_hw *dev)
 
        vdcf = (struct p54_tx_control_vdcf *) hdr->data;
 
-       P54_SET_QUEUE(vdcf->queue[0], 0x0002, 0x0003, 0x0007, 0x000f);
-       P54_SET_QUEUE(vdcf->queue[1], 0x0002, 0x0007, 0x000f, 0x001e);
-       P54_SET_QUEUE(vdcf->queue[2], 0x0002, 0x000f, 0x03ff, 0x0014);
-       P54_SET_QUEUE(vdcf->queue[3], 0x0007, 0x000f, 0x03ff, 0x0000);
+       /*
+        * FIXME: The default values in the spec (IEEE 802.11
+        *        7.3.2.19 Table 37) are 47, 94, 0, 0, why use
+        *        47, 94, 63, 0 here? Also, the default AIFS
+        *        values (second parameter) are 2, 2, 3, 7...
+        */
+       P54_SET_QUEUE(vdcf->queue[0], 0x0002, 0x0003, 0x0007, 47);
+       P54_SET_QUEUE(vdcf->queue[1], 0x0002, 0x0007, 0x000f, 94);
+       P54_SET_QUEUE(vdcf->queue[2], 0x0002, 0x000f, 0x03ff, 63);
+       P54_SET_QUEUE(vdcf->queue[3], 0x0007, 0x000f, 0x03ff, 0);
 }
 
 static void p54_set_vdcf(struct ieee80211_hw *dev)
 
        if ((params) && !((queue < 0) || (queue > 4))) {
                P54_SET_QUEUE(vdcf->queue[queue], params->aifs,
-                       params->cw_min, params->cw_max, params->burst_time);
+                       params->cw_min, params->cw_max, params->txop);
        } else
                return -EINVAL;
 
 
  * struct ieee80211_tx_queue_params - transmit queue configuration
  *
  * The information provided in this structure is required for QoS
- * transmit queue configuration.
+ * transmit queue configuration. Cf. IEEE 802.11 7.3.2.29.
  *
  * @aifs: arbitration interface space [0..255, -1: use default]
  * @cw_min: minimum contention window [will be a value of the form
  *     2^n-1 in the range 1..1023; 0: use default]
  * @cw_max: maximum contention window [like @cw_min]
- * @burst_time: maximum burst time in units of 0.1ms, 0 meaning disabled
+ * @txop: maximum burst time in units of 32 usecs, 0 meaning disabled
  */
 struct ieee80211_tx_queue_params {
-       int aifs;
-       int cw_min;
-       int cw_max;
-       int burst_time;
+       s16 aifs;
+       u16 cw_min;
+       u16 cw_max;
+       u16 txop;
 };
 
 /**
 
                params.aifs = pos[0] & 0x0f;
                params.cw_max = ecw2cw((pos[1] & 0xf0) >> 4);
                params.cw_min = ecw2cw(pos[1] & 0x0f);
-               /* TXOP is in units of 32 usec; burst_time in 0.1 ms */
-               params.burst_time = (pos[2] | (pos[3] << 8)) * 32 / 100;
+               params.txop = pos[2] | (pos[3] << 8);
+#ifdef CONFIG_MAC80211_DEBUG
                printk(KERN_DEBUG "%s: WMM queue=%d aci=%d acm=%d aifs=%d "
-                      "cWmin=%d cWmax=%d burst=%d\n",
+                      "cWmin=%d cWmax=%d txop=%d\n",
                       dev->name, queue, aci, acm, params.aifs, params.cw_min,
-                      params.cw_max, params.burst_time);
+                      params.cw_max, params.txop);
+#endif
                /* TODO: handle ACM (block TX, fallback to next lowest allowed
                 * AC for now) */
                if (local->ops->conf_tx(local_to_hw(local), queue, ¶ms)) {
                        qparam.cw_min = 15;
 
                qparam.cw_max = 1023;
-               qparam.burst_time = 0;
+               qparam.txop = 0;
 
                for (i = IEEE80211_TX_QUEUE_DATA0; i < NUM_TX_DATA_QUEUES; i++)
                        local->ops->conf_tx(local_to_hw(local),