at86rf230: remove interframe spacing time workaround
[deliverable/linux.git] / drivers / net / ieee802154 / at86rf230.c
index 46e50295710a31479d1fbcedba05515967a14d46..7278e1838c570afa74372af42fc8b28043f4a073 100644 (file)
@@ -46,10 +46,6 @@ struct at86rf2xx_chip_data {
        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;
@@ -719,19 +715,10 @@ at86rf230_tx_complete(void *context)
 
        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
@@ -1038,6 +1025,36 @@ at86rf212_set_channel(struct at86rf230_local *lp, u8 page, u8 channel)
        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);
 }
 
@@ -1245,8 +1262,6 @@ static struct at86rf2xx_chip_data at86rf233_data = {
        .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,
@@ -1261,8 +1276,6 @@ static struct at86rf2xx_chip_data at86rf231_data = {
        .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,
@@ -1277,8 +1290,6 @@ static struct at86rf2xx_chip_data at86rf212_data = {
        .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,
@@ -1414,6 +1425,7 @@ at86rf230_detect_device(struct at86rf230_local *lp)
                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";
@@ -1423,6 +1435,7 @@ at86rf230_detect_device(struct at86rf230_local *lp)
                        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;
                }
@@ -1432,6 +1445,7 @@ at86rf230_detect_device(struct at86rf230_local *lp)
                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";
This page took 0.025851 seconds and 5 git commands to generate.