OSDN Git Service

Stefan Schmidt says:
[tomoyo/tomoyo-test1.git] / drivers / net / ieee802154 / at86rf230.c
index 549d04b..15f283b 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/skbuff.h>
 #include <linux/of_gpio.h>
 #include <linux/ieee802154.h>
-#include <linux/debugfs.h>
 
 #include <net/mac802154.h>
 #include <net/cfg802154.h>
@@ -72,19 +71,11 @@ struct at86rf230_state_change {
        void (*complete)(void *context);
        u8 from_state;
        u8 to_state;
+       int trac;
 
        bool free;
 };
 
-struct at86rf230_trac {
-       u64 success;
-       u64 success_data_pending;
-       u64 success_wait_for_ack;
-       u64 channel_access_failure;
-       u64 no_ack;
-       u64 invalid;
-};
-
 struct at86rf230_local {
        struct spi_device *spi;
 
@@ -104,8 +95,6 @@ struct at86rf230_local {
        u8 tx_retry;
        struct sk_buff *tx_skb;
        struct at86rf230_state_change tx;
-
-       struct at86rf230_trac trac;
 };
 
 #define AT86RF2XX_NUMREGS 0x3F
@@ -346,8 +335,7 @@ at86rf230_async_error_recover_complete(void *context)
 
        if (lp->was_tx) {
                lp->was_tx = 0;
-               dev_kfree_skb_any(lp->tx_skb);
-               ieee802154_wake_queue(lp->hw);
+               ieee802154_xmit_hw_error(lp->hw, lp->tx_skb);
        }
 }
 
@@ -653,7 +641,11 @@ at86rf230_tx_complete(void *context)
        struct at86rf230_state_change *ctx = context;
        struct at86rf230_local *lp = ctx->lp;
 
-       ieee802154_xmit_complete(lp->hw, lp->tx_skb, false);
+       if (ctx->trac == IEEE802154_SUCCESS)
+               ieee802154_xmit_complete(lp->hw, lp->tx_skb, false);
+       else
+               ieee802154_xmit_error(lp->hw, lp->tx_skb, ctx->trac);
+
        kfree(ctx);
 }
 
@@ -672,30 +664,21 @@ at86rf230_tx_trac_check(void *context)
 {
        struct at86rf230_state_change *ctx = context;
        struct at86rf230_local *lp = ctx->lp;
+       u8 trac = TRAC_MASK(ctx->buf[1]);
 
-       if (IS_ENABLED(CONFIG_IEEE802154_AT86RF230_DEBUGFS)) {
-               u8 trac = TRAC_MASK(ctx->buf[1]);
-
-               switch (trac) {
-               case TRAC_SUCCESS:
-                       lp->trac.success++;
-                       break;
-               case TRAC_SUCCESS_DATA_PENDING:
-                       lp->trac.success_data_pending++;
-                       break;
-               case TRAC_CHANNEL_ACCESS_FAILURE:
-                       lp->trac.channel_access_failure++;
-                       break;
-               case TRAC_NO_ACK:
-                       lp->trac.no_ack++;
-                       break;
-               case TRAC_INVALID:
-                       lp->trac.invalid++;
-                       break;
-               default:
-                       WARN_ONCE(1, "received tx trac status %d\n", trac);
-                       break;
-               }
+       switch (trac) {
+       case TRAC_SUCCESS:
+       case TRAC_SUCCESS_DATA_PENDING:
+               ctx->trac = IEEE802154_SUCCESS;
+               break;
+       case TRAC_CHANNEL_ACCESS_FAILURE:
+               ctx->trac = IEEE802154_CHANNEL_ACCESS_FAILURE;
+               break;
+       case TRAC_NO_ACK:
+               ctx->trac = IEEE802154_NO_ACK;
+               break;
+       default:
+               ctx->trac = IEEE802154_SYSTEM_ERROR;
        }
 
        at86rf230_async_state_change(lp, ctx, STATE_TX_ON, at86rf230_tx_on);
@@ -737,25 +720,6 @@ at86rf230_rx_trac_check(void *context)
        u8 *buf = ctx->buf;
        int rc;
 
-       if (IS_ENABLED(CONFIG_IEEE802154_AT86RF230_DEBUGFS)) {
-               u8 trac = TRAC_MASK(buf[1]);
-
-               switch (trac) {
-               case TRAC_SUCCESS:
-                       lp->trac.success++;
-                       break;
-               case TRAC_SUCCESS_WAIT_FOR_ACK:
-                       lp->trac.success_wait_for_ack++;
-                       break;
-               case TRAC_INVALID:
-                       lp->trac.invalid++;
-                       break;
-               default:
-                       WARN_ONCE(1, "received rx trac status %d\n", trac);
-                       break;
-               }
-       }
-
        buf[0] = CMD_FB;
        ctx->trx.len = AT86RF2XX_MAX_BUF;
        ctx->msg.complete = at86rf230_rx_read_frame_complete;
@@ -951,10 +915,6 @@ at86rf230_start(struct ieee802154_hw *hw)
 {
        struct at86rf230_local *lp = hw->priv;
 
-       /* reset trac stats on start */
-       if (IS_ENABLED(CONFIG_IEEE802154_AT86RF230_DEBUGFS))
-               memset(&lp->trac, 0, sizeof(struct at86rf230_trac));
-
        at86rf230_awake(lp);
        enable_irq(lp->spi->irq);
 
@@ -1064,36 +1024,6 @@ 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 -> OQPSK-100/200/400 */
-                       lp->hw->phy->symbol_duration = 40;
-               else
-                       /* SUB:1 and BPSK:1 -> OQPSK-250/500/1000 */
-                       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);
 }
 
@@ -1569,7 +1499,6 @@ at86rf230_detect_device(struct at86rf230_local *lp)
                lp->data = &at86rf231_data;
                lp->hw->phy->supported.channels[0] = 0x7FFF800;
                lp->hw->phy->current_channel = 11;
-               lp->hw->phy->symbol_duration = 16;
                lp->hw->phy->supported.tx_powers = at86rf231_powers;
                lp->hw->phy->supported.tx_powers_size = ARRAY_SIZE(at86rf231_powers);
                lp->hw->phy->supported.cca_ed_levels = at86rf231_ed_levels;
@@ -1582,7 +1511,6 @@ at86rf230_detect_device(struct at86rf230_local *lp)
                lp->hw->phy->supported.channels[0] = 0x00007FF;
                lp->hw->phy->supported.channels[2] = 0x00007FF;
                lp->hw->phy->current_channel = 5;
-               lp->hw->phy->symbol_duration = 25;
                lp->hw->phy->supported.lbt = NL802154_SUPPORTED_BOOL_BOTH;
                lp->hw->phy->supported.tx_powers = at86rf212_powers;
                lp->hw->phy->supported.tx_powers_size = ARRAY_SIZE(at86rf212_powers);
@@ -1594,7 +1522,6 @@ at86rf230_detect_device(struct at86rf230_local *lp)
                lp->data = &at86rf233_data;
                lp->hw->phy->supported.channels[0] = 0x7FFF800;
                lp->hw->phy->current_channel = 13;
-               lp->hw->phy->symbol_duration = 16;
                lp->hw->phy->supported.tx_powers = at86rf233_powers;
                lp->hw->phy->supported.tx_powers_size = ARRAY_SIZE(at86rf233_powers);
                lp->hw->phy->supported.cca_ed_levels = at86rf233_ed_levels;
@@ -1615,47 +1542,6 @@ not_supp:
        return rc;
 }
 
