Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi...
authorJohn W. Linville <linville@tuxdriver.com>
Wed, 20 Jun 2012 18:40:26 +0000 (14:40 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 20 Jun 2012 18:40:26 +0000 (14:40 -0400)
drivers/net/wireless/iwlwifi/dvm/dev.h
drivers/net/wireless/iwlwifi/dvm/devices.c
drivers/net/wireless/iwlwifi/dvm/lib.c
drivers/net/wireless/iwlwifi/dvm/mac80211.c
drivers/net/wireless/iwlwifi/dvm/main.c
drivers/net/wireless/iwlwifi/dvm/scan.c
drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c
drivers/net/wireless/iwlwifi/iwl-notif-wait.c
drivers/net/wireless/iwlwifi/iwl-op-mode.h
drivers/net/wireless/iwlwifi/pcie/rx.c
drivers/net/wireless/iwlwifi/pcie/trans.c

index 4620b657948a0731bdbcadce4cad5ac57c13b1f8..54cf085ddc8965d74cdf053750862afe51bff814 100644 (file)
@@ -568,7 +568,6 @@ enum iwl_scan_type {
  *
  * @tx_chains_num: Number of TX chains
  * @rx_chains_num: Number of RX chains
- * @sku: sku read from EEPROM
  * @ct_kill_threshold: temperature threshold - in hw dependent unit
  * @ct_kill_exit_threshold: when to reeable the device - in hw dependent unit
  *     relevant for 1000, 6000 and up
@@ -579,7 +578,6 @@ struct iwl_hw_params {
        u8  tx_chains_num;
        u8  rx_chains_num;
        bool use_rts_for_aggregation;
-       u16 sku;
        u32 ct_kill_threshold;
        u32 ct_kill_exit_threshold;
 
index 0521a6be09d283332d57d2a0dc2c7f0a2960e720..349c205d5f62e218d3a76226b983818e92732a95 100644 (file)
@@ -250,17 +250,6 @@ struct iwl_lib_ops iwl2030_lib = {
  */
 
 /* NIC configuration for 5000 series */
-static void iwl5000_nic_config(struct iwl_priv *priv)
-{
-       /* W/A : NIC is stuck in a reset state after Early PCIe power off
-        * (PCIe power is lost before PERST# is asserted),
-        * causing ME FW to lose ownership and not being able to obtain it back.
-        */
-       iwl_set_bits_mask_prph(priv->trans, APMG_PS_CTRL_REG,
-                               APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS,
-                               ~APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS);
-}
-
 static const struct iwl_sensitivity_ranges iwl5000_sensitivity = {
        .min_nrg_cck = 100,
        .auto_corr_min_ofdm = 90,
@@ -433,14 +422,12 @@ static int iwl5000_hw_channel_switch(struct iwl_priv *priv,
 struct iwl_lib_ops iwl5000_lib = {
        .set_hw_params = iwl5000_hw_set_hw_params,
        .set_channel_switch = iwl5000_hw_channel_switch,
-       .nic_config = iwl5000_nic_config,
        .temperature = iwlagn_temperature,
 };
 
 struct iwl_lib_ops iwl5150_lib = {
        .set_hw_params = iwl5150_hw_set_hw_params,
        .set_channel_switch = iwl5000_hw_channel_switch,
-       .nic_config = iwl5000_nic_config,
        .temperature = iwl5150_temperature,
 };
 
index 76f259283c3a30f857bfe34550f6897cd244895f..207ae91a83aa83e4f9c36b8fdd2b7bf741ac97f4 100644 (file)
@@ -160,7 +160,7 @@ int iwlagn_txfifo_flush(struct iwl_priv *priv, u16 flush_control)
                                IWL_PAN_SCD_BK_MSK | IWL_PAN_SCD_MGMT_MSK |
                                IWL_PAN_SCD_MULTICAST_MSK;
 
-       if (priv->hw_params.sku & EEPROM_SKU_CAP_11N_ENABLE)
+       if (priv->eeprom_data->sku & EEPROM_SKU_CAP_11N_ENABLE)
                flush_cmd.fifo_control |= IWL_AGG_TX_QUEUE_MSK;
 
        IWL_DEBUG_INFO(priv, "fifo queue control: 0X%x\n",
index 9d23748623142c8373ee973debbf85b85fc755a7..b581f035d4b075672ff86daeb4391ef8fd7dc06d 100644 (file)
@@ -164,7 +164,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
        hw->max_tx_aggregation_subframes = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
         */
 
-       if (priv->hw_params.sku & EEPROM_SKU_CAP_11N_ENABLE)
+       if (priv->eeprom_data->sku & EEPROM_SKU_CAP_11N_ENABLE)
                hw->flags |= IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
                             IEEE80211_HW_SUPPORTS_STATIC_SMPS;
 
@@ -649,7 +649,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
        IWL_DEBUG_HT(priv, "A-MPDU action on addr %pM tid %d\n",
                     sta->addr, tid);
 
-       if (!(priv->hw_params.sku & EEPROM_SKU_CAP_11N_ENABLE))
+       if (!(priv->eeprom_data->sku & EEPROM_SKU_CAP_11N_ENABLE))
                return -EACCES;
 
        IWL_DEBUG_MAC80211(priv, "enter\n");
@@ -1036,8 +1036,18 @@ static int iwlagn_mac_remain_on_channel(struct ieee80211_hw *hw,
        mutex_lock(&priv->mutex);
 
        if (test_bit(STATUS_SCAN_HW, &priv->status)) {
-               err = -EBUSY;
-               goto out;
+               /* mac80211 should not scan while ROC or ROC while scanning */
+               if (WARN_ON_ONCE(priv->scan_type != IWL_SCAN_RADIO_RESET)) {
+                       err = -EBUSY;
+                       goto out;
+               }
+
+               iwl_scan_cancel_timeout(priv, 100);
+
+               if (test_bit(STATUS_SCAN_HW, &priv->status)) {
+                       err = -EBUSY;
+                       goto out;
+               }
        }
 
        priv->hw_roc_channel = channel;
index e620af3d592df800fce18c6dcee5865ab84f15b9..abfd7916bde60097da978e976a9fca685a6d2a0b 100644 (file)
 #include "iwl-op-mode.h"
 #include "iwl-drv.h"
 #include "iwl-modparams.h"
+#include "iwl-prph.h"
 
 #include "dev.h"
 #include "calib.h"
 #include "agn.h"
 
+
 /******************************************************************************
  *
  * module boiler plate
@@ -1185,9 +1187,6 @@ static void iwl_set_hw_params(struct iwl_priv *priv)
                priv->hw_params.use_rts_for_aggregation =
                        priv->cfg->ht_params->use_rts_for_aggregation;
 
-       if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_ALL)
-               priv->hw_params.sku &= ~EEPROM_SKU_CAP_11N_ENABLE;
-
        /* Device-specific setup */
        priv->lib->set_hw_params(priv);
 }
@@ -1232,20 +1231,20 @@ static int iwl_eeprom_init_hw_params(struct iwl_priv *priv)
 {
        u16 radio_cfg;
 
-       priv->hw_params.sku = priv->eeprom_data->sku;
+       priv->eeprom_data->sku = priv->eeprom_data->sku;
 
-       if (priv->hw_params.sku & EEPROM_SKU_CAP_11N_ENABLE &&
+       if (priv->eeprom_data->sku & EEPROM_SKU_CAP_11N_ENABLE &&
            !priv->cfg->ht_params) {
                IWL_ERR(priv, "Invalid 11n configuration\n");
                return -EINVAL;
        }
 
-       if (!priv->hw_params.sku) {
+       if (!priv->eeprom_data->sku) {
                IWL_ERR(priv, "Invalid device sku\n");
                return -EINVAL;
        }
 
-       IWL_INFO(priv, "Device SKU: 0x%X\n", priv->hw_params.sku);
+       IWL_INFO(priv, "Device SKU: 0x%X\n", priv->eeprom_data->sku);
 
        radio_cfg = priv->eeprom_data->radio_cfg;
 
@@ -1352,6 +1351,9 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
                trans_cfg.queue_watchdog_timeout = IWL_WATCHDOG_DISABLED;
        trans_cfg.command_names = iwl_dvm_cmd_strings;
 
+       WARN_ON(sizeof(priv->transport_queue_stop) * BITS_PER_BYTE <
+               priv->cfg->base_params->num_of_queues);
+
        ucode_flags = fw->ucode_capa.flags;
 
 #ifndef CONFIG_IWLWIFI_P2P
@@ -1448,7 +1450,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
         ************************/
        iwl_set_hw_params(priv);
 
-       if (!(priv->hw_params.sku & EEPROM_SKU_CAP_IPAN_ENABLE)) {
+       if (!(priv->eeprom_data->sku & EEPROM_SKU_CAP_IPAN_ENABLE)) {
                IWL_DEBUG_INFO(priv, "Your EEPROM disabled PAN");
                ucode_flags &= ~IWL_UCODE_TLV_FLAGS_PAN;
                /*
@@ -2073,7 +2075,16 @@ static void iwl_nic_config(struct iwl_op_mode *op_mode)
                    CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI |
                    CSR_HW_IF_CONFIG_REG_BIT_MAC_SI);
 
-       priv->lib->nic_config(priv);
+       /* W/A : NIC is stuck in a reset state after Early PCIe power off
+        * (PCIe power is lost before PERST# is asserted),
+        * causing ME FW to lose ownership and not being able to obtain it back.
+        */
+       iwl_set_bits_mask_prph(priv->trans, APMG_PS_CTRL_REG,
+                              APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS,
+                              ~APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS);
+
+       if (priv->lib->nic_config)
+               priv->lib->nic_config(priv);
 }
 
 static void iwl_wimax_active(struct iwl_op_mode *op_mode)
index 2f271c96ed3917205d37ce434ff198d792c322a8..f5b1452a60b37b7b3feb9a42b22e5b26328c76d7 100644 (file)
@@ -51,6 +51,9 @@
 #define IWL_CHANNEL_TUNE_TIME       5
 #define MAX_SCAN_CHANNEL           50
 
+/* For reset radio, need minimal dwell time only */
+#define IWL_RADIO_RESET_DWELL_TIME     5
+
 static int iwl_send_scan_abort(struct iwl_priv *priv)
 {
        int ret;
@@ -469,45 +472,39 @@ static u8 iwl_get_single_channel_number(struct iwl_priv *priv,
        return 0;
 }
 
-static int iwl_get_single_channel_for_scan(struct iwl_priv *priv,
-                                          struct ieee80211_vif *vif,
-                                          enum ieee80211_band band,
-                                          struct iwl_scan_channel *scan_ch)
+static int iwl_get_channel_for_reset_scan(struct iwl_priv *priv,
+                                         struct ieee80211_vif *vif,
+                                         enum ieee80211_band band,
+                                         struct iwl_scan_channel *scan_ch)
 {
        const struct ieee80211_supported_band *sband;
-       u16 passive_dwell = 0;
-       u16 active_dwell = 0;
-       int added = 0;
-       u16 channel = 0;
+       u16 channel;
 
        sband = iwl_get_hw_mode(priv, band);
        if (!sband) {
                IWL_ERR(priv, "invalid band\n");
-               return added;
+               return 0;
        }
 
-       active_dwell = iwl_get_active_dwell_time(priv, band, 0);
-       passive_dwell = iwl_get_passive_dwell_time(priv, band);
-
-       if (passive_dwell <= active_dwell)
-               passive_dwell = active_dwell + 1;
-
        channel = iwl_get_single_channel_number(priv, band);
        if (channel) {
                scan_ch->channel = cpu_to_le16(channel);
                scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE;
-               scan_ch->active_dwell = cpu_to_le16(active_dwell);
-               scan_ch->passive_dwell = cpu_to_le16(passive_dwell);
+               scan_ch->active_dwell =
+                       cpu_to_le16(IWL_RADIO_RESET_DWELL_TIME);
+               scan_ch->passive_dwell =
+                       cpu_to_le16(IWL_RADIO_RESET_DWELL_TIME);
                /* Set txpower levels to defaults */
                scan_ch->dsp_atten = 110;
                if (band == IEEE80211_BAND_5GHZ)
                        scan_ch->tx_gain = ((1 << 5) | (3 << 3)) | 3;
                else
                        scan_ch->tx_gain = ((1 << 5) | (5 << 3));
-               added++;
-       } else
-               IWL_ERR(priv, "no valid channel found\n");
-       return added;
+               return 1;
+       }
+
+       IWL_ERR(priv, "no valid channel found\n");
+       return 0;
 }
 
 static int iwl_get_channels_for_scan(struct iwl_priv *priv,
@@ -896,7 +893,7 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
        switch (priv->scan_type) {
        case IWL_SCAN_RADIO_RESET:
                scan->channel_count =
-                       iwl_get_single_channel_for_scan(priv, vif, band,
+                       iwl_get_channel_for_reset_scan(priv, vif, band,
                                (void *)&scan->data[cmd_len]);
                break;
        case IWL_SCAN_NORMAL:
index c87a05cbec1251f3b38372999e62eccd90a941e9..f10170fe879922b6f56a8d2a6b287d11af92421e 100644 (file)
@@ -853,6 +853,9 @@ iwl_parse_eeprom_data(struct device *dev, const struct iwl_cfg *cfg,
                                             EEPROM_RADIO_CONFIG);
        data->sku = iwl_eeprom_query16(eeprom, eeprom_size,
                                       EEPROM_SKU_CAP);
+       if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_ALL)
+               data->sku &= ~EEPROM_SKU_CAP_11N_ENABLE;
+
        data->eeprom_version = iwl_eeprom_query16(eeprom, eeprom_size,
                                                  EEPROM_VERSION);
 
index 5cfed29b1b18dbbdae16f3a93af279220cc41c74..c61f2070f15a0fab26d6f6caf20de846ca328010 100644 (file)
@@ -121,13 +121,12 @@ EXPORT_SYMBOL_GPL(iwl_notification_wait_notify);
 
 void iwl_abort_notification_waits(struct iwl_notif_wait_data *notif_wait)
 {
-       unsigned long flags;
        struct iwl_notification_wait *wait_entry;
 
-       spin_lock_irqsave(&notif_wait->notif_wait_lock, flags);
+       spin_lock(&notif_wait->notif_wait_lock);
        list_for_each_entry(wait_entry, &notif_wait->notif_waits, list)
                wait_entry->aborted = true;
-       spin_unlock_irqrestore(&notif_wait->notif_wait_lock, flags);
+       spin_unlock(&notif_wait->notif_wait_lock);
 
        wake_up_all(&notif_wait->notif_waitq);
 }
index cd9ef114d3a38e24433ab58eab173a162ebdf505..64886f95664f996b370f621c97c14998b0c27171 100644 (file)
@@ -111,22 +111,25 @@ struct iwl_cfg;
  *     May sleep
  * @rx: Rx notification to the op_mode. rxb is the Rx buffer itself. Cmd is the
  *     HCMD the this Rx responds to.
- *     Must be atomic.
+ *     Must be atomic and called with BH disabled.
  * @queue_full: notifies that a HW queue is full.
- *     Must be atomic
+ *     Must be atomic and called with BH disabled.
  * @queue_not_full: notifies that a HW queue is not full any more.
- *     Must be atomic
+ *     Must be atomic and called with BH disabled.
  * @hw_rf_kill:notifies of a change in the HW rf kill switch. True means that
  *     the radio is killed. Must be atomic.
  * @free_skb: allows the transport layer to free skbs that haven't been
  *     reclaimed by the op_mode. This can happen when the driver is freed and
  *     there are Tx packets pending in the transport layer.
  *     Must be atomic
- * @nic_error: error notification. Must be atomic
- * @cmd_queue_full: Called when the command queue gets full. Must be atomic.
+ * @nic_error: error notification. Must be atomic and must be called with BH
+ *     disabled.
+ * @cmd_queue_full: Called when the command queue gets full. Must be atomic and
+ *     called with BH disabled.
  * @nic_config: configure NIC, called before firmware is started.
  *     May sleep
- * @wimax_active: invoked when WiMax becomes active.  Must be atomic.
+ * @wimax_active: invoked when WiMax becomes active.  Must be atomic and called
+ *     with BH disabled.
  */
 struct iwl_op_mode_ops {
        struct iwl_op_mode *(*start)(struct iwl_trans *trans,
@@ -165,7 +168,6 @@ struct iwl_op_mode {
 static inline void iwl_op_mode_stop(struct iwl_op_mode *op_mode)
 {
        might_sleep();
-
        op_mode->ops->stop(op_mode);
 }
 
index d6860c070c16c06a0255d02ea380c56210b64909..be143eb4aa4ff04a63969070736211a08e6a76aa 100644 (file)
@@ -867,24 +867,23 @@ void iwl_disable_ict(struct iwl_trans *trans)
        spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
 }
 
+/* legacy (non-ICT) ISR. Assumes that trans_pcie->irq_lock is held */
 static irqreturn_t iwl_isr(int irq, void *data)
 {
        struct iwl_trans *trans = data;
-       struct iwl_trans_pcie *trans_pcie;
+       struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
        u32 inta, inta_mask;
-       unsigned long flags;
 #ifdef CONFIG_IWLWIFI_DEBUG
        u32 inta_fh;
 #endif
+
+       lockdep_assert_held(&trans_pcie->irq_lock);
+
        if (!trans)
                return IRQ_NONE;
 
        trace_iwlwifi_dev_irq(trans->dev);
 
-       trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
-
-       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
-
        /* Disable (but don't clear!) interrupts here to avoid
         *    back-to-back ISRs and sporadic interrupts from our NIC.
         * If we have something to service, the tasklet will re-enable ints.
@@ -907,7 +906,7 @@ static irqreturn_t iwl_isr(int irq, void *data)
                /* Hardware disappeared. It might have already raised
                 * an interrupt */
                IWL_WARN(trans, "HARDWARE GONE?? INTA == 0x%08x\n", inta);
-               goto unplugged;
+               return IRQ_HANDLED;
        }
 
 #ifdef CONFIG_IWLWIFI_DEBUG
@@ -926,18 +925,13 @@ static irqreturn_t iwl_isr(int irq, void *data)
                 !trans_pcie->inta)
                iwl_enable_interrupts(trans);
 
- unplugged:
-       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
-       return IRQ_HANDLED;
-
- none:
+none:
        /* re-enable interrupts here since we don't have anything to service. */
        /* only Re-enable if disabled by irq  and no schedules tasklet. */
        if (test_bit(STATUS_INT_ENABLED, &trans_pcie->status) &&
            !trans_pcie->inta)
                iwl_enable_interrupts(trans);
 
-       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
        return IRQ_NONE;
 }
 
@@ -963,15 +957,19 @@ irqreturn_t iwl_isr_ict(int irq, void *data)
 
        trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
 
+       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
+
        /* dram interrupt table not set yet,
         * use legacy interrupt.
         */
-       if (!trans_pcie->use_ict)
-               return iwl_isr(irq, data);
+       if (unlikely(!trans_pcie->use_ict)) {
+               irqreturn_t ret = iwl_isr(irq, data);
+               spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
+               return ret;
+       }
 
        trace_iwlwifi_dev_irq(trans->dev);
 
-       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
 
        /* Disable (but don't clear!) interrupts here to avoid
         * back-to-back ISRs and sporadic interrupts from our NIC.
index cc935168ae52b9849753925b19abd79b612767c3..42f369d15f48146ed543d6430394d6281d742542 100644 (file)
@@ -296,6 +296,7 @@ static void iwlagn_free_dma_ptr(struct iwl_trans *trans,
 static void iwl_trans_pcie_queue_stuck_timer(unsigned long data)
 {
        struct iwl_tx_queue *txq = (void *)data;
+       struct iwl_queue *q = &txq->q;
        struct iwl_trans_pcie *trans_pcie = txq->trans_pcie;
        struct iwl_trans *trans = iwl_trans_pcie_get_trans(trans_pcie);
        u32 scd_sram_addr = trans_pcie->scd_base_addr +
@@ -346,6 +347,14 @@ static void iwl_trans_pcie_queue_stuck_timer(unsigned long data)
                        iwl_read_prph(trans, SCD_QUEUE_WRPTR(i)));
        }
 
+       for (i = q->read_ptr; i != q->write_ptr;
+            i = iwl_queue_inc_wrap(i, q->n_bd)) {
+               struct iwl_tx_cmd *tx_cmd =
+                       (struct iwl_tx_cmd *)txq->entries[i].cmd->payload;
+               IWL_ERR(trans, "scratch %d = 0x%08x\n", i,
+                       get_unaligned_le32(&tx_cmd->scratch));
+       }
+
        iwl_op_mode_nic_error(trans->op_mode);
 }
 
@@ -1037,15 +1046,12 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
 
 /*
  * Activate/Deactivate Tx DMA/FIFO channels according tx fifos mask
- * must be called under the irq lock and with MAC access
  */
 static void iwl_trans_txq_set_sched(struct iwl_trans *trans, u32 mask)
 {
        struct iwl_trans_pcie __maybe_unused *trans_pcie =
                IWL_TRANS_GET_PCIE_TRANS(trans);
 
-       lockdep_assert_held(&trans_pcie->irq_lock);
-
        iwl_write_prph(trans, SCD_TXFACT, mask);
 }
 
@@ -1053,12 +1059,9 @@ static void iwl_tx_start(struct iwl_trans *trans)
 {
        struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
        u32 a;
-       unsigned long flags;
        int i, chan;
        u32 reg_val;
 
-       spin_lock_irqsave(&trans_pcie->irq_lock, flags);
-
        /* make sure all queue are not stopped/used */
        memset(trans_pcie->queue_stopped, 0, sizeof(trans_pcie->queue_stopped));
        memset(trans_pcie->queue_used, 0, sizeof(trans_pcie->queue_used));
@@ -1109,8 +1112,6 @@ static void iwl_tx_start(struct iwl_trans *trans)
        iwl_write_direct32(trans, FH_TX_CHICKEN_BITS_REG,
                           reg_val | FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN);
 
-       spin_unlock_irqrestore(&trans_pcie->irq_lock, flags);
-
        /* Enable L1-Active */
        iwl_clear_bits_prph(trans, APMG_PCIDEV_STT_REG,
                            APMG_PCIDEV_STT_VAL_L1_ACT_DIS);
@@ -2017,7 +2018,9 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct file *file,
        if (!trans->op_mode)
                return -EAGAIN;
 
+       local_bh_disable();
        iwl_op_mode_nic_error(trans->op_mode);
+       local_bh_enable();
 
        return count;
 }
This page took 0.05662 seconds and 5 git commands to generate.