aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorChaoming_Li <chaoming_li@realsil.com.cn>2011-04-25 14:23:05 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-04-26 16:13:31 -0400
commit46a6272c20d4f639093ad2ad8db1eba622187bee (patch)
tree782aff0bffff9c3939c3a8638b81115b153f1dca /drivers/net/wireless
parentacd48572c396364bb480175d7de83944eefa2563 (diff)
rtlwifi: Change cam routines for addition of rtl8192se and rtl8192de
Change cam routines for addition of RTL8192SE and RTL8192DE code Signed-off-by: Chaoming_Li <chaoming_li@realsil.com.cn> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/rtlwifi/cam.c106
-rw-r--r--drivers/net/wireless/rtlwifi/cam.h5
2 files changed, 89 insertions, 22 deletions
diff --git a/drivers/net/wireless/rtlwifi/cam.c b/drivers/net/wireless/rtlwifi/cam.c
index 52c9c1367ca..7295af0536b 100644
--- a/drivers/net/wireless/rtlwifi/cam.c
+++ b/drivers/net/wireless/rtlwifi/cam.c
@@ -23,6 +23,8 @@
23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24 * Hsinchu 300, Taiwan. 24 * Hsinchu 300, Taiwan.
25 * 25 *
26 * Larry Finger <Larry.Finger@lwfinger.net>
27 *
26 *****************************************************************************/ 28 *****************************************************************************/
27 29
28#include "wifi.h" 30#include "wifi.h"
@@ -49,7 +51,7 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
49 u32 target_content = 0; 51 u32 target_content = 0;
50 u8 entry_i; 52 u8 entry_i;
51 53
52 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 54 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
53 ("key_cont_128:\n %x:%x:%x:%x:%x:%x\n", 55 ("key_cont_128:\n %x:%x:%x:%x:%x:%x\n",
54 key_cont_128[0], key_cont_128[1], 56 key_cont_128[0], key_cont_128[1],
55 key_cont_128[2], key_cont_128[3], 57 key_cont_128[2], key_cont_128[3],
@@ -68,15 +70,13 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
68 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM], 70 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM],
69 target_command); 71 target_command);
70 72
71 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 73 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
72 ("rtl_cam_program_entry(): " 74 ("WRITE %x: %x\n",
73 "WRITE %x: %x\n",
74 rtlpriv->cfg->maps[WCAMI], target_content)); 75 rtlpriv->cfg->maps[WCAMI], target_content));
75 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 76 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
76 ("The Key ID is %d\n", entry_no)); 77 ("The Key ID is %d\n", entry_no));
77 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 78 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
78 ("rtl_cam_program_entry(): " 79 ("WRITE %x: %x\n",
79 "WRITE %x: %x\n",
80 rtlpriv->cfg->maps[RWCAM], target_command)); 80 rtlpriv->cfg->maps[RWCAM], target_command));
81 81
82 } else if (entry_i == 1) { 82 } else if (entry_i == 1) {
@@ -91,12 +91,10 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
91 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM], 91 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM],
92 target_command); 92 target_command);
93 93
94 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 94 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
95 ("rtl_cam_program_entry(): WRITE A4: %x\n", 95 ("WRITE A4: %x\n", target_content));
96 target_content)); 96 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
97 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 97 ("WRITE A0: %x\n", target_command));
98 ("rtl_cam_program_entry(): WRITE A0: %x\n",
99 target_command));
100 98
101 } else { 99 } else {
102 100
@@ -113,16 +111,14 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
113 target_command); 111 target_command);
114 udelay(100); 112 udelay(100);
115 113
116 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 114 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
117 ("rtl_cam_program_entry(): WRITE A4: %x\n", 115 ("WRITE A4: %x\n", target_content));
118 target_content)); 116 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
119 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 117 ("WRITE A0: %x\n", target_command));
120 ("rtl_cam_program_entry(): WRITE A0: %x\n",
121 target_command));
122 } 118 }
123 } 119 }
124 120
125 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 121 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
126 ("after set key, usconfig:%x\n", us_config)); 122 ("after set key, usconfig:%x\n", us_config));
127} 123}
128 124
@@ -289,3 +285,71 @@ void rtl_cam_empty_entry(struct ieee80211_hw *hw, u8 uc_index)
289 285
290} 286}
291EXPORT_SYMBOL(rtl_cam_empty_entry); 287EXPORT_SYMBOL(rtl_cam_empty_entry);
288
289u8 rtl_cam_get_free_entry(struct ieee80211_hw *hw, u8 *sta_addr)
290{
291 struct rtl_priv *rtlpriv = rtl_priv(hw);
292 u32 bitmap = (rtlpriv->sec.hwsec_cam_bitmap) >> 4;
293 u8 entry_idx = 0;
294 u8 i, *addr;
295
296 if (NULL == sta_addr) {
297 RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
298 ("sta_addr is NULL.\n"));
299 return TOTAL_CAM_ENTRY;
300 }
301 /* Does STA already exist? */
302 for (i = 4; i < TOTAL_CAM_ENTRY; i++) {
303 addr = rtlpriv->sec.hwsec_cam_sta_addr[i];
304 if (memcmp(addr, sta_addr, ETH_ALEN) == 0)
305 return i;
306 }
307 /* Get a free CAM entry. */
308 for (entry_idx = 4; entry_idx < TOTAL_CAM_ENTRY; entry_idx++) {
309 if ((bitmap & BIT(0)) == 0) {
310 RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
311 ("-----hwsec_cam_bitmap: 0x%x entry_idx=%d\n",
312 rtlpriv->sec.hwsec_cam_bitmap, entry_idx));
313 rtlpriv->sec.hwsec_cam_bitmap |= BIT(0) << entry_idx;
314 memcpy(rtlpriv->sec.hwsec_cam_sta_addr[entry_idx],
315 sta_addr, ETH_ALEN);
316 return entry_idx;
317 }
318 bitmap = bitmap >> 1;
319 }
320 return TOTAL_CAM_ENTRY;
321}
322EXPORT_SYMBOL(rtl_cam_get_free_entry);
323
324void rtl_cam_del_entry(struct ieee80211_hw *hw, u8 *sta_addr)
325{
326 struct rtl_priv *rtlpriv = rtl_priv(hw);
327 u32 bitmap;
328 u8 i, *addr;
329
330 if (NULL == sta_addr) {
331 RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
332 ("sta_addr is NULL.\n"));
333 }
334
335 if ((sta_addr[0]|sta_addr[1]|sta_addr[2]|sta_addr[3]|\
336 sta_addr[4]|sta_addr[5]) == 0) {
337 RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
338 ("sta_addr is 00:00:00:00:00:00.\n"));
339 return;
340 }
341 /* Does STA already exist? */
342 for (i = 4; i < TOTAL_CAM_ENTRY; i++) {
343 addr = rtlpriv->sec.hwsec_cam_sta_addr[i];
344 bitmap = (rtlpriv->sec.hwsec_cam_bitmap) >> i;
345 if (((bitmap & BIT(0)) == BIT(0)) &&
346 (memcmp(addr, sta_addr, ETH_ALEN) == 0)) {
347 /* Remove from HW Security CAM */
348 memset(rtlpriv->sec.hwsec_cam_sta_addr[i], 0, ETH_ALEN);
349 rtlpriv->sec.hwsec_cam_bitmap &= ~(BIT(0) << i);
350 printk(KERN_INFO "&&&&&&&&&del entry %d\n", i);
351 }
352 }
353 return;
354}
355EXPORT_SYMBOL(rtl_cam_del_entry);
diff --git a/drivers/net/wireless/rtlwifi/cam.h b/drivers/net/wireless/rtlwifi/cam.h
index dd82f057d53..c62da4eefc7 100644
--- a/drivers/net/wireless/rtlwifi/cam.h
+++ b/drivers/net/wireless/rtlwifi/cam.h
@@ -23,12 +23,13 @@
23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24 * Hsinchu 300, Taiwan. 24 * Hsinchu 300, Taiwan.
25 * 25 *
26 * Larry Finger <Larry.Finger@lwfinger.net>
27 *
26 *****************************************************************************/ 28 *****************************************************************************/
27 29
28#ifndef __RTL_CAM_H_ 30#ifndef __RTL_CAM_H_
29#define __RTL_CAM_H_ 31#define __RTL_CAM_H_
30 32
31#define TOTAL_CAM_ENTRY 32
32#define CAM_CONTENT_COUNT 8 33#define CAM_CONTENT_COUNT 8
33 34
34#define CFG_DEFAULT_KEY BIT(5) 35#define CFG_DEFAULT_KEY BIT(5)
@@ -49,5 +50,7 @@ int rtl_cam_delete_one_entry(struct ieee80211_hw *hw, u8 *mac_addr,
49void rtl_cam_mark_invalid(struct ieee80211_hw *hw, u8 uc_index); 50void rtl_cam_mark_invalid(struct ieee80211_hw *hw, u8 uc_index);
50void rtl_cam_empty_entry(struct ieee80211_hw *hw, u8 uc_index); 51void rtl_cam_empty_entry(struct ieee80211_hw *hw, u8 uc_index);
51void rtl_cam_reset_sec_info(struct ieee80211_hw *hw); 52void rtl_cam_reset_sec_info(struct ieee80211_hw *hw);
53u8 rtl_cam_get_free_entry(struct ieee80211_hw *hw, u8 *sta_addr);
54void rtl_cam_del_entry(struct ieee80211_hw *hw, u8 *sta_addr);
52 55
53#endif 56#endif