-#ifdef CONFIG_IEEE802154_AT86RF230_DEBUGFS
-static struct dentry *at86rf230_debugfs_root;
-
-static int at86rf230_stats_show(struct seq_file *file, void *offset)
-{
-       struct at86rf230_local *lp = file->private;
-
-       seq_printf(file, "SUCCESS:\t\t%8llu\n", lp->trac.success);
-       seq_printf(file, "SUCCESS_DATA_PENDING:\t%8llu\n",
-                  lp->trac.success_data_pending);
-       seq_printf(file, "SUCCESS_WAIT_FOR_ACK:\t%8llu\n",
-                  lp->trac.success_wait_for_ack);
-       seq_printf(file, "CHANNEL_ACCESS_FAILURE:\t%8llu\n",
-                  lp->trac.channel_access_failure);
-       seq_printf(file, "NO_ACK:\t\t\t%8llu\n", lp->trac.no_ack);
-       seq_printf(file, "INVALID:\t\t%8llu\n", lp->trac.invalid);
-       return 0;
-}
-DEFINE_SHOW_ATTRIBUTE(at86rf230_stats);
-
-static void at86rf230_debugfs_init(struct at86rf230_local *lp)
-{
-       char debugfs_dir_name[DNAME_INLINE_LEN + 1] = "at86rf230-";
-
-       strncat(debugfs_dir_name, dev_name(&lp->spi->dev), DNAME_INLINE_LEN);
-
-       at86rf230_debugfs_root = debugfs_create_dir(debugfs_dir_name, NULL);
-
-       debugfs_create_file("trac_stats", 0444, at86rf230_debugfs_root, lp,
-                           &at86rf230_stats_fops);
-}
-
-static void at86rf230_debugfs_remove(void)
-{
-       debugfs_remove_recursive(at86rf230_debugfs_root);
-}
-#else
-static void at86rf230_debugfs_init(struct at86rf230_local *lp) { }
-static void at86rf230_debugfs_remove(void) { }
-#endif
-
 static int at86rf230_probe(struct spi_device *spi)
 {
        struct ieee802154_hw *hw;
@@ -1752,16 +1638,12 @@ static int at86rf230_probe(struct spi_device *spi)
        /* going into sleep by default */
        at86rf230_sleep(lp);
 
-       at86rf230_debugfs_init(lp);
-
        rc = ieee802154_register_hw(lp->hw);
        if (rc)
-               goto free_debugfs;
+               goto free_dev;
 
        return rc;
 
-free_debugfs:
-       at86rf230_debugfs_remove();
 free_dev:
        ieee802154_free_hw(lp->hw);
 
@@ -1776,7 +1658,6 @@ static void at86rf230_remove(struct spi_device *spi)
        at86rf230_write_subreg(lp, SR_IRQ_MASK, 0);
        ieee802154_unregister_hw(lp->hw);
        ieee802154_free_hw(lp->hw);
-       at86rf230_debugfs_remove();
        dev_dbg(&spi->dev, "unregistered at86rf230\n");
 }