memset(¶ms, 0, sizeof(params));
 
-       if (!local->ops->conf_tx)
-               return;
-
        local->wmm_acm = 0;
        for (; left >= 4; left -= 4, pos += 4) {
                int aci = (pos[0] >> 5) & 0x03;
                int queue;
 
                switch (aci) {
-               case 1:
+               case 1: /* AC_BK */
                        queue = 3;
                        if (acm)
-                               local->wmm_acm |= BIT(0) | BIT(3);
+                               local->wmm_acm |= BIT(1) | BIT(2); /* BK/- */
                        break;
-               case 2:
+               case 2: /* AC_VI */
                        queue = 1;
                        if (acm)
-                               local->wmm_acm |= BIT(4) | BIT(5);
+                               local->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */
                        break;
-               case 3:
+               case 3: /* AC_VO */
                        queue = 0;
                        if (acm)
-                               local->wmm_acm |= BIT(6) | BIT(7);
+                               local->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */
                        break;
-               case 0:
+               case 0: /* AC_BE */
                default:
                        queue = 2;
                        if (acm)
-                               local->wmm_acm |= BIT(1) | BIT(2);
+                               local->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */
                        break;
                }
 
                       local->mdev->name, queue, aci, acm, params.aifs, params.cw_min,
                       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)) {
+               if (local->ops->conf_tx &&
+                   local->ops->conf_tx(local_to_hw(local), queue, ¶ms)) {
                        printk(KERN_DEBUG "%s: failed to set TX queue "
                               "parameters for queue %d\n", local->mdev->name, queue);
                }
 
        /* in case we are a client verify acm is not set for this ac */
        while (unlikely(local->wmm_acm & BIT(skb->priority))) {
                if (wme_downgrade_ac(skb)) {
-                       /* The old code would drop the packet in this
-                        * case.
+                       /*
+                        * This should not really happen. The AP has marked all
+                        * lower ACs to require admission control which is not
+                        * a reasonable configuration. Allow the frame to be
+                        * transmitted using AC_BK as a workaround.
                         */
-                       return 0;
+                       break;
                }
        }