u16 t_off_to_tx_on;
        u16 t_frame;
        u16 t_p_ack;
-       /* short interframe spacing time */
-       u16 t_sifs;
-       /* long interframe spacing time */
-       u16 t_lifs;
        /* completion timeout for tx in msecs */
        u16 t_tx_timeout;
        int rssi_base_val;
 
        enable_irq(lp->spi->irq);
 
-       if (lp->max_frame_retries <= 0) {
-               /* Interfame spacing time, which is phy depend.
-                * TODO
-                * Move this handling in MAC 802.15.4 layer.
-                * This is currently a workaround to avoid fragmenation issues.
-                */
-               if (skb->len > 18)
-                       udelay(lp->data->t_lifs);
-               else
-                       udelay(lp->data->t_sifs);
-       }
-
-       ieee802154_xmit_complete(lp->hw, skb, false);
+       if (lp->max_frame_retries <= 0)
+               ieee802154_xmit_complete(lp->hw, skb, true);
+       else
+               ieee802154_xmit_complete(lp->hw, skb, false);
 }
 
 static void
        if (rc < 0)
                return rc;
 
+       /* This sets the symbol_duration according frequency on the 212.
+        * TODO move this handling while set channel and page in cfg802154.
+        * We can do that, this timings are according 802.15.4 standard.
+        * If we do that in cfg802154, this is a more generic calculation.
+        *
+        * This should also protected from ifs_timer. Means cancel timer and
+        * init with a new value. For now, this is okay.
+        */
+       if (channel == 0) {
+               if (page == 0) {
+                       /* SUB:0 and BPSK:0 -> BPSK-20 */
+                       lp->hw->phy->symbol_duration = 50;
+               } else {
+                       /* SUB:1 and BPSK:0 -> BPSK-40 */
+                       lp->hw->phy->symbol_duration = 25;
+               }
+       } else {
+               if (page == 0)
+                       /* SUB:0 and BPSK:1 -> BPSK-20 */
+                       lp->hw->phy->symbol_duration = 40;
+               else
+                       /* SUB:1 and BPSK:1 -> BPSK-20 */
+                       lp->hw->phy->symbol_duration = 16;
+       }
+
+       lp->hw->phy->lifs_period = IEEE802154_LIFS_PERIOD *
+                                  lp->hw->phy->symbol_duration;
+       lp->hw->phy->sifs_period = IEEE802154_SIFS_PERIOD *
+                                  lp->hw->phy->symbol_duration;
+
        return at86rf230_write_subreg(lp, SR_CHANNEL, channel);
 }
 
        .t_off_to_tx_on = 80,
        .t_frame = 4096,
        .t_p_ack = 545,
-       .t_sifs = 192,
-       .t_lifs = 640,
        .t_tx_timeout = 2000,
        .rssi_base_val = -91,
        .set_channel = at86rf23x_set_channel,
        .t_off_to_tx_on = 110,
        .t_frame = 4096,
        .t_p_ack = 545,
-       .t_sifs = 192,
-       .t_lifs = 640,
        .t_tx_timeout = 2000,
        .rssi_base_val = -91,
        .set_channel = at86rf23x_set_channel,
        .t_off_to_tx_on = 200,
        .t_frame = 4096,
        .t_p_ack = 545,
-       .t_sifs = 192,
-       .t_lifs = 640,
        .t_tx_timeout = 2000,
        .rssi_base_val = -100,
        .set_channel = at86rf212_set_channel,
                lp->data = &at86rf231_data;
                lp->hw->phy->channels_supported[0] = 0x7FFF800;
                lp->hw->phy->current_channel = 11;
+               lp->hw->phy->symbol_duration = 16;
                break;
        case 7:
                chip = "at86rf212";
                        lp->hw->phy->channels_supported[0] = 0x00007FF;
                        lp->hw->phy->channels_supported[2] = 0x00007FF;
                        lp->hw->phy->current_channel = 5;
+                       lp->hw->phy->symbol_duration = 25;
                } else {
                        rc = -ENOTSUPP;
                }
                lp->data = &at86rf233_data;
                lp->hw->phy->channels_supported[0] = 0x7FFF800;
                lp->hw->phy->current_channel = 13;
+               lp->hw->phy->symbol_duration = 16;
                break;
        default:
                chip = "unkown";