diff options
author | Tomas Winkler <tomas.winkler@intel.com> | 2008-11-07 12:58:40 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-11-21 11:07:23 -0500 |
commit | 4ddbb7d060061e584cb2137f4c7e41e502a560b4 (patch) | |
tree | cb6a78a622df2660411786e73c2bbd33b187d173 /drivers/net/wireless/iwlwifi/iwl-5000.c | |
parent | 8d86422a83d79e3d3241cf0f269fca0c2640bcee (diff) |
iwlwifi: revamp tx scheduler byte count tables handling
This moves byte count tables to tx domain removing completely
ambivalent shared data. Changes handling of allocation
byte count tables and keep warm consistent memory
Moves general tx scheduler definitions from iwl-4956-hw.h
to iwl-fh.h
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-5000.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-5000.c | 45 |
1 files changed, 10 insertions, 35 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index e81000cdcbc5..ee3613db3132 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -721,11 +721,9 @@ static int iwl5000_alive_notify(struct iwl_priv *priv) | |||
721 | iwl_write_targ_mem(priv, a, 0); | 721 | iwl_write_targ_mem(priv, a, 0); |
722 | 722 | ||
723 | iwl_write_prph(priv, IWL50_SCD_DRAM_BASE_ADDR, | 723 | iwl_write_prph(priv, IWL50_SCD_DRAM_BASE_ADDR, |
724 | (priv->shared_phys + | 724 | priv->scd_bc_tbls.dma >> 10); |
725 | offsetof(struct iwl5000_shared, queues_bc_tbls)) >> 10); | ||
726 | iwl_write_prph(priv, IWL50_SCD_QUEUECHAIN_SEL, | 725 | iwl_write_prph(priv, IWL50_SCD_QUEUECHAIN_SEL, |
727 | IWL50_SCD_QUEUECHAIN_SEL_ALL( | 726 | IWL50_SCD_QUEUECHAIN_SEL_ALL(priv->hw_params.max_txq_num)); |
728 | priv->hw_params.max_txq_num)); | ||
729 | iwl_write_prph(priv, IWL50_SCD_AGGR_SEL, 0); | 727 | iwl_write_prph(priv, IWL50_SCD_AGGR_SEL, 0); |
730 | 728 | ||
731 | /* initiate the queues */ | 729 | /* initiate the queues */ |
@@ -788,6 +786,8 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv) | |||
788 | } | 786 | } |
789 | 787 | ||
790 | priv->hw_params.max_txq_num = priv->cfg->mod_params->num_of_queues; | 788 | priv->hw_params.max_txq_num = priv->cfg->mod_params->num_of_queues; |
789 | priv->hw_params.scd_bc_tbls_size = | ||
790 | IWL50_NUM_QUEUES * sizeof(struct iwl5000_scd_bc_tbl); | ||
791 | priv->hw_params.max_stations = IWL5000_STATION_COUNT; | 791 | priv->hw_params.max_stations = IWL5000_STATION_COUNT; |
792 | priv->hw_params.bcast_sta_id = IWL5000_BROADCAST_ID; | 792 | priv->hw_params.bcast_sta_id = IWL5000_BROADCAST_ID; |
793 | priv->hw_params.max_data_size = IWL50_RTC_DATA_SIZE; | 793 | priv->hw_params.max_data_size = IWL50_RTC_DATA_SIZE; |
@@ -853,28 +853,6 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv) | |||
853 | return 0; | 853 | return 0; |
854 | } | 854 | } |
855 | 855 | ||
856 | static int iwl5000_alloc_shared_mem(struct iwl_priv *priv) | ||
857 | { | ||
858 | priv->shared_virt = pci_alloc_consistent(priv->pci_dev, | ||
859 | sizeof(struct iwl5000_shared), | ||
860 | &priv->shared_phys); | ||
861 | if (!priv->shared_virt) | ||
862 | return -ENOMEM; | ||
863 | |||
864 | memset(priv->shared_virt, 0, sizeof(struct iwl5000_shared)); | ||
865 | |||
866 | return 0; | ||
867 | } | ||
868 | |||
869 | static void iwl5000_free_shared_mem(struct iwl_priv *priv) | ||
870 | { | ||
871 | if (priv->shared_virt) | ||
872 | pci_free_consistent(priv->pci_dev, | ||
873 | sizeof(struct iwl5000_shared), | ||
874 | priv->shared_virt, | ||
875 | priv->shared_phys); | ||
876 | } | ||
877 | |||
878 | /** | 856 | /** |
879 | * iwl5000_txq_update_byte_cnt_tbl - Set up entry in Tx byte-count array | 857 | * iwl5000_txq_update_byte_cnt_tbl - Set up entry in Tx byte-count array |
880 | */ | 858 | */ |
@@ -882,7 +860,7 @@ static void iwl5000_txq_update_byte_cnt_tbl(struct iwl_priv *priv, | |||
882 | struct iwl_tx_queue *txq, | 860 | struct iwl_tx_queue *txq, |
883 | u16 byte_cnt) | 861 | u16 byte_cnt) |
884 | { | 862 | { |
885 | struct iwl5000_shared *shared_data = priv->shared_virt; | 863 | struct iwl5000_scd_bc_tbl *scd_bc_tbl = priv->scd_bc_tbls.addr; |
886 | int write_ptr = txq->q.write_ptr; | 864 | int write_ptr = txq->q.write_ptr; |
887 | int txq_id = txq->q.id; | 865 | int txq_id = txq->q.id; |
888 | u8 sec_ctl = 0; | 866 | u8 sec_ctl = 0; |
@@ -911,17 +889,17 @@ static void iwl5000_txq_update_byte_cnt_tbl(struct iwl_priv *priv, | |||
911 | 889 | ||
912 | bc_ent = cpu_to_le16((len & 0xFFF) | (sta_id << 12)); | 890 | bc_ent = cpu_to_le16((len & 0xFFF) | (sta_id << 12)); |
913 | 891 | ||
914 | shared_data->queues_bc_tbls[txq_id].tfd_offset[write_ptr] = bc_ent; | 892 | scd_bc_tbl[txq_id].tfd_offset[write_ptr] = bc_ent; |
915 | 893 | ||
916 | if (txq->q.write_ptr < TFD_QUEUE_SIZE_BC_DUP) | 894 | if (txq->q.write_ptr < TFD_QUEUE_SIZE_BC_DUP) |
917 | shared_data->queues_bc_tbls[txq_id]. | 895 | scd_bc_tbl[txq_id]. |
918 | tfd_offset[TFD_QUEUE_SIZE_MAX + write_ptr] = bc_ent; | 896 | tfd_offset[TFD_QUEUE_SIZE_MAX + write_ptr] = bc_ent; |
919 | } | 897 | } |
920 | 898 | ||
921 | static void iwl5000_txq_inval_byte_cnt_tbl(struct iwl_priv *priv, | 899 | static void iwl5000_txq_inval_byte_cnt_tbl(struct iwl_priv *priv, |
922 | struct iwl_tx_queue *txq) | 900 | struct iwl_tx_queue *txq) |
923 | { | 901 | { |
924 | struct iwl5000_shared *shared_data = priv->shared_virt; | 902 | struct iwl5000_scd_bc_tbl *scd_bc_tbl = priv->scd_bc_tbls.addr; |
925 | int txq_id = txq->q.id; | 903 | int txq_id = txq->q.id; |
926 | int read_ptr = txq->q.read_ptr; | 904 | int read_ptr = txq->q.read_ptr; |
927 | u8 sta_id = 0; | 905 | u8 sta_id = 0; |
@@ -933,11 +911,10 @@ static void iwl5000_txq_inval_byte_cnt_tbl(struct iwl_priv *priv, | |||
933 | sta_id = txq->cmd[read_ptr]->cmd.tx.sta_id; | 911 | sta_id = txq->cmd[read_ptr]->cmd.tx.sta_id; |
934 | 912 | ||
935 | bc_ent = cpu_to_le16(1 | (sta_id << 12)); | 913 | bc_ent = cpu_to_le16(1 | (sta_id << 12)); |
936 | shared_data->queues_bc_tbls[txq_id]. | 914 | scd_bc_tbl[txq_id].tfd_offset[read_ptr] = bc_ent; |
937 | tfd_offset[read_ptr] = bc_ent; | ||
938 | 915 | ||
939 | if (txq->q.write_ptr < TFD_QUEUE_SIZE_BC_DUP) | 916 | if (txq->q.write_ptr < TFD_QUEUE_SIZE_BC_DUP) |
940 | shared_data->queues_bc_tbls[txq_id]. | 917 | scd_bc_tbl[txq_id]. |
941 | tfd_offset[TFD_QUEUE_SIZE_MAX + read_ptr] = bc_ent; | 918 | tfd_offset[TFD_QUEUE_SIZE_MAX + read_ptr] = bc_ent; |
942 | } | 919 | } |
943 | 920 | ||
@@ -1450,8 +1427,6 @@ static struct iwl_hcmd_utils_ops iwl5000_hcmd_utils = { | |||
1450 | 1427 | ||
1451 | static struct iwl_lib_ops iwl5000_lib = { | 1428 | static struct iwl_lib_ops iwl5000_lib = { |
1452 | .set_hw_params = iwl5000_hw_set_hw_params, | 1429 | .set_hw_params = iwl5000_hw_set_hw_params, |
1453 | .alloc_shared_mem = iwl5000_alloc_shared_mem, | ||
1454 | .free_shared_mem = iwl5000_free_shared_mem, | ||
1455 | .txq_update_byte_cnt_tbl = iwl5000_txq_update_byte_cnt_tbl, | 1430 | .txq_update_byte_cnt_tbl = iwl5000_txq_update_byte_cnt_tbl, |
1456 | .txq_inval_byte_cnt_tbl = iwl5000_txq_inval_byte_cnt_tbl, | 1431 | .txq_inval_byte_cnt_tbl = iwl5000_txq_inval_byte_cnt_tbl, |
1457 | .txq_set_sched = iwl5000_txq_set_sched, | 1432 | .txq_set_sched = iwl5000_txq_set_sched, |