diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn-calib.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-calib.c | 133 |
1 files changed, 105 insertions, 28 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-calib.c b/drivers/net/wireless/iwlwifi/iwl-agn-calib.c index eb052b05e79..90033e8752b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-calib.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-calib.c | |||
@@ -409,46 +409,34 @@ static int iwl_sens_auto_corr_ofdm(struct iwl_priv *priv, | |||
409 | return 0; | 409 | return 0; |
410 | } | 410 | } |
411 | 411 | ||
412 | /* Prepare a SENSITIVITY_CMD, send to uCode if values have changed */ | 412 | static void iwl_prepare_legacy_sensitivity_tbl(struct iwl_priv *priv, |
413 | static int iwl_sensitivity_write(struct iwl_priv *priv) | 413 | struct iwl_sensitivity_data *data, |
414 | __le16 *tbl) | ||
414 | { | 415 | { |
415 | struct iwl_sensitivity_cmd cmd ; | 416 | tbl[HD_AUTO_CORR32_X4_TH_ADD_MIN_INDEX] = |
416 | struct iwl_sensitivity_data *data = NULL; | ||
417 | struct iwl_host_cmd cmd_out = { | ||
418 | .id = SENSITIVITY_CMD, | ||
419 | .len = sizeof(struct iwl_sensitivity_cmd), | ||
420 | .flags = CMD_ASYNC, | ||
421 | .data = &cmd, | ||
422 | }; | ||
423 | |||
424 | data = &(priv->sensitivity_data); | ||
425 | |||
426 | memset(&cmd, 0, sizeof(cmd)); | ||
427 | |||
428 | cmd.table[HD_AUTO_CORR32_X4_TH_ADD_MIN_INDEX] = | ||
429 | cpu_to_le16((u16)data->auto_corr_ofdm); | 417 | cpu_to_le16((u16)data->auto_corr_ofdm); |
430 | cmd.table[HD_AUTO_CORR32_X4_TH_ADD_MIN_MRC_INDEX] = | 418 | tbl[HD_AUTO_CORR32_X4_TH_ADD_MIN_MRC_INDEX] = |
431 | cpu_to_le16((u16)data->auto_corr_ofdm_mrc); | 419 | cpu_to_le16((u16)data->auto_corr_ofdm_mrc); |
432 | cmd.table[HD_AUTO_CORR32_X1_TH_ADD_MIN_INDEX] = | 420 | tbl[HD_AUTO_CORR32_X1_TH_ADD_MIN_INDEX] = |
433 | cpu_to_le16((u16)data->auto_corr_ofdm_x1); | 421 | cpu_to_le16((u16)data->auto_corr_ofdm_x1); |
434 | cmd.table[HD_AUTO_CORR32_X1_TH_ADD_MIN_MRC_INDEX] = | 422 | tbl[HD_AUTO_CORR32_X1_TH_ADD_MIN_MRC_INDEX] = |
435 | cpu_to_le16((u16)data->auto_corr_ofdm_mrc_x1); | 423 | cpu_to_le16((u16)data->auto_corr_ofdm_mrc_x1); |
436 | 424 | ||
437 | cmd.table[HD_AUTO_CORR40_X4_TH_ADD_MIN_INDEX] = | 425 | tbl[HD_AUTO_CORR40_X4_TH_ADD_MIN_INDEX] = |
438 | cpu_to_le16((u16)data->auto_corr_cck); | 426 | cpu_to_le16((u16)data->auto_corr_cck); |
439 | cmd.table[HD_AUTO_CORR40_X4_TH_ADD_MIN_MRC_INDEX] = | 427 | tbl[HD_AUTO_CORR40_X4_TH_ADD_MIN_MRC_INDEX] = |
440 | cpu_to_le16((u16)data->auto_corr_cck_mrc); | 428 | cpu_to_le16((u16)data->auto_corr_cck_mrc); |
441 | 429 | ||
442 | cmd.table[HD_MIN_ENERGY_CCK_DET_INDEX] = | 430 | tbl[HD_MIN_ENERGY_CCK_DET_INDEX] = |
443 | cpu_to_le16((u16)data->nrg_th_cck); | 431 | cpu_to_le16((u16)data->nrg_th_cck); |
444 | cmd.table[HD_MIN_ENERGY_OFDM_DET_INDEX] = | 432 | tbl[HD_MIN_ENERGY_OFDM_DET_INDEX] = |
445 | cpu_to_le16((u16)data->nrg_th_ofdm); | 433 | cpu_to_le16((u16)data->nrg_th_ofdm); |
446 | 434 | ||
447 | cmd.table[HD_BARKER_CORR_TH_ADD_MIN_INDEX] = | 435 | tbl[HD_BARKER_CORR_TH_ADD_MIN_INDEX] = |
448 | cpu_to_le16(data->barker_corr_th_min); | 436 | cpu_to_le16(data->barker_corr_th_min); |
449 | cmd.table[HD_BARKER_CORR_TH_ADD_MIN_MRC_INDEX] = | 437 | tbl[HD_BARKER_CORR_TH_ADD_MIN_MRC_INDEX] = |
450 | cpu_to_le16(data->barker_corr_th_min_mrc); | 438 | cpu_to_le16(data->barker_corr_th_min_mrc); |
451 | cmd.table[HD_OFDM_ENERGY_TH_IN_INDEX] = | 439 | tbl[HD_OFDM_ENERGY_TH_IN_INDEX] = |
452 | cpu_to_le16(data->nrg_th_cca); | 440 | cpu_to_le16(data->nrg_th_cca); |
453 | 441 | ||
454 | IWL_DEBUG_CALIB(priv, "ofdm: ac %u mrc %u x1 %u mrc_x1 %u thresh %u\n", | 442 | IWL_DEBUG_CALIB(priv, "ofdm: ac %u mrc %u x1 %u mrc_x1 %u thresh %u\n", |
@@ -459,6 +447,25 @@ static int iwl_sensitivity_write(struct iwl_priv *priv) | |||
459 | IWL_DEBUG_CALIB(priv, "cck: ac %u mrc %u thresh %u\n", | 447 | IWL_DEBUG_CALIB(priv, "cck: ac %u mrc %u thresh %u\n", |
460 | data->auto_corr_cck, data->auto_corr_cck_mrc, | 448 | data->auto_corr_cck, data->auto_corr_cck_mrc, |
461 | data->nrg_th_cck); | 449 | data->nrg_th_cck); |
450 | } | ||
451 | |||
452 | /* Prepare a SENSITIVITY_CMD, send to uCode if values have changed */ | ||
453 | static int iwl_sensitivity_write(struct iwl_priv *priv) | ||
454 | { | ||
455 | struct iwl_sensitivity_cmd cmd; | ||
456 | struct iwl_sensitivity_data *data = NULL; | ||
457 | struct iwl_host_cmd cmd_out = { | ||
458 | .id = SENSITIVITY_CMD, | ||
459 | .len = sizeof(struct iwl_sensitivity_cmd), | ||
460 | .flags = CMD_ASYNC, | ||
461 | .data = &cmd, | ||
462 | }; | ||
463 | |||
464 | data = &(priv->sensitivity_data); | ||
465 | |||
466 | memset(&cmd, 0, sizeof(cmd)); | ||
467 | |||
468 | iwl_prepare_legacy_sensitivity_tbl(priv, data, &cmd.table[0]); | ||
462 | 469 | ||
463 | /* Update uCode's "work" table, and copy it to DSP */ | 470 | /* Update uCode's "work" table, and copy it to DSP */ |
464 | cmd.control = SENSITIVITY_CMD_CONTROL_WORK_TABLE; | 471 | cmd.control = SENSITIVITY_CMD_CONTROL_WORK_TABLE; |
@@ -477,6 +484,70 @@ static int iwl_sensitivity_write(struct iwl_priv *priv) | |||
477 | return iwl_send_cmd(priv, &cmd_out); | 484 | return iwl_send_cmd(priv, &cmd_out); |
478 | } | 485 | } |
479 | 486 | ||
487 | /* Prepare a SENSITIVITY_CMD, send to uCode if values have changed */ | ||
488 | static int iwl_enhance_sensitivity_write(struct iwl_priv *priv) | ||
489 | { | ||
490 | struct iwl_enhance_sensitivity_cmd cmd; | ||
491 | struct iwl_sensitivity_data *data = NULL; | ||
492 | struct iwl_host_cmd cmd_out = { | ||
493 | .id = SENSITIVITY_CMD, | ||
494 | .len = sizeof(struct iwl_enhance_sensitivity_cmd), | ||
495 | .flags = CMD_ASYNC, | ||
496 | .data = &cmd, | ||
497 | }; | ||
498 | |||
499 | data = &(priv->sensitivity_data); | ||
500 | |||
501 | memset(&cmd, 0, sizeof(cmd)); | ||
502 | |||
503 | iwl_prepare_legacy_sensitivity_tbl(priv, data, &cmd.enhance_table[0]); | ||
504 | |||
505 | cmd.enhance_table[HD_INA_NON_SQUARE_DET_OFDM_INDEX] = | ||
506 | HD_INA_NON_SQUARE_DET_OFDM_DATA; | ||
507 | cmd.enhance_table[HD_INA_NON_SQUARE_DET_CCK_INDEX] = | ||
508 | HD_INA_NON_SQUARE_DET_CCK_DATA; | ||
509 | cmd.enhance_table[HD_CORR_11_INSTEAD_OF_CORR_9_EN_INDEX] = | ||
510 | HD_CORR_11_INSTEAD_OF_CORR_9_EN_DATA; | ||
511 | cmd.enhance_table[HD_OFDM_NON_SQUARE_DET_SLOPE_MRC_INDEX] = | ||
512 | HD_OFDM_NON_SQUARE_DET_SLOPE_MRC_DATA; | ||
513 | cmd.enhance_table[HD_OFDM_NON_SQUARE_DET_INTERCEPT_MRC_INDEX] = | ||
514 | HD_OFDM_NON_SQUARE_DET_INTERCEPT_MRC_DATA; | ||
515 | cmd.enhance_table[HD_OFDM_NON_SQUARE_DET_SLOPE_INDEX] = | ||
516 | HD_OFDM_NON_SQUARE_DET_SLOPE_DATA; | ||
517 | cmd.enhance_table[HD_OFDM_NON_SQUARE_DET_INTERCEPT_INDEX] = | ||
518 | HD_OFDM_NON_SQUARE_DET_INTERCEPT_DATA; | ||
519 | cmd.enhance_table[HD_CCK_NON_SQUARE_DET_SLOPE_MRC_INDEX] = | ||
520 | HD_CCK_NON_SQUARE_DET_SLOPE_MRC_DATA; | ||
521 | cmd.enhance_table[HD_CCK_NON_SQUARE_DET_INTERCEPT_MRC_INDEX] = | ||
522 | HD_CCK_NON_SQUARE_DET_INTERCEPT_MRC_DATA; | ||
523 | cmd.enhance_table[HD_CCK_NON_SQUARE_DET_SLOPE_INDEX] = | ||
524 | HD_CCK_NON_SQUARE_DET_SLOPE_DATA; | ||
525 | cmd.enhance_table[HD_CCK_NON_SQUARE_DET_INTERCEPT_INDEX] = | ||
526 | HD_CCK_NON_SQUARE_DET_INTERCEPT_DATA; | ||
527 | |||
528 | /* Update uCode's "work" table, and copy it to DSP */ | ||
529 | cmd.control = SENSITIVITY_CMD_CONTROL_WORK_TABLE; | ||
530 | |||
531 | /* Don't send command to uCode if nothing has changed */ | ||
532 | if (!memcmp(&cmd.enhance_table[0], &(priv->sensitivity_tbl[0]), | ||
533 | sizeof(u16)*HD_TABLE_SIZE) && | ||
534 | !memcmp(&cmd.enhance_table[HD_INA_NON_SQUARE_DET_OFDM_INDEX], | ||
535 | &(priv->enhance_sensitivity_tbl[0]), | ||
536 | sizeof(u16)*ENHANCE_HD_TABLE_ENTRIES)) { | ||
537 | IWL_DEBUG_CALIB(priv, "No change in SENSITIVITY_CMD\n"); | ||
538 | return 0; | ||
539 | } | ||
540 | |||
541 | /* Copy table for comparison next time */ | ||
542 | memcpy(&(priv->sensitivity_tbl[0]), &(cmd.enhance_table[0]), | ||
543 | sizeof(u16)*HD_TABLE_SIZE); | ||
544 | memcpy(&(priv->enhance_sensitivity_tbl[0]), | ||
545 | &(cmd.enhance_table[HD_INA_NON_SQUARE_DET_OFDM_INDEX]), | ||
546 | sizeof(u16)*ENHANCE_HD_TABLE_ENTRIES); | ||
547 | |||
548 | return iwl_send_cmd(priv, &cmd_out); | ||
549 | } | ||
550 | |||
480 | void iwl_init_sensitivity(struct iwl_priv *priv) | 551 | void iwl_init_sensitivity(struct iwl_priv *priv) |
481 | { | 552 | { |
482 | int ret = 0; | 553 | int ret = 0; |
@@ -527,7 +598,10 @@ void iwl_init_sensitivity(struct iwl_priv *priv) | |||
527 | data->last_bad_plcp_cnt_cck = 0; | 598 | data->last_bad_plcp_cnt_cck = 0; |
528 | data->last_fa_cnt_cck = 0; | 599 | data->last_fa_cnt_cck = 0; |
529 | 600 | ||
530 | ret |= iwl_sensitivity_write(priv); | 601 | if (priv->enhance_sensitivity_table) |
602 | ret |= iwl_enhance_sensitivity_write(priv); | ||
603 | else | ||
604 | ret |= iwl_sensitivity_write(priv); | ||
531 | IWL_DEBUG_CALIB(priv, "<<return 0x%X\n", ret); | 605 | IWL_DEBUG_CALIB(priv, "<<return 0x%X\n", ret); |
532 | } | 606 | } |
533 | 607 | ||
@@ -633,7 +707,10 @@ void iwl_sensitivity_calibration(struct iwl_priv *priv, | |||
633 | 707 | ||
634 | iwl_sens_auto_corr_ofdm(priv, norm_fa_ofdm, rx_enable_time); | 708 | iwl_sens_auto_corr_ofdm(priv, norm_fa_ofdm, rx_enable_time); |
635 | iwl_sens_energy_cck(priv, norm_fa_cck, rx_enable_time, &statis); | 709 | iwl_sens_energy_cck(priv, norm_fa_cck, rx_enable_time, &statis); |
636 | iwl_sensitivity_write(priv); | 710 | if (priv->enhance_sensitivity_table) |
711 | iwl_enhance_sensitivity_write(priv); | ||
712 | else | ||
713 | iwl_sensitivity_write(priv); | ||
637 | } | 714 | } |
638 | 715 | ||
639 | static inline u8 find_first_chain(u8 mask) | 716 | static inline u8 find_first_chain(u8 mask) |