diff options
author | David S. Miller <davem@davemloft.net> | 2011-05-05 17:09:28 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-05-05 17:09:28 -0400 |
commit | 90864fbc7639d7a2300c67a18c9fb9fbcf7d51d2 (patch) | |
tree | 6951c8d0e529dbfc7c4cec75d4cec63350e39b7c /drivers/net/wireless/rtlwifi/cam.c | |
parent | 228e548e602061b08ee8e8966f567c12aa079682 (diff) | |
parent | a70171dce9cd44cb06c7d299eba9fa87a8933045 (diff) |
Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
Diffstat (limited to 'drivers/net/wireless/rtlwifi/cam.c')
-rw-r--r-- | drivers/net/wireless/rtlwifi/cam.c | 106 |
1 files changed, 85 insertions, 21 deletions
diff --git a/drivers/net/wireless/rtlwifi/cam.c b/drivers/net/wireless/rtlwifi/cam.c index 52c9c1367cac..7295af0536b7 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 | } |
291 | EXPORT_SYMBOL(rtl_cam_empty_entry); | 287 | EXPORT_SYMBOL(rtl_cam_empty_entry); |
288 | |||
289 | u8 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 | } | ||
322 | EXPORT_SYMBOL(rtl_cam_get_free_entry); | ||
323 | |||
324 | void 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 | } | ||
355 | EXPORT_SYMBOL(rtl_cam_del_entry); | ||