mac80211/drivers: rewrite the rate control API
[pandora-kernel.git] / drivers / net / wireless / iwlwifi / iwl-5000.c
index 5155b8a..d5282fa 100644 (file)
@@ -390,8 +390,8 @@ static void iwl5000_chain_noise_reset(struct iwl_priv *priv)
 static void iwl5000_rts_tx_cmd_flag(struct ieee80211_tx_info *info,
                        __le32 *tx_flags)
 {
-       if ((info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) ||
-           (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT))
+       if ((info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) ||
+           (info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT))
                *tx_flags |= TX_CMD_FLG_RTS_CTS_MSK;
        else
                *tx_flags &= ~TX_CMD_FLG_RTS_CTS_MSK;
@@ -429,20 +429,19 @@ static const u8 *iwl5000_eeprom_query_addr(const struct iwl_priv *priv,
 /*
  *  Calibration
  */
-static int iwl5000_send_Xtal_calib(struct iwl_priv *priv)
+static int iwl5000_set_Xtal_calib(struct iwl_priv *priv)
 {
+       u8 data[sizeof(struct iwl5000_calib_hdr) +
+               sizeof(struct iwl_cal_xtal_freq)];
+       struct iwl5000_calib_cmd *cmd = (struct iwl5000_calib_cmd *)data;
+       struct iwl_cal_xtal_freq *xtal = (struct iwl_cal_xtal_freq *)cmd->data;
        u16 *xtal_calib = (u16 *)iwl_eeprom_query_addr(priv, EEPROM_5000_XTAL);
 
-       struct iwl5000_calibration cal_cmd = {
-               .op_code = IWL5000_PHY_CALIBRATE_CRYSTAL_FRQ_CMD,
-               .data = {
-                       (u8)xtal_calib[0],
-                       (u8)xtal_calib[1],
-               }
-       };
-
-       return iwl_send_cmd_pdu(priv, REPLY_PHY_CALIBRATION_CMD,
-                               sizeof(cal_cmd), &cal_cmd);
+       cmd->hdr.op_code = IWL5000_PHY_CALIBRATE_CRYSTAL_FRQ_CMD;
+       xtal->cap_pin1 = (u8)xtal_calib[0];
+       xtal->cap_pin2 = (u8)xtal_calib[1];
+       return iwl_calib_set(&priv->calib_results[IWL5000_CALIB_XTAL],
+                            data, sizeof(data));
 }
 
 static int iwl5000_send_calib_cfg(struct iwl_priv *priv)
@@ -784,10 +783,8 @@ static int iwl5000_alive_notify(struct iwl_priv *priv)
 
        iwl5000_send_wimax_coex(priv);
 
-       iwl5000_send_Xtal_calib(priv);
-
-       if (priv->ucode_type == UCODE_RT)
-               iwl_send_calib_results(priv);
+       iwl5000_set_Xtal_calib(priv);
+       iwl_send_calib_results(priv);
 
        return 0;
 }
@@ -814,10 +811,14 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
 
        switch (priv->hw_rev & CSR_HW_REV_TYPE_MSK) {
        case CSR_HW_REV_TYPE_5100:
+               priv->hw_params.tx_chains_num = 1;
+               priv->hw_params.rx_chains_num = 2;
+               priv->hw_params.valid_tx_ant = ANT_B;
+               priv->hw_params.valid_rx_ant = ANT_AB;
+               break;
        case CSR_HW_REV_TYPE_5150:
                priv->hw_params.tx_chains_num = 1;
                priv->hw_params.rx_chains_num = 2;
-               /* FIXME: move to ANT_A, ANT_B, ANT_C enum */
                priv->hw_params.valid_tx_ant = ANT_A;
                priv->hw_params.valid_rx_ant = ANT_AB;
                break;
@@ -844,6 +845,23 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
                break;
        }
 
+       /* Set initial calibration set */
+       switch (priv->hw_rev & CSR_HW_REV_TYPE_MSK) {
+       case CSR_HW_REV_TYPE_5100:
+       case CSR_HW_REV_TYPE_5300:
+       case CSR_HW_REV_TYPE_5350:
+               priv->hw_params.calib_init_cfg =
+                       BIT(IWL5000_CALIB_XTAL)         |
+                       BIT(IWL5000_CALIB_LO)           |
+                       BIT(IWL5000_CALIB_TX_IQ)        |
+                       BIT(IWL5000_CALIB_TX_IQ_PERD);
+               break;
+       case CSR_HW_REV_TYPE_5150:
+               priv->hw_params.calib_init_cfg = 0;
+               break;
+       }
+
+
        return 0;
 }
 
@@ -1136,7 +1154,7 @@ static int iwl5000_tx_status_reply_tx(struct iwl_priv *priv,
                                   agg->frame_count, agg->start_idx, idx);
 
                info = IEEE80211_SKB_CB(priv->txq[txq_id].txb[idx].skb[0]);
-               info->status.retry_count = tx_resp->failure_frame;
+               info->status.rates[0].count = tx_resp->failure_frame + 1;
                info->flags &= ~IEEE80211_TX_CTL_AMPDU;
                info->flags |= iwl_is_tx_success(status)?
                        IEEE80211_TX_STAT_ACK : 0;
@@ -1289,7 +1307,7 @@ static void iwl5000_rx_reply_tx(struct iwl_priv *priv,
                        iwl_txq_check_empty(priv, sta_id, tid, txq_id);
                }
        } else {
-               info->status.retry_count = tx_resp->failure_frame;
+               info->status.rates[0].count = tx_resp->failure_frame + 1;
                info->flags =
                        iwl_is_tx_success(status) ? IEEE80211_TX_STAT_ACK : 0;
                iwl_hwrate_to_tx_control(priv,