mtwifi: add mt7603 and mt7612 support (Thx MeIsReallyBa and TangHaili)
This commit is contained in:
parent
5bce2927c6
commit
2a4bc4a3ef
@ -4,10 +4,10 @@ PKG_LICENSE:=GPLv2
|
||||
PKG_MAINTAINER:=Hua Shao <nossiac@163.com>
|
||||
|
||||
LUCI_TITLE:=LuCI support for mt wifi driver
|
||||
LUCI_DEPENDS:=@TARGET_ramips +kmod-mt_wifi
|
||||
LUCI_DEPENDS:=@TARGET_ramips +mt_wifi
|
||||
LUCI_PKGARCH:=all
|
||||
PKG_VERSION:=1
|
||||
PKG_RELEASE:=8
|
||||
PKG_RELEASE:=12
|
||||
|
||||
define Package/luci-app-mtwifi/conffiles
|
||||
/etc/wireless/mt7615/
|
||||
|
||||
@ -120,9 +120,9 @@ function dev_cfg(devname)
|
||||
if mimo == "0" then
|
||||
cfgs.ETxBfEnCond=1
|
||||
cfgs.MUTxRxEnable=0
|
||||
cfgs.ITxBfEn=0
|
||||
cfgs.ITxBfEn=1
|
||||
elseif mimo == "1" then
|
||||
cfgs.ETxBfEnCond=0
|
||||
cfgs.ETxBfEnCond=1
|
||||
cfgs.MUTxRxEnable=0
|
||||
cfgs.ITxBfEn=1
|
||||
elseif mimo == "2" then
|
||||
@ -131,24 +131,16 @@ function dev_cfg(devname)
|
||||
cfgs.ITxBfEn=1
|
||||
elseif mimo == "3" then
|
||||
cfgs.ETxBfEnCond=1
|
||||
if tonumber(cfgs.ApCliEnable) == 1 then
|
||||
cfgs.MUTxRxEnable=3
|
||||
else
|
||||
cfgs.MUTxRxEnable=1
|
||||
end
|
||||
cfgs.ITxBfEn=0
|
||||
cfgs.MUTxRxEnable=0
|
||||
cfgs.ITxBfEn=1
|
||||
elseif mimo == "4" then
|
||||
cfgs.ETxBfEnCond=1
|
||||
if tonumber(cfgs.ApCliEnable) == 1 then
|
||||
cfgs.MUTxRxEnable=3
|
||||
else
|
||||
cfgs.MUTxRxEnable=1
|
||||
end
|
||||
cfgs.MUTxRxEnable=0
|
||||
cfgs.ITxBfEn=1
|
||||
else
|
||||
cfgs.ETxBfEnCond=0
|
||||
cfgs.MUTxRxEnable=0
|
||||
cfgs.ITxBfEn=0
|
||||
cfgs.ETxBfEnCond=1
|
||||
cfgs.MUTxRxEnable=0
|
||||
cfgs.ITxBfEn=1
|
||||
end
|
||||
|
||||
-- if cfgs.ApCliEnable == "1" then
|
||||
|
||||
@ -37,7 +37,7 @@ local cfgs = mtkwifi.load_profile(dev.profile)
|
||||
|
||||
<form method="post" name="cbi" action="<%=luci.dispatcher.build_url("admin", "network", "wifi", "dev_cfg", devname)%>" enctype="multipart/form-data" onreset="return cbi_validate_reset(this)" onsubmit="return cbi_validate_form(this, 'Some fields are invalid, cannot save values!')" autocomplete="false">
|
||||
<fieldset class="cbi-section">
|
||||
<legend> Device Configurations - <%=devname%>
|
||||
<legend> 无线高级设置 - <%=devname%>
|
||||
<%
|
||||
local diff = mtkwifi.diff_profile(dev.profile)
|
||||
if next(diff) ~= nil then
|
||||
@ -50,7 +50,7 @@ if next(diff) ~= nil then
|
||||
<table id="dev-cfg-basic" class="cbi-section-table">
|
||||
<tr><th></th><td></td><td></td></tr>
|
||||
<tr>
|
||||
<td>Mode</td>
|
||||
<td>模式</td>
|
||||
<td>
|
||||
<select style="width:auto" name="WirelessMode" id="WirelessMode" onchange="WirelessMode_onchange(this.options[this.options.selectedIndex].value)">
|
||||
<% for k,v in pairs(dev.WirelessModeList) do %>
|
||||
@ -61,7 +61,7 @@ if next(diff) ~= nil then
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Channel</td>
|
||||
<td>信道</td>
|
||||
<td>
|
||||
<select style="width:auto; min-width:180px;" name="Channel" id="Channel" onchange="Channel_onchange(this.value)" <% if cfgs.ApCliEnable == "1" then %> disabled="disabled" <% end %>>
|
||||
</select>
|
||||
@ -69,7 +69,7 @@ if next(diff) ~= nil then
|
||||
<td><% if cfgs.ApCliEnable == "1" then %> APClient/Repeater Mode. <% end %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Country Code</td>
|
||||
<td>区域代码</td>
|
||||
<td>
|
||||
<select name="CountryCode" style="width:auto">
|
||||
<option value="US" id="advCountryCodeUS" <% if cfgs.CountryCode == "US" then %> selected="selected"<% end %>>US (United States)</option>
|
||||
@ -93,11 +93,11 @@ if next(diff) ~= nil then
|
||||
</tr>
|
||||
<% if cfgs.HT_OpMode then %>
|
||||
<tr>
|
||||
<td>Operating Mode</td>
|
||||
<td>无线模式</td>
|
||||
<td>
|
||||
<select style="width:auto" name="HT_OpMode">
|
||||
<option value="0" <% if cfgs.HT_OpMode == "0" then %> selected="selected"<% end%>>Mixed Mode</option>
|
||||
<option value="1" <% if cfgs.HT_OpMode == "1" then %> selected="selected"<% end%>>Green Field</option>
|
||||
<option value="0" <% if cfgs.HT_OpMode == "0" then %> selected="selected"<% end%>>正常模式</option>
|
||||
<option value="1" <% if cfgs.HT_OpMode == "1" then %> selected="selected"<% end%>>绿色模式</option>
|
||||
</select>
|
||||
</td>
|
||||
<td></td>
|
||||
@ -117,7 +117,7 @@ if next(diff) ~= nil then
|
||||
</tr>
|
||||
<% end %>
|
||||
<tr>
|
||||
<td>Channel BandWidth</td>
|
||||
<td>信道带宽</td>
|
||||
<td>
|
||||
<select style="width:auto" name="__bw" id="__bw" onchange="Bw_onchange(this.options[this.options.selectedIndex].value)">
|
||||
<option value="20" <% if dev.__bw == "20" then %> selected="selected"<% end%>>20 MHz</option>
|
||||
@ -132,7 +132,7 @@ if next(diff) ~= nil then
|
||||
</tr>
|
||||
<% if cfgs.VHT_BW then %>
|
||||
<tr>
|
||||
<td>2G 40Mhz Ext Channel</td>
|
||||
<td>2G 40MHZ模式辅助信道</td>
|
||||
<td>
|
||||
<select style="width:auto; min-width:180px;" name="HT_EXTCHA" id="HT_EXTCHA" <% if cfgs.ApCliEnable == "1" or dev.__bw ~= "40" or dev.__bw ~= "60" then %> disabled="disabled" <% end %>>
|
||||
</select>
|
||||
@ -152,8 +152,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>STBC</td>
|
||||
<td>
|
||||
<input type="radio" name="HT_STBC" value="1" <% if cfgs.HT_STBC == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="HT_STBC" value="0" <% if cfgs.HT_STBC == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="HT_STBC" value="1" <% if cfgs.HT_STBC == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="HT_STBC" value="0" <% if cfgs.HT_STBC == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -162,8 +162,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>A-MSDU</td>
|
||||
<td>
|
||||
<input type="radio" name="HT_AMSDU" value="1" <% if cfgs.HT_AMSDU == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="HT_AMSDU" value="0" <% if cfgs.HT_AMSDU == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="HT_AMSDU" value="1" <% if cfgs.HT_AMSDU == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="HT_AMSDU" value="0" <% if cfgs.HT_AMSDU == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -172,8 +172,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>Auto Block ACK</td>
|
||||
<td>
|
||||
<input type="radio" name="HT_AutoBA" value="1" <% if cfgs.HT_AutoBA == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="HT_AutoBA" value="0" <% if cfgs.HT_AutoBA == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="HT_AutoBA" value="1" <% if cfgs.HT_AutoBA == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="HT_AutoBA" value="0" <% if cfgs.HT_AutoBA == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -182,8 +182,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>Decline BA Request</td>
|
||||
<td>
|
||||
<input type="radio" name="HT_BADecline" value="1" <% if cfgs.HT_BADecline == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="HT_BADecline" value="0" <% if cfgs.HT_BADecline == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="HT_BADecline" value="1" <% if cfgs.HT_BADecline == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="HT_BADecline" value="0" <% if cfgs.HT_BADecline == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -192,8 +192,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>HT Disallow TKIP</td>
|
||||
<td>
|
||||
<input type="radio" name="HT_DisallowTKIP" value="1" <% if cfgs.HT_DisallowTKIP == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="HT_DisallowTKIP" value="0" <% if cfgs.HT_DisallowTKIP == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="HT_DisallowTKIP" value="1" <% if cfgs.HT_DisallowTKIP == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="HT_DisallowTKIP" value="0" <% if cfgs.HT_DisallowTKIP == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -202,8 +202,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>HT LDPC</td>
|
||||
<td>
|
||||
<input type="radio" name="HT_LDPC" value="1" <% if cfgs.HT_LDPC == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="HT_LDPC" value="0" <% if cfgs.HT_LDPC == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="HT_LDPC" value="1" <% if cfgs.HT_LDPC == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="HT_LDPC" value="0" <% if cfgs.HT_LDPC == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -224,8 +224,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>VHT STBC</td>
|
||||
<td>
|
||||
<input type="radio" name="VHT_STBC" value="1" <% if cfgs.VHT_STBC == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="VHT_STBC" value="0" <% if cfgs.VHT_STBC == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="VHT_STBC" value="1" <% if cfgs.VHT_STBC == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="VHT_STBC" value="0" <% if cfgs.VHT_STBC == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -234,8 +234,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>VHT BW Signaling</td>
|
||||
<td>
|
||||
<input type="radio" name="VHT_BW_SIGNAL" value="1" <% if cfgs.VHT_BW_SIGNAL == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="VHT_BW_SIGNAL" value="0" <% if cfgs.VHT_BW_SIGNAL == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="VHT_BW_SIGNAL" value="1" <% if cfgs.VHT_BW_SIGNAL == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="VHT_BW_SIGNAL" value="0" <% if cfgs.VHT_BW_SIGNAL == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
<input type="radio" name="VHT_BW_SIGNAL" value="0" <% if cfgs.VHT_BW_SIGNAL == "2" then %> checked="checked"<% end %>/> Dynamic
|
||||
</td>
|
||||
<td></td>
|
||||
@ -245,8 +245,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>VHT LDPC</td>
|
||||
<td>
|
||||
<input type="radio" name="VHT_LDPC" value="1" <% if cfgs.VHT_LDPC == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="VHT_LDPC" value="0" <% if cfgs.VHT_LDPC == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="VHT_LDPC" value="1" <% if cfgs.VHT_LDPC == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="VHT_LDPC" value="0" <% if cfgs.VHT_LDPC == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -268,8 +268,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>HT Protection</td>
|
||||
<td>
|
||||
<input type="radio" name="HT_PROTECT" value="1" <% if cfgs.HT_PROTECT == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="HT_PROTECT" value="0" <% if cfgs.HT_PROTECT == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="HT_PROTECT" value="1" <% if cfgs.HT_PROTECT == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="HT_PROTECT" value="0" <% if cfgs.HT_PROTECT == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -278,7 +278,7 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>Beacon Interval</td>
|
||||
<td>
|
||||
<input name="BeaconPeriod" value="<%=cfgs.BeaconPeriod%>" />ms(range 20-999, default 100)
|
||||
<input name="BeaconPeriod" value="<%=cfgs.BeaconPeriod%>" />ms(范围 20-999, 默认值 100)
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -287,7 +287,7 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>Data Beacon Rate (DTIM)</td>
|
||||
<td>
|
||||
<input name="DtimPeriod" value="<%=cfgs.DtimPeriod%>" />ms(range 1-255, default 1)
|
||||
<input name="DtimPeriod" value="<%=cfgs.DtimPeriod%>" />ms(范围 1-255, 默认值 1)
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -296,7 +296,7 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>Fragment Threshold</td>
|
||||
<td>
|
||||
<input name="FragThreshold" value="<%=cfgs.FragThreshold%>" />(range 256-2346, default 2346)
|
||||
<input name="FragThreshold" value="<%=cfgs.FragThreshold%>" />(范围 256-2346, 默认值 2346)
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -305,7 +305,7 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>RTS Threshold</td>
|
||||
<td>
|
||||
<input name="RTSThreshold" value="<%=cfgs.RTSThreshold%>" />(range 256-2347, default 2347)
|
||||
<input name="RTSThreshold" value="<%=cfgs.RTSThreshold%>" />(范围 256-2347, 默认值 2347)
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -314,7 +314,7 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>TX Power</td>
|
||||
<td>
|
||||
<input name="TxPower" value="<%=cfgs.TxPower%>" />dbm(range 1-100, default 100)
|
||||
<input name="TxPower" value="<%=cfgs.TxPower%>" />dbm(范围 1-100, 默认值 100)
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -323,8 +323,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>Short Preamble</td>
|
||||
<td>
|
||||
<input type="radio" name="TxPreamble" value="1" <% if cfgs.TxPreamble == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="TxPreamble" value="0" <% if cfgs.TxPreamble == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="TxPreamble" value="1" <% if cfgs.TxPreamble == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="TxPreamble" value="0" <% if cfgs.TxPreamble == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -333,8 +333,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>Short Slot</td>
|
||||
<td>
|
||||
<input type="radio" name="ShortSlot" value="1" <% if cfgs.ShortSlot == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="ShortSlot" value="0" <% if cfgs.ShortSlot == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="ShortSlot" value="1" <% if cfgs.ShortSlot == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="ShortSlot" value="0" <% if cfgs.ShortSlot == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -343,8 +343,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>TX Burst</td>
|
||||
<td>
|
||||
<input type="radio" name="TxBurst" value="1" <% if cfgs.TxBurst == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="TxBurst" value="0" <% if cfgs.TxBurst == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="TxBurst" value="1" <% if cfgs.TxBurst == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="TxBurst" value="0" <% if cfgs.TxBurst == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -353,8 +353,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>Packet Aggregate</td>
|
||||
<td>
|
||||
<input type="radio" name="PktAggregate" value="1" <% if cfgs.PktAggregate == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="PktAggregate" value="0" <% if cfgs.PktAggregate == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="PktAggregate" value="1" <% if cfgs.PktAggregate == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="PktAggregate" value="0" <% if cfgs.PktAggregate == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -363,8 +363,8 @@ if next(diff) ~= nil then
|
||||
<tr>
|
||||
<td>802.11H</td>
|
||||
<td>
|
||||
<input type="radio" name="IEEE80211H" value="1" <% if cfgs.IEEE80211H == "1" then %> checked="checked"<% end %>/> Enable
|
||||
<input type="radio" name="IEEE80211H" value="0" <% if cfgs.IEEE80211H == "0" then %> checked="checked"<% end %>/> Disable
|
||||
<input type="radio" name="IEEE80211H" value="1" <% if cfgs.IEEE80211H == "1" then %> checked="checked"<% end %>/> 启用
|
||||
<input type="radio" name="IEEE80211H" value="0" <% if cfgs.IEEE80211H == "0" then %> checked="checked"<% end %>/> 禁用
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
@ -374,18 +374,18 @@ if next(diff) ~= nil then
|
||||
|
||||
</fieldset>
|
||||
<div class="cbi-page-actions">
|
||||
<input class="cbi-button cbi-button-apply" value="Reload" type="button" onclick='wifi_reload("<%=luci.dispatcher.build_url("admin", "network", "wifi", "reload", devname)%>");' />
|
||||
<input class="cbi-button cbi-button-apply" value="Save" type="submit" />
|
||||
<input class="cbi-button cbi-button-apply" name="__apply" value="Save & Apply" type="submit" />
|
||||
<input class="cbi-button cbi-button-reset" value="Reset" type="reset" />
|
||||
<input class="cbi-button cbi-button-apply" value="重启无线" type="button" onclick='wifi_reload("<%=luci.dispatcher.build_url("admin", "network", "wifi", "reload", devname)%>");' />
|
||||
<input class="cbi-button cbi-button-apply" value="保存设置" type="submit" />
|
||||
<input class="cbi-button cbi-button-apply" name="__apply" value="保存&应用" type="submit" />
|
||||
<input class="cbi-button cbi-button-reset" value="重置" type="reset" />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
<form method="post" name="cbi2" action="<%=luci.dispatcher.build_url("admin", "network", "wifi", "dev_cfg_raw", devname)%>" enctype="multipart/form-data" onreset="return cbi_validate_reset(this)" onsubmit="return cbi_validate_form(this, 'Some fields are invalid, cannot save values!')" autocomplete="off">
|
||||
<fieldset class="cbi-section">
|
||||
<legend> Raw Configurations ( Edit WiFi profile directly )</legend>
|
||||
<p> <span style="color: red"><b>WARNING</b></span> : DO NOT MESS WITH IT IF YOU DON'T UNDERSTAND IT!</p>
|
||||
<legend> 无线参数(直接修改无线配置)</legend>
|
||||
<p> <span style="color: red"><b>警告</b></span> : 如果你不了解请不要修改!</p>
|
||||
<textarea name="raw" id="raw" style="width:98%; height: 200px;"><%
|
||||
local fd = io.open(dev.profile)
|
||||
for line in fd:lines() do
|
||||
@ -394,9 +394,9 @@ if next(diff) ~= nil then
|
||||
%></textarea>
|
||||
</fieldset>
|
||||
<div class="cbi-page-actions">
|
||||
<input class="cbi-button cbi-button-reset" value="Reset" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "dev_cfg_view", devname)%>'" type="button" />
|
||||
<input class="cbi-button cbi-button-apply" id="save" value="Save" type="submit" onclick="if (confirm('You are going to overwrite the profile directly, are you sure?')) return true; else return false;" />
|
||||
<input class="cbi-button cbi-button-apply" id="reset" value="Restore Profile to Factory Setting" type="button" onclick="if (confirm('You are going to reset the profile of <%=devname%> to factory default, are you sure?')) location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "dev_cfg_reset", devname)%>'" />
|
||||
<input class="cbi-button cbi-button-reset" value="重置" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "dev_cfg_view", devname)%>'" type="button" />
|
||||
<input class="cbi-button cbi-button-apply" id="save" value="保存" type="submit" onclick="if (confirm('你将修改无线参数,确认要修改?')) return true; else return false;" />
|
||||
<input class="cbi-button cbi-button-apply" id="reset" value="恢复出厂设置" type="button" onclick="if (confirm(' 确认恢复<%=devname%> 至出厂设置?')) location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "dev_cfg_reset", devname)%>'" />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
@ -47,9 +47,9 @@ local devs = mtkwifi.get_all_devs()
|
||||
<span><strong>模式:</strong> <% if dev.ApCliEnable == "1" then %> APCli <% else %> Master AP<% end %> </span>
|
||||
</td>
|
||||
<td style="width:310px;text-align:right">
|
||||
<input class="cbi-button cbi-button-reload" style="width:100px" title="Reload WiFi network" value="重新加载" type="button" onclick='wifi_reload("<%=luci.dispatcher.build_url("admin", "network", "wifi", "reload", dev.devname)%>");' />
|
||||
<input class="cbi-button cbi-button-edit" style="width:100px" title="Configure WiFi device" value="修改" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "dev_cfg_view", dev.devname)%>'" />
|
||||
<input class="cbi-button cbi-button-add" style="width:100px" title="Add WiFi network" value="添加" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "vif_add_view", dev.devname,dev.vifs.__prefix)%>'" />
|
||||
<input class="cbi-button cbi-button-reload" style="width:100px" title="重启无线" value="重启无线" type="button" onclick='wifi_reload("<%=luci.dispatcher.build_url("admin", "network", "wifi", "reload", dev.devname)%>");' />
|
||||
<input class="cbi-button cbi-button-edit" style="width:100px" title="配置无线高级设置" value="高级设置" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "dev_cfg_view", dev.devname)%>'" />
|
||||
<input class="cbi-button cbi-button-add" style="width:100px" title="添加SSID" value="添加" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "vif_add_view", dev.devname,dev.vifs.__prefix)%>'" />
|
||||
</td>
|
||||
</tr>
|
||||
<!-- /physical device -->
|
||||
@ -64,7 +64,7 @@ local devs = mtkwifi.get_all_devs()
|
||||
<img src="/luci-static/resources/icons/signal-none.png" />
|
||||
<% end %>
|
||||
</td>
|
||||
<td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px"><strong>Interface:</strong> <%=vif.vifname%> | <strong>SSID:</strong> <%=vif.__ssid%> | <strong>信道:</strong> <%=vif.__channel or dev.Channel%>
|
||||
<td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px"><strong>接口:</strong> <%=vif.vifname%> | <strong>无线名称:</strong> <%=vif.__ssid%> | <strong>信道:</strong> <%=vif.__channel or dev.Channel%>
|
||||
<br/>
|
||||
<% if vif.state == "up" then %>
|
||||
<strong>BSSID:</strong>:<%=vif.__bssid%> | <strong>无线模式:</strong> <%=dev.WirelessModeList[tonumber(vif.__wirelessmode or dev.WirelessMode)]%>
|
||||
@ -74,14 +74,14 @@ local devs = mtkwifi.get_all_devs()
|
||||
</td>
|
||||
<td class="cbi-value-field" style="text-align:right">
|
||||
<% if not vif.state then %>
|
||||
<input class="cbi-button cbi-button-apply" style="width:100px" title="Enable this network" value="启用" type="button" onclick="alert('Please restart manually to create this interface.')" />
|
||||
<input class="cbi-button cbi-button-apply" style="width:100px" title="启用无线" value="启用" type="button" onclick="alert('Please restart manually to create this interface.')" />
|
||||
<% elseif vif.state == "up" then %>
|
||||
<input class="cbi-button cbi-button-reset" style="width:100px" title="Disable this network" value="停用" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "vif_disable", vif.vifname)%>'" />
|
||||
<input class="cbi-button cbi-button-reset" style="width:100px" title="禁用无线" value="停用" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "vif_disable", vif.vifname)%>'" />
|
||||
<% else %>
|
||||
<input class="cbi-button cbi-button-apply" style="width:100px" title="Enable this network" value="启用" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "vif_enable", vif.vifname)%>'" />
|
||||
<input class="cbi-button cbi-button-apply" style="width:100px" title="禁用无线" value="启用" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "vif_enable", vif.vifname)%>'" />
|
||||
<% end %>
|
||||
<input class="cbi-button cbi-button-edit" style="width:100px" title="Edit this network" value="修改" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "vif_cfg_view", dev.devname, vif.vifname)%>'" />
|
||||
<input class="cbi-button cbi-button-remove" style="width:100px" title="Delete this network" value="移除" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "vif_del", dev.devname, vif.vifname)%>'" />
|
||||
<input class="cbi-button cbi-button-edit" style="width:100px" title="修改无线基本设置" value="基本设置" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "vif_cfg_view", dev.devname, vif.vifname)%>'" />
|
||||
<input class="cbi-button cbi-button-remove" style="width:100px" title="删除网络" value="移除" type="button" onclick="location.href='<%=luci.dispatcher.build_url("admin", "network", "wifi", "vif_del", dev.devname, vif.vifname)%>'" />
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
|
||||
@ -68,7 +68,7 @@ local WscValue = mtkwifi.token_get(cfgs["WscConfMode"], vifidx, "0") or "0"
|
||||
</fieldset>
|
||||
<% else %>
|
||||
<fieldset class="cbi-section">
|
||||
<legend>无线配置 - <%=vifname and devname.."@"..vifname or devname%>
|
||||
<legend>无线高级设置 - <%=vifname and devname.."@"..vifname or devname%>
|
||||
<%
|
||||
local diff = mtkwifi.diff_profile(dev.profile)
|
||||
if next(diff) ~= nil then
|
||||
|
||||
61
package/lean/mt-drivers/mt7603e/Makefile
Normal file
61
package/lean/mt-drivers/mt7603e/Makefile
Normal file
@ -0,0 +1,61 @@
|
||||
# All rights reserved.
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v2.
|
||||
# See /LICENSE for more information.
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
|
||||
PKG_NAME:=mt7603e
|
||||
P4REV:=2
|
||||
PKG_VERSION:=4.1.2.0
|
||||
PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/mt7603_wifi
|
||||
PKG_KCONFIG:= \
|
||||
RALINK_MT7620 RALINK_RT7621 RLT_WIFI MT_WIFI_PATH FIRST_IF_MT7603E\
|
||||
FIRST_IF_EEPROM_PROM FIRST_IF_EEPROM_EFUSE FIRST_IF_EEPROM_FLASH RT_FIRST_CARD_EEPROM WIFI_BASIC_FUNC\
|
||||
MULTI_INF_SUPPORT WSC_INCLUDED WSC_V2_SUPPORT DOT11N_DRAFT3 DOT11_VHT_AC DOT11W_PMF_SUPPORT\
|
||||
TXBF_SUPPORT WMM_ACM_SUPPORT QOS_DLS_SUPPORT WAPI_SUPPORT CARRIER_DETECTION_SUPPORT\
|
||||
IGMP_SNOOP_SUPPORT BLOCK_NET_IF RATE_ADAPTION NEW_RATE_ADAPT_SUPPORT AGS_SUPPORT\
|
||||
IDS_SUPPORT WIFI_WORK_QUEUE WIFI_SKB_RECYCLE RTMP_FLASH_SUPPORT LED_CONTROL_SUPPORT\
|
||||
SINGLE_SKU_V2 HW_ANTENNA_DIVERSITY ATE_SUPPORT RT2860V2_AP_V24_DATA_STRUCTURE RT2860V2_AP_32B_DESC\
|
||||
MEMORY_OPTIMIZATION HOTSPOT HOTSPOT_R2 ACL_V2_SUPPORT UAPSD PA_LNA RLT_BBP RLT_RF RTMP_BBP RTMP_RF RLT_MAC RLT_BBP RLT_RF RTMP_MAC RTMP_BBP RTMP_RF \
|
||||
RTMP_PCI_SUPPORT RTMP_USB_SUPPORT RTMP_RBUS_SUPPORT RLT_AP_SUPPORT RALINK_MT7603E MT_MAC AP_SUPPORT\
|
||||
WDS_SUPPORT MBSS_SUPPORT NEW_MBSSID_MODE ENHANCE_NEW_MBSSID_MODE APCLI_SUPPORT MULTI_APCLI_SUPPORT \
|
||||
AIRPLAY_SUPPORT MAC_REPEATER_SUPPORT DFS_SUPPORT NINTENDO_AP DOT11K_RRM_SUPPORT RT2860V2_SNMP\
|
||||
LLTD_SUPPORT NINTENDO_AP COC_SUPPORT MULTI_CORE_SUPPORT MCAST_RATE_SPECIFIC PREVENT_ARP_SPOOFING_SUPPORT \
|
||||
EXT_BUILD_CHANNEL_LIST AUTO_CH_SELECT_ENHANCE MEMORY_OPTIMIZATION RTMP_TEMPERATURE_CALIBRATION\
|
||||
SNIFFER_SUPPORT CFG80211_SUPPORT SNIFFER_MIB_CMD ALL_NET_EVENT
|
||||
|
||||
|
||||
PKG_CONFIG_DEPENDS:=$(foreach c, $(PKG_KCONFIG),$(if $(CONFIG_$c),CONFIG_$(c)))
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
TAR_CMD=$(HOST_TAR) -C $(1)/ $(TAR_OPTIONS)
|
||||
|
||||
define KernelPackage/mt7603e
|
||||
CATEGORY:=Kernel modules
|
||||
TITLE:=MTK wifi AP driver
|
||||
FILES:=$(PKG_BUILD_DIR)/mt7603_wifi_ap/mt7603e.ko
|
||||
SUBMENU:=Wireless Drivers
|
||||
MENU:=1
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7603e/config
|
||||
source "$(SOURCE)/config.in"
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C "$(LINUX_DIR)" V=1 \
|
||||
CROSS_COMPILE="$(TARGET_CROSS)" \
|
||||
ARCH="$(LINUX_KARCH)" \
|
||||
M="$(PKG_BUILD_DIR)/mt7603_wifi_ap" \
|
||||
$(foreach c, $(PKG_KCONFIG),$(if $(CONFIG_MT7603E_$c),CONFIG_$(c)=$(CONFIG_MT7603E_$(c)))) \
|
||||
modules
|
||||
endef
|
||||
|
||||
define KernelPackage/mt7603e/install
|
||||
$(INSTALL_DIR) $(1)/etc/wireless/mt7603/
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,mt7603e))
|
||||
523
package/lean/mt-drivers/mt7603e/config.in
Normal file
523
package/lean/mt-drivers/mt7603e/config.in
Normal file
@ -0,0 +1,523 @@
|
||||
if PACKAGE_kmod-mt7603e
|
||||
|
||||
#if FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
||||
config MT7603E_FIRST_IF_MT7603E
|
||||
bool
|
||||
default y
|
||||
depends on PACKAGE_kmod-mt7603e
|
||||
|
||||
config MT7603E_RLT_WIFI
|
||||
tristate "MT WIFI Driver"
|
||||
default y
|
||||
|
||||
config MT7603E_MT_WIFI_PATH
|
||||
string
|
||||
depends on MT7603E_RLT_WIFI
|
||||
default "rlt_wifi"
|
||||
|
||||
if MT7603E_RLT_WIFI
|
||||
menu "WiFi Generic Feature Options"
|
||||
|
||||
if MT7603E_FIRST_IF_MT7603E
|
||||
choice
|
||||
prompt "EEPROM Type of 1st Card"
|
||||
default MT7603E_FIRST_IF_EEPROM_FLASH
|
||||
#depends on ! FIRST_IF_NONE
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_FLASH
|
||||
bool "FLASH"
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_PROM
|
||||
bool "EEPROM"
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_EFUSE
|
||||
bool "EFUSE"
|
||||
endchoice
|
||||
|
||||
config MT7603E_RT_FIRST_CARD_EEPROM
|
||||
string
|
||||
#depends on ! FIRST_IF_NONE
|
||||
default "prom" if MT7603E_FIRST_IF_EEPROM_PROM
|
||||
default "efuse" if MT7603E_FIRST_IF_EEPROM_EFUSE
|
||||
default "flash" if MT7603E_FIRST_IF_EEPROM_FLASH
|
||||
endif
|
||||
|
||||
config MT7603E_MULTI_INF_SUPPORT
|
||||
bool
|
||||
#default y if !FIRST_IF_NONE && !SECOND_IF_NONE
|
||||
default y
|
||||
|
||||
#config MT7603E_WIFI_BASIC_FUNC
|
||||
# bool "Basic Functions"
|
||||
# select WIRELESS_EXT
|
||||
# select WEXT_SPY
|
||||
# select WEXT_PRIV
|
||||
|
||||
config MT7603E_WSC_INCLUDED
|
||||
bool "WSC (WiFi Simple Config)"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_WSC_V2_SUPPORT
|
||||
bool "WSC V2(WiFi Simple Config Version 2.0)"
|
||||
depends on MT7603E_MMT_WSC_INCLUDED
|
||||
default y
|
||||
config MT7603E_WSC_NFC_SUPPORT
|
||||
bool "WSC out-of-band(NFC)"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
config MT7603E_DOT11N_DRAFT3
|
||||
bool "802.11n Draft3"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
#config MT7603E_DOT11_VHT_AC
|
||||
# bool "802.11 ac"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_DOT11W_PMF_SUPPORT
|
||||
bool "PMF Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_TXBF_SUPPORT
|
||||
bool "Tx Bean Forming Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT7603E_WMM_ACM_SUPPORT
|
||||
# bool "WMM ACM"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_LLTD_SUPPORT
|
||||
bool "LLTD (Link Layer Topology Discovery Protocol)"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_QOS_DLS_SUPPORT
|
||||
bool "802.11e DLS ((Direct-Link Setup) Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WAPI_SUPPORT
|
||||
bool "WAPI Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_CARRIER_DETECTION_SUPPORT
|
||||
bool "Carrier Detect"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_IGMP_SNOOP_SUPPORT
|
||||
bool "IGMP Snooping"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_BLOCK_NET_IF
|
||||
bool "NETIF Block"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
help
|
||||
Support Net interface block while Tx-Sw queue full
|
||||
|
||||
#config MT7603E_MT_TXBF_SUPPORT
|
||||
# bool "Tx Bean Forming Support (Only 3883)"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT2883 || RALINK_RT3883
|
||||
# default n
|
||||
|
||||
#config MT7603E_MT_VIDEO_TURBINE_SUPPORT
|
||||
# bool "Video Turbine support"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT7603E_RATE_ADAPTION
|
||||
# tristate "Ralink Flow Classifier"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_NEW_RATE_ADAPT_SUPPORT
|
||||
bool "New Rate Adaptation support"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_MT_NEW_RATE_ADAPT_SUPPORT
|
||||
bool "Intelligent Rate Adaption"
|
||||
# depends on WIFI_DRIVER && MT_RATE_ADAPTION
|
||||
default y
|
||||
|
||||
config MT7603E_AGS_SUPPORT
|
||||
bool "Adaptive Group Switching"
|
||||
depends on MT7603E_MT_RATE_ADAPTION
|
||||
default n
|
||||
|
||||
config MT7603E_IDS_SUPPORT
|
||||
bool "IDS (Intrusion Detection System) Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WIFI_WORK_QUEUE
|
||||
bool "Work Queue"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WIFI_SKB_RECYCLE
|
||||
bool "SKB Recycle(Linux)"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RTMP_FLASH_SUPPORT
|
||||
bool "Flash Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_LED_CONTROL_SUPPORT
|
||||
bool "LED Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_SINGLE_SKU
|
||||
bool "Single SKU"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_SINGLE_SKU_V2
|
||||
bool "Single SKU V2"
|
||||
depends on MT7603E_SINGLE_SKU && RALINK_RT6352
|
||||
default n
|
||||
|
||||
config MT7603E_HW_ANTENNA_DIVERSITY
|
||||
bool "Antenna Diversity Support"
|
||||
depends on MT7603E_RLT_AP_SUPPORT || MT7603E_RLT_STA_SUPPORT
|
||||
depends on RALINK_RT5350
|
||||
default n
|
||||
|
||||
config MT7603E_ATE_SUPPORT
|
||||
bool "ATE/QA Support"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_RT2860V2_AP_V24_DATA_STRUCTURE
|
||||
bool
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_RT2860V2_AP_32B_DESC
|
||||
bool "32 Byte Descriptor Support"
|
||||
# depends on WIFI_DRIVER
|
||||
depends on RALINK_RT6352 || RALINK_MT7620
|
||||
default n
|
||||
|
||||
config MT7603E_MEMORY_OPTIMIZATION
|
||||
bool "Memory Optimization"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT7603E_RTMP_INTERNAL_TX_ALC
|
||||
# bool "TSSI Compensation"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350 || RALINK_RT6352
|
||||
# default n
|
||||
|
||||
#config MT7603E_RTMP_TEMPERATURE_CALIBRATION
|
||||
# bool "Temperature Calibration"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT6352
|
||||
# default n
|
||||
|
||||
config MT7603E_HOTSPOT
|
||||
bool "Passpoint-R1"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_MT_HOTSPOT_R2
|
||||
bool "Passpoint Release-2 Support"
|
||||
depends on HOTSPOT
|
||||
select MT7603E_MT_DOT11W_PMF_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_MT_RTMP_TEMPERATURE_TX_ALC
|
||||
bool "Temperature Tx Power Compensation"
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_UAPSD
|
||||
bool "UAPSD support"
|
||||
# depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
|
||||
#
|
||||
# Section for chip architectures
|
||||
#
|
||||
# "RLT MAC Support"
|
||||
config MT7603E_RLT_MAC
|
||||
bool
|
||||
# depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RLT_BBP
|
||||
bool
|
||||
|
||||
config MT7603E_RLT_RF
|
||||
bool
|
||||
|
||||
# "RTMP MAC Support"
|
||||
config MT7603E_RTMP_MAC
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RTMP_BBP
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_RF
|
||||
bool
|
||||
|
||||
#config MT7603E_MT_EPA_ELNA
|
||||
# bool "ePAeLNA"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
#choice
|
||||
# prompt "PA,LNA Type"
|
||||
# depends on MT7603E_MT_WIFI
|
||||
#
|
||||
# config MT7603E_MT_IPA_ILNA
|
||||
# bool "iPAiLNA"
|
||||
#
|
||||
# config MT7603E_MT_IPA_ELNA
|
||||
# bool "iPAeLNA"
|
||||
#
|
||||
# config MT7603E_MT_EPA_ILNA
|
||||
# bool "ePAiLNA"
|
||||
#
|
||||
# config MT7603E_MT_EPA_ELNA
|
||||
# bool "ePAeLNA"
|
||||
#endchoice
|
||||
#
|
||||
#config MT7603E_MT_PA_LNA
|
||||
# string
|
||||
# depends on MT7603E_MT_WIFI
|
||||
# default "iPAiLNA" if MT7603E_MT_IPA_ILNA
|
||||
# default "iPAeLNA" if MT7603E_MT_IPA_ELNA
|
||||
# default "ePAiLNA" if MT7603E_MT_EPA_ILNA
|
||||
# default "ePAeLNA" if MT7603E_MT_EPA_ELNA
|
||||
#
|
||||
#
|
||||
# Section for chip architectures
|
||||
#
|
||||
# "RLT MAC Support"
|
||||
#config MT7603E_RLT_MAC
|
||||
# bool
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT7603E_RLT_BBP
|
||||
# bool
|
||||
|
||||
#config MT7603E_RLT_RF
|
||||
# bool
|
||||
|
||||
# "RTMP MAC Support"
|
||||
#config MT7603E_RTMP_MAC
|
||||
# bool
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT7603E_RTMP_BBP
|
||||
# bool
|
||||
|
||||
#config MT7603E_RTMP_RF
|
||||
# bool
|
||||
|
||||
#
|
||||
# Section for interfaces
|
||||
#
|
||||
config MT7603E_RTMP_PCI_SUPPORT
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_USB_SUPPORT
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_RBUS_SUPPORT
|
||||
bool
|
||||
|
||||
endmenu
|
||||
|
||||
menu "WiFi Operation Modes"
|
||||
choice
|
||||
prompt "Main Mode"
|
||||
default MT7603E_MT_WIFI_MODE_AP
|
||||
|
||||
config MT7603E_MT_WIFI_MODE_AP
|
||||
bool "AP"
|
||||
|
||||
config MT7603E_MT_WIFI_MODE_STA
|
||||
bool "STA"
|
||||
|
||||
config MT7603E_MT_WIFI_MODE_BOTH
|
||||
bool "APSTA"
|
||||
endchoice
|
||||
|
||||
if MT7603E_MT_WIFI_MODE_AP || MT7603E_MT_WIFI_MODE_BOTH
|
||||
|
||||
config MT7603E_RLT_AP_SUPPORT
|
||||
tristate "UnifyMAC 802.11n AP support"
|
||||
default y
|
||||
# depends on NET_RADIO
|
||||
select WIRELESS_EXT
|
||||
select WEXT_SPY
|
||||
select WEXT_PRIV
|
||||
|
||||
config MT7603E_WDS_SUPPORT
|
||||
bool "WDS"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_MBSS_SUPPORT
|
||||
bool "MBSSID"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default y
|
||||
|
||||
config MT7603E_NEW_MBSSID_MODE
|
||||
bool "New MBSSID MODE"
|
||||
depends on MT7603E_RLT_AP_SUPPORT && MT7603E_MBSS_SUPPORT
|
||||
# depends on RALINK_RT3883 || RALINK_RT3352 || RALINK_RT5350 || RALINK_RT6352 || RALINK_MT7620 || RALINK_MT7621
|
||||
default n
|
||||
|
||||
config MT7603E_ENHANCE_NEW_MBSSID_MODE
|
||||
bool "Enhanced MBSSID mode"
|
||||
depends on MT7603E_NEW_MBSSID_MODE
|
||||
default n
|
||||
config MT7603E_CFG80211_SUPPORT
|
||||
bool "CFG80211"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_SNIFFER_MIB_CMD
|
||||
bool "SNIFFER_MIB_CMD"
|
||||
depends on MT7603E_SNIFFER_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_ALL_NET_EVENT
|
||||
bool "ALL_NET_EVENT"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_ACL_V2_SUPPORT
|
||||
bool "ACL_V2"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
|
||||
config MT7603E_APCLI_SUPPORT
|
||||
bool "AP-Client Support"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default y
|
||||
config MT7603E_MULTI_APCLI_SUPPORT
|
||||
bool "MULTI AP-Client Support"
|
||||
depends on MT7603E_APCLI_SUPPORT
|
||||
default y
|
||||
config MT7603E_MAC_REPEATER_SUPPORT
|
||||
bool "MAC Repeater Support"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
depends on MT7603E_APCLI_SUPPORT
|
||||
depends on RALINK_RT6352 || RALINK_MT7620 || MT7603E_RALINK_MT7603E
|
||||
default y
|
||||
config MT7603E_AIRPLAY_SUPPORT
|
||||
bool "AirPlay Support"
|
||||
depends on MT7603E_APCLI_SUPPORT
|
||||
|
||||
#config MT7603E_MT_MESH_SUPPORT
|
||||
# bool "MESH Support"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
config MT7603E_DFS_SUPPORT
|
||||
bool "DFS"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
select RALINK_TIMER_DFS
|
||||
|
||||
#config MT7603E_DOT11R_FT_SUPPORT
|
||||
# bool "802.11r Fast BSS Transition"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
#config MT7603E_DOT11K_RRM_SUPPORT
|
||||
# bool "802.11k Radio Resource Management"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
config MT7603E_LLTD_SUPPORT
|
||||
bool "LLTD (Link Layer Topology Discovery Protocol)"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default y
|
||||
|
||||
config MT7603E_NINTENDO_AP
|
||||
bool "Nintendo AP"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
config MT7603E_COC_SUPPORT
|
||||
bool "CoC Support"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
default n
|
||||
|
||||
#config MT7603E_ RT2860V2_SNMP
|
||||
# bool "Net-SNMP Support"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
config MT7603E_MCAST_RATE_SPECIFIC
|
||||
bool "User specific tx rate of mcast pkt"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
config MT7603E_PREVENT_ARP_SPOOFING_SUPPORT
|
||||
bool "Detect ARP spoof pkts attack"
|
||||
depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
#config MT7603E_EXT_BUILD_CHANNEL_LIST
|
||||
# bool "Extension Channel List"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
#config MT7603E_AUTO_CH_SELECT_ENHANCE
|
||||
# bool "Auto Channel Selection Enhancement"
|
||||
# depends on MT7603E_RLT_AP_SUPPORT
|
||||
|
||||
config MT7603E_MULTI_CORE_SUPPORT
|
||||
bool "multi core support"
|
||||
depends on TARGET_ramips_mt7621
|
||||
default n
|
||||
|
||||
endif
|
||||
|
||||
source "./src/mt7603_wifi_ap/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
||||
#"MT7603E"
|
||||
config MT7603E_RALINK_MT7603E
|
||||
bool
|
||||
default y
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
endif
|
||||
|
||||
#if MT7603E_RLT_MAC
|
||||
# config MT7603E_RLT_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
#if MT7603E_RTMP_MAC
|
||||
# config MT7603E_RTMP_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
#if MT7603E_MT_MAC
|
||||
if MT7603E_RALINK_MT7603E
|
||||
config MT7603E_MT_MAC
|
||||
bool
|
||||
default y
|
||||
endif
|
||||
#endif MT7603E_MT_WIFI
|
||||
#endif
|
||||
#endif FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
||||
endif
|
||||
96
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/History.txt
Normal file
96
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/History.txt
Normal file
@ -0,0 +1,96 @@
|
||||
Release Note:
|
||||
|
||||
[V4.0.0.7]
|
||||
Host Driver:
|
||||
1. Bug fixed for TGn 4.2.12 PMK caching and 4.2.11 pre-authentication issue.
|
||||
2. Bug fixed for 802.1x issue of WEP encryption.
|
||||
3. Add UAPSD support.
|
||||
4. Add APCLI_AUTO_CONNECT_SUPPORT function.
|
||||
5. Fix MCU INT CR read/write issue.
|
||||
6. modify rate retry rule.
|
||||
7. Fix QA tool: check the writing length to write all to flash.
|
||||
8. Fix memory leak issue when command TxPwr send fail.
|
||||
9. Fix MT7603E load fw fail issue that need to adjust PCIe LDO setting to 1.2V.
|
||||
10. Fix the WSC config status( in beacon & probe resp ) is wrong when we key the wrong DUT's enrolee PIN.
|
||||
11. ATE tool:
|
||||
a. fix txpower can not be set at ATE mode issue.
|
||||
b. Add code for TxTone Power HQADLL command and iwpriv.
|
||||
12. Fix Makefile/Kconfig:
|
||||
a. we should use CONFIG_SINGLE_SKU_V2, not CONFIG_SINGLE_SKU.
|
||||
b. Remove RTMP_TEMPERATURE_TX_ALC because this driver flag is not valid. (controlled by FW)
|
||||
|
||||
F/W:
|
||||
1. Add EDCA and Slot time set command.
|
||||
2. Enable and update CCK_MRC fix.
|
||||
3. Enable TX PA dynamic GC
|
||||
4. Support negative TMAC PWR
|
||||
5. Set CR_TSSI_PA_OFFSET_HPA
|
||||
6. Lower WF0/WF1 TSSI ON TH to 0dBm
|
||||
|
||||
|
||||
[V4.0.0.6 ]
|
||||
Host Driver:
|
||||
1.Add tx power percentage function for iPA
|
||||
2. Modify AP PS, use CR replace AP PS CMD
|
||||
3.fix apcli vs DIR655 IOT can't set ba size to 21
|
||||
4.Set MSSID *7, iPhone5 connect then ping overnight, still ping fail (?¶çˆ¾PSE Redirection bit被è?èµ? STA ping fail)
|
||||
for ps retrieve function, rename "token_enq_fail" to "token_enq_all_fail" to let it more clear.
|
||||
5. MT7603 auto rate update
|
||||
6. Fix [AP][TGn]:4.2.47 Power Save, fail on step 8,each PS poll the station sends to the APUT, the APUT is expected to send only one directed data packet in response.
|
||||
7. Fix TGn 4.2.11 & 4.2.12 PMK cache is delete in Auth. Req.
|
||||
8. add PSE logical reset when detect pse abonormal condition
|
||||
9. add sw based PDMA watchdog to detect & recovery PDMA TX/RX hang
|
||||
|
||||
F/W:
|
||||
Fix PCIE FW download fail when sw reboot, reset HIF then trigger WDT.
|
||||
1. Add DMA scheduler workaround.
|
||||
2. Add Admission control.
|
||||
3. Add TX power % support.
|
||||
|
||||
|
||||
[MT7603E_DPA_LinuxAP_4.0.0.5_20140511]
|
||||
1. Fixed Cal Free IC eeprom endian issue.
|
||||
2. Fixed IOT issue with Linksys WUSB6300.
|
||||
3. AP-client repeater: fixed icv error when authmode/encryptype update.
|
||||
4. Fixed crash issue that tasklet for processing pci dma done for mcu cmd sometimes will execute after event tasklet.
|
||||
5. Update auto fall back config and algorithm.
|
||||
6. Update firmware to fixed FW re-download fail issue.
|
||||
7. Do 802.11 header endian swap for ps retrieve packet.
|
||||
8. Fixed LED command big endian issue.
|
||||
9. Fixed MlmeHardTransmitTxRing cache flush issue that will cause memory for dma and cache non sync at big endian platform.
|
||||
10. Modify check en/disable RTS/CTS conditions.
|
||||
11. Fixed radio on/off cmd parameters to correct value.
|
||||
12. Update patch for flash mode.
|
||||
13. Fixed LED RadioOff issue.
|
||||
14. ATE:
|
||||
a. fixed Tx/Rx antenna switch resulting wrong Tx power level work around.
|
||||
b. patch PCIE ASPM write efuse Add PCIe Compile flag.
|
||||
c. add iwpriv TXCONT
|
||||
d. add iwpriv for carrier suppression test TXCARR
|
||||
e. Initialize Tx power with EEPROM array when ATESTART
|
||||
f. Fix CONFIG_QA blocking setting power when only CONFIG_ATE is chosen
|
||||
|
||||
|
||||
[MT7603E_DPA_LinuxAP_4.0.0.4_20140411]
|
||||
1. Support IGMP Snooping function.
|
||||
2. Fix NewRateAdapt Error in STA mode.
|
||||
3. Fixed apcli ICV error issue to decrypt Broadcast packet from AP.
|
||||
4. Fixed BAR issues:
|
||||
a. Change SW BAR rate to CCK 1M.
|
||||
b. Send SW BAR for ap power saving to refresh peer sta side reordering buffer (Intel IOT).
|
||||
c. Add SW BAR mechanism which SN will control by wtbl per tid.
|
||||
d. Considering the BAR data rate in both 2.4G & 5G
|
||||
e. SendRefreshBar when recv. CmdPsClearRsp, this modify will make sure the 1st. packet in PSE is BAR after PS.
|
||||
5. Update new firmware for BBP issue.
|
||||
6. Upload E1/E2 default EEPROM bin file.
|
||||
7. Fixed ATE bugs for Tx power setting, BW40 channel control, and Rx issue.
|
||||
8. Change MAX_NUMBER_OF_MAC definition to support 32 association STAs.
|
||||
9. Correct ApCli entry setting to fix throughput issue.
|
||||
10. Fix sometimes software tx will stuck since Intel STA in ps mode is very frequently.
|
||||
11. Fine tune TXOP settings.
|
||||
12. Fixed the bug when spatial extension on/off.
|
||||
13. Fixed AP client TKIP/WEP connection issue with Broadcom AP.
|
||||
|
||||
|
||||
[MT7603E_DPA_LinuxAP_4.0.0.4_20140401]
|
||||
1. Init AP Driver version
|
||||
533
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/Kconfig
Normal file
533
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/Kconfig
Normal file
@ -0,0 +1,533 @@
|
||||
if FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
||||
config MT7603E_RLT_WIFI
|
||||
tristate "RLT 7603 WIFI Driver"
|
||||
select MT7603E_WIFI_BASIC_FUNC if MT7603E_RLT_WIFI
|
||||
|
||||
config MT7603E_MT_WIFI_PATH
|
||||
string
|
||||
depends on MT7603E_RLT_WIFI
|
||||
default "rlt_wifi"
|
||||
|
||||
if MT7603E_RLT_WIFI
|
||||
menu "WiFi Generic Feature Options"
|
||||
|
||||
if FIRST_IF_MT7603E
|
||||
choice
|
||||
prompt "EEPROM Type of 1st Card"
|
||||
depends on ! FIRST_IF_NONE
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_PROM
|
||||
bool "EEPROM"
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_EFUSE
|
||||
bool "EFUSE"
|
||||
|
||||
config MT7603E_FIRST_IF_EEPROM_FLASH
|
||||
bool "FLASH"
|
||||
endchoice
|
||||
|
||||
config MT7603E_RT_FIRST_CARD_EEPROM
|
||||
string
|
||||
depends on ! FIRST_IF_NONE
|
||||
default "prom" if MT7603E_FIRST_IF_EEPROM_PROM
|
||||
default "efuse" if MT7603E_FIRST_IF_EEPROM_EFUSE
|
||||
default "flash" if MT7603E_FIRST_IF_EEPROM_FLASH
|
||||
endif
|
||||
# endif FIRST_IF_MT7603E
|
||||
|
||||
if SECOND_IF_MT7603E
|
||||
choice
|
||||
prompt "EEPROM Type of 2nd Card"
|
||||
depends on ! SECOND_IF_NONE
|
||||
|
||||
config MT7603E_SECOND_IF_EEPROM_PROM
|
||||
bool "EEPROM"
|
||||
|
||||
config MT7603E_SECOND_IF_EEPROM_EFUSE
|
||||
bool "EFUSE"
|
||||
|
||||
config MT7603E_SECOND_IF_EEPROM_FLASH
|
||||
bool "FLASH"
|
||||
endchoice
|
||||
|
||||
config MT7603E_RT_SECOND_CARD_EEPROM
|
||||
string
|
||||
depends on ! SECOND_IF_NONE
|
||||
default "prom" if MT7603E_SECOND_IF_EEPROM_PROM
|
||||
default "efuse" if MT7603E_SECOND_IF_EEPROM_EFUSE
|
||||
default "flash" if MT7603E_SECOND_IF_EEPROM_FLASH
|
||||
endif
|
||||
#endif SECOND_IF_MT7603E
|
||||
|
||||
config MT7603E_MULTI_INF_SUPPORT
|
||||
bool
|
||||
default y if !FIRST_IF_NONE && !SECOND_IF_NONE
|
||||
|
||||
config MT7603E_WIFI_BASIC_FUNC
|
||||
bool "Basic Functions"
|
||||
select WIRELESS_EXT
|
||||
select WEXT_SPY
|
||||
select WEXT_PRIV
|
||||
|
||||
config MT7603E_WSC_INCLUDED
|
||||
bool "WSC (WiFi Simple Config)"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_WSC_V2_SUPPORT
|
||||
bool "WSC V2(WiFi Simple Config Version 2.0)"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_WSC_NFC_SUPPORT
|
||||
bool "WSC out-of-band(NFC)"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_DOT11N_DRAFT3
|
||||
bool "802.11n Draft3"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT7603E_DOT11_VHT_AC
|
||||
# bool "802.11 ac"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_DOT11W_PMF_SUPPORT
|
||||
bool "PMF"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
#config MT7603E_TXBF_SUPPORT
|
||||
# bool "Tx Bean Forming Support"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT7603E_WMM_ACM_SUPPORT
|
||||
# bool "WMM ACM"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_LLTD_SUPPORT
|
||||
bool "LLTD (Link Layer Topology Discovery Protocol)"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_QOS_DLS_SUPPORT
|
||||
bool "802.11e DLS ((Direct-Link Setup) Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
|
||||
config MT7603E_WAPI_SUPPORT
|
||||
bool "WAPI Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_CARRIER_DETECTION_SUPPORT
|
||||
bool "Carrier Detect"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_IGMP_SNOOP_SUPPORT
|
||||
bool "IGMP Snooping"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_BLOCK_NET_IF
|
||||
bool "NETIF Block"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
help
|
||||
Support Net interface block while Tx-Sw queue full
|
||||
|
||||
config MT7603E_TXBF_SUPPORT
|
||||
bool "Tx Bean Forming Support (Only 3883)"
|
||||
depends on WIFI_DRIVER
|
||||
depends on RALINK_RT2883 || RALINK_RT3883
|
||||
default n
|
||||
#
|
||||
# optimize dma cache mapping for internal mips platform
|
||||
#
|
||||
config MT7603E_DMA_CACHE_OPTIMIZE
|
||||
bool "optimize dma cache mapping for internal mips platform"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT7603E_VIDEO_TURBINE_SUPPORT
|
||||
# bool "Video Turbine support"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT7603E_RA_CLASSIFIER
|
||||
# tristate "Ralink Flow Classifier"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_RATE_ADAPTION
|
||||
bool "New Rate Adaptation support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_NEW_RATE_ADAPT_SUPPORT
|
||||
bool "Intelligent Rate Adaption"
|
||||
depends on WIFI_DRIVER && MT7603E_RATE_ADAPTION
|
||||
default y
|
||||
|
||||
config MT7603E_AGS_SUPPORT
|
||||
bool "Adaptive Group Switching"
|
||||
depends on WIFI_DRIVER && MT7603E_RATE_ADAPTION
|
||||
default n
|
||||
|
||||
config MT7603E_IDS_SUPPORT
|
||||
bool "IDS (Intrusion Detection System) Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WIFI_WORK_QUEUE
|
||||
bool "Work Queue"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WIFI_SKB_RECYCLE
|
||||
bool "SKB Recycle(Linux)"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_PUSH_SUPPORT
|
||||
bool "Config Push Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT7603E_EASY_SETUP_SUPPORT
|
||||
# bool "Whole Home Coverage - Easy Setup"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT7603E_EVENT_NOTIFIER_SUPPORT
|
||||
bool "Whole Home Coverage - Event Notifier"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_SMART_CARRIER_SENSE_SUPPORT
|
||||
bool "Smart Carrier Sense"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
config MT7603E_MBO_SUPPORT
|
||||
bool "MBO Support"
|
||||
depends on WIFI_DRIVER
|
||||
select INTERWORKING
|
||||
select WNM_SUPPORT
|
||||
select DOT11K_RRM_SUPPORT
|
||||
select DOT11R_FT_SUPPORT
|
||||
select DOT11W_PMF_SUPPORT
|
||||
select PASSPOINT_R2
|
||||
default n
|
||||
config MT7603E_RTMP_FLASH_SUPPORT
|
||||
bool "Flash Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_MWDS_SUPPORT
|
||||
bool "Mixed WDS(MWDS)"
|
||||
default n
|
||||
|
||||
config MT7603E_AIR_MONITOR_SUPPORT
|
||||
bool "Air Monitor Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_STA_FORCE_ROAM_SUPPORT
|
||||
bool "Sta Force Roam Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_ROAMING_ENHANCE_SUPPORT
|
||||
bool "Roaming Enhance Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_WIFI_FWD_UPDATED
|
||||
bool "Wifi Forwarding Support Update"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_BTCOEX_CONCURRENT
|
||||
bool "Coexisence Event Notify between BT and WiFi"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_LED_CONTROL_SUPPORT
|
||||
bool "LED Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_SINGLE_SKU_V2
|
||||
bool "Single SKU V2"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_HW_ANTENNA_DIVERSITY
|
||||
bool "Antenna Diversity Support"
|
||||
depends on MT7603E_RLT_AP_SUPPORT || RLT_STA_SUPPORT
|
||||
depends on RALINK_RT5350
|
||||
default n
|
||||
|
||||
config MT7603E_ATE_SUPPORT
|
||||
bool "ATE/QA Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_RT2860V2_AP_V24_DATA_STRUCTURE
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT7603E_RT2860V2_AP_32B_DESC
|
||||
bool "32 Byte Descriptor Support"
|
||||
depends on WIFI_DRIVER
|
||||
depends on MT7603E_RALINK_RT6352 || RALINK_MT7620
|
||||
default n
|
||||
|
||||
config MT7603E_MEMORY_OPTIMIZATION
|
||||
bool "Memory Optimization"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RTMP_INTERNAL_TX_ALC
|
||||
bool "TSSI Compensation"
|
||||
depends on WIFI_DRIVER
|
||||
depends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350 || MT7603E_RALINK_RT6352
|
||||
default n
|
||||
|
||||
config MT7603E_RTMP_TEMPERATURE_CALIBRATION
|
||||
bool "Temperature Calibration"
|
||||
depends on WIFI_DRIVER
|
||||
depends on MT7603E_RALINK_RT6352
|
||||
default n
|
||||
|
||||
config MT7603E_HOTSPOT
|
||||
bool "Passpoint-R1"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_PASSPOINT_R2
|
||||
bool "Passpoint Release-2 Support"
|
||||
depends on MT7603E_HOTSPOT
|
||||
select MT7603E_DOT11W_PMF_SUPPORT
|
||||
default n
|
||||
|
||||
config MT7603E_UAPSD
|
||||
bool "MT7603E_UAPSD support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
#config MT7603E_EPA_ELNA
|
||||
# bool "ePAeLNA"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
choice
|
||||
prompt "PA,LNA Type"
|
||||
depends on MT7603E_RLT_WIFI
|
||||
|
||||
config MT7603E_IPA_ILNA
|
||||
bool "iPAiLNA"
|
||||
|
||||
config MT7603E_IPA_ELNA
|
||||
bool "iPAeLNA"
|
||||
|
||||
config MT7603E_EPA_ILNA
|
||||
bool "ePAiLNA"
|
||||
|
||||
config MT7603E_EPA_ELNA
|
||||
bool "ePAeLNA"
|
||||
endchoice
|
||||
|
||||
config MT7603E_PA_LNA
|
||||
string
|
||||
depends on MT7603E_RLT_WIFI
|
||||
default "iPAiLNA" if MT7603E_IPA_ILNA
|
||||
default "iPAeLNA" if MT7603E_IPA_ELNA
|
||||
default "ePAiLNA" if MT7603E_EPA_ILNA
|
||||
default "ePAeLNA" if MT7603E_EPA_ELNA
|
||||
|
||||
#
|
||||
# Section for chip architectures
|
||||
#
|
||||
# "RLT MAC Support"
|
||||
config MT7603E_RLT_MAC
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RLT_BBP
|
||||
bool
|
||||
|
||||
config MT7603E_RLT_RF
|
||||
bool
|
||||
|
||||
# "RTMP MAC Support"
|
||||
config MT7603E_RTMP_MAC
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_RTMP_BBP
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_RF
|
||||
bool
|
||||
|
||||
#
|
||||
# Section for interfaces
|
||||
#
|
||||
config MT7603E_RTMP_PCI_SUPPORT
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_USB_SUPPORT
|
||||
bool
|
||||
|
||||
config MT7603E_RTMP_RBUS_SUPPORT
|
||||
bool
|
||||
|
||||
endmenu
|
||||
|
||||
menu "WiFi Operation Modes"
|
||||
choice
|
||||
prompt "Main Mode"
|
||||
default MT7603E_WIFI_MODE_AP
|
||||
|
||||
config MT7603E_WIFI_MODE_AP
|
||||
bool "AP"
|
||||
|
||||
config MT7603E_WIFI_MODE_STA
|
||||
bool "STA"
|
||||
|
||||
config MT7603E_WIFI_MODE_BOTH
|
||||
bool "APSTA"
|
||||
endchoice
|
||||
|
||||
if MT7603E_WIFI_MODE_AP || MT7603E_WIFI_MODE_BOTH
|
||||
source "drivers/net/wireless/mtk/mt7603e/mt7603_wifi_ap/Kconfig"
|
||||
endif
|
||||
|
||||
#if MT7603E_WIFI_MODE_STA || MT7603E_WIFI_MODE_BOTH
|
||||
# source "drivers/net/wireless/rlt_wifi_sta/Kconfig"
|
||||
#endif
|
||||
endmenu
|
||||
|
||||
#"RT2860 series"
|
||||
config MT7603E_RALINK_RT28XX
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT3092"
|
||||
config MT7603E_RALINK_RT3092
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT3572"
|
||||
config MT7603E_RALINK_RT3572
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_USB_SUPPORT
|
||||
|
||||
#"RT5392"
|
||||
config MT7603E_RALINK_RT5392
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT5572"
|
||||
config MT7603E_RALINK_RT5572
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_USB_SUPPORT
|
||||
|
||||
#"RT5592"
|
||||
config MT7603E_RALINK_RT5592
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7620/RT6352"
|
||||
config MT7603E_RALINK_RT6352
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_RBUS_SUPPORT
|
||||
# select MT7603E_RTMP_TEMPERATURE_CALIBRATION
|
||||
# select MT7603E_RTMP_INTERNAL_TX_ALC
|
||||
|
||||
#"MT7610E"
|
||||
config MT7603E_RALINK_MT7610E
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7610U"
|
||||
config MT7603E_RALINK_MT7610U
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_USB_SUPPORT
|
||||
|
||||
#"RT8592"
|
||||
config MT7603E_RALINK_RT8592
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7612E"
|
||||
config MT7603E_RALINK_MT7612E
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7612U"
|
||||
config MT7603E_RALINK_MT7612U
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_USB_SUPPORT
|
||||
|
||||
#"MT7603E"
|
||||
config MT7603E_RALINK_MT7603E
|
||||
bool
|
||||
default y
|
||||
select MT7603E_RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7603U"
|
||||
config MT7603E_RALINK_MT7603U
|
||||
bool
|
||||
default n
|
||||
select MT7603E_RTMP_USB_SUPPORT
|
||||
|
||||
endif
|
||||
|
||||
#if MT7603E_RLT_MAC
|
||||
# config MT7603E_RLT_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
#if MT7603E_RTMP_MAC
|
||||
# config MT7603E_RTMP_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
if MT7603E_RALINK_MT7603E
|
||||
config MT7603E_MT_MAC
|
||||
bool
|
||||
default y
|
||||
endif
|
||||
|
||||
if MT7603E_RALINK_MT7603U
|
||||
config MT7603E_MT_MAC
|
||||
bool
|
||||
default y
|
||||
endif
|
||||
endif
|
||||
#endif FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
||||
513
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/Kconfig.mt_wifi
Normal file
513
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/Kconfig.mt_wifi
Normal file
@ -0,0 +1,513 @@
|
||||
if FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
||||
config MT_WIFI
|
||||
tristate "MT WIFI Driver"
|
||||
|
||||
config MT_WIFI_PATH
|
||||
string
|
||||
depends on MT_WIFI
|
||||
default "mt_wifi"
|
||||
|
||||
if MT_WIFI
|
||||
menu "WiFi Generic Feature Options"
|
||||
|
||||
if FIRST_IF_MT7603E
|
||||
choice
|
||||
prompt "EEPROM Type of 1st Card"
|
||||
depends on ! FIRST_IF_NONE
|
||||
|
||||
config FIRST_MT_IF_EEPROM_PROM
|
||||
bool "EEPROM"
|
||||
|
||||
config FIRST_MT_IF_EEPROM_EFUSE
|
||||
bool "EFUSE"
|
||||
|
||||
config FIRST_MT_IF_EEPROM_FLASH
|
||||
bool "FLASH"
|
||||
endchoice
|
||||
|
||||
config RT_FIRST_CARD_EEPROM
|
||||
string
|
||||
depends on ! FIRST_IF_NONE
|
||||
default "prom" if FIRST_MT_IF_EEPROM_PROM
|
||||
default "efuse" if FIRST_MT_IF_EEPROM_EFUSE
|
||||
default "flash" if FIRST_MT_IF_EEPROM_FLASH
|
||||
endif
|
||||
# endif FIRST_IF_MT7603E
|
||||
|
||||
if SECOND_IF_MT7603E
|
||||
choice
|
||||
prompt "EEPROM Type of 2nd Card"
|
||||
depends on ! SECOND_IF_NONE
|
||||
|
||||
config SECOND_MT_IF_EEPROM_PROM
|
||||
bool "EEPROM"
|
||||
|
||||
config SECOND_MT_IF_EEPROM_EFUSE
|
||||
bool "EFUSE"
|
||||
|
||||
config SECOND_MT_IF_EEPROM_FLASH
|
||||
bool "FLASH"
|
||||
endchoice
|
||||
|
||||
config RT_SECOND_CARD_EEPROM
|
||||
string
|
||||
depends on ! SECOND_IF_NONE
|
||||
default "prom" if SECOND_MT_IF_EEPROM_PROM
|
||||
default "efuse" if SECOND_MT_IF_EEPROM_EFUSE
|
||||
default "flash" if SECOND_MT_IF_EEPROM_FLASH
|
||||
endif
|
||||
#endif SECOND_IF_MT7603E
|
||||
|
||||
config MULTI_INF_SUPPORT
|
||||
bool
|
||||
default y if !FIRST_IF_NONE && !SECOND_IF_NONE
|
||||
|
||||
#config WIFI_BASIC_FUNC
|
||||
# bool "Basic Functions"
|
||||
# select WIRELESS_EXT
|
||||
# select WEXT_SPY
|
||||
# select WEXT_PRIV
|
||||
|
||||
config MT_WSC_INCLUDED
|
||||
bool "WSC (WiFi Simple Config)"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_WSC_V2_SUPPORT
|
||||
bool "WSC V2(WiFi Simple Config Version 2.0)"
|
||||
depends on MT_WSC_INCLUDED
|
||||
default y
|
||||
|
||||
config MT_DOT11N_DRAFT3
|
||||
bool "802.11n Draft3"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_DOT11_VHT_AC
|
||||
bool "802.11 ac"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config WSC_NFC_SUPPORT
|
||||
bool "WSC out-of-band(NFC)"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_DOT11W_PMF_SUPPORT
|
||||
bool "PMF Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_TXBF_SUPPORT
|
||||
bool "Tx Bean Forming Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT_WMM_ACM_SUPPORT
|
||||
# bool "WMM ACM"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT_LLTD_SUPPORT
|
||||
bool "LLTD (Link Layer Topology Discovery Protocol)"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_QOS_DLS_SUPPORT
|
||||
bool "802.11e DLS ((Direct-Link Setup) Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_WAPI_SUPPORT
|
||||
bool "WAPI Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_CARRIER_DETECTION_SUPPORT
|
||||
bool "Carrier Detect"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT7603E_MBO_SUPPORT
|
||||
bool "MBO Support"
|
||||
depends on WIFI_DRIVER
|
||||
select INTERWORKING
|
||||
select WNM_SUPPORT
|
||||
select DOT11K_RRM_SUPPORT
|
||||
select DOT11R_FT_SUPPORT
|
||||
select DOT11W_PMF_SUPPORT
|
||||
select PASSPOINT_R2
|
||||
default n
|
||||
|
||||
config MT_IGMP_SNOOP_SUPPORT
|
||||
bool "IGMP Snooping"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_BLOCK_NET_IF
|
||||
bool "NETIF Block"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
help
|
||||
Support Net interface block while Tx-Sw queue full
|
||||
|
||||
config MT_DMA_CACHE_OPTIMIZE
|
||||
bool "optimize dma cache mapping for internal mips platform"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT_TXBF_SUPPORT
|
||||
# bool "Tx Bean Forming Support (Only 3883)"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT2883 || RALINK_RT3883
|
||||
# default n
|
||||
|
||||
#config MT_VIDEO_TURBINE_SUPPORT
|
||||
# bool "Video Turbine support"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
#config MT_RA_CLASSIFIER
|
||||
# tristate "Ralink Flow Classifier"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
config MT_RATE_ADAPTION
|
||||
bool "New Rate Adaptation support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_NEW_RATE_ADAPT_SUPPORT
|
||||
bool "Intelligent Rate Adaption"
|
||||
depends on WIFI_DRIVER && MT_RATE_ADAPTION
|
||||
default y
|
||||
|
||||
config MT_AGS_SUPPORT
|
||||
bool "Adaptive Group Switching"
|
||||
depends on WIFI_DRIVER && MT_RATE_ADAPTION
|
||||
default n
|
||||
|
||||
config MT_IDS_SUPPORT
|
||||
bool "IDS (Intrusion Detection System) Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_WIFI_WORK_QUEUE
|
||||
bool "Work Queue"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_WIFI_SKB_RECYCLE
|
||||
bool "SKB Recycle(Linux)"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_RTMP_FLASH_SUPPORT
|
||||
bool "Flash Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config CONFIG_PUSH_SUPPORT
|
||||
bool "Config Push Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
config CONFIG_EASY_SETUP_SUPPORT
|
||||
bool "Whole Home Coverage - Easy Setup"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config EVENT_NOTIFIER_SUPPORT
|
||||
bool "Whole Home Coverage - Event Notifier"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
config MWDS_SUPPORT
|
||||
bool "Mixed WDS(MWDS)"
|
||||
default y
|
||||
config AIR_MONITOR_SUPPORT
|
||||
bool "Air Monitor Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config STA_FORCE_ROAM_SUPPORT
|
||||
bool "Sta Force Roam Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config ROAMING_ENHANCE_SUPPORT
|
||||
bool "Roaming Enhance Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config WIFI_FWD_UPDATED
|
||||
bool "Wifi Forwarding Support Update"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_BTCOEX_CONCURRENT
|
||||
bool "Coexisence Event Notify between BT and WiFi"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_LED_CONTROL_SUPPORT
|
||||
bool "LED Support"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_SINGLE_SKU_V2
|
||||
bool "Single SKU V2"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_HW_ANTENNA_DIVERSITY
|
||||
bool "Antenna Diversity Support"
|
||||
depends on RLT_AP_SUPPORT || RLT_STA_SUPPORT
|
||||
depends on RALINK_RT5350
|
||||
default n
|
||||
|
||||
config MT_ATE_SUPPORT
|
||||
bool "ATE/QA Support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_RT2860V2_AP_V24_DATA_STRUCTURE
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
config MT_RT2860V2_AP_32B_DESC
|
||||
bool "32 Byte Descriptor Support"
|
||||
depends on WIFI_DRIVER
|
||||
depends on RALINK_RT6352 || RALINK_MT7620
|
||||
default n
|
||||
|
||||
config MT_MEMORY_OPTIMIZATION
|
||||
bool "Memory Optimization"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
#config MT_RTMP_INTERNAL_TX_ALC
|
||||
# bool "TSSI Compensation"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT3350 || RALINK_RT3352 || RALINK_RT5350 || RALINK_RT6352
|
||||
# default n
|
||||
|
||||
#config MT_RTMP_TEMPERATURE_CALIBRATION
|
||||
# bool "Temperature Calibration"
|
||||
# depends on WIFI_DRIVER
|
||||
# depends on RALINK_RT6352
|
||||
# default n
|
||||
|
||||
config MT_HOTSPOT
|
||||
bool "Passpoint-R1"
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config MT_HOTSPOT_R2
|
||||
bool "Passpoint Release-2 Support"
|
||||
depends on HOTSPOT
|
||||
select MT_DOT11W_PMF_SUPPORT
|
||||
default n
|
||||
|
||||
config MT_UAPSD
|
||||
bool "UAPSD support"
|
||||
depends on WIFI_DRIVER
|
||||
default y
|
||||
|
||||
#config MT_EPA_ELNA
|
||||
# bool "ePAeLNA"
|
||||
# depends on WIFI_DRIVER
|
||||
# default n
|
||||
|
||||
choice
|
||||
prompt "PA,LNA Type"
|
||||
depends on MT_WIFI
|
||||
|
||||
config MT_IPA_ILNA
|
||||
bool "iPAiLNA"
|
||||
|
||||
config MT_IPA_ELNA
|
||||
bool "iPAeLNA"
|
||||
|
||||
config MT_EPA_ILNA
|
||||
bool "ePAiLNA"
|
||||
|
||||
config MT_EPA_ELNA
|
||||
bool "ePAeLNA"
|
||||
endchoice
|
||||
|
||||
config MT_PA_LNA
|
||||
string
|
||||
depends on MT_WIFI
|
||||
default "iPAiLNA" if MT_IPA_ILNA
|
||||
default "iPAeLNA" if MT_IPA_ELNA
|
||||
default "ePAiLNA" if MT_EPA_ILNA
|
||||
default "ePAeLNA" if MT_EPA_ELNA
|
||||
|
||||
#
|
||||
# Section for chip architectures
|
||||
#
|
||||
# "RLT MAC Support"
|
||||
config RLT_MAC
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config RLT_BBP
|
||||
bool
|
||||
|
||||
config RLT_RF
|
||||
bool
|
||||
|
||||
# "RTMP MAC Support"
|
||||
config RTMP_MAC
|
||||
bool
|
||||
depends on WIFI_DRIVER
|
||||
default n
|
||||
|
||||
config RTMP_BBP
|
||||
bool
|
||||
|
||||
config RTMP_RF
|
||||
bool
|
||||
|
||||
#
|
||||
# Section for interfaces
|
||||
#
|
||||
config RTMP_PCI_SUPPORT
|
||||
bool
|
||||
|
||||
config RTMP_USB_SUPPORT
|
||||
bool
|
||||
|
||||
config RTMP_RBUS_SUPPORT
|
||||
bool
|
||||
|
||||
endmenu
|
||||
|
||||
menu "WiFi Operation Modes"
|
||||
choice
|
||||
prompt "Main Mode"
|
||||
default MT_WIFI_MODE_AP
|
||||
|
||||
config MT_WIFI_MODE_AP
|
||||
bool "AP"
|
||||
|
||||
config MT_WIFI_MODE_STA
|
||||
bool "STA"
|
||||
|
||||
config MT_WIFI_MODE_BOTH
|
||||
bool "APSTA"
|
||||
endchoice
|
||||
|
||||
if MT_WIFI_MODE_AP || MT_WIFI_MODE_BOTH
|
||||
source "drivers/net/wireless/mt_wifi_ap/Kconfig"
|
||||
endif
|
||||
|
||||
#if MT_WIFI_MODE_STA || MT_WIFI_MODE_BOTH
|
||||
# source "drivers/net/wireless/rlt_wifi_sta/Kconfig"
|
||||
#endif
|
||||
endmenu
|
||||
|
||||
#"RT2860 series"
|
||||
config RALINK_RT28XX
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT3092"
|
||||
config RALINK_RT3092
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT3572"
|
||||
config RALINK_RT3572
|
||||
bool
|
||||
default n
|
||||
select RTMP_USB_SUPPORT
|
||||
|
||||
#"RT5392"
|
||||
config RALINK_RT5392
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"RT5572"
|
||||
config RALINK_RT5572
|
||||
bool
|
||||
default n
|
||||
select RTMP_USB_SUPPORT
|
||||
|
||||
#"RT5592"
|
||||
config RALINK_RT5592
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7620/RT6352"
|
||||
config RALINK_RT6352
|
||||
bool
|
||||
default n
|
||||
select RTMP_RBUS_SUPPORT
|
||||
# select RTMP_TEMPERATURE_CALIBRATION
|
||||
# select RTMP_INTERNAL_TX_ALC
|
||||
|
||||
#"MT7610E"
|
||||
config RALINK_MT7610E
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7610U"
|
||||
config RALINK_MT7610U
|
||||
bool
|
||||
default n
|
||||
select RTMP_USB_SUPPORT
|
||||
|
||||
#"RT8592"
|
||||
config RALINK_RT8592
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7612E"
|
||||
config RALINK_MT7612E
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
#"MT7612U"
|
||||
config RALINK_MT7612U
|
||||
bool
|
||||
default n
|
||||
select RTMP_USB_SUPPORT
|
||||
|
||||
#"MT7603E"
|
||||
config RALINK_MT7603E
|
||||
bool
|
||||
default n
|
||||
select RTMP_PCI_SUPPORT
|
||||
|
||||
endif
|
||||
|
||||
#if RLT_MAC
|
||||
# config RLT_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
#if RTMP_MAC
|
||||
# config RTMP_MAC
|
||||
# bool
|
||||
# default y
|
||||
#endif
|
||||
|
||||
#if MT_MAC
|
||||
if RALINK_MT7603E
|
||||
config MT_MAC
|
||||
bool
|
||||
default y
|
||||
endif
|
||||
#endif MT_WIFI
|
||||
endif
|
||||
#endif FIRST_IF_MT7603E || SECOND_IF_MT7603E
|
||||
678
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/Makefile
Normal file
678
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/Makefile
Normal file
@ -0,0 +1,678 @@
|
||||
RT28xx_MODE = AP
|
||||
|
||||
|
||||
|
||||
TARGET = LINUX
|
||||
|
||||
|
||||
# CHIPSET
|
||||
# rt2860, rt2870, rt2880, rt2070, rt3070, rt3090, rt3572, rt3062, rt3562, rt3593, rt3573
|
||||
# rt3562(for rt3592), rt3050, rt3350, rt3352, rt5350, rt5370, rt5390, rt5572, rt5592,
|
||||
# rt8592(for rt85592),
|
||||
# mt7601e, mt7601u,
|
||||
# mt7650e, mt7630e, mt7610e, mt7650u, mt7630u, mt7610u
|
||||
# mt7662e, mt7632e, mt7612e, mt7662u, mt7632u, mt7612u
|
||||
# mt7603e, mt7603u, mt7636u, mt7636s
|
||||
|
||||
|
||||
CHIPSET = mt7603e
|
||||
|
||||
|
||||
MODULE = $(word 1, $(CHIPSET))
|
||||
|
||||
#OS ABL - YES or NO
|
||||
OSABL = NO
|
||||
|
||||
#Build Prealloc ko
|
||||
PREALLOC = NO
|
||||
|
||||
ifneq ($(TARGET),THREADX)
|
||||
#RT28xx_DIR = home directory of RT28xx source code
|
||||
RT28xx_DIR = $(shell pwd)
|
||||
endif
|
||||
|
||||
include $(RT28xx_DIR)/os/linux/config.mk
|
||||
|
||||
RTMP_SRC_DIR = $(RT28xx_DIR)/RT$(MODULE)
|
||||
|
||||
#PLATFORM: Target platform
|
||||
PLATFORM = PC
|
||||
#PLATFORM = MT53XX
|
||||
#PLATFORM = PC_AUTO_BUILD
|
||||
#PLATFORM = BB_SOC
|
||||
#PLATFORM = 5VT
|
||||
#PLATFORM = IKANOS_V160
|
||||
#PLATFORM = IKANOS_V180
|
||||
#PLATFORM = SIGMA
|
||||
#PLATFORM = SIGMA_8622
|
||||
#PLATFORM = INIC
|
||||
#PLATFORM = STAR
|
||||
#PLATFORM = IXP
|
||||
#PLATFORM = INF_TWINPASS
|
||||
#PLATFORM = INF_DANUBE
|
||||
#PLATFORM = INF_AR9
|
||||
#PLATFORM = INF_VR9
|
||||
#PLATFORM = BRCM_6358
|
||||
#PLATFORM = INF_AMAZON_SE
|
||||
#PLATFORM = CAVM_OCTEON
|
||||
#PLATFORM = CMPC
|
||||
#PLATFORM = RALINK_2880
|
||||
#PLATFORM = RALINK_3052
|
||||
#PLATFORM = SMDK
|
||||
#PLATFORM = RMI
|
||||
#PLATFORM = RMI_64
|
||||
#PLATFORM = KODAK_DC
|
||||
#PLATFORM = DM6446
|
||||
#PLATFORM = FREESCALE8377
|
||||
#PLATFORM = BL2348
|
||||
#PLATFORM = BL23570
|
||||
#PLATFORM = BLUBB
|
||||
#PLATFORM = BLPMP
|
||||
#PLATFORM = MT85XX
|
||||
#PLATFORM = NXP_TV550
|
||||
#PLATFORM = MVL5
|
||||
#PLATFORM = RALINK_3352
|
||||
#PLATFORM = UBICOM_IPX8
|
||||
#PLATFORM = INTELP6
|
||||
#PLATFORM = MT7620
|
||||
#PLATFORM = MT7621
|
||||
#PLATFORM = MSTAR
|
||||
|
||||
#APSOC
|
||||
ifeq ($(MODULE),3050)
|
||||
PLATFORM = RALINK_3050
|
||||
endif
|
||||
ifeq ($(MODULE),3052)
|
||||
PLATFORM = RALINK_3052
|
||||
endif
|
||||
ifeq ($(MODULE),3350)
|
||||
PLATFORM = RALINK_3050
|
||||
endif
|
||||
ifeq ($(MODULE),3352)
|
||||
PLATFORM = RALINK_3352
|
||||
endif
|
||||
ifeq ($(CHIPSET),mt7628)
|
||||
PLATFORM = MT7628
|
||||
endif
|
||||
|
||||
#RELEASE Package
|
||||
RELEASE = DPA
|
||||
|
||||
|
||||
ifeq ($(TARGET),LINUX)
|
||||
MAKE = make
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET), UCOS)
|
||||
MAKE = make
|
||||
endif
|
||||
ifeq ($(TARGET),THREADX)
|
||||
MAKE = gmake
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET), ECOS)
|
||||
MAKE = make
|
||||
MODULE = $(shell pwd | sed "s/.*\///" ).o
|
||||
export MODULE
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BB_SOC)
|
||||
LINUX_SRC = $(KERNEL_DIR)
|
||||
#CROSS_COMPILE = /opt/trendchip/mips-linux-uclibc/usr/bin/mips-linux-uclibc-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),5VT)
|
||||
LINUX_SRC = /home/ralink-2860-sdk-5vt-distribution/linux-2.6.17
|
||||
CROSS_COMPILE = /opt/crosstool/uClibc_v5te_le_gcc_4_1_1/bin/arm-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),UBICOM_IPX8)
|
||||
LINUX_SRC = /home/sample/Customers/UBICOM/ubicom-linux-dist-2.1.1/linux-2.6.x
|
||||
CROSS_COMPILE = ubicom32-elf-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IKANOS_V160)
|
||||
LINUX_SRC = /home/sample/projects/LX_2618_RG_5_3_00r4_SRC/linux-2.6.18
|
||||
CROSS_COMPILE = mips-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IKANOS_V180)
|
||||
LINUX_SRC = /home/sample/projects/LX_BSP_VX180_5_4_0r1_ALPHA_26DEC07/linux-2.6.18
|
||||
CROSS_COMPILE = mips-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),SIGMA)
|
||||
LINUX_SRC = /root/sigma/smp86xx_kernel_source_2.7.172.0/linux-2.6.15
|
||||
CROSS_COMPILE = /root/sigma/smp86xx_toolchain_2.7.172.0/build_mipsel_nofpu/staging_dir/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),SIGMA_8622)
|
||||
LINUX_SRC = /home/snowpin/armutils_2.5.120.1/build_arm/linux-2.4.22-em86xx
|
||||
CROSS_COMPILE = /home/snowpin/armutils_2.5.120.1/toolchain/bin/arm-elf-
|
||||
CROSS_COMPILE_INCLUDE = /home/snowpin/armutils_2.5.120.1/toolchain/lib/gcc-lib/arm-elf/2.95.3
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INIC)
|
||||
UCOS_SRC = /opt/uCOS/iNIC_rt2880
|
||||
CROSS_COMPILE = /usr/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),STAR)
|
||||
LINUX_SRC = /opt/star/kernel/linux-2.4.27-star
|
||||
CROSS_COMPILE = /opt/star/tools/arm-linux/bin/arm-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),RMI)
|
||||
LINUX_SRC = /opt/rmi/1.7.0/linux/src/
|
||||
CROSS_COMPILE = /opt/rmi/1.7.0/mipscross/nptl/bin/mips64-unknown-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),RMI_64)
|
||||
LINUX_SRC = /opt/rmi/1.7.0/linux_64/src/
|
||||
CROSS_COMPILE = /opt/rmi/1.7.0/mipscross/nptl/bin/mips64-unknown-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM), RALINK_2880)
|
||||
LINUX_SRC = /project/stable/RT288x/RT288x_SDK/source/linux-2.4.x
|
||||
CROSS_COMPILE = /opt/buildroot-gdb/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),RALINK_3052)
|
||||
LINUX_SRC = /home/peter/ap_soc/SDK_3_3_0_0/RT288x_SDK/source/linux-2.6.21.x
|
||||
CROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux-uclibc-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),FREESCALE8377)
|
||||
LINUX_SRC = /opt/ltib-mpc8377_rds-20090309/rpm/BUILD/linux-2.6.25
|
||||
CROSS_COMPILE = /opt/freescale/usr/local/gcc-4.2.187-eglibc-2.5.187/powerpc-linux-gnu/bin/powerpc-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BL2348)
|
||||
LINUX_SRC = /home/sample/Customers/BroadLight/bl234x-linux-2.6.21-small-v29
|
||||
CROSS_COMPILE = mips-wrs-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BL23570)
|
||||
LINUX_SRC = /home/FIBERHOME/linux-2.6.34.8
|
||||
CROSS_COMPILE = mips-wrs-linux-gnu-mips_74k_softfp-glibc_small-
|
||||
ARCH:=mips
|
||||
export $ARCH
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(PLATFORM),BLUBB)
|
||||
LINUX_SRC = /home/sample/Customers/BroadLight/UBB/gmp20/linux-2.6.21-small
|
||||
CROSS_COMPILE = mips-wrs-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BLPMP)
|
||||
LINUX_SRC = /home/sample/Customers/BroadLight/UBB/pmp16/bl234x-linux-2.6.21-small-v30.2
|
||||
CROSS_COMPILE = mips-wrs-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),PC)
|
||||
# Linux 2.6
|
||||
LINUX_SRC = /lib/modules/$(shell uname -r)/build
|
||||
# Linux 2.4 Change to your local setting
|
||||
#LINUX_SRC = /usr/src/linux-2.4
|
||||
LINUX_SRC_MODULE = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless/
|
||||
CROSS_COMPILE =
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INTELP6)
|
||||
LINUX_SRC = /tftpboot/IntelCE-20.0.11052.243193/project_build_i686/IntelCE/kernel-20.0.11024.238456/linux-2.6.35
|
||||
CROSS_COMPILE = /tftpboot/IntelCE-20.0.11052.243193/build_i686/i686-linux-elf/bin/i686-cm-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IXP)
|
||||
LINUX_SRC = /project/stable/Gmtek/snapgear-uclibc/linux-2.6.x
|
||||
CROSS_COMPILE = arm-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_TWINPASS)
|
||||
# Linux 2.6
|
||||
#LINUX_SRC = /lib/modules/$(shell uname -r)/build
|
||||
# Linux 2.4 Change to your local setting
|
||||
LINUX_SRC = /project/stable/twinpass/release/2.0.1/source/kernel/opensource/linux-2.4.31/
|
||||
CROSS_COMPILE = mips-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_DANUBE)
|
||||
LINUX_SRC = /opt/danube/sdk/linux-2.6.16.x
|
||||
CROSS_COMPILE = mips-linux-
|
||||
ROOTDIR = /opt/danube/sdk
|
||||
export ROOTDIR
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_AR9)
|
||||
LINUX_SRC = /root/ar9/xR9_BSP1.2.2.0/source/kernel/opensource/linux-2.6.20/
|
||||
CROSS_COMPILE = /root/ar9/ifx-lxdb26-1.0.2/gcc-3.4.4/toolchain-mips/bin/
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_VR9)
|
||||
LINUX_SRC = /home/public/lantiq/VR9/UGW-4.2/build_dir/linux-ifxcpe_platform_vr9/linux-2.6.20.19
|
||||
CROSS_COMPILE = /home/public/lantiq/VR9/UGW-4.2/staging_dir/toolchain-mips_gcc-3.4.6_uClibc-0.9.29/bin/mips-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BRCM_6358)
|
||||
LINUX_SRC =
|
||||
CROSS_COMPILE =
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_AMAZON_SE)
|
||||
# Linux 2.6
|
||||
#LINUX_SRC = /lib/modules/$(shell uname -r)/build
|
||||
# Linux 2.4 Change to your local setting
|
||||
LINUX_SRC = /backup/ifx/3.6.2.2/source/kernel/opensource/linux-2.4.31
|
||||
#CROSS_COMPILE = mips-linux-
|
||||
#LINUX_SRC = /project/Infineon/3.6.2.2/source/kernel/opensource/linux-2.4.31
|
||||
CROSS_COMPILE = /opt/uclibc-toolchain/ifx-lxdb-1-2-3-external/gcc-3.3.6/toolchain-mips/R0208V35/mips-linux-uclibc/bin/
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),ST)
|
||||
LINUX_SRC = /opt/STM/STLinux-2.2/devkit/sources/kernel/linux0039
|
||||
CROSS_COMPILE = /opt/STM/STLinux-2.2/devkit/sh4/bin/sh4-linux-
|
||||
ARCH := sh
|
||||
export ARCH
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),CAVM_OCTEON)
|
||||
OCTEON_ROOT = /usr/local/Cavium_Networks/OCTEON-SDK
|
||||
LINUX_SRC = $(OCTEON_ROOT)/linux/kernel_2.6/linux
|
||||
CROSS_COMPILE = mips64-octeon-linux-gnu-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),CMPC)
|
||||
LINUX_SRC = /opt/fvt_11N_SDK_0807/fvt131x_SDK_11n/linux-2.6.17
|
||||
CROSS_COMPILE =
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),SMDK)
|
||||
LINUX_SRC = /home/bhushan/itcenter/may28/linux-2.6-samsung
|
||||
CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),RALINK_3352)
|
||||
LINUX_SRC = /home/sample/3352/RT288x_SDK/source/linux-2.6.21.x
|
||||
CROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),KODAK_DC)
|
||||
SKD_SRC = C:/SigmaTel/DC1250_SDK_v1-9/sdk
|
||||
CROSS_COMPILE = $(cc)
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),DM6446)
|
||||
LINUX_SRC = /home/fonchi/work/soc/ti-davinci
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
ifeq ($(OSABL),YES)
|
||||
LINUX_SRC = $(RT28xx_DIR)/../../../../../build_linux
|
||||
else
|
||||
LINUX_SRC = $(RT28xx_DIR)/../../../../build_linux
|
||||
endif
|
||||
ifeq ($(CROSS_COMPILE),)
|
||||
CROSS_COMPILE=armv7a-mediatek451_001_vfp-linux-gnueabi-
|
||||
endif
|
||||
CC=$(CROSS_COMPILE)gcc
|
||||
$(warning =============================================)
|
||||
$(warning CC=$(CC) for wifi driver)
|
||||
$(warning =============================================)
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),MT53XX)
|
||||
TARGET = LINUX
|
||||
#****** For system auto build ******
|
||||
#LINUX_SRC=$(KERNEL_OBJ_ROOT)/$(KERNEL_VER)/$(KERNEL_CONFIG)_modules
|
||||
#****** For local build ******
|
||||
# uncomment the following lines
|
||||
VM_LINUX_ROOT ?= $(word 1, $(subst /vm_linux/,/vm_linux /, $(shell pwd)))
|
||||
LINUX_ROOT ?= $(VM_LINUX_ROOT)
|
||||
LINUX_SRC=$(VM_LINUX_ROOT)/output/mtk_android/mt5399_cn_android/rel/obj/kernel/chiling/kernel/linux-3.10/mt5399_android_smp_mod_defconfig_modules
|
||||
OBJ_ROOT ?= $(VM_LINUX_ROOT)/output/mtk_android/mt5399_cn_android/rel/obj
|
||||
export KERNEL_OBJ_ROOT=$(LINUX_SRC)/../..
|
||||
ifeq ($(CROSS_COMPILE),)
|
||||
CROSS_COMPILE=/mtkoss/gnuarm/vfp_4.5.1_2.6.27_cortex-a9-rhel4/i686/bin/armv7a-mediatek451_001_vfp-linux-gnueabi-
|
||||
endif
|
||||
ifeq "$(CC)" "gcc"
|
||||
CC ?= $(CROSS_COMPILE)gcc
|
||||
endif
|
||||
$(warning =============================================)
|
||||
$(warning CC=$(CC) for wifi driver LINUX_SRC=$(LINUX_SRC))
|
||||
$(warning TARGET=$(TARGET))
|
||||
$(warning =============================================)
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),NXP_TV550)
|
||||
LINUX_SRC = /data/tv550/kernel/linux-2.6.28.9
|
||||
LINUX_SRC_MODULE = /data/tv550/kernel/linux-2.6.28.9/drivers/net/wireless
|
||||
CROSS_COMPILE = /opt/embeddedalley/nxp_tv550/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),PC_AUTO_BUILD)
|
||||
LINUX_SRC=/proj/srv_wcnautobuild/external/linux-3.10.59/
|
||||
#CROSS_COMPILE=/proj/srv_wcnautobuild/external/gcc-4.9.2/bin/
|
||||
CROSS_COMPILE=
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(PLATFORM),MVL5)
|
||||
LINUX_SRC = /home2/charlestu/AP-VT3426/linux-2.6.18
|
||||
CROSS_COMPILE = /opt/montavista/pro/devkit/arm/v5t_le_mvl5/bin/arm_v5t_le-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),MT7620)
|
||||
LINUX_SRC = /home/share/src/MT7601/AP/RT288x_SDK/source/linux-2.6.36.x
|
||||
CROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),MT7621)
|
||||
LINUX_SRC = /root/SDK_4_2_0_0/RT288x_SDK/source/linux-2.6.36.x
|
||||
CROSS_COMPILE = /opt/buildroot-gcc463/usr/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(PLATFORM),MT7628)
|
||||
LINUX_SRC = /root/Working/MT7628_SDK_2013_0912/RT288x_SDK/source/linux-2.6.36.x
|
||||
CROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux-
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(PLATFORM),MSTAR)
|
||||
PREALLOC = YES
|
||||
|
||||
#628 TV Platform
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/628/kernel/RedLion/3.1.10/
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/628/kernel/3.10.23/3.10.23/
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/628/kernel/3.1.10_Madison_TVOS/3.1.10/
|
||||
|
||||
#918 TV Android4.3 Platform
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/918_TV/android4.3/kernel/3.1.10_Napoli_tvos/3.1.10/
|
||||
|
||||
#918 Box Android4.4 Platform
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/toolchain/918_Box_android4.4/3.1.10_Napoli_tvos_0616_new_kernel/3.1.10/
|
||||
|
||||
#928 Box Android4.4 Platform
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/928/928_kernel_0716/3.10.23/
|
||||
#LINUX_SRC = /proj/mtk05650/share/mstar/928/928_kernel_0722/3.10.23/
|
||||
LINUX_SRC = /proj/mtk05650/share/mstar/928/20140710_KERN-3.10.23-00911089/3.10.23/
|
||||
|
||||
#ToolChian Setting
|
||||
#CROSS_COMPILE = /proj/mtk05650/share/mstar/628/toolchain/arm-2012.09/bin/arm-none-linux-gnueabi-
|
||||
CROSS_COMPILE = /proj/mtk05650/share/mstar/toolchain/arm-2010.09/bin/arm-none-linux-gnueabi-
|
||||
#CROSS_COMPILE = /proj/mtk05650/share/mstar/toolchain/918_Box_android4.4/arm-2012.09/bin/arm-none-linux-gnueabi-
|
||||
#CROSS_COMPILE = /proj/mtk05650/share/mstar/toolchain/918_Box_android4.4/arm-2012.09/bin/arm-none-linux-gnueabi-
|
||||
endif
|
||||
|
||||
export OSABL RT28xx_DIR RT28xx_MODE LINUX_SRC CROSS_COMPILE CROSS_COMPILE_INCLUDE PLATFORM RELEASE CHIPSET MODULE RTMP_SRC_DIR LINUX_SRC_MODULE TARGET HAS_WOW_SUPPORT
|
||||
|
||||
# The targets that may be used.
|
||||
PHONY += all build_tools test UCOS THREADX LINUX release prerelease clean uninstall install libwapi osabl sdk_build_tools
|
||||
|
||||
ifeq ($(TARGET),LINUX)
|
||||
all: build_tools $(TARGET) plug_in
|
||||
else
|
||||
all: $(TARGET)
|
||||
endif
|
||||
|
||||
build_tools:
|
||||
$(MAKE) -C tools
|
||||
$(RT28xx_DIR)/tools/bin2h
|
||||
|
||||
sdk_build_tools:
|
||||
if [ -f $(RT28xx_DIR)/eeprom_log ]; then \
|
||||
rm -f $(RT28xx_DIR)/eeprom_log
|
||||
fi
|
||||
echo $(EE_TYPE) >> eeprom_log
|
||||
echo $(CHIPSET) >> eeprom_log
|
||||
if [ -f $(RT28xx_DIR)/eeprom/SA/MT7603E_EEPROM.bin ]; then \
|
||||
echo 'find SA/MT7603E_EEPROM.bin' >> eeprom_log ; \
|
||||
cp -f $(RT28xx_DIR)/eeprom/SA/MT7603E_EEPROM.bin $(RT28xx_DIR)/eeprom/MT7603E_EEPROM.bin ; \
|
||||
else \
|
||||
cp -f $(RT28xx_DIR)/eeprom/$(EE_TYPE)/MT7603E_EEPROM.bin $(RT28xx_DIR)/eeprom/MT7603E_EEPROM.bin ; \
|
||||
fi
|
||||
$(MAKE) -C tools
|
||||
$(RT28xx_DIR)/tools/bin2h
|
||||
# rm -f $(RT28xx_DIR)/eeprom/SA/MT7603E_EEPROM.bin
|
||||
|
||||
test:
|
||||
$(MAKE) -C tools test
|
||||
|
||||
UCOS:
|
||||
$(MAKE) -C os/ucos/ MODE=$(RT28xx_MODE)
|
||||
echo $(RT28xx_MODE)
|
||||
|
||||
ECOS:
|
||||
$(MAKE) -C os/ecos/ MODE=$(RT28xx_MODE)
|
||||
cp -f os/ecos/$(MODULE) $(MODULE)
|
||||
|
||||
THREADX:
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/Threadx -f $(RT28xx_DIR)/os/ThreadX/Makefile
|
||||
|
||||
LINUX:
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f os/linux/Makefile.4.util $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
endif
|
||||
|
||||
cp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f os/linux/Makefile.4.netif $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
endif
|
||||
|
||||
ifeq ($(RT28xx_MODE),AP)
|
||||
ifneq ($(PLATFORM),BB_SOC)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_ap.o /tftpboot
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)_ap.o /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)_ap.o /tftpboot
|
||||
endif
|
||||
ifeq ($(PLATFORM),INF_AMAZON_SE)
|
||||
cp -f /tftpboot/rt2870ap.o /backup/ifx/build/root_filesystem/lib/modules/2.4.31-Amazon_SE-3.6.2.2-R0416_Ralink/kernel/drivers/net
|
||||
endif
|
||||
endif
|
||||
else
|
||||
ifeq ($(RT28xx_MODE),APSTA)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_apsta.o /tftpboot
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)_apsta.o /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)_apsta.o /tftpboot
|
||||
endif
|
||||
else
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_sta.o /tftpboot
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtutil$(MODULE)_sta.o /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/rtnet$(MODULE)_sta.o /tftpboot
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
else
|
||||
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f os/linux/Makefile.6.util $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
endif
|
||||
ifeq ($(PREALLOC), YES)
|
||||
cp -f PREALLOC/os/linux/Makefile.6.prealloc PREALLOC/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/PREALLOC/os/linux modules
|
||||
$(SHELL) cp_prealloc.sh
|
||||
endif
|
||||
cp -f os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile
|
||||
ifeq ($(PLATFORM),DM6446)
|
||||
$(MAKE) ARCH=arm CROSS_COMPILE=arm_v5t_le- -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
else
|
||||
ifeq ($(PLATFORM),FREESCALE8377)
|
||||
$(MAKE) ARCH=powerpc CROSS_COMPILE=$(CROSS_COMPILE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
else
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f os/linux/Makefile.6.netif $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
endif
|
||||
|
||||
ifeq ($(RT28xx_MODE),AP)
|
||||
ifneq ($(PLATFORM),BB_SOC)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_ap.ko /tftpboot
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_ap_util.ko /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_ap_net.ko /tftpboot
|
||||
endif
|
||||
else
|
||||
rm -f os/linux/$(MODULE)_ap.ko.lzma
|
||||
/root/bin/lzma e os/linux/$(MODULE)_ap.ko os/linux/$(MODULE)_ap.ko.lzma
|
||||
endif
|
||||
else
|
||||
ifeq ($(RT28xx_MODE),APSTA)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_apsta.ko /tftpboot
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_apsta_util.ko /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_apsta_net.ko /tftpboot
|
||||
endif
|
||||
else
|
||||
ifeq ($(PLATFORM),PC_AUTO_BUILD)
|
||||
else
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_sta.ko /tftpboot
|
||||
endif
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_sta_util.ko /tftpboot
|
||||
cp -f $(RT28xx_DIR)/os/linux/$(MODULE)_sta_net.ko /tftpboot
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
mkdir -p $(RT28xx_DIR)/../../../../../BDP_Generic/build_linux_ko/src/driver/wlan/
|
||||
cp -f $(RT28xx_DIR)/os/linux/mt7603u_sta.ko $(RT28xx_DIR)/../../../../../BDP_Generic/build_linux_ko/src/driver/wlan/
|
||||
endif
|
||||
|
||||
plug_in:
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/tools/plug_in MODULE_FLAGS="$(WFLAGS)"
|
||||
|
||||
release: build_tools
|
||||
$(MAKE) -C $(RT28xx_DIR)/striptool -f Makefile.release clean
|
||||
$(MAKE) -C $(RT28xx_DIR)/striptool -f Makefile.release
|
||||
striptool/striptool.out
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
cp -f tools/osabl_check.sh $(RELEASE)/
|
||||
endif
|
||||
ifeq ($(RELEASE), DPO)
|
||||
gcc -o striptool/banner striptool/banner.c
|
||||
./striptool/banner -b striptool/copyright.gpl -s DPO/ -d DPO_GPL -R
|
||||
./striptool/banner -b striptool/copyright.frm -s DPO_GPL/include/firmware.h
|
||||
endif
|
||||
|
||||
prerelease:
|
||||
ifeq ($(MODULE), 2880)
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.release.2880 prerelease
|
||||
else
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.release prerelease
|
||||
endif
|
||||
cp $(RT28xx_DIR)/os/linux/Makefile.DPB $(RTMP_SRC_DIR)/os/linux/.
|
||||
cp $(RT28xx_DIR)/os/linux/Makefile.DPA $(RTMP_SRC_DIR)/os/linux/.
|
||||
cp $(RT28xx_DIR)/os/linux/Makefile.DPC $(RTMP_SRC_DIR)/os/linux/.
|
||||
ifeq ($(RT28xx_MODE),STA)
|
||||
cp $(RT28xx_DIR)/os/linux/Makefile.DPD $(RTMP_SRC_DIR)/os/linux/.
|
||||
cp $(RT28xx_DIR)/os/linux/Makefile.DPO $(RTMP_SRC_DIR)/os/linux/.
|
||||
endif
|
||||
|
||||
clean:
|
||||
ifeq ($(TARGET), LINUX)
|
||||
cp -f os/linux/Makefile.clean os/linux/Makefile
|
||||
$(MAKE) -C os/linux clean
|
||||
rm -rf os/linux/Makefile
|
||||
ifeq ($(PREALLOC), YES)
|
||||
cp -f PREALLOC/os/linux/Makefile.clean PREALLOC/os/linux/Makefile
|
||||
$(MAKE) -C PREALLOC/os/linux clean
|
||||
rm -rf PREALLOC/os/linux/Makefile
|
||||
endif
|
||||
endif
|
||||
ifeq ($(TARGET), UCOS)
|
||||
$(MAKE) -C os/ucos clean MODE=$(RT28xx_MODE)
|
||||
endif
|
||||
ifeq ($(TARGET), ECOS)
|
||||
$(MAKE) -C os/ecos clean MODE=$(RT28xx_MODE)
|
||||
endif
|
||||
|
||||
uninstall:
|
||||
ifeq ($(TARGET), LINUX)
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 uninstall
|
||||
else
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 uninstall
|
||||
endif
|
||||
endif
|
||||
|
||||
install:
|
||||
ifeq ($(TARGET), LINUX)
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 install
|
||||
else
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 install
|
||||
endif
|
||||
endif
|
||||
|
||||
libwapi:
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
cp -f os/linux/Makefile.libwapi.4 $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
else
|
||||
cp -f os/linux/Makefile.libwapi.6 $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
endif
|
||||
|
||||
osutil:
|
||||
ifeq ($(OSABL),YES)
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
cp -f os/linux/Makefile.4.util $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
else
|
||||
cp -f os/linux/Makefile.6.util $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
cp -f $(RT28xx_DIR)/os/linux/mt7603u_sta.ko $(RT28xx_DIR)/../../../../../../BDP_Generic/build_linux_ko/src/driver/wlan/
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
osnet:
|
||||
ifeq ($(OSABL),YES)
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
cp -f os/linux/Makefile.4.netif $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
else
|
||||
cp -f os/linux/Makefile.6.netif $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
cp -f $(RT28xx_DIR)/os/linux/mt7603u_sta.ko $(RT28xx_DIR)/../../../../../../BDP_Generic/build_linux_ko/src/driver/wlan/
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
osdrv:
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
cp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(RT28xx_DIR)/os/linux/
|
||||
else
|
||||
cp -f os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile
|
||||
$(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
|
||||
ifeq ($(PLATFORM),MT85XX)
|
||||
ifeq ($(OSABL),YES)
|
||||
cp -f $(RT28xx_DIR)/os/linux/mt7603u_sta.ko $(RT28xx_DIR)/../../../../../../BDP_Generic/build_linux_ko/src/driver/wlan/
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
# Declare the contents of the .PHONY variable as phony. We keep that information in a variable
|
||||
.PHONY: $(PHONY)
|
||||
|
||||
|
||||
|
||||
147
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/RT2860AP.dat
Normal file
147
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/RT2860AP.dat
Normal file
@ -0,0 +1,147 @@
|
||||
#The word of "Default" must not be removed
|
||||
Default
|
||||
ed_th_nonCE=52
|
||||
Cts2SelfTh=1500
|
||||
CountryRegion=5
|
||||
CountryRegionABand=7
|
||||
CountryCode=TW
|
||||
BssidNum=1
|
||||
SSID1=RT2860AP1
|
||||
SSID2=
|
||||
SSID3=
|
||||
SSID4=
|
||||
WirelessMode=9
|
||||
TxRate=0
|
||||
Channel=11
|
||||
BasicRate=15
|
||||
BeaconPeriod=100
|
||||
DtimPeriod=1
|
||||
TxPower=100
|
||||
DisableOLBC=0
|
||||
BGProtection=0
|
||||
MaxStaNum=0
|
||||
TxPreamble=0
|
||||
RTSThreshold=2347
|
||||
FragThreshold=2346
|
||||
TxBurst=1
|
||||
PktAggregate=0
|
||||
TurboRate=0
|
||||
WmmCapable=0
|
||||
APSDCapable=0
|
||||
DLSCapable=0
|
||||
APAifsn=3;7;1;1
|
||||
APCwmin=4;4;3;2
|
||||
APCwmax=6;10;4;3
|
||||
APTxop=0;0;94;47
|
||||
APACM=0;0;0;0
|
||||
BSSAifsn=3;7;2;2
|
||||
BSSCwmin=4;4;3;2
|
||||
BSSCwmax=10;10;4;3
|
||||
BSSTxop=0;0;94;47
|
||||
BSSACM=0;0;0;0
|
||||
AckPolicy=0;0;0;0
|
||||
NoForwarding=0
|
||||
NoForwardingBTNBSSID=0
|
||||
HideSSID=0
|
||||
StationKeepAlive=0
|
||||
ShortSlot=1
|
||||
AutoChannelSelect=0
|
||||
IEEE8021X=0
|
||||
IEEE80211H=0
|
||||
CSPeriod=10
|
||||
WirelessEvent=0
|
||||
IdsEnable=0
|
||||
AuthFloodThreshold=32
|
||||
AssocReqFloodThreshold=32
|
||||
ReassocReqFloodThreshold=32
|
||||
ProbeReqFloodThreshold=32
|
||||
DisassocFloodThreshold=32
|
||||
DeauthFloodThreshold=32
|
||||
EapReqFooldThreshold=32
|
||||
PreAuth=0
|
||||
AuthMode=OPEN
|
||||
EncrypType=NONE
|
||||
RekeyInterval=0
|
||||
RekeyMethod=DISABLE
|
||||
PMKCachePeriod=10
|
||||
WPAPSK1=
|
||||
WPAPSK2=
|
||||
WPAPSK3=
|
||||
WPAPSK4=
|
||||
DefaultKeyID=1
|
||||
Key1Type=0
|
||||
Key1Str1=
|
||||
Key1Str2=
|
||||
Key1Str3=
|
||||
Key1Str4=
|
||||
Key2Type=0
|
||||
Key2Str1=
|
||||
Key2Str2=
|
||||
Key2Str3=
|
||||
Key2Str4=
|
||||
Key3Type=0
|
||||
Key3Str1=
|
||||
Key3Str2=
|
||||
Key3Str3=
|
||||
Key3Str4=
|
||||
Key4Type=0
|
||||
Key4Str1=
|
||||
Key4Str2=
|
||||
Key4Str3=
|
||||
Key4Str4=
|
||||
HSCounter=0
|
||||
AccessPolicy0=0
|
||||
AccessControlList0=
|
||||
AccessPolicy1=0
|
||||
AccessControlList1=
|
||||
AccessPolicy2=0
|
||||
AccessControlList2=
|
||||
AccessPolicy3=0
|
||||
AccessControlList3=
|
||||
WdsEnable=0
|
||||
WdsEncrypType=NONE
|
||||
WdsList=
|
||||
WdsKey=
|
||||
RADIUS_Server=192.168.2.3
|
||||
RADIUS_Port=1812
|
||||
RADIUS_Key=ralink
|
||||
own_ip_addr=192.168.5.234
|
||||
EAPifname=br0
|
||||
PreAuthifname=br0
|
||||
HT_HTC=0
|
||||
HT_RDG=0
|
||||
HT_EXTCHA=0
|
||||
HT_LinkAdapt=0
|
||||
HT_OpMode=0
|
||||
HT_MpduDensity=5
|
||||
HT_BW=1
|
||||
HT_AutoBA=1
|
||||
HT_AMSDU=0
|
||||
HT_BAWinSize=64
|
||||
HT_GI=1
|
||||
HT_LDPC=0
|
||||
HT_MCS=33
|
||||
VHT_BW=1
|
||||
VHT_SGI=1
|
||||
VHT_STBC=0
|
||||
VHT_BW_SIGNAL=0
|
||||
VHT_DisallowNonVHT=0
|
||||
VHT_LDPC=0
|
||||
MeshId=MESH
|
||||
MeshAutoLink=1
|
||||
MeshAuthMode=OPEN
|
||||
MeshEncrypType=NONE
|
||||
MeshWPAKEY=
|
||||
MeshDefaultkey=1
|
||||
MeshWEPKEY=
|
||||
WscManufacturer=
|
||||
WscModelName=
|
||||
WscDeviceName=
|
||||
WscModelNumber=
|
||||
WscSerialNumber=
|
||||
RadioOn=1
|
||||
PMFMFPC=0
|
||||
PMFMFPR=0
|
||||
PMFSHA256=0
|
||||
LoadCodeMethod=0
|
||||
ed_th_nonCE=52
|
||||
@ -0,0 +1,19 @@
|
||||
#The word of "Default" must not be removed, maximum 32 cards, 00 ~ 31
|
||||
Default
|
||||
|
||||
#CARDID, MAC, CARDTYPE
|
||||
SELECT=CARDTYPE
|
||||
|
||||
00CARDID=/etc/Wireless/RT2860AP/RT2860AP1.dat
|
||||
01CARDID=/etc/Wireless/RT2860AP/RT2860AP2.dat
|
||||
02CARDID=/etc/Wireless/RT2860AP/RT2860AP3.dat
|
||||
|
||||
00MAC00:0E:2E:C3:D0:48=/etc/Wireless/RT2860AP/RT2860AP1.dat
|
||||
01MAC00:40:F4:FF:AA:40=/etc/Wireless/RT2860AP/RT2860AP2.dat
|
||||
02MAC00:0C:43:10:11:5C=/etc/Wireless/RT2860AP/RT2860AP3.dat
|
||||
|
||||
00CARDTYPEbgn=/etc/Wireless/RT2860AP/RT2860AP1.dat
|
||||
01CARDTYPEbgn=/etc/Wireless/RT2860AP/RT2860AP2.dat
|
||||
02CARDTYPEabgn=/etc/Wireless/RT2860AP/RT2860AP3.dat
|
||||
|
||||
|
||||
3983
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap.c
Normal file
3983
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap.c
Normal file
File diff suppressed because it is too large
Load Diff
724
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_acl_v2.c
Normal file
724
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_acl_v2.c
Normal file
@ -0,0 +1,724 @@
|
||||
|
||||
#ifdef ACL_V2_SUPPORT
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
// check http://www.coffer.com/mac_find/ not all can be found, need huawei to refine this table!!
|
||||
OUI_ENTRY OUI_ACL_TABLE[] =
|
||||
{
|
||||
{FBT_IOT_PEER_UNKNOWN, {0x00,0x00,0x00}},
|
||||
|
||||
/*Realtek why need 5 IDs ??, only 3 can be found*/
|
||||
{FBT_IOT_PEER_REALTEK, {0x00,0x48,0x54}}, //first three
|
||||
{FBT_IOT_PEER_REALTEK_92SE, {0x00,0xe0,0x4c}}, //first three
|
||||
{FBT_IOT_PEER_REALTEK_SOFTAP, {0x52,0x54,0x05}}, //first three
|
||||
//{FBT_IOT_PEER_RTK_APCLIENT, {0x00,0x00,0x00}}, //can't be found
|
||||
//{FBT_IOT_PEER_REALTEK_81XX, {0x00,0x00,0x00}}, //can't be found
|
||||
//{FBT_IOT_PEER_REALTEK_WOW, {0x00,0x00,0x00}}, //can't be found
|
||||
|
||||
{FBT_IOT_PEER_BROADCOM, {0x00,0x05,0xb5}},
|
||||
|
||||
{FBT_IOT_PEER_RALINK, {0x00,0x0c,0x43}},
|
||||
|
||||
{FBT_IOT_PEER_ATHEROS, {0x00,0x03,0x7f}},
|
||||
{FBT_IOT_PEER_ATHEROS, {0x00,0x13,0x74}},
|
||||
{FBT_IOT_PEER_ATHEROS, {0x88,0x12,0x4e}},
|
||||
|
||||
/*too many cisco OUIs, only keep 3*/
|
||||
{FBT_IOT_PEER_CISCO, {0x00,0x00,0x0c}},
|
||||
{FBT_IOT_PEER_CISCO, {0x00,0x01,0x42}},
|
||||
{FBT_IOT_PEER_CISCO, {0x00,0x01,0x43}},
|
||||
|
||||
{FBT_IOT_PEER_MERU, {0x00,0x0c,0xe6}},
|
||||
|
||||
{FBT_IOT_PEER_MARVEL, {0x00,0x50,0x43}},
|
||||
|
||||
//{FBT_IOT_PEER_SELF_SOFTAP, {000000}}, // can't be found
|
||||
|
||||
{FBT_IOT_PEER_AIRGO, {0x00,0x0a,0xf5}},
|
||||
|
||||
/*too many cisco OUIs, only keep 3*/
|
||||
{FBT_IOT_PEER_INTEL, {0x00,0x02,0xb3}},
|
||||
{FBT_IOT_PEER_INTEL, {0x00,0x03,0x47}},
|
||||
{FBT_IOT_PEER_INTEL, {0x00,0x04,0x23}},
|
||||
|
||||
/*too many , only keep 1! */
|
||||
{FBT_IOT_PEER_HTC, {0x00,0x04,0x23}},
|
||||
//{FBT_IOT_PEER_MAX, {0x00,0x00,0x00}}, // can't be found
|
||||
};
|
||||
|
||||
INT OUI_ACL_TABLE_NUM = (sizeof(OUI_ACL_TABLE)/sizeof(OUI_ENTRY));
|
||||
|
||||
|
||||
|
||||
VOID ACL_V2_Timeout(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3);
|
||||
|
||||
|
||||
BUILD_TIMER_FUNCTION(ACL_V2_Timeout);
|
||||
|
||||
|
||||
|
||||
VOID ACL_V2_CtrlInit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
UCHAR APIndex;
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
for (APIndex = 0; APIndex < MAX_MBSSID_NUM(pAd); APIndex++)
|
||||
{
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[APIndex].AccessControlList_V2;
|
||||
|
||||
NdisZeroMemory(pACLCtrl, sizeof(*pACLCtrl));
|
||||
pACLCtrl->BlockTime = 2; //spec is 2 seconds by default
|
||||
|
||||
pACLCtrl->pAd = pAd;
|
||||
|
||||
RTMPInitTimer(pAd, &pACLCtrl->AgeOutTimer,
|
||||
GET_TIMER_FUNCTION(ACL_V2_Timeout), pACLCtrl, FALSE);
|
||||
|
||||
pACLCtrl->AgeOutTimer_Running = FALSE;
|
||||
NdisAllocateSpinLock(pAd, &pACLCtrl->MAC_ListLock);
|
||||
NdisAllocateSpinLock(pAd, &pACLCtrl->OUI_ListLock);
|
||||
|
||||
DlListInit(&pACLCtrl->MAC_List);
|
||||
DlListInit(&pACLCtrl->OUI_List);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
VOID ACL_V2_CtrlExit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
UINT32 Ret;
|
||||
BOOLEAN Cancelled;
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
ACL_MAC_CTRL *pMACEntry, *pMACEntryTmp;
|
||||
ACL_OUI_CTRL *pOUIEntry, *pOUITmp;
|
||||
UCHAR APIndex;
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
for (APIndex = 0; APIndex < MAX_MBSSID_NUM(pAd); APIndex++)
|
||||
{
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[APIndex].AccessControlList_V2;
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
DlListForEachSafe(pMACEntry, pMACEntryTmp, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
DlListDel(&pMACEntry->List);
|
||||
os_free_mem(NULL, pMACEntry);
|
||||
}
|
||||
DlListInit(&pACLCtrl->MAC_List);
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
DlListForEachSafe(pOUIEntry, pOUITmp, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
DlListDel(&pOUIEntry->List);
|
||||
os_free_mem(NULL, pOUIEntry);
|
||||
}
|
||||
DlListInit(&pACLCtrl->OUI_List);
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
if(pACLCtrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&pACLCtrl->AgeOutTimer, &Cancelled);
|
||||
pACLCtrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
RTMPReleaseTimer(&pACLCtrl->AgeOutTimer, &Cancelled);
|
||||
|
||||
NdisFreeSpinLock(&pACLCtrl->MAC_ListLock);
|
||||
NdisFreeSpinLock(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
}
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
}
|
||||
|
||||
INT Set_ACL_V2_DisConnectSta_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
UCHAR macAddr[MAC_ADDR_LEN];
|
||||
RTMP_STRING *value;
|
||||
INT i;
|
||||
MAC_TABLE_ENTRY *pEntry = NULL;
|
||||
|
||||
if(strlen(arg) != 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */
|
||||
return FALSE;
|
||||
|
||||
for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":"))
|
||||
{
|
||||
if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
|
||||
return FALSE; /*Invalid */
|
||||
|
||||
AtoH(value, (UCHAR *)&macAddr[i++], 1);
|
||||
}
|
||||
|
||||
pEntry = MacTableLookup(pAd, macAddr);
|
||||
|
||||
|
||||
Set_ACL_V2_AddSTAEntry_Proc(pAd, macAddr);
|
||||
|
||||
if (pEntry)
|
||||
{
|
||||
MlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, FALSE);
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,PRINT_MAC(macAddr)));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT Set_ACL_V2_DisConnectOUI_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
INT i=0;
|
||||
INT32 Ret;
|
||||
BOOLEAN Cancelled;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_OUI_CTRL *pOUIEntry, *pOUIEntryTmp;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
ULONG Value = (ULONG) simple_strtol(arg, 0, 16);
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
if(pACLCtrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&pACLCtrl->AgeOutTimer, &Cancelled);
|
||||
pACLCtrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
if (Value)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: OUI=0x%08x\n", __FUNCTION__,Value));
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
if(pACLCtrl->OUI_Enable)
|
||||
{
|
||||
DlListForEachSafe(pOUIEntry, pOUIEntryTmp, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
DlListDel(&pOUIEntry->List);
|
||||
pACLCtrl->OUI_ListNum --;
|
||||
if(pACLCtrl->OUI_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->OUI_Enable = 0;
|
||||
}
|
||||
os_free_mem(NULL, pOUIEntry);
|
||||
}
|
||||
}
|
||||
|
||||
DlListInit(&pACLCtrl->OUI_List);
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
for (i=0; i <OUI_ACL_TABLE_NUM ; i++)
|
||||
{
|
||||
if(Value & OUI_ACL_TABLE[i].ID)
|
||||
{
|
||||
Set_ACL_V2_AddOUIEntry_Proc(pAd, OUI_ACL_TABLE[i].OUI);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
if(pACLCtrl->OUI_Enable)
|
||||
{
|
||||
DlListForEachSafe(pOUIEntry, pOUIEntryTmp, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
DlListDel(&pOUIEntry->List);
|
||||
pACLCtrl->OUI_ListNum --;
|
||||
if(pACLCtrl->OUI_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->OUI_Enable = 0;
|
||||
}
|
||||
os_free_mem(NULL, pOUIEntry);
|
||||
}
|
||||
}
|
||||
|
||||
DlListInit(&pACLCtrl->OUI_List);
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
}
|
||||
|
||||
i=0;
|
||||
|
||||
//dump all OUI list
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
DlListForEach(pOUIEntry, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: OUI [%d]=%02x:%02x:%02x\n", __FUNCTION__,i++, pOUIEntry->OUI[0],pOUIEntry->OUI[1],pOUIEntry->OUI[2]));
|
||||
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
if(pACLCtrl->BlockTime)
|
||||
{
|
||||
RTMPSetTimer(&pACLCtrl->AgeOutTimer, pACLCtrl->BlockTime * 1000);
|
||||
pACLCtrl->AgeOutTimer_Running = TRUE;
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: OUI count=%d\n", __FUNCTION__,i));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
UINT32 Set_ACL_V2_AddSTAEntry_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pTargetMACAddr)
|
||||
{
|
||||
BOOLEAN find_list = FALSE;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_MAC_CTRL *pMACEntry;
|
||||
ULONG Now32;
|
||||
INT32 Ret;
|
||||
BOOLEAN Cancelled;
|
||||
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
if (pACLCtrl->MAC_ListNum >= (MAX_NUM_OF_ACL_V2_MAC - 1))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN, ("%s : AccessControlList is full, and no more entry can join the list!\n",__FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s\n", __FUNCTION__));
|
||||
|
||||
if(pACLCtrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&pACLCtrl->AgeOutTimer, &Cancelled);
|
||||
pACLCtrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
if (MAC_ADDR_EQUAL(pMACEntry->MACAddr, pTargetMACAddr))
|
||||
{
|
||||
find_list = TRUE;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : duplicate mac =%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,PRINT_MAC(pTargetMACAddr)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
if (find_list == FALSE)
|
||||
os_alloc_mem(NULL, (UCHAR **)&pMACEntry, sizeof(*pMACEntry));
|
||||
|
||||
if (!pMACEntry)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (find_list == FALSE)
|
||||
{
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
NdisMoveMemory(pMACEntry->MACAddr, pTargetMACAddr, 6);
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
pMACEntry->SetTime = Now32;
|
||||
|
||||
DlListAddTail(&pACLCtrl->MAC_List, &pMACEntry->List);
|
||||
|
||||
pACLCtrl->MAC_ListNum ++;
|
||||
|
||||
if(pACLCtrl->MAC_ListNum)
|
||||
{
|
||||
pACLCtrl->MAC_Enable = 1;
|
||||
}
|
||||
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
}
|
||||
else
|
||||
{
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
pMACEntry->SetTime = Now32;
|
||||
}
|
||||
if(pACLCtrl->BlockTime)
|
||||
{
|
||||
RTMPSetTimer(&pACLCtrl->AgeOutTimer, pACLCtrl->BlockTime * 1000);
|
||||
pACLCtrl->AgeOutTimer_Running = TRUE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT Show_ACL_V2_OUI_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
INT i=0;
|
||||
INT32 Ret;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_OUI_CTRL *pOUIEntry;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
//dump all OUI list
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
DlListForEach(pOUIEntry, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: OUI [%d]=%02x:%02x:%02x\n", __FUNCTION__,i++, pOUIEntry->OUI[0],pOUIEntry->OUI[1],pOUIEntry->OUI[2]));
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: OUI count=%d\n", __FUNCTION__,i));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT Show_ACL_V2_STAEntry_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
INT i=0;
|
||||
INT32 Ret;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_MAC_CTRL *pMACEntry;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
//dump all OUI list
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: MAC [%d]=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,i++, PRINT_MAC(pMACEntry->MACAddr)));
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: MAC count=%d\n", __FUNCTION__,i));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID Set_ACL_V2_DelSTAEntry_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pTargetMACAddr)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_MAC_CTRL *pMACEntry, *pMACEntryTmp;
|
||||
|
||||
INT32 Ret;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s\n", __FUNCTION__));
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
DlListForEachSafe(pMACEntry, pMACEntryTmp, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
if (!pMACEntry)
|
||||
break;
|
||||
|
||||
if (MAC_ADDR_EQUAL(pMACEntry->MACAddr, pTargetMACAddr))
|
||||
{
|
||||
DlListDel(&pMACEntry->List);
|
||||
|
||||
pACLCtrl->MAC_ListNum --;
|
||||
|
||||
if(pACLCtrl->MAC_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->MAC_Enable = 0;
|
||||
}
|
||||
|
||||
os_free_mem(NULL, pMACEntry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
}
|
||||
|
||||
|
||||
UINT32 Set_ACL_V2_AddOUIEntry_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pTargetOUIAddr)
|
||||
{
|
||||
BOOLEAN find_list = FALSE;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_OUI_CTRL *pOUIEntry;
|
||||
ULONG Now32;
|
||||
INT32 Ret;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
if (pACLCtrl->OUI_ListNum >= (MAX_NUM_OF_ACL_V2_OUI - 1))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN, ("%s : AccessControlList is full, and no more entry can join the list!\n",__FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s\n", __FUNCTION__));
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
DlListForEach(pOUIEntry, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
if (RTMPEqualMemory(pOUIEntry->OUI, pTargetOUIAddr, OUI_LEN))
|
||||
{
|
||||
find_list = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
if (find_list == FALSE)
|
||||
os_alloc_mem(NULL, (UCHAR **)&pOUIEntry, sizeof(*pOUIEntry));
|
||||
|
||||
if (!pOUIEntry)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
if (find_list == FALSE)
|
||||
{
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
NdisMoveMemory(pOUIEntry->OUI, pTargetOUIAddr, OUI_LEN);
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
pOUIEntry->SetTime = Now32;
|
||||
|
||||
DlListAddTail(&pACLCtrl->OUI_List, &pOUIEntry->List);
|
||||
|
||||
pACLCtrl->OUI_ListNum ++;
|
||||
if (pACLCtrl->OUI_ListNum)
|
||||
{
|
||||
pACLCtrl->OUI_Enable = 1;
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
}
|
||||
else
|
||||
{ // only update timestamp
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
pOUIEntry->SetTime = Now32;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID Set_ACL_V2_DelOUIEntry_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pTargetOUIAddr)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_OUI_CTRL *pOUIEntry, *pOUIEntryTmp;
|
||||
|
||||
INT32 Ret;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s\n", __FUNCTION__));
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
DlListForEachSafe(pOUIEntry, pOUIEntryTmp, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
if (!pOUIEntry)
|
||||
break;
|
||||
|
||||
if (RTMPEqualMemory(pOUIEntry->OUI, pTargetOUIAddr, OUI_LEN))
|
||||
{
|
||||
DlListDel(&pOUIEntry->List);
|
||||
|
||||
pACLCtrl->OUI_ListNum --;
|
||||
if(pACLCtrl->OUI_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->OUI_Enable = 0;
|
||||
}
|
||||
os_free_mem(NULL, pOUIEntry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
}
|
||||
|
||||
VOID Set_ACL_V2_EntryExpire_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ULONG Value;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
Value = (ULONG) simple_strtol(arg, 0, 10);
|
||||
pACLCtrl->BlockTime = Value;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : pACLCtrl->BlockTime=%lu\n", __FUNCTION__,pACLCtrl->BlockTime));
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID Show_ACL_V2_EntryExpire_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[pObj->ioctl_if].AccessControlList_V2;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : pACLCtrl->BlockTime=%lu\n", __FUNCTION__,pACLCtrl->BlockTime));
|
||||
|
||||
}
|
||||
|
||||
BOOLEAN ACL_V2_List_Check(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UCHAR *pAddr,
|
||||
IN UCHAR Apidx)
|
||||
{
|
||||
BOOLEAN Result = TRUE;
|
||||
PACL_V2_CTRL pACLCtrl;
|
||||
ACL_MAC_CTRL *pMACEntry;
|
||||
ACL_OUI_CTRL *pOUIEntry;
|
||||
|
||||
INT32 Ret;
|
||||
|
||||
pACLCtrl = &pAd->ApCfg.MBSSID[Apidx].AccessControlList_V2;
|
||||
|
||||
|
||||
check_oui:
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
DlListForEach(pOUIEntry, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
if (RTMPEqualMemory(pOUIEntry->OUI, pAddr, OUI_LEN))
|
||||
{
|
||||
Result = FALSE;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : hit OUI =%02x:%02x:%02x\n", __FUNCTION__,pOUIEntry->OUI[0],pOUIEntry->OUI[1],pOUIEntry->OUI[2]));
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
|
||||
if (Result == FALSE)
|
||||
goto done;
|
||||
|
||||
|
||||
check_mac:
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
if (MAC_ADDR_EQUAL(pMACEntry->MACAddr, pAddr))
|
||||
{
|
||||
Result = FALSE;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : hit mac =%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,PRINT_MAC(pAddr)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
done:
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
||||
VOID ACL_V2_AgeOut(
|
||||
IN PACL_V2_CTRL pACLCtrl)
|
||||
{
|
||||
ACL_MAC_CTRL *pMACEntry, *pMACEntryTmp;
|
||||
ACL_OUI_CTRL *pOUIEntry, *pOUIEntryTmp;
|
||||
|
||||
INT32 Ret;
|
||||
UINT32 Now32;
|
||||
INT i = 0;
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
UCHAR Apidx;
|
||||
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
{
|
||||
RTMP_SEM_LOCK(&pACLCtrl->OUI_ListLock);
|
||||
if(pACLCtrl->OUI_Enable)
|
||||
{
|
||||
DlListForEachSafe(pOUIEntry, pOUIEntryTmp, &pACLCtrl->OUI_List, ACL_OUI_CTRL, List)
|
||||
{
|
||||
if(RTMP_TIME_AFTER(Now32, pOUIEntry->SetTime + (pACLCtrl->BlockTime * OS_HZ)))
|
||||
{
|
||||
DlListDel(&pOUIEntry->List);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : age OUI[%d] =%02x:%02x:%02x\n", __FUNCTION__, i, pOUIEntry->OUI[0], pOUIEntry->OUI[1], pOUIEntry->OUI[2]));
|
||||
i++;
|
||||
pACLCtrl->OUI_ListNum --;
|
||||
if(pACLCtrl->OUI_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->OUI_Enable = 0;
|
||||
}
|
||||
os_free_mem(NULL, pOUIEntry);
|
||||
}
|
||||
}
|
||||
|
||||
DlListInit(&pACLCtrl->OUI_List);
|
||||
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->OUI_ListLock);
|
||||
|
||||
|
||||
i=0;
|
||||
|
||||
RTMP_SEM_LOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
if(pACLCtrl->MAC_Enable)
|
||||
{
|
||||
DlListForEachSafe(pMACEntry, pMACEntryTmp, &pACLCtrl->MAC_List, ACL_MAC_CTRL, List)
|
||||
{
|
||||
if(RTMP_TIME_AFTER(Now32, pMACEntry->SetTime + (pACLCtrl->BlockTime * OS_HZ)))
|
||||
{
|
||||
DlListDel(&pMACEntry->List);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : age MAC[%d] =%02x:%02x:%02x,%02x:%02x:%02x\n", __FUNCTION__, i, PRINT_MAC(pMACEntry->MACAddr)));
|
||||
i++;
|
||||
|
||||
pACLCtrl->MAC_ListNum --;
|
||||
if(pACLCtrl->MAC_ListNum == 0)
|
||||
{
|
||||
pACLCtrl->MAC_Enable = 0;
|
||||
}
|
||||
os_free_mem(NULL, pMACEntry);
|
||||
}
|
||||
}
|
||||
|
||||
DlListInit(&pACLCtrl->MAC_List);
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&pACLCtrl->MAC_ListLock);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void ACL_V2_Timeout(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
PACL_V2_CTRL pACLCtrl = (ACL_V2_CTRL *)FunctionContext;
|
||||
PRTMP_ADAPTER pAd = pACLCtrl->pAd;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s\n", __FUNCTION__));
|
||||
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s: fRTMP_ADAPTER_HALT_IN_PROGRESS\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
ACL_V2_AgeOut(pACLCtrl);
|
||||
|
||||
}
|
||||
|
||||
#endif /* ACL_V2_SUPPORT */
|
||||
4961
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_apcli.c
Normal file
4961
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_apcli.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,195 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2006, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_apcli.c
|
||||
|
||||
Abstract:
|
||||
Support AP-Client function.
|
||||
|
||||
Note:
|
||||
1. Call RT28xx_ApCli_Init() in init function and
|
||||
call RT28xx_ApCli_Remove() in close function
|
||||
|
||||
2. MAC of ApCli-interface is initialized in RT28xx_ApCli_Init()
|
||||
|
||||
3. ApCli index (0) of different rx packet is got in
|
||||
|
||||
4. ApCli index (0) of different tx packet is assigned in
|
||||
|
||||
5. ApCli index (0) of different interface is got in APHardTransmit() by using
|
||||
|
||||
6. ApCli index (0) of IOCTL command is put in pAd->OS_Cookie->ioctl_if
|
||||
|
||||
8. The number of ApCli only can be 1
|
||||
|
||||
9. apcli convert engine subroutines, we should just take care data packet.
|
||||
Revision History:
|
||||
Who When What
|
||||
-------------- ---------- ----------------------------------------------
|
||||
Shiang, Fonchi 02-13-2007 created
|
||||
*/
|
||||
#define RTMP_MODULE_OS
|
||||
|
||||
#ifdef APCLI_SUPPORT
|
||||
|
||||
/*#include "rt_config.h" */
|
||||
#include "rtmp_comm.h"
|
||||
#include "rt_os_util.h"
|
||||
#include "rt_os_net.h"
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Init AP-Client function.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
main_dev_p points to the main BSS network interface
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
1. Only create and initialize virtual network interfaces.
|
||||
2. No main network interface here.
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28xx_ApCli_Init(VOID *pAd, PNET_DEV main_dev_p)
|
||||
{
|
||||
RTMP_OS_NETDEV_OP_HOOK netDevOpHook;
|
||||
|
||||
/* init operation functions */
|
||||
NdisZeroMemory(&netDevOpHook, sizeof(RTMP_OS_NETDEV_OP_HOOK));
|
||||
netDevOpHook.open = ApCli_VirtualIF_Open;
|
||||
netDevOpHook.stop = ApCli_VirtualIF_Close;
|
||||
netDevOpHook.xmit = rt28xx_send_packets;
|
||||
netDevOpHook.ioctl = rt28xx_ioctl;
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_INIT,
|
||||
0, &netDevOpHook, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Open a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
dev_p which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: open successfully
|
||||
otherwise: open fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT ApCli_VirtualIF_Open(PNET_DEV dev_p)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
/* increase MODULE use count */
|
||||
RT_MOD_INC_USE_COUNT();
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p);
|
||||
ASSERT(pAd);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p)));
|
||||
|
||||
if (VIRTUAL_IF_UP(pAd) != 0)
|
||||
return -1;
|
||||
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_REG(dev_p);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_OPEN, 0, dev_p, 0);
|
||||
|
||||
#ifdef MTFWD
|
||||
RTMP_OS_NETDEV_CARRIER_OFF(dev_p);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Close a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
dev_p which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: close successfully
|
||||
otherwise: close fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT ApCli_VirtualIF_Close(PNET_DEV dev_p)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(dev_p);
|
||||
ASSERT(pAd);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p)));
|
||||
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_CLOSE, 0, dev_p, 0);
|
||||
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_DEREG(dev_p);
|
||||
#endif
|
||||
|
||||
VIRTUAL_IF_DOWN(pAd);
|
||||
|
||||
RT_MOD_DEC_USE_COUNT();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Remove ApCli-BSS network interface.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28xx_ApCli_Remove(VOID *pAd)
|
||||
{
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_APC_REMOVE, 0, NULL, 0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif /* APCLI_SUPPORT */
|
||||
|
||||
3417
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_assoc.c
Normal file
3417
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_assoc.c
Normal file
File diff suppressed because it is too large
Load Diff
1374
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_auth.c
Normal file
1374
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_auth.c
Normal file
File diff suppressed because it is too large
Load Diff
1563
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_autoChSel.c
Normal file
1563
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_autoChSel.c
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
17758
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_cfg.c
Normal file
17758
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_cfg.c
Normal file
File diff suppressed because it is too large
Load Diff
1890
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_connect.c
Normal file
1890
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_connect.c
Normal file
File diff suppressed because it is too large
Load Diff
4133
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_data.c
Normal file
4133
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_data.c
Normal file
File diff suppressed because it is too large
Load Diff
27
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_dls.c
Normal file
27
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_dls.c
Normal file
@ -0,0 +1,27 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Abstract:
|
||||
|
||||
Handle WMM-DLS state machine.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
|
||||
/* End of ap_dls.c */
|
||||
1775
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_ftkd.c
Normal file
1775
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_ftkd.c
Normal file
File diff suppressed because it is too large
Load Diff
481
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_ids.c
Normal file
481
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_ids.c
Normal file
@ -0,0 +1,481 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_ids.c
|
||||
|
||||
Abstract:
|
||||
monitor intrusion detection condition
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
#ifdef IDS_SUPPORT
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
#define IDS_EXEC_INTV 1000 /* 1 sec */
|
||||
|
||||
|
||||
VOID RTMPIdsStart(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
|
||||
if (pAd->ApCfg.IDSTimerRunning == FALSE)
|
||||
{
|
||||
RTMPSetTimer(&pAd->ApCfg.IDSTimer, IDS_EXEC_INTV);
|
||||
pAd->ApCfg.IDSTimerRunning = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
VOID RTMPIdsStop(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
BOOLEAN Cancelled;
|
||||
|
||||
if (pAd->ApCfg.IDSTimerRunning == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&pAd->ApCfg.IDSTimer, &Cancelled);
|
||||
pAd->ApCfg.IDSTimerRunning = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SYSTEM_LOG_SUPPORT
|
||||
VOID RTMPHandleIdsEvent(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT i, j;
|
||||
|
||||
UINT32 FloodFrameCount[IW_FLOOD_EVENT_TYPE_NUM];
|
||||
UINT32 FloodFrameThreshold[IW_FLOOD_EVENT_TYPE_NUM];
|
||||
|
||||
FloodFrameCount[0] = pAd->ApCfg.RcvdAuthCount;
|
||||
FloodFrameCount[1] = pAd->ApCfg.RcvdAssocReqCount;
|
||||
FloodFrameCount[2] = pAd->ApCfg.RcvdReassocReqCount;
|
||||
FloodFrameCount[3] = pAd->ApCfg.RcvdProbeReqCount;
|
||||
FloodFrameCount[4] = pAd->ApCfg.RcvdDisassocCount;
|
||||
FloodFrameCount[5] = pAd->ApCfg.RcvdDeauthCount;
|
||||
FloodFrameCount[6] = pAd->ApCfg.RcvdEapReqCount;
|
||||
|
||||
FloodFrameThreshold[0] = pAd->ApCfg.AuthFloodThreshold;
|
||||
FloodFrameThreshold[1] = pAd->ApCfg.AssocReqFloodThreshold;
|
||||
FloodFrameThreshold[2] = pAd->ApCfg.ReassocReqFloodThreshold;
|
||||
FloodFrameThreshold[3] = pAd->ApCfg.ProbeReqFloodThreshold;
|
||||
FloodFrameThreshold[4] = pAd->ApCfg.DisassocFloodThreshold;
|
||||
FloodFrameThreshold[5] = pAd->ApCfg.DeauthFloodThreshold;
|
||||
FloodFrameThreshold[6] = pAd->ApCfg.EapReqFloodThreshold;
|
||||
|
||||
/* trigger flooding traffic event */
|
||||
for (j = 0; j < IW_FLOOD_EVENT_TYPE_NUM; j++)
|
||||
{
|
||||
if ((FloodFrameThreshold[j] > 0) && (FloodFrameCount[j] > FloodFrameThreshold[j]))
|
||||
{
|
||||
RTMPSendWirelessEvent(pAd, IW_FLOOD_AUTH_EVENT_FLAG + j, NULL, MAX_MBSSID_NUM(pAd), 0);
|
||||
/*DBGPRINT(RT_DEBUG_TRACE, ("flooding traffic event(%d) - %d\n", IW_FLOOD_AUTH_EVENT_FLAG + j, FloodFrameCount[j])); */
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
UINT32 SpoofedFrameCount[IW_SPOOF_EVENT_TYPE_NUM];
|
||||
CHAR RssiOfSpoofedFrame[IW_SPOOF_EVENT_TYPE_NUM];
|
||||
INT k;
|
||||
|
||||
SpoofedFrameCount[0] = pAd->ApCfg.MBSSID[i].RcvdConflictSsidCount;
|
||||
SpoofedFrameCount[1] = pAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount;
|
||||
SpoofedFrameCount[2] = pAd->ApCfg.MBSSID[i].RcvdSpoofedReassocRespCount;
|
||||
SpoofedFrameCount[3] = pAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount;
|
||||
SpoofedFrameCount[4] = pAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount;
|
||||
SpoofedFrameCount[5] = pAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount;
|
||||
SpoofedFrameCount[6] = pAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount;
|
||||
SpoofedFrameCount[7] = pAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount;
|
||||
SpoofedFrameCount[8] = pAd->ApCfg.MBSSID[i].RcvdSpoofedUnknownMgmtCount;
|
||||
SpoofedFrameCount[9] = pAd->ApCfg.MBSSID[i].RcvdReplayAttackCount;
|
||||
|
||||
RssiOfSpoofedFrame[0] = pAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid;
|
||||
RssiOfSpoofedFrame[1] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp;
|
||||
RssiOfSpoofedFrame[2] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedReassocResp;
|
||||
RssiOfSpoofedFrame[3] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp;
|
||||
RssiOfSpoofedFrame[4] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon;
|
||||
RssiOfSpoofedFrame[5] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc;
|
||||
RssiOfSpoofedFrame[6] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth;
|
||||
RssiOfSpoofedFrame[7] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth;
|
||||
RssiOfSpoofedFrame[8] = pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedUnknownMgmt;
|
||||
RssiOfSpoofedFrame[9] = pAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack;
|
||||
|
||||
/* trigger spoofed attack event */
|
||||
for (k = 0; k < IW_SPOOF_EVENT_TYPE_NUM; k++)
|
||||
{
|
||||
if (SpoofedFrameCount[k] > 0)
|
||||
{
|
||||
RTMPSendWirelessEvent(pAd, IW_CONFLICT_SSID_EVENT_FLAG + k, NULL, i, RssiOfSpoofedFrame[k]);
|
||||
/*DBGPRINT(RT_DEBUG_TRACE, ("spoofed attack event(%d) - %d\n", IW_CONFLICT_SSID_EVENT_FLAG + k, SpoofedFrameCount[k])); */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif /* SYSTEM_LOG_SUPPORT */
|
||||
|
||||
VOID RTMPClearAllIdsCounter(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT i;
|
||||
|
||||
pAd->ApCfg.RcvdAuthCount = 0;
|
||||
pAd->ApCfg.RcvdAssocReqCount = 0;
|
||||
pAd->ApCfg.RcvdReassocReqCount = 0;
|
||||
pAd->ApCfg.RcvdProbeReqCount = 0;
|
||||
pAd->ApCfg.RcvdDisassocCount = 0;
|
||||
pAd->ApCfg.RcvdDeauthCount = 0;
|
||||
pAd->ApCfg.RcvdEapReqCount = 0;
|
||||
pAd->ApCfg.RcvdMaliciousDataCount = 0;
|
||||
|
||||
for (i = 0; i < pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
pAd->ApCfg.MBSSID[i].RcvdConflictSsidCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedReassocRespCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedUnknownMgmtCount = 0;
|
||||
pAd->ApCfg.MBSSID[i].RcvdReplayAttackCount = 0;
|
||||
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedReassocResp = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedUnknownMgmt = 0;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack = 0;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
VOID RTMPIdsPeriodicExec(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext;
|
||||
|
||||
pAd->ApCfg.IDSTimerRunning = FALSE;
|
||||
|
||||
#ifdef SYSTEM_LOG_SUPPORT
|
||||
/* when IDS occured, send out wireless event */
|
||||
if (pAd->CommonCfg.bWirelessEvent)
|
||||
RTMPHandleIdsEvent(pAd);
|
||||
#endif /* SYSTEM_LOG_SUPPORT */
|
||||
|
||||
/* clear all IDS counter */
|
||||
RTMPClearAllIdsCounter(pAd);
|
||||
|
||||
/* set timer */
|
||||
if (pAd->ApCfg.IdsEnable)
|
||||
{
|
||||
RTMPSetTimer(&pAd->ApCfg.IDSTimer, IDS_EXEC_INTV);
|
||||
pAd->ApCfg.IDSTimerRunning = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
This routine is used to check if a rogue AP sent an 802.11 management
|
||||
frame to a client using our BSSID.
|
||||
|
||||
Arguments:
|
||||
pAd - Pointer to our adapter
|
||||
pHeader - Pointer to 802.11 header
|
||||
|
||||
Return Value:
|
||||
TRUE - This is a spoofed frame
|
||||
FALSE - This isn't a spoofed frame
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RTMPSpoofedMgmtDetection(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN HEADER_802_11 *pHeader,
|
||||
IN RX_BLK *rxblk)
|
||||
{
|
||||
INT i;
|
||||
|
||||
for (i = 0; i < pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
/* Spoofed BSSID detection */
|
||||
if (NdisEqualMemory(pHeader->Addr2, pAd->ApCfg.MBSSID[i].wdev.bssid, MAC_ADDR_LEN))
|
||||
{
|
||||
CHAR RcvdRssi;
|
||||
struct raw_rssi_info rssi_info;
|
||||
|
||||
rssi_info.raw_rssi[0] = rxblk->rx_signal.raw_rssi[0];
|
||||
rssi_info.raw_rssi[1] = rxblk->rx_signal.raw_rssi[1];
|
||||
rssi_info.raw_rssi[2] = rxblk->rx_signal.raw_rssi[2];
|
||||
RcvdRssi = RTMPMaxRssi(pAd,
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2));
|
||||
|
||||
switch (pHeader->FC.SubType)
|
||||
{
|
||||
case SUBTYPE_ASSOC_RSP:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedAssocRespCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAssocResp = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_REASSOC_RSP:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedReassocRespCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedReassocResp = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_PROBE_RSP:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedProbeRespCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedProbeResp = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_BEACON:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedBeaconCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedBeacon = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_DISASSOC:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedDisassocCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDisassoc = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_AUTH:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedAuthCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedAuth = RcvdRssi;
|
||||
break;
|
||||
|
||||
case SUBTYPE_DEAUTH:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedDeauthCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedDeauth = RcvdRssi;
|
||||
break;
|
||||
|
||||
default:
|
||||
pAd->ApCfg.MBSSID[i].RcvdSpoofedUnknownMgmtCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdSpoofedUnknownMgmt = RcvdRssi;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
VOID RTMPConflictSsidDetection(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pSsid,
|
||||
IN UCHAR SsidLen,
|
||||
IN CHAR Rssi0,
|
||||
IN CHAR Rssi1,
|
||||
IN CHAR Rssi2)
|
||||
{
|
||||
INT i;
|
||||
|
||||
for (i = 0; i < pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
/* Conflict SSID detection */
|
||||
if (SSID_EQUAL(pSsid, SsidLen, pAd->ApCfg.MBSSID[i].Ssid, pAd->ApCfg.MBSSID[i].SsidLen))
|
||||
{
|
||||
CHAR RcvdRssi;
|
||||
struct raw_rssi_info rssi_info;
|
||||
|
||||
rssi_info.raw_rssi[0] = Rssi0;
|
||||
rssi_info.raw_rssi[1] = Rssi1;
|
||||
rssi_info.raw_rssi[2] = Rssi2;
|
||||
|
||||
RcvdRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2));
|
||||
|
||||
pAd->ApCfg.MBSSID[i].RcvdConflictSsidCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdConflictSsid = RcvdRssi;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN RTMPReplayAttackDetection(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UCHAR *pAddr2,
|
||||
IN RX_BLK *rxblk)
|
||||
{
|
||||
INT i;
|
||||
|
||||
for (i = 0; i < pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
/* Conflict SSID detection */
|
||||
if (NdisEqualMemory(pAddr2, pAd->ApCfg.MBSSID[i].wdev.bssid, MAC_ADDR_LEN))
|
||||
{
|
||||
CHAR RcvdRssi;
|
||||
struct raw_rssi_info rssi_info;
|
||||
|
||||
rssi_info.raw_rssi[0] = rxblk->rx_signal.raw_rssi[0];
|
||||
rssi_info.raw_rssi[1] = rxblk->rx_signal.raw_rssi[1];
|
||||
rssi_info.raw_rssi[2] = rxblk->rx_signal.raw_rssi[2];
|
||||
|
||||
RcvdRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, &rssi_info, RSSI_IDX_0),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_1),
|
||||
ConvertToRssi(pAd, &rssi_info, RSSI_IDX_2));
|
||||
|
||||
pAd->ApCfg.MBSSID[i].RcvdReplayAttackCount ++;
|
||||
pAd->ApCfg.MBSSID[i].RssiOfRcvdReplayAttack = RcvdRssi;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VOID RTMPUpdateStaMgmtCounter(RTMP_ADAPTER *pAd, USHORT type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case SUBTYPE_ASSOC_REQ:
|
||||
pAd->ApCfg.RcvdAssocReqCount ++;
|
||||
break;
|
||||
|
||||
case SUBTYPE_REASSOC_REQ:
|
||||
pAd->ApCfg.RcvdReassocReqCount ++;
|
||||
break;
|
||||
|
||||
case SUBTYPE_PROBE_REQ:
|
||||
pAd->ApCfg.RcvdProbeReqCount ++;
|
||||
break;
|
||||
|
||||
case SUBTYPE_DISASSOC:
|
||||
pAd->ApCfg.RcvdDisassocCount ++;
|
||||
break;
|
||||
|
||||
case SUBTYPE_DEAUTH:
|
||||
pAd->ApCfg.RcvdDeauthCount ++;
|
||||
break;
|
||||
|
||||
case SUBTYPE_AUTH:
|
||||
pAd->ApCfg.RcvdAuthCount ++;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdAssocReqCount=%d\n", pAd->ApCfg.RcvdAssocReqCount));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdReassocReqCount=%d\n", pAd->ApCfg.RcvdReassocReqCount));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdProbeReqCount=%d\n", pAd->ApCfg.RcvdProbeReqCount));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdDisassocCount=%d\n", pAd->ApCfg.RcvdDisassocCount));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdDeauthCount=%d\n", pAd->ApCfg.RcvdDeauthCount));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RcvdAuthCount=%d\n", pAd->ApCfg.RcvdAuthCount));
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
VOID rtmp_read_ids_from_file(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
RTMP_STRING *tmpbuf,
|
||||
RTMP_STRING *buffer)
|
||||
{
|
||||
/*IdsEnable */
|
||||
if(RTMPGetKeyParameter("IdsEnable", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
if (simple_strtol(tmpbuf, 0, 10) == 1)
|
||||
pAd->ApCfg.IdsEnable = TRUE;
|
||||
else
|
||||
pAd->ApCfg.IdsEnable = FALSE;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("IDS is %s\n", pAd->ApCfg.IdsEnable ? "enabled" : "disabled"));
|
||||
}
|
||||
|
||||
/*AuthFloodThreshold */
|
||||
if(RTMPGetKeyParameter("AuthFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.AuthFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("AuthFloodThreshold = %d\n", pAd->ApCfg.AuthFloodThreshold));
|
||||
}
|
||||
|
||||
/*AssocReqFloodThreshold */
|
||||
if(RTMPGetKeyParameter("AssocReqFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.AssocReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("AssocReqFloodThreshold = %d\n", pAd->ApCfg.AssocReqFloodThreshold));
|
||||
}
|
||||
|
||||
/*ReassocReqFloodThreshold */
|
||||
if(RTMPGetKeyParameter("ReassocReqFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.ReassocReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ReassocReqFloodThreshold = %d\n", pAd->ApCfg.ReassocReqFloodThreshold));
|
||||
}
|
||||
|
||||
/*ProbeReqFloodThreshold */
|
||||
if(RTMPGetKeyParameter("ProbeReqFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.ProbeReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ProbeReqFloodThreshold = %d\n", pAd->ApCfg.ProbeReqFloodThreshold));
|
||||
}
|
||||
|
||||
/*DisassocFloodThreshold */
|
||||
if(RTMPGetKeyParameter("DisassocFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.DisassocFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("DisassocFloodThreshold = %d\n", pAd->ApCfg.DisassocFloodThreshold));
|
||||
}
|
||||
|
||||
/*DeauthFloodThreshold */
|
||||
if(RTMPGetKeyParameter("DeauthFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.DeauthFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("DeauthFloodThreshold = %d\n", pAd->ApCfg.DeauthFloodThreshold));
|
||||
}
|
||||
|
||||
/*EapReqFloodThreshold */
|
||||
if(RTMPGetKeyParameter("EapReqFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.EapReqFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("EapReqFloodThreshold = %d\n", pAd->ApCfg.EapReqFloodThreshold));
|
||||
}
|
||||
|
||||
/* DataFloodThreshold */
|
||||
if(RTMPGetKeyParameter("DataFloodThreshold", tmpbuf, 10, buffer, TRUE))
|
||||
{
|
||||
pAd->ApCfg.DataFloodThreshold = simple_strtol(tmpbuf, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("DataFloodThreshold = %d\n", pAd->ApCfg.DataFloodThreshold));
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* IDS_SUPPORT */
|
||||
454
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_mbss.c
Normal file
454
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_mbss.c
Normal file
@ -0,0 +1,454 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Abstract:
|
||||
|
||||
Support multi-BSS function.
|
||||
|
||||
Note:
|
||||
1. Call RT28xx_MBSS_Init() in init function and
|
||||
call RT28xx_MBSS_Remove() in close function
|
||||
|
||||
2. MAC of different BSS is initialized in APStartUp()
|
||||
|
||||
3. BSS Index (0 ~ 15) of different rx packet is got in
|
||||
|
||||
4. BSS Index (0 ~ 15) of different tx packet is assigned in
|
||||
|
||||
5. BSS Index (0 ~ 15) of different BSS is got in APHardTransmit() by using
|
||||
|
||||
6. BSS Index (0 ~ 15) of IOCTL command is put in pAd->OS_Cookie->ioctl_if
|
||||
|
||||
7. Beacon of different BSS is enabled in APMakeAllBssBeacon() by writing 1
|
||||
to the register MAC_BSSID_DW1
|
||||
|
||||
8. The number of MBSS can be 1, 2, 4, or 8
|
||||
|
||||
***************************************************************************/
|
||||
#ifdef MBSS_SUPPORT
|
||||
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
/* --------------------------------- Public -------------------------------- */
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize Multi-BSS function.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
pDevMain points to the main BSS network interface
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
1. Only create and initialize virtual network interfaces.
|
||||
2. No main network interface here.
|
||||
3. If you down ra0 and modify the BssNum of RT2860AP.dat/RT2870AP.dat,
|
||||
it will not work! You must rmmod rt2860ap.ko and lsmod rt2860ap.ko again.
|
||||
========================================================================
|
||||
*/
|
||||
VOID MBSS_Init(RTMP_ADAPTER *pAd, RTMP_OS_NETDEV_OP_HOOK *pNetDevOps)
|
||||
{
|
||||
#define MBSS_MAX_DEV_NUM 32
|
||||
PNET_DEV pDevNew;
|
||||
INT32 IdBss, MaxNumBss;
|
||||
//INT status;
|
||||
RTMP_OS_NETDEV_OP_HOOK netDevHook;
|
||||
|
||||
/* sanity check to avoid redundant virtual interfaces are created */
|
||||
if (pAd->FlgMbssInit != FALSE)
|
||||
return;
|
||||
|
||||
|
||||
MaxNumBss = pAd->ApCfg.BssidNum;
|
||||
if (MaxNumBss > MAX_MBSSID_NUM(pAd))
|
||||
MaxNumBss = MAX_MBSSID_NUM(pAd);
|
||||
|
||||
/* first IdBss must not be 0 (BSS0), must be 1 (BSS1) */
|
||||
for(IdBss=FIRST_MBSSID; IdBss<MAX_MBSSID_NUM(pAd); IdBss++)
|
||||
pAd->ApCfg.MBSSID[IdBss].wdev.if_dev = NULL;
|
||||
|
||||
/* create virtual network interface */
|
||||
for(IdBss=FIRST_MBSSID; IdBss<MaxNumBss; IdBss++)
|
||||
{
|
||||
struct wifi_dev *wdev;
|
||||
UINT32 MC_RowID = 0, IoctlIF = 0;
|
||||
char *dev_name;
|
||||
#ifdef MULTIPLE_CARD_SUPPORT
|
||||
MC_RowID = pAd->MC_RowID;
|
||||
#endif /* MULTIPLE_CARD_SUPPORT */
|
||||
#ifdef HOSTAPD_SUPPORT
|
||||
IoctlIF = pAd->IoctlIF;
|
||||
#endif /* HOSTAPD_SUPPORT */
|
||||
BSS_STRUCT *pMbss;
|
||||
|
||||
dev_name = get_dev_name_prefix(pAd, INT_MBSSID);
|
||||
pDevNew = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, INT_MBSSID, IdBss, sizeof(struct mt_dev_priv), dev_name);
|
||||
#ifdef HOSTAPD_SUPPORT
|
||||
pAd->IoctlIF = IoctlIF;
|
||||
#endif /* HOSTAPD_SUPPORT */
|
||||
if (pDevNew == NULL)
|
||||
{
|
||||
pAd->ApCfg.BssidNum = IdBss; /* re-assign new MBSS number */
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Register MBSSID IF (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pDevNew)));
|
||||
}
|
||||
|
||||
pMbss = &pAd->ApCfg.MBSSID[IdBss];
|
||||
wdev = &pAd->ApCfg.MBSSID[IdBss].wdev;
|
||||
wdev->wdev_type = WDEV_TYPE_AP;
|
||||
wdev->func_dev = &pAd->ApCfg.MBSSID[IdBss];
|
||||
wdev->func_idx = IdBss;
|
||||
wdev->sys_handle = (void *)pAd;
|
||||
wdev->if_dev = pDevNew;
|
||||
if (rtmp_wdev_idx_reg(pAd, wdev) < 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Assign wdev idx for %s failed, free net device!\n",
|
||||
RTMP_OS_NETDEV_GET_DEVNAME(pDevNew)));
|
||||
RtmpOSNetDevFree(pDevNew);
|
||||
break;
|
||||
}
|
||||
wdev->tx_pkt_allowed = ApAllowToSendPacket;
|
||||
wdev->tx_pkt_handle = APSendPacket;
|
||||
wdev->wdev_hard_tx = APHardTransmit;
|
||||
|
||||
wdev->rx_pkt_allowed = ap_rx_pkt_allow;
|
||||
wdev->rx_ps_handle = ap_rx_ps_handle;
|
||||
wdev->rx_pkt_foward = ap_rx_foward_handle;
|
||||
|
||||
RTMP_OS_NETDEV_SET_PRIV(pDevNew, pAd);
|
||||
RTMP_OS_NETDEV_SET_WDEV(pDevNew, wdev);
|
||||
|
||||
/* init operation functions and flags */
|
||||
NdisCopyMemory(&netDevHook, pNetDevOps, sizeof(netDevHook));
|
||||
|
||||
netDevHook.priv_flags = INT_MBSSID;
|
||||
netDevHook.needProtcted = TRUE;
|
||||
netDevHook.wdev = wdev;
|
||||
|
||||
/* Init MAC address of virtual network interface */
|
||||
NdisMoveMemory(&netDevHook.devAddr[0], &wdev->bssid[0], MAC_ADDR_LEN);
|
||||
|
||||
/* register this device to OS */
|
||||
/*status =*/ RtmpOSNetDevAttach(pAd->OpMode, pDevNew, &netDevHook);
|
||||
ASSERT(pMbss);
|
||||
if (pMbss) {
|
||||
wdev_bcn_buf_init(pAd, &pMbss->bcn_buf);
|
||||
} else {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s():func_dev is NULL!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pAd->FlgMbssInit = TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Remove Multi-BSS network interface.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
FIRST_MBSSID = 1
|
||||
Main BSS is not removed here.
|
||||
========================================================================
|
||||
*/
|
||||
VOID MBSS_Remove(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
struct wifi_dev *wdev;
|
||||
UINT IdBss;
|
||||
BSS_STRUCT *pMbss;
|
||||
|
||||
|
||||
|
||||
for(IdBss=FIRST_MBSSID; IdBss<MAX_MBSSID_NUM(pAd); IdBss++)
|
||||
{
|
||||
wdev = &pAd->ApCfg.MBSSID[IdBss].wdev;
|
||||
pMbss = &pAd->ApCfg.MBSSID[IdBss];
|
||||
if (pMbss) {
|
||||
wdev_bcn_buf_deinit(pAd, &pMbss->bcn_buf);
|
||||
}
|
||||
if (wdev->if_dev)
|
||||
{
|
||||
RtmpOSNetDevProtect(1);
|
||||
RtmpOSNetDevDetach(wdev->if_dev);
|
||||
RtmpOSNetDevProtect(0);
|
||||
rtmp_wdev_idx_unreg(pAd, wdev);
|
||||
RtmpOSNetDevFree(wdev->if_dev);
|
||||
wdev->if_dev = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Get multiple bss idx.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
pDev which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: close successfully
|
||||
otherwise: close fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT32 RT28xx_MBSS_IdxGet(RTMP_ADAPTER *pAd, PNET_DEV pDev)
|
||||
{
|
||||
INT32 BssId = -1;
|
||||
INT32 IdBss;
|
||||
|
||||
|
||||
for(IdBss=0; IdBss<pAd->ApCfg.BssidNum; IdBss++)
|
||||
{
|
||||
if (pAd->ApCfg.MBSSID[IdBss].wdev.if_dev == pDev)
|
||||
{
|
||||
BssId = IdBss;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return BssId;
|
||||
}
|
||||
|
||||
#ifdef MT_MAC
|
||||
INT32 mbss_cr_enable(PNET_DEV pDev)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
INT BssId;
|
||||
UINT32 Value = 0;
|
||||
//register for sub Bssid start from 0x603000a0
|
||||
UINT32 bssid_reg_base = LPON_SBTOR1;
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
BssId = RT28xx_MBSS_IdxGet(pAd, pDev);
|
||||
printk("##### %s, BssId = %d\n", __func__, BssId);
|
||||
if (BssId < 0)
|
||||
return -1;
|
||||
|
||||
if (pAd->chipCap.hif_type != HIF_MT)
|
||||
return 0;
|
||||
|
||||
|
||||
if (BssId >= 1) {
|
||||
//if there is any sub bssid is enable. this bit in LPON_SBTOR1 shall be 1 always.
|
||||
RTMP_IO_READ32(pAd, bssid_reg_base, &Value);
|
||||
Value |= SBSS_TBTT0_TSF0_EN;
|
||||
RTMP_IO_WRITE32(pAd, bssid_reg_base, Value);
|
||||
|
||||
RTMP_IO_READ32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), &Value);
|
||||
Value = 0;
|
||||
Value &= ~SUB_BSSID0_TIME_OFFSET_n_MASK;
|
||||
Value |= SUB_BSSID0_TIME_OFFSET_n(BssId * (20 + 4096));
|
||||
|
||||
/* SIFS time, 20us, and assume bcn len is 512 byte, tx by 1Mbps.*/
|
||||
Value |= TBTT0_n_INT_EN;
|
||||
Value |= PRE_TBTT0_n_INT_EN;
|
||||
Value |= SBSS_TBTT0_TSF0_EN;
|
||||
|
||||
RTMP_IO_WRITE32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), Value);
|
||||
|
||||
/* Start Beacon Queue */
|
||||
RTMP_IO_READ32(pAd, ARB_BCNQCR0, &Value);
|
||||
Value |= (0x1 << (BssId+15));
|
||||
RTMP_IO_WRITE32(pAd, ARB_BCNQCR0, Value);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT mbss_cr_disable(PNET_DEV pDev)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
INT BssId;
|
||||
UINT32 Value;
|
||||
UINT32 bssid_reg_base = LPON_SBTOR1;
|
||||
UCHAR loop = 0;
|
||||
BOOLEAN any_mbss_enable = FALSE;
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
BssId = RT28xx_MBSS_IdxGet(pAd, pDev);
|
||||
if (BssId < 0)
|
||||
return -1;
|
||||
|
||||
if (pAd->chipCap.hif_type != HIF_MT)
|
||||
return 0;
|
||||
|
||||
for (loop = 1; loop < pAd->ApCfg.BssidNum; loop++) {
|
||||
if (loop == BssId)
|
||||
continue;//skip itself.
|
||||
if (pAd->ApCfg.MBSSID[loop].bcn_buf.bBcnSntReq == TRUE)
|
||||
any_mbss_enable = TRUE;
|
||||
}
|
||||
|
||||
if (BssId >= 1) {
|
||||
RTMP_IO_READ32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), &Value);
|
||||
Value = 0;
|
||||
Value &= ~SUB_BSSID0_TIME_OFFSET_n_MASK;
|
||||
Value |= SUB_BSSID0_TIME_OFFSET_n(BssId * (20 + 4096));
|
||||
Value &= ~TBTT0_n_INT_EN;
|
||||
Value &= ~PRE_TBTT0_n_INT_EN;
|
||||
if (any_mbss_enable == TRUE)
|
||||
Value |= SBSS_TBTT0_TSF0_EN;
|
||||
else
|
||||
Value &= ~SBSS_TBTT0_TSF0_EN;
|
||||
RTMP_IO_WRITE32(pAd, (bssid_reg_base + (BssId - 1) * (0x4)), Value);
|
||||
RTMP_IO_READ32(pAd, ARB_BCNQCR0, &Value);
|
||||
Value &= ~(0x1 << (BssId+15));
|
||||
RTMP_IO_WRITE32(pAd, ARB_BCNQCR0, Value);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* MT_MAC */
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Open a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
pDev which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: open successfully
|
||||
otherwise: open fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT32 MBSS_Open(PNET_DEV pDev)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
INT BssId;
|
||||
UINT32 u4MaxMBSSIDSize;
|
||||
|
||||
u4MaxMBSSIDSize = sizeof(pAd->ApCfg.MBSSID)/sizeof(pAd->ApCfg.MBSSID[0]);
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
BssId = RT28xx_MBSS_IdxGet(pAd, pDev);
|
||||
if (BssId < 0)
|
||||
return -1;
|
||||
|
||||
if(BssId >= u4MaxMBSSIDSize)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): Over buffer size!\n", __FUNCTION__));
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef AIRPLAY_SUPPORT
|
||||
if (AIRPLAY_ON(pAd))
|
||||
pAd->ApCfg.MBSSID[BssId].bcn_buf.bBcnSntReq = TRUE;
|
||||
else
|
||||
pAd->ApCfg.MBSSID[BssId].bcn_buf.bBcnSntReq = FALSE;
|
||||
#else
|
||||
pAd->ApCfg.MBSSID[BssId].bcn_buf.bBcnSntReq = TRUE;
|
||||
#endif /* AIRPLAY_SUPPORT */
|
||||
|
||||
#ifdef BAND_STEERING
|
||||
if(pAd->ApCfg.BandSteering)
|
||||
{
|
||||
PBND_STRG_CLI_TABLE table;
|
||||
table = Get_BndStrgTable(pAd, BssId);
|
||||
if(table)
|
||||
{
|
||||
/* Inform daemon interface ready */
|
||||
BndStrg_SetInfFlags(pAd, &pAd->ApCfg.MBSSID[BssId].wdev, table, TRUE);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Close a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
pDev which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: close successfully
|
||||
otherwise: close fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT MBSS_Close(PNET_DEV pDev)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
INT BssId;
|
||||
UINT32 u4MaxMBSSIDSize;
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
BssId = RT28xx_MBSS_IdxGet(pAd, pDev);
|
||||
if (BssId < 0)
|
||||
return -1;
|
||||
|
||||
RTMP_OS_NETDEV_STOP_QUEUE(pDev);
|
||||
|
||||
/* kick out all stas behind the Bss */
|
||||
MbssKickOutStas(pAd, BssId, REASON_DISASSOC_INACTIVE);
|
||||
|
||||
u4MaxMBSSIDSize = sizeof(pAd->ApCfg.MBSSID)/sizeof(pAd->ApCfg.MBSSID[0]);
|
||||
if(BssId >= u4MaxMBSSIDSize)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): Over buffer size!\n", __FUNCTION__));
|
||||
return -1;
|
||||
}
|
||||
|
||||
pAd->ApCfg.MBSSID[BssId].bcn_buf.bBcnSntReq = FALSE;
|
||||
|
||||
|
||||
APMakeAllBssBeacon(pAd);
|
||||
APUpdateAllBeaconFrame(pAd);
|
||||
|
||||
#ifdef BAND_STEERING
|
||||
if(pAd->ApCfg.BandSteering)
|
||||
{
|
||||
PBND_STRG_CLI_TABLE table;
|
||||
table = Get_BndStrgTable(pAd, BssId);
|
||||
if(table)
|
||||
{
|
||||
/* Inform daemon interface down */
|
||||
BndStrg_SetInfFlags(pAd, &pAd->ApCfg.MBSSID[BssId].wdev, table, FALSE);
|
||||
}
|
||||
}
|
||||
#endif /* BAND_STEERING */
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* MBSS_SUPPORT */
|
||||
|
||||
202
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_mbss_inf.c
Normal file
202
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_mbss_inf.c
Normal file
@ -0,0 +1,202 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Abstract:
|
||||
|
||||
Support multi-BSS function.
|
||||
|
||||
Note:
|
||||
1. Call RT28xx_MBSS_Init() in init function and
|
||||
call RT28xx_MBSS_Remove() in close function
|
||||
|
||||
2. MAC of different BSS is initialized in APStartUp()
|
||||
|
||||
3. BSS Index (0 ~ 15) of different rx packet is got in
|
||||
|
||||
4. BSS Index (0 ~ 15) of different tx packet is assigned in
|
||||
|
||||
5. BSS Index (0 ~ 15) of different BSS is got in APHardTransmit() by using
|
||||
|
||||
6. BSS Index (0 ~ 15) of IOCTL command is put in pAd->OS_Cookie->ioctl_if
|
||||
|
||||
7. Beacon of different BSS is enabled in APMakeAllBssBeacon() by writing 1
|
||||
to the register MAC_BSSID_DW1
|
||||
|
||||
8. The number of MBSS can be 1, 2, 4, or 8
|
||||
|
||||
***************************************************************************/
|
||||
#define RTMP_MODULE_OS
|
||||
|
||||
#ifdef MBSS_SUPPORT
|
||||
|
||||
/*#include "rt_config.h" */
|
||||
#include "rtmp_comm.h"
|
||||
#include "rt_os_util.h"
|
||||
#include "rt_os_net.h"
|
||||
|
||||
|
||||
/* --------------------------------- Public -------------------------------- */
|
||||
NET_DEV_STATS *RT28xx_get_ether_stats(PNET_DEV net_dev);
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize Multi-BSS function.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
pDevMain points to the main BSS network interface
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
1. Only create and initialize virtual network interfaces.
|
||||
2. No main network interface here.
|
||||
3. If you down ra0 and modify the BssNum of RT2860AP.dat/RT2870AP.dat,
|
||||
it will not work! You must rmmod rt2860ap.ko and lsmod rt2860ap.ko again.
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28xx_MBSS_Init(VOID *pAd, PNET_DEV pDevMain)
|
||||
{
|
||||
RTMP_OS_NETDEV_OP_HOOK netDevHook;
|
||||
|
||||
NdisZeroMemory(&netDevHook, sizeof(netDevHook));
|
||||
netDevHook.open = MBSS_VirtualIF_Open; /* device opem hook point */
|
||||
netDevHook.stop = MBSS_VirtualIF_Close; /* device close hook point */
|
||||
netDevHook.xmit = rt28xx_send_packets; /* hard transmit hook point */
|
||||
netDevHook.ioctl = rt28xx_ioctl; /* ioctl hook point */
|
||||
netDevHook.get_stats = RT28xx_get_ether_stats;
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_INIT,
|
||||
0, &netDevHook, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Remove Multi-BSS network interface.
|
||||
|
||||
Arguments:
|
||||
pAd points to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
FIRST_MBSSID = 1
|
||||
Main BSS is not removed here.
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28xx_MBSS_Remove(VOID *pAd)
|
||||
{
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_REMOVE, 0, NULL, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* --------------------------------- Private -------------------------------- */
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Open a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
pDev which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: open successfully
|
||||
otherwise: open fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT MBSS_VirtualIF_Open(PNET_DEV pDev)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
/* increase MODULE use count */
|
||||
RT_MOD_INC_USE_COUNT();
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> MBSSVirtualIF_open\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev)));
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_OPEN, 0, pDev, 0);
|
||||
|
||||
if (VIRTUAL_IF_UP(pAd) != 0)
|
||||
return -1;
|
||||
|
||||
#ifdef MT_MAC
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_CR_ENABLE, 0, pDev, 0);
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_REG(pDev);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
RTMP_OS_NETDEV_START_QUEUE(pDev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Close a virtual network interface.
|
||||
|
||||
Arguments:
|
||||
pDev which WLAN network interface
|
||||
|
||||
Return Value:
|
||||
0: close successfully
|
||||
otherwise: close fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT MBSS_VirtualIF_Close(PNET_DEV pDev)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> MBSSVirtualIF_close\n", RTMP_OS_NETDEV_GET_DEVNAME(pDev)));
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(pDev);
|
||||
|
||||
#ifdef MT_MAC
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_CR_DISABLE, 0, pDev, 0);
|
||||
#endif
|
||||
|
||||
RTMP_OS_NETDEV_STOP_QUEUE(pDev);
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_MBSS_CLOSE, 0, pDev, 0);
|
||||
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_DEREG(pDev);
|
||||
#endif
|
||||
VIRTUAL_IF_DOWN(pAd);
|
||||
|
||||
RT_MOD_DEC_USE_COUNT();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* MBSS_SUPPORT */
|
||||
|
||||
533
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_mix_mode.c
Normal file
533
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_mix_mode.c
Normal file
@ -0,0 +1,533 @@
|
||||
#include "rt_config.h"
|
||||
#include "mix_mode.h"
|
||||
|
||||
|
||||
static INT scan_ch_restore_for_MixMode(RTMP_ADAPTER *pAd, UCHAR OpMode)
|
||||
{
|
||||
INT bw, ch;
|
||||
|
||||
|
||||
if (pAd->CommonCfg.BBPCurrentBW != pAd->hw_cfg.bbp_bw)
|
||||
bbp_set_bw(pAd, pAd->hw_cfg.bbp_bw);
|
||||
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (pAd->hw_cfg.bbp_bw == BW_80)
|
||||
ch = pAd->CommonCfg.vht_cent_ch;
|
||||
else
|
||||
#endif /* DOT11_VHT_AC */
|
||||
if (pAd->hw_cfg.bbp_bw == BW_40)
|
||||
ch = pAd->CommonCfg.CentralChannel;
|
||||
else
|
||||
ch = pAd->CommonCfg.Channel;
|
||||
|
||||
switch(pAd->CommonCfg.BBPCurrentBW)
|
||||
{
|
||||
case BW_80:
|
||||
bw = 80;
|
||||
break;
|
||||
case BW_40:
|
||||
bw = 40;
|
||||
break;
|
||||
case BW_10:
|
||||
bw = 10;
|
||||
break;
|
||||
case BW_20:
|
||||
default:
|
||||
bw =20;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
ASSERT((ch != 0));
|
||||
AsicSwitchChannel(pAd, ch, FALSE);
|
||||
AsicLockChannel(pAd, ch);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to %dMHz channel %d, Total BSS[%02d]\n",
|
||||
bw, ch, pAd->ScanTab.BssNr));
|
||||
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
if (OpMode == OPMODE_AP)
|
||||
{
|
||||
#ifdef APCLI_SUPPORT
|
||||
#ifdef APCLI_AUTO_CONNECT_SUPPORT
|
||||
if (pAd->ApCfg.ApCliAutoConnectRunning == TRUE)
|
||||
{
|
||||
if (!ApCliAutoConnectExec(pAd))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Error in %s\n", __FUNCTION__));
|
||||
}
|
||||
}
|
||||
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
|
||||
#endif /* APCLI_SUPPORT */
|
||||
pAd->Mlme.ApSyncMachine.CurrState = AP_SYNC_IDLE;
|
||||
RTMPResumeMsduTransmission(pAd);
|
||||
|
||||
/* iwpriv set auto channel selection*/
|
||||
/* scanned all channels*/
|
||||
if (pAd->ApCfg.bAutoChannelAtBootup==TRUE)
|
||||
{
|
||||
pAd->CommonCfg.Channel = SelectBestChannel(pAd, pAd->ApCfg.AutoChannelAlg);
|
||||
pAd->ApCfg.bAutoChannelAtBootup = FALSE;
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
N_ChannelCheck(pAd);
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
APStop(pAd);
|
||||
APStartUp(pAd);
|
||||
}
|
||||
|
||||
if (!((pAd->CommonCfg.Channel > 14) && (pAd->CommonCfg.bIEEE80211H == TRUE) && (pAd->Dot11_H.RDMode != RD_NORMAL_MODE)))
|
||||
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
||||
}
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static BOOLEAN MixModeChannelCheck(IN PRTMP_ADAPTER pAd, UCHAR channel, struct wifi_dev *wdev)
|
||||
{
|
||||
|
||||
if(channel == 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s pass a invalid channel\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*check channel in channel list*/
|
||||
if(ChannelSanity(pAd, channel) == 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("the channel parameter is out of channel list\n"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*check channel & phy mode*/
|
||||
if((channel < 14 && WMODE_CAP_5G(wdev->PhyMode)) ||
|
||||
(channel > 14 && WMODE_CAP_2G(wdev->PhyMode))) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("the channel parameter and phy mode is not matched\n"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static INT MixModeSwitchCH(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UCHAR channel;
|
||||
struct wifi_dev *wdev;
|
||||
struct peer_info *mon_sta_info = &pAd->MixModeCtrl.sta_info[0];
|
||||
|
||||
if(pAd == NULL)
|
||||
return -1;
|
||||
|
||||
channel = pAd->MixModeCtrl.sta_info[0].channel;
|
||||
wdev = pAd->MixModeCtrl.pMixModewdev;
|
||||
|
||||
/*check channel with current band channel*/
|
||||
if(channel == wdev->channel) {
|
||||
DBGPRINT(RT_DEBUG_TRACE,
|
||||
("%s:: current channel is the sniffer set channel %d\n", __FUNCTION__, channel));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Disable BCN */
|
||||
AsicDisableSync(pAd);
|
||||
|
||||
/*need to poll tx Q unitl empty*/
|
||||
|
||||
/* Suspend MSDU transmission here */
|
||||
RTMPSuspendMsduTransmission(pAd);
|
||||
|
||||
bbp_set_bw(pAd, mon_sta_info->bw);
|
||||
|
||||
/*Switch Channel*/
|
||||
AsicSwitchChannel(pAd, mon_sta_info->center_channel, FALSE);
|
||||
AsicLockChannel(pAd, mon_sta_info->center_channel);
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("%s:: switch to channel %d\n", __FUNCTION__, channel));
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static CHAR MixModeCalcAvgRssi(RTMP_ADAPTER *pAd, UCHAR idx)
|
||||
{
|
||||
UCHAR mnt_idx = 0;
|
||||
LONG avgRssi = -127;
|
||||
|
||||
struct peer_info *sta = &pAd->MixModeCtrl.sta_info[mnt_idx];
|
||||
LONG mgmt_rssi = sta->mnt_sta.frm[FC_TYPE_MGMT].rssi;
|
||||
LONG data_rssi = sta->mnt_sta.frm[FC_TYPE_DATA].rssi;
|
||||
LONG cntl_rssi = sta->mnt_sta.frm[FC_TYPE_CNTL].rssi;
|
||||
LONG total = sta->mnt_sta.Count;
|
||||
|
||||
/*
|
||||
* weight * rssi
|
||||
* But need to check vaule
|
||||
* it cannot overflow
|
||||
*/
|
||||
if (total)
|
||||
avgRssi = (mgmt_rssi + data_rssi + cntl_rssi) / total;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("%s:: %02x:%02x:%02x:%02x:%02x:%02x, avgRssi=%ld\n", __FUNCTION__, PRINT_MAC(sta->mac_addr), avgRssi));
|
||||
|
||||
return avgRssi;
|
||||
}
|
||||
|
||||
static INT MixModeSniffer(RTMP_ADAPTER *pAd, UINT8 enable)
|
||||
{
|
||||
if (enable == TRUE)
|
||||
pAd->MixModeCtrl.current_monitor_mode = MIX_MODE_FULL;
|
||||
else if (enable == FALSE)
|
||||
pAd->MixModeCtrl.current_monitor_mode = MIX_MODE_OFF;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("%s(): set Current Monitor Mode = %d\n",
|
||||
__FUNCTION__, pAd->MixModeCtrl.current_monitor_mode));
|
||||
|
||||
switch(pAd->MixModeCtrl.current_monitor_mode)
|
||||
{
|
||||
/*reset to normal */
|
||||
case MIX_MODE_OFF:
|
||||
pAd->ApCfg.BssType = BSS_INFRA;
|
||||
AsicSetRxFilter(pAd);
|
||||
break;
|
||||
|
||||
/*fully report, Enable Rx with promiscuous reception*/
|
||||
case MIX_MODE_FULL:
|
||||
pAd->ApCfg.BssType = BSS_MONITOR;
|
||||
AsicSetRxFilter(pAd);
|
||||
break;
|
||||
default:
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("MIX MODE index ONLY be set to 0 or 2\n"));
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//extern INT scan_ch_restore(RTMP_ADAPTER *pAd, UCHAR OpMode);
|
||||
|
||||
static VOID MixModeRestoreCH(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if(pAd->MixModeCtrl.pMixModewdev != NULL &&
|
||||
(pAd->MixModeCtrl.sta_info[0].channel != (pAd->MixModeCtrl.pMixModewdev)->channel))
|
||||
/*scan ch restore for MixMode will do enable BCN*/
|
||||
scan_ch_restore_for_MixMode(pAd, OPMODE_AP);
|
||||
}
|
||||
|
||||
static VOID MixModeReset(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
pAd->MixModeCtrl.MixModeOn = FALSE;
|
||||
pAd->MixModeCtrl.pMixModewdev = NULL;
|
||||
pAd->MixModeCtrl.MixModeStatMachine.CurrState = MIX_MODE_STATE_INIT;
|
||||
pAd->MixModeCtrl.ioctl_if = -1;
|
||||
}
|
||||
|
||||
static VOID MixModeListenExit(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
BOOLEAN disbleSniffer = FALSE;
|
||||
BOOLEAN mixmode_done = TRUE;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
if(MixModeSniffer(pAd,disbleSniffer) !=0)
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s fail by sniffer mode\n",__FUNCTION__));
|
||||
|
||||
MixModeRestoreCH(pAd);
|
||||
MixModeReset(pAd);
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s::Exit mix mode\n", __FUNCTION__));
|
||||
/* send event to userspace */
|
||||
RtmpOSWrielessEventSend(pAd->net_dev,
|
||||
RT_WLAN_EVENT_CUSTOM,
|
||||
RT_MIX_MODE_EVENT_FLAG,
|
||||
NULL,
|
||||
(char *)&mixmode_done,
|
||||
sizeof(mixmode_done));
|
||||
}
|
||||
|
||||
static VOID MixModeListenCancel(RTMP_ADAPTER *pAd,MLME_QUEUE_ELEM *pElem)
|
||||
{
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
MixModeListenExit(pAd);
|
||||
}
|
||||
|
||||
|
||||
static VOID MixModeListenTimeout(RTMP_ADAPTER *pAd,MLME_QUEUE_ELEM *pElem)
|
||||
{
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
MixModeListenExit(pAd);
|
||||
|
||||
}
|
||||
|
||||
|
||||
static VOID MixModeEnterListen(RTMP_ADAPTER *pAd,MLME_QUEUE_ELEM *pElem)
|
||||
{
|
||||
INT32 ret;
|
||||
BOOLEAN enbleSniffer = TRUE;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
/*switch channel*/
|
||||
ret = MixModeSwitchCH(pAd);
|
||||
if(ret != 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s fail by switch channel\n",__FUNCTION__));
|
||||
MixModeReset(pAd);
|
||||
return;
|
||||
}
|
||||
|
||||
/*enter sniffer mode*/
|
||||
ret = MixModeSniffer(pAd,enbleSniffer);
|
||||
if(ret != 0) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s fail by sniffer mode\n",__FUNCTION__));
|
||||
MixModeRestoreCH(pAd);
|
||||
MixModeReset(pAd);
|
||||
return;
|
||||
}
|
||||
pAd->MixModeCtrl.MixModeOn = TRUE;
|
||||
pAd->MixModeCtrl.MixModeStatMachine.CurrState = MIX_MODE_STATE_RUNNING;
|
||||
DBGPRINT(RT_DEBUG_OFF, ("pAd->MixModeCtrl.sta_info[0].duration = %d\n", pAd->MixModeCtrl.sta_info[0].duration));
|
||||
RTMPSetTimer(&pAd->MixModeCtrl.MixModeTimer, pAd->MixModeCtrl.sta_info[0].duration);
|
||||
}
|
||||
|
||||
static VOID MixModeStateMachineInit(IN RTMP_ADAPTER *pAd, IN STATE_MACHINE *Sm, OUT STATE_MACHINE_FUNC Trans[])
|
||||
{
|
||||
/*Init*/
|
||||
StateMachineInit(Sm,(STATE_MACHINE_FUNC *)Trans,MIX_MODE_STATE_MAX, MIX_MODE_MSG_MAX, (STATE_MACHINE_FUNC)Drop, MIX_MODE_STATE_INIT, MIX_MODE_STATE_BASE);
|
||||
|
||||
/*Idle*/
|
||||
StateMachineSetAction(Sm, MIX_MODE_STATE_INIT, MIX_MODE_MSG_LISTEN, (STATE_MACHINE_FUNC)MixModeEnterListen);
|
||||
/*Running*/
|
||||
StateMachineSetAction(Sm, MIX_MODE_STATE_RUNNING, MIX_MODE_MSG_CANCLE, (STATE_MACHINE_FUNC)MixModeListenCancel);
|
||||
StateMachineSetAction(Sm, MIX_MODE_STATE_RUNNING, MIX_MODE_MSG_TIMEOUT, (STATE_MACHINE_FUNC)MixModeListenTimeout);
|
||||
}
|
||||
|
||||
|
||||
VOID MixModeTimeout(IN PVOID SystemSpecific1, IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2, IN PVOID SystemSpecific3)
|
||||
{
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)FunctionContext;
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
MlmeEnqueue(pAd, MIX_MODE_STATE_MACHINE, MIX_MODE_MSG_TIMEOUT, 0, NULL, 0);
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
}
|
||||
|
||||
VOID MixModeDebugInfo(IN PRTMP_ADAPTER pAd, IN int idx)
|
||||
{
|
||||
MIX_MODE_CTRL *MixModeCtrl = &pAd->MixModeCtrl;
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("MixMode status = %d\nMixMode CurrState = %lu\nMixMode CH = %d\n"
|
||||
"targetMac = %02x:%02x:%02x:%02x:%02x:%02x\nMixMode Duration = %d\n",
|
||||
MixModeCtrl->MixModeOn, MixModeCtrl->MixModeStatMachine.CurrState,
|
||||
MixModeCtrl->sta_info[idx].channel,
|
||||
PRINT_MAC(MixModeCtrl->sta_info[idx].mac_addr),
|
||||
MixModeCtrl->sta_info[idx].duration));
|
||||
|
||||
}
|
||||
|
||||
VOID MixModeProcessData(RTMP_ADAPTER *pAd, void *rxBlk)
|
||||
{
|
||||
RX_BLK *pRxBlk = (RX_BLK*)rxBlk;
|
||||
PHEADER_802_11 pHeader;
|
||||
CHAR avg_rssi;
|
||||
struct peer_info *mon_sta_info = &pAd->MixModeCtrl.sta_info[0];
|
||||
FRAME_CONTROL *fc;
|
||||
struct MNT_STA_INFO *mnt_sta;
|
||||
|
||||
// DBGPRINT(RT_DEBUG_OFF, ("%s()\n", __FUNCTION__));
|
||||
|
||||
ASSERT(pRxBlk->pRxPacket);
|
||||
|
||||
pHeader = pRxBlk->pHeader;
|
||||
fc = &pHeader->FC;
|
||||
mnt_sta = &mon_sta_info->mnt_sta;
|
||||
|
||||
// DBGPRINT(RT_DEBUG_OFF, ("mon_sta_info->mac_addr = %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(mon_sta_info->mac_addr)));
|
||||
|
||||
if (NdisEqualMemory(pHeader->Addr2, mon_sta_info->mac_addr, MAC_ADDR_LEN)) {
|
||||
if (fc->Type == FC_TYPE_DATA)
|
||||
Update_Rssi_Sample(pAd, &mon_sta_info->RssiSample, &pRxBlk->rx_signal,
|
||||
pRxBlk->rx_rate.field.MODE, pRxBlk->rx_rate.field.BW);
|
||||
else
|
||||
Update_Rssi_Sample(pAd, &mon_sta_info->RssiSample, &pRxBlk->rx_signal,
|
||||
0, pRxBlk->rx_rate.field.BW);
|
||||
|
||||
avg_rssi = RTMPAvgRssi(pAd, &mon_sta_info->RssiSample);
|
||||
|
||||
if (fc->Type < FC_TYPE_RSVED) {
|
||||
mnt_sta->frm[fc->Type].cnt++;
|
||||
mnt_sta->frm[fc->Type].rssi += avg_rssi;
|
||||
mnt_sta->Count++;
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("fctype = %d ,mgmt = %ld , data = %ld , cnt = %ld "
|
||||
"frame FROM %02x:%02x:%02x:%02x:%02x:%02x TO "
|
||||
"%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
fc->Type,
|
||||
mnt_sta->frm[FC_TYPE_MGMT].cnt,
|
||||
mnt_sta->frm[FC_TYPE_DATA].cnt,
|
||||
mnt_sta->frm[FC_TYPE_CNTL].cnt,
|
||||
PRINT_MAC(pHeader->Addr2),
|
||||
PRINT_MAC(pHeader->Addr1)));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* 1. check parameters
|
||||
* 2. check other SMs
|
||||
* 3. run SM
|
||||
*/
|
||||
INT MixModeSet(IN PRTMP_ADAPTER pAd, struct mix_peer_parameter *sta_info, IN UCHAR idx)
|
||||
{
|
||||
POS_COOKIE pObj;
|
||||
struct wifi_dev *wdev;
|
||||
struct peer_info *mon_sta_info = &pAd->MixModeCtrl.sta_info[0];
|
||||
|
||||
if (pAd == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
wdev = &pAd->ApCfg.MBSSID[pObj->ioctl_if].wdev;
|
||||
|
||||
if (wdev == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
pAd->MixModeCtrl.pMixModewdev = wdev;
|
||||
pAd->MixModeCtrl.ioctl_if = pObj->ioctl_if;
|
||||
|
||||
if (sta_info->mac_addr == NULL)
|
||||
return -EFAULT;
|
||||
|
||||
if (NdisEqualMemory(sta_info->mac_addr, &BROADCAST_ADDR[0], MAC_ADDR_LEN) ||
|
||||
NdisEqualMemory(sta_info->mac_addr, &ZERO_MAC_ADDR[0], MAC_ADDR_LEN)) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s pass a invalid mac %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
__FUNCTION__, PRINT_MAC(sta_info->mac_addr)));
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
NdisZeroMemory(mon_sta_info, sizeof(struct peer_info));
|
||||
NdisCopyMemory(mon_sta_info->mac_addr, sta_info->mac_addr, MAC_ADDR_LEN);
|
||||
|
||||
if (MixModeChannelCheck(pAd, sta_info->channel, wdev))
|
||||
mon_sta_info->channel = sta_info->channel;
|
||||
else
|
||||
return -EFAULT;
|
||||
|
||||
if (sta_info->duration == 0)
|
||||
mon_sta_info->duration = MixModeDefualtListenTime;
|
||||
else
|
||||
mon_sta_info->duration = sta_info->duration;
|
||||
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (sta_info->channel > 14) {
|
||||
mon_sta_info->bw = BW_80;
|
||||
mon_sta_info->center_channel = vht_cent_ch_freq(pAd, sta_info->channel);
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
mon_sta_info->bw = sta_info->bw;
|
||||
mon_sta_info->ch_offset = sta_info->ch_offset;
|
||||
|
||||
if(sta_info->bw == BW_40) {
|
||||
/*check bw & channel*/
|
||||
if ((sta_info->channel < 5 && sta_info->ch_offset == EXTCHA_BELOW)
|
||||
|| (sta_info->channel > 9 && sta_info->ch_offset == EXTCHA_ABOVE)) {
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s pass a invalid primary channel & second channel\n", __FUNCTION__));
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if(sta_info->ch_offset == EXTCHA_ABOVE)
|
||||
mon_sta_info->center_channel = sta_info->channel + 2;
|
||||
else if(sta_info->ch_offset == EXTCHA_BELOW)
|
||||
mon_sta_info->center_channel = sta_info->channel - 2;
|
||||
} else
|
||||
mon_sta_info->center_channel = sta_info->channel;
|
||||
}
|
||||
|
||||
/*check other SMs like autsel or bgscan etc*/
|
||||
MlmeEnqueue(pAd, MIX_MODE_STATE_MACHINE, MIX_MODE_MSG_LISTEN, 0, NULL, 0);
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
INT RTMPIoctlQueryMixModeRssi(IN PRTMP_ADAPTER pAd, IN RTMP_IOCTL_INPUT_STRUCT *wrq)
|
||||
{
|
||||
INT Status;
|
||||
CHAR avg_rssi;
|
||||
|
||||
avg_rssi = MixModeCalcAvgRssi(pAd, 0);
|
||||
|
||||
wrq->u.data.length = sizeof(avg_rssi);
|
||||
|
||||
Status = copy_to_user(wrq->u.data.pointer, &avg_rssi, wrq->u.data.length);
|
||||
|
||||
if(Status)
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("%s: copy_to_user() fail\n", __FUNCTION__));
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
VOID MixModeCancel(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
BOOLEAN Cancelled;
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
RTMPCancelTimer(&pAd->MixModeCtrl.MixModeTimer,&Cancelled);
|
||||
|
||||
MlmeEnqueue(pAd, MIX_MODE_STATE_MACHINE, MIX_MODE_MSG_CANCLE, 0, NULL, 0);
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
}
|
||||
|
||||
VOID MixModeInit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
MixModeReset(pAd);
|
||||
MixModeStateMachineInit(pAd, &pAd->MixModeCtrl.MixModeStatMachine, pAd->MixModeCtrl.MixModeStateFunc);
|
||||
RTMPInitTimer(pAd, &pAd->MixModeCtrl.MixModeTimer, GET_TIMER_FUNCTION(MixModeTimeout), pAd, FALSE);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Enter %s\n", __FUNCTION__));
|
||||
}
|
||||
|
||||
VOID MixModeDel(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
BOOLEAN Cancelled;
|
||||
if(pAd == NULL)
|
||||
return;
|
||||
|
||||
RTMPReleaseTimer(&pAd->MixModeCtrl.MixModeTimer, &Cancelled);
|
||||
NdisZeroMemory(&pAd->MixModeCtrl.sta_info, sizeof(pAd->MixModeCtrl.sta_info));
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Exit %s\n", __FUNCTION__));
|
||||
}
|
||||
|
||||
769
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_mlme.c
Normal file
769
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_mlme.c
Normal file
@ -0,0 +1,769 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
mlme.c
|
||||
|
||||
Abstract:
|
||||
Major MLME state machiones here
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
John Chang 08-04-2003 created for 11g soft-AP
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifdef BTCOEX_CONCURRENT
|
||||
extern void MT7662ReceCoexFromOtherCHip(
|
||||
IN UCHAR channel,
|
||||
IN UCHAR centralchannel,
|
||||
IN UCHAR channel_bw
|
||||
);
|
||||
#endif
|
||||
#if defined(MAX_CONTINUOUS_TX_CNT) || defined(NEW_IXIA_METHOD)
|
||||
VOID rtmp_deqmode_detect(RTMP_ADAPTER *pAd);
|
||||
#endif
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
|
||||
int DetectOverlappingPeriodicRound;
|
||||
|
||||
|
||||
#ifdef DOT11N_DRAFT3
|
||||
VOID Bss2040CoexistTimeOut(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
int apidx;
|
||||
PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Bss2040CoexistTimeOut(): Recovery to original setting!\n"));
|
||||
|
||||
/* Recovery to original setting when next DTIM Interval. */
|
||||
pAd->CommonCfg.Bss2040CoexistFlag &= (~BSS_2040_COEXIST_TIMER_FIRED);
|
||||
NdisZeroMemory(&pAd->CommonCfg.LastBSSCoexist2040, sizeof(BSS_2040_COEXIST_IE));
|
||||
pAd->CommonCfg.Bss2040CoexistFlag |= BSS_2040_COEXIST_INFO_SYNC;
|
||||
|
||||
if (pAd->CommonCfg.bBssCoexEnable == FALSE)
|
||||
{
|
||||
/* TODO: Find a better way to handle this when the timer is fired and we disable the bBssCoexEable support!! */
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Bss2040CoexistTimeOut(): bBssCoexEnable is FALSE, return directly!\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
for (apidx = 0; apidx < pAd->ApCfg.BssidNum; apidx++)
|
||||
SendBSS2040CoexistMgmtAction(pAd, MCAST_WCID, apidx, 0);
|
||||
|
||||
}
|
||||
#endif /* DOT11N_DRAFT3 */
|
||||
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
|
||||
|
||||
VOID APDetectOverlappingExec(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext;
|
||||
|
||||
if (DetectOverlappingPeriodicRound == 0)
|
||||
{
|
||||
/* switch back 20/40 */
|
||||
if ((pAd->CommonCfg.Channel <=14) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40))
|
||||
{
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1;
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((DetectOverlappingPeriodicRound == 25) || (DetectOverlappingPeriodicRound == 1))
|
||||
{
|
||||
if ((pAd->CommonCfg.Channel <=14) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth==BW_40))
|
||||
{
|
||||
SendBeaconRequest(pAd, 1);
|
||||
SendBeaconRequest(pAd, 2);
|
||||
SendBeaconRequest(pAd, 3);
|
||||
}
|
||||
|
||||
}
|
||||
DetectOverlappingPeriodicRound--;
|
||||
}
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
This routine is executed every second -
|
||||
1. Decide the overall channel quality
|
||||
2. Check if need to upgrade the TX rate to any client
|
||||
3. perform MAC table maintenance, including ageout no-traffic clients,
|
||||
and release packet buffer in PSQ is fail to TX in time.
|
||||
==========================================================================
|
||||
*/
|
||||
VOID APMlmePeriodicExec(
|
||||
PRTMP_ADAPTER pAd)
|
||||
{
|
||||
#ifdef A4_CONN
|
||||
UCHAR mbss_idx;
|
||||
#endif
|
||||
/*
|
||||
Reqeust by David 2005/05/12
|
||||
It make sense to disable Adjust Tx Power on AP mode, since we can't
|
||||
take care all of the client's situation
|
||||
ToDo: need to verify compatibility issue with WiFi product.
|
||||
*/
|
||||
|
||||
#ifdef BTCOEX_CONCURRENT
|
||||
MT7662ReceCoexFromOtherCHip(pAd->CommonCfg.Channel,pAd->CommonCfg.CentralChannel,pAd->CommonCfg.BBPCurrentBW);
|
||||
#endif
|
||||
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
if (isCarrierDetectExist(pAd) == TRUE)
|
||||
{
|
||||
PCARRIER_DETECTION_STRUCT pCarrierDetect = &pAd->CommonCfg.CarrierDetect;
|
||||
if (pCarrierDetect->OneSecIntCount < pCarrierDetect->CarrierGoneThreshold)
|
||||
{
|
||||
pCarrierDetect->CD_State = CD_NORMAL;
|
||||
pCarrierDetect->recheck = pCarrierDetect->recheck1;
|
||||
if (pCarrierDetect->Debug != RT_DEBUG_TRACE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Carrier gone\n"));
|
||||
/* start all TX actions. */
|
||||
APMakeAllBssBeacon(pAd);
|
||||
APUpdateAllBeaconFrame(pAd);
|
||||
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Carrier gone\n"));
|
||||
}
|
||||
}
|
||||
pCarrierDetect->OneSecIntCount = 0;
|
||||
}
|
||||
|
||||
#endif /* CARRIER_DETECTION_SUPPORT */
|
||||
|
||||
RTMP_CHIP_HIGH_POWER_TUNING(pAd, &pAd->ApCfg.RssiSample);
|
||||
|
||||
|
||||
/* Disable Adjust Tx Power for WPA WiFi-test. */
|
||||
/* Because high TX power results in the abnormal disconnection of Intel BG-STA. */
|
||||
/*#ifndef WIFI_TEST */
|
||||
/* if (pAd->CommonCfg.bWiFiTest == FALSE) */
|
||||
/* for SmartBit 64-byte stream test */
|
||||
/* removed based on the decision of Ralink congress at 2011/7/06 */
|
||||
/* if (pAd->MacTab.Size > 0) */
|
||||
RTMP_CHIP_ASIC_ADJUST_TX_POWER(pAd);
|
||||
/*#endif // WIFI_TEST */
|
||||
|
||||
RTMP_CHIP_ASIC_TEMPERATURE_COMPENSATION(pAd);
|
||||
|
||||
/* walk through MAC table, see if switching TX rate is required */
|
||||
|
||||
/* MAC table maintenance */
|
||||
if (pAd->Mlme.PeriodicRound % MLME_TASK_EXEC_MULTIPLE == 0)
|
||||
{
|
||||
#if defined(BAND_STEERING) || defined(CUSTOMER_DCC_FEATURE) || defined(WIFI_DIAG)\
|
||||
|| defined(WAPP_SUPPORT)
|
||||
UINT32 msdr9;
|
||||
|
||||
/* NAV, CCA, or TX active timer in unit of TU, used for Measurement. (channel busy time) */
|
||||
RTMP_IO_READ32(pAd, MIB_MSDR9, &msdr9);
|
||||
msdr9 &= 0xFFFFFF;
|
||||
pAd->OneSecChBusyTime = msdr9;
|
||||
#ifdef BAND_STEERING
|
||||
if (pAd->ApCfg.BandSteering)
|
||||
pAd->ApCfg.BndStrgOneSecChBusyTime = (pAd->ApCfg.BndStrgOneSecChBusyTime == 0)? \
|
||||
msdr9 : ((msdr9 + pAd->ApCfg.BndStrgOneSecChBusyTime)>>1);
|
||||
#endif
|
||||
#endif
|
||||
/* one second timer */
|
||||
MacTableMaintenance(pAd);
|
||||
|
||||
#ifdef WH_EZ_SETUP
|
||||
#ifdef NEW_CONNECTION_ALGO
|
||||
if(IS_ADPTR_EZ_SETUP_ENABLED(pAd)) {
|
||||
EzMlmeEnqueue(pAd, EZ_STATE_MACHINE, EZ_PERIODIC_EXEC_REQ, 0, NULL, 0);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_FPGA_MODE
|
||||
if (pAd->fpga_ctl.fpga_tr_stop)
|
||||
{
|
||||
INT enable = FALSE, ctrl_type;
|
||||
|
||||
/* enable/disable tx/rx*/
|
||||
switch (pAd->fpga_ctl.fpga_tr_stop)
|
||||
{
|
||||
case 3: //stop tx + rx
|
||||
ctrl_type = ASIC_MAC_TXRX;
|
||||
break;
|
||||
case 2: // stop rx
|
||||
ctrl_type = ASIC_MAC_RX;
|
||||
break;
|
||||
case 1: // stop tx
|
||||
ctrl_type = ASIC_MAC_TX;
|
||||
break;
|
||||
case 4:
|
||||
default:
|
||||
enable = TRUE;
|
||||
ctrl_type = ASIC_MAC_TXRX;
|
||||
break;
|
||||
}
|
||||
AsicSetMacTxRx(pAd, ctrl_type, enable);
|
||||
}
|
||||
#endif /* CONFIG_FPGA_MODE */
|
||||
|
||||
RTMPMaintainPMKIDCache(pAd);
|
||||
|
||||
#ifdef WDS_SUPPORT
|
||||
WdsTableMaintenance(pAd);
|
||||
#endif /* WDS_SUPPORT */
|
||||
|
||||
|
||||
#ifdef CLIENT_WDS
|
||||
CliWds_ProxyTabMaintain(pAd);
|
||||
#endif /* CLIENT_WDS */
|
||||
#ifdef A4_CONN
|
||||
for(mbss_idx = 0; mbss_idx < pAd->ApCfg.BssidNum; mbss_idx++)
|
||||
a4_proxy_maintain(pAd, mbss_idx);
|
||||
pAd->a4_need_refresh = FALSE;
|
||||
#endif /* A4_CONN */
|
||||
#ifdef WH_EVENT_NOTIFIER
|
||||
//WHCMlmePeriodicExec(pAd); // Arvind : Need to confirm that we have to support this event
|
||||
#endif /* WH_EVENT_NOTIFIER */
|
||||
|
||||
#ifdef WIFI_DIAG
|
||||
DiagApMlmeOneSecProc(pAd);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef AP_SCAN_SUPPORT
|
||||
AutoChannelSelCheck(pAd);
|
||||
#endif /* AP_SCAN_SUPPORT */
|
||||
|
||||
APUpdateCapabilityAndErpIe(pAd);
|
||||
|
||||
#ifdef APCLI_SUPPORT
|
||||
if (pAd->Mlme.OneSecPeriodicRound % 2 == 0)
|
||||
ApCliIfMonitor(pAd);
|
||||
|
||||
if (pAd->Mlme.OneSecPeriodicRound % 2 == 1
|
||||
#ifdef APCLI_AUTO_CONNECT_SUPPORT
|
||||
&& (pAd->ApCfg.ApCliAutoConnectChannelSwitching == FALSE)
|
||||
#endif /* APCLI_AUTO_CONNECT_SUPPORT */
|
||||
) {
|
||||
ApCliIfUp(pAd);
|
||||
}
|
||||
|
||||
{
|
||||
INT loop;
|
||||
ULONG Now32;
|
||||
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
if (pAd->ApCfg.bMACRepeaterEn)
|
||||
{
|
||||
RTMPRepeaterReconnectionCheck(pAd);
|
||||
}
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
for (loop = 0; loop < MAX_APCLI_NUM; loop++)
|
||||
{
|
||||
PAPCLI_STRUCT pApCliEntry = &pAd->ApCfg.ApCliTab[loop];
|
||||
if ((pApCliEntry->Valid == TRUE)
|
||||
&& (pApCliEntry->MacTabWCID < MAX_LEN_OF_MAC_TABLE))
|
||||
{
|
||||
/* update channel quality for Roaming and UI LinkQuality display */
|
||||
MlmeCalculateChannelQuality(pAd,
|
||||
&pAd->MacTab.Content[pApCliEntry->MacTabWCID], Now32);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* APCLI_SUPPORT */
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if (pAd->CommonCfg.bHTProtect) {
|
||||
/*APUpdateCapabilityAndErpIe(pAd); */
|
||||
APUpdateOperationMode(pAd);
|
||||
if (pAd->CommonCfg.IOTestParm.bRTSLongProtOn == FALSE)
|
||||
AsicUpdateProtect(pAd, (USHORT)pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode,
|
||||
ALLN_SETPROTECT, FALSE, pAd->MacTab.fAnyStationNonGF);
|
||||
}
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
|
||||
#ifdef A_BAND_SUPPORT
|
||||
if ( (pAd->CommonCfg.Channel > 14)
|
||||
&& (pAd->CommonCfg.bIEEE80211H == 1))
|
||||
{
|
||||
#ifdef DFS_SUPPORT
|
||||
ApRadarDetectPeriodic(pAd);
|
||||
#else
|
||||
pAd->Dot11_H.InServiceMonitorCount++;
|
||||
if (pAd->Dot11_H.RDMode == RD_SILENCE_MODE)
|
||||
{
|
||||
if (pAd->Dot11_H.RDCount++ > pAd->Dot11_H.ChMovingTime)
|
||||
{
|
||||
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
||||
pAd->Dot11_H.RDMode = RD_NORMAL_MODE;
|
||||
}
|
||||
}
|
||||
#endif /* !DFS_SUPPORT */
|
||||
}
|
||||
#endif /* A_BAND_SUPPORT */
|
||||
#ifdef MBO_SUPPORT
|
||||
MboCheckBssTermination(pAd);
|
||||
#endif/* MBO_SUPPORT */
|
||||
#ifdef DOT11R_FT_SUPPORT
|
||||
FT_R1KHInfoMaintenance(pAd);
|
||||
#endif /* DOT11R_FT_SUPPORT */
|
||||
#if defined(MAX_CONTINUOUS_TX_CNT) || defined(NEW_IXIA_METHOD)
|
||||
if(pAd->MonitorFlag == TRUE)
|
||||
rtmp_deqmode_detect(pAd); /* 1s detect*/
|
||||
#endif
|
||||
#ifdef BAND_STEERING
|
||||
BndStrgHeartBeatMonitor(pAd);
|
||||
#endif
|
||||
#ifdef NEW_IXIA_METHOD
|
||||
if (pAd->Mlme.OneSecPeriodicRound % pAd->chkTmr == 0) {
|
||||
if ((txpktdetect2s < pAd->pktthld)
|
||||
&& (rxpktdetect2s < pAd->pktthld)) {/*Threshold*/
|
||||
pAd->tmrlogctrl++;
|
||||
if (pAd->tmrlogctrl <= 1)
|
||||
wifi_txrx_parmtrs_dump(pAd);
|
||||
else
|
||||
pAd->tmrlogctrl = 10;/*prevent pAd->tmrlogctrl overflow*/
|
||||
} else
|
||||
pAd->tmrlogctrl = 0;
|
||||
txpktdetect2s = 0;
|
||||
rxpktdetect2s = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*! \brief To substitute the message type if the message is coming from external
|
||||
* \param *Fr The frame received
|
||||
* \param *Machine The state machine
|
||||
* \param *MsgType the message type for the state machine
|
||||
* \return TRUE if the substitution is successful, FALSE otherwise
|
||||
* \pre
|
||||
* \post
|
||||
*/
|
||||
BOOLEAN APMsgTypeSubst(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PFRAME_802_11 pFrame,
|
||||
OUT INT *Machine,
|
||||
OUT INT *MsgType)
|
||||
{
|
||||
USHORT Seq;
|
||||
#ifdef DOT11_SAE_SUPPORT
|
||||
USHORT Alg;
|
||||
#endif /* DOT11_SAE_SUPPORT */
|
||||
UCHAR EAPType;
|
||||
BOOLEAN Return = FALSE;
|
||||
#ifdef WSC_AP_SUPPORT
|
||||
UCHAR EAPCode;
|
||||
PMAC_TABLE_ENTRY pEntry;
|
||||
#endif /* WSC_AP_SUPPORT */
|
||||
unsigned char hdr_len = LENGTH_802_11;
|
||||
|
||||
#ifdef A4_CONN
|
||||
if ((pFrame->Hdr.FC.FrDs == 1) && (pFrame->Hdr.FC.ToDs == 1))
|
||||
hdr_len = LENGTH_802_11_WITH_ADDR4;
|
||||
#endif
|
||||
/*
|
||||
TODO:
|
||||
only PROBE_REQ can be broadcast, all others must be unicast-to-me && is_mybssid;
|
||||
otherwise, ignore this frame
|
||||
*/
|
||||
|
||||
/* wpa EAPOL PACKET */
|
||||
if (pFrame->Hdr.FC.Type == FC_TYPE_DATA)
|
||||
{
|
||||
#ifdef WSC_AP_SUPPORT
|
||||
WSC_CTRL *wsc_ctrl;
|
||||
/*WSC EAPOL PACKET */
|
||||
pEntry = MacTableLookup(pAd, pFrame->Hdr.Addr2);
|
||||
if (pEntry &&
|
||||
((pEntry->bWscCapable) ||
|
||||
(pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.AuthMode < Ndis802_11AuthModeWPA)))
|
||||
{
|
||||
/*
|
||||
WSC AP only can service one WSC STA in one WPS session.
|
||||
Forward this EAP packet to WSC SM if this EAP packets is from
|
||||
WSC STA that WSC AP services or WSC AP doesn't service any
|
||||
WSC STA now.
|
||||
*/
|
||||
wsc_ctrl = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx].WscControl;
|
||||
if ((MAC_ADDR_EQUAL(wsc_ctrl->EntryAddr, pEntry->Addr) ||
|
||||
MAC_ADDR_EQUAL(wsc_ctrl->EntryAddr, ZERO_MAC_ADDR)) &&
|
||||
IS_ENTRY_CLIENT(pEntry) &&
|
||||
(wsc_ctrl->WscConfMode != WSC_DISABLE))
|
||||
{
|
||||
*Machine = WSC_STATE_MACHINE;
|
||||
EAPType = *((UCHAR *)pFrame + hdr_len + LENGTH_802_1_H + 1);
|
||||
EAPCode = *((UCHAR *)pFrame + hdr_len + LENGTH_802_1_H + 4);
|
||||
Return = WscMsgTypeSubst(EAPType, EAPCode, MsgType);
|
||||
}
|
||||
}
|
||||
#endif /* WSC_AP_SUPPORT */
|
||||
if (!Return)
|
||||
{
|
||||
*Machine = WPA_STATE_MACHINE;
|
||||
EAPType = *((UCHAR *)pFrame + hdr_len + LENGTH_802_1_H + 1);
|
||||
Return = WpaMsgTypeSubst(EAPType, (INT *) MsgType);
|
||||
}
|
||||
return Return;
|
||||
}
|
||||
|
||||
if (pFrame->Hdr.FC.Type != FC_TYPE_MGMT)
|
||||
return FALSE;
|
||||
|
||||
switch (pFrame->Hdr.FC.SubType)
|
||||
{
|
||||
case SUBTYPE_ASSOC_REQ:
|
||||
*Machine = AP_ASSOC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_ASSOC_REQ;
|
||||
|
||||
break;
|
||||
/*
|
||||
case SUBTYPE_ASSOC_RSP:
|
||||
*Machine = AP_ASSOC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_ASSOC_RSP;
|
||||
break;
|
||||
*/
|
||||
case SUBTYPE_REASSOC_REQ:
|
||||
*Machine = AP_ASSOC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_REASSOC_REQ;
|
||||
break;
|
||||
/*
|
||||
case SUBTYPE_REASSOC_RSP:
|
||||
*Machine = AP_ASSOC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_REASSOC_RSP;
|
||||
break;
|
||||
*/
|
||||
case SUBTYPE_PROBE_REQ:
|
||||
*Machine = AP_SYNC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_PROBE_REQ;
|
||||
break;
|
||||
|
||||
/* For Active Scan */
|
||||
case SUBTYPE_PROBE_RSP:
|
||||
*Machine = AP_SYNC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_PROBE_RSP;
|
||||
break;
|
||||
case SUBTYPE_BEACON:
|
||||
*Machine = AP_SYNC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_BEACON;
|
||||
break;
|
||||
/*
|
||||
case SUBTYPE_ATIM:
|
||||
*Machine = AP_SYNC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_ATIM;
|
||||
break;
|
||||
*/
|
||||
case SUBTYPE_DISASSOC:
|
||||
*Machine = AP_ASSOC_STATE_MACHINE;
|
||||
*MsgType = APMT2_PEER_DISASSOC_REQ;
|
||||
break;
|
||||
case SUBTYPE_AUTH:
|
||||
/* get the sequence number from payload 24 Mac Header + 2 bytes algorithm */
|
||||
#ifdef DOT11_SAE_SUPPORT
|
||||
NdisMoveMemory(&Alg, &pFrame->Octet[0], sizeof(USHORT));
|
||||
#endif /* DOT11_SAE_SUPPORT */
|
||||
NdisMoveMemory(&Seq, &pFrame->Octet[2], sizeof(USHORT));
|
||||
|
||||
*Machine = AP_AUTH_STATE_MACHINE;
|
||||
if (Seq == 1
|
||||
#ifdef DOT11_SAE_SUPPORT
|
||||
|| (Alg == AUTH_MODE_SAE && Seq == 2)
|
||||
#endif /* DOT11_SAE_SUPPORT */
|
||||
)
|
||||
*MsgType = APMT2_PEER_AUTH_REQ;
|
||||
else if (Seq == 3)
|
||||
*MsgType = APMT2_PEER_AUTH_CONFIRM;
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,("wrong AUTH seq=%d Octet=%02x %02x %02x %02x %02x %02x %02x %02x\n",
|
||||
Seq,
|
||||
pFrame->Octet[0], pFrame->Octet[1], pFrame->Octet[2], pFrame->Octet[3],
|
||||
pFrame->Octet[4], pFrame->Octet[5], pFrame->Octet[6], pFrame->Octet[7]));
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
|
||||
case SUBTYPE_DEAUTH:
|
||||
*Machine = AP_AUTH_STATE_MACHINE; /*AP_AUTH_RSP_STATE_MACHINE;*/
|
||||
*MsgType = APMT2_PEER_DEAUTH;
|
||||
break;
|
||||
|
||||
case SUBTYPE_ACTION:
|
||||
case SUBTYPE_ACTION_NO_ACK:
|
||||
*Machine = ACTION_STATE_MACHINE;
|
||||
/* Sometimes Sta will return with category bytes with MSB = 1, if they receive catogory out of their support */
|
||||
if ((pFrame->Octet[0]&0x7F) > MAX_PEER_CATE_MSG)
|
||||
{
|
||||
*MsgType = MT2_ACT_INVALID;
|
||||
}
|
||||
else
|
||||
{
|
||||
*MsgType = (pFrame->Octet[0]&0x7F);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Periodic evaluate antenna link status
|
||||
|
||||
Arguments:
|
||||
pAd - Adapter pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID APAsicEvaluateRxAnt(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
ULONG TxTotalCnt;
|
||||
|
||||
#ifdef CONFIG_ATE
|
||||
if (ATE_ON(pAd))
|
||||
return;
|
||||
#endif /* CONFIG_ATE */
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
if(pAd->CommonCfg.CarrierDetect.CD_State == CD_SILENCE)
|
||||
return;
|
||||
#endif /* CARRIER_DETECTION_SUPPORT */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
#ifdef GREENAP_SUPPORT
|
||||
if (pAd->ApCfg.bGreenAPActive == TRUE)
|
||||
bbp_set_rxpath(pAd, 1);
|
||||
else
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath);
|
||||
|
||||
TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount +
|
||||
pAd->RalinkCounters.OneSecTxRetryOkCount +
|
||||
pAd->RalinkCounters.OneSecTxFailCount;
|
||||
|
||||
if (TxTotalCnt > 50)
|
||||
{
|
||||
RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 20);
|
||||
pAd->Mlme.bLowThroughput = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 300);
|
||||
pAd->Mlme.bLowThroughput = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
After evaluation, check antenna link status
|
||||
|
||||
Arguments:
|
||||
pAd - Adapter pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID APAsicRxAntEvalTimeout(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
CHAR rssi[3], *target_rssi;
|
||||
|
||||
#ifdef CONFIG_ATE
|
||||
if (ATE_ON(pAd))
|
||||
return;
|
||||
#endif /* CONFIG_ATE */
|
||||
|
||||
/* if the traffic is low, use average rssi as the criteria */
|
||||
if (pAd->Mlme.bLowThroughput == TRUE)
|
||||
target_rssi = &pAd->ApCfg.RssiSample.LastRssi[0];
|
||||
else
|
||||
target_rssi = &pAd->ApCfg.RssiSample.AvgRssi[0];
|
||||
NdisMoveMemory(&rssi[0], target_rssi, 3);
|
||||
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
if(pAd->Antenna.field.RxPath == 3)
|
||||
{
|
||||
CHAR larger = -127;
|
||||
|
||||
larger = max(rssi[0], rssi[1]);
|
||||
if (pAd->CommonCfg.RxStream >= 3)
|
||||
pAd->Mlme.RealRxPath = 3;
|
||||
else
|
||||
{
|
||||
if (larger > (rssi[2] + 20))
|
||||
pAd->Mlme.RealRxPath = 2;
|
||||
else
|
||||
pAd->Mlme.RealRxPath = 3;
|
||||
}
|
||||
}
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
|
||||
/* Disable the below to fix 1T/2R issue. It's suggested by Rory at 2007/7/11. */
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
#ifdef GREENAP_SUPPORT
|
||||
if (pAd->ApCfg.bGreenAPActive == TRUE)
|
||||
bbp_set_rxpath(pAd, 1);
|
||||
else
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
bbp_set_rxpath(pAd, pAd->Mlme.RealRxPath);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
After evaluation, check antenna link status
|
||||
|
||||
Arguments:
|
||||
pAd - Adapter pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID APAsicAntennaAvg(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR AntSelect,
|
||||
IN SHORT* RssiAvg)
|
||||
{
|
||||
SHORT realavgrssi;
|
||||
LONG realavgrssi1;
|
||||
ULONG recvPktNum = pAd->RxAnt.RcvPktNum[AntSelect];
|
||||
|
||||
realavgrssi1 = pAd->RxAnt.Pair1AvgRssiGroup1[AntSelect];
|
||||
|
||||
if(realavgrssi1 == 0)
|
||||
{
|
||||
*RssiAvg = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
realavgrssi = (SHORT) (realavgrssi1 / recvPktNum);
|
||||
|
||||
pAd->RxAnt.Pair1AvgRssiGroup1[0] = 0;
|
||||
pAd->RxAnt.Pair1AvgRssiGroup1[1] = 0;
|
||||
pAd->RxAnt.Pair1AvgRssiGroup2[0] = 0;
|
||||
pAd->RxAnt.Pair1AvgRssiGroup2[1] = 0;
|
||||
pAd->RxAnt.RcvPktNum[0] = 0;
|
||||
pAd->RxAnt.RcvPktNum[1] = 0;
|
||||
*RssiAvg = realavgrssi - 256;
|
||||
}
|
||||
#if defined(MAX_CONTINUOUS_TX_CNT) || defined(NEW_IXIA_METHOD)
|
||||
BOOLEAN Rtmp_Max_Continuous_Tx_OnOff(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
PMAC_TABLE_ENTRY pEntry = NULL;
|
||||
INT i;
|
||||
CHAR MaxRssi = -127,MinRssi = -127,myAvgRssi = -127; //for RSSI
|
||||
ULONG DataRate=0; //for datarate.
|
||||
for (i=0; i < MAX_LEN_OF_MAC_TABLE; i++)
|
||||
{
|
||||
pEntry = &pAd->MacTab.Content[i];
|
||||
if (!(IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC)))
|
||||
continue;
|
||||
myAvgRssi = RTMPAvgRssi(pAd, &pEntry->RssiSample);// get my rssi average.
|
||||
getRate(pEntry->HTPhyMode, &DataRate);
|
||||
|
||||
if(DataRate < pAd->RateTh)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d)Some sta's rate is low. DataRate = %lu\n",__FUNCTION__,__LINE__,DataRate));
|
||||
return FALSE;
|
||||
}
|
||||
if((MaxRssi == -127) && (MinRssi == -127))
|
||||
{
|
||||
MaxRssi= myAvgRssi;
|
||||
MinRssi = myAvgRssi;
|
||||
}
|
||||
else
|
||||
{
|
||||
MaxRssi = RTMPMaxRssi(pAd,MaxRssi,myAvgRssi,0);// find the max rssi in mactable size.
|
||||
MinRssi = RTMPMinRssi(pAd,MinRssi,myAvgRssi,0);// find the min rssi in mactable size.
|
||||
}
|
||||
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d)MaxRssi = %-3d,MinRssi = %-3d\n",__FUNCTION__,__LINE__,MaxRssi,MinRssi));
|
||||
if((MaxRssi - MinRssi) < pAd->DeltaRssiTh) /*pAd->DeltaRssiTh default 10 dBm*/
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d) in in in in in in \n",__FUNCTION__,__LINE__));
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VOID rtmp_deqmode_detect(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
if(pAd->MacTab.Size >=5)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d) MacTab.Size = %d\n",__FUNCTION__,__LINE__,pAd->MacTab.Size));
|
||||
if(Rtmp_Max_Continuous_Tx_OnOff(pAd) == TRUE)
|
||||
{
|
||||
pAd->ContinousTxCnt = CONTINUOUS_TX_CNT;/*set tx 21 packets one time*/
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d)Countinous to Tx %d Packets\n",__FUNCTION__,__LINE__,pAd->ContinousTxCnt));
|
||||
}
|
||||
else
|
||||
{
|
||||
pAd->ContinousTxCnt = 1; /*default tx 1 packet one time*/
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d)tx 1 packet!\n",__FUNCTION__,__LINE__));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN,("%s(%d)client num = %d\n",__FUNCTION__,__LINE__, pAd->MacTab.Size));
|
||||
pAd->ContinousTxCnt = 1; /*default tx 1 packet one time*/
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -0,0 +1,31 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_nintendo.c
|
||||
|
||||
Abstract:
|
||||
Miniport Query information related subroutines
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
JuemingChen 12-28-2006 created
|
||||
|
||||
*/
|
||||
#include "rt_config.h"
|
||||
|
||||
309
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_nps.c
Normal file
309
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_nps.c
Normal file
@ -0,0 +1,309 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_nps.c
|
||||
|
||||
Abstract:
|
||||
IEEE 802.11v NPS SoftAP related function
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Carter Chen 08-23-2013 created for 7603 AP
|
||||
*/
|
||||
#ifdef MT_MAC
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
extern VOID write_tmac_info_tim(RTMP_ADAPTER *pAd, INT apidx, UCHAR *tmac_buf, HTTRANSMIT_SETTING *BeaconTransmit, ULONG frmLen);
|
||||
|
||||
BOOLEAN TimTransmitRequired(RTMP_ADAPTER *pAd, INT apidx, BSS_STRUCT *pMbss)
|
||||
{
|
||||
BOOLEAN result = FALSE;
|
||||
TIM_BUF_STRUC *tim_info;
|
||||
|
||||
tim_info = &pMbss->tim_buf;
|
||||
if (tim_info->TimBufIdx >= HW_BEACON_MAX_NUM)
|
||||
return result;
|
||||
|
||||
if (tim_info->bTimSntReq == TRUE)
|
||||
{
|
||||
result = TRUE;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef MT_MAC
|
||||
VOID RT28xx_UpdateTimToAsic(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN INT apidx,
|
||||
IN ULONG FrameLen)
|
||||
{
|
||||
TIM_BUF_STRUC *tim_buf = NULL;
|
||||
UCHAR *buf;
|
||||
INT len;
|
||||
PNDIS_PACKET *pkt = NULL;
|
||||
|
||||
IF_DEV_CONFIG_OPMODE_ON_AP(pAd) {
|
||||
tim_buf = &pAd->ApCfg.MBSSID[apidx].tim_buf;
|
||||
}
|
||||
|
||||
if (!tim_buf) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): bcn_buf is NULL!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
pkt = tim_buf->TimPkt;
|
||||
if (pkt) {
|
||||
buf = (UCHAR *)GET_OS_PKT_DATAPTR(pkt);
|
||||
len = FrameLen + pAd->chipCap.tx_hw_hdr_len;
|
||||
SET_OS_PKT_LEN(pkt, len);
|
||||
|
||||
/* Now do hardware-depened kick out.*/
|
||||
RTMP_SEM_LOCK(&pAd->BcnRingLock);
|
||||
HAL_KickOutMgmtTx(pAd, Q_IDX_BCN, pkt, buf, len);
|
||||
RTMP_SEM_UNLOCK(&pAd->BcnRingLock);
|
||||
} else {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): TimPkt is NULL!\n", __FUNCTION__));
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* MT_MAC */
|
||||
|
||||
VOID write_tmac_info_tim(RTMP_ADAPTER *pAd, INT apidx, UCHAR *tmac_buf, HTTRANSMIT_SETTING *BeaconTransmit, ULONG frmLen)
|
||||
{
|
||||
MAC_TX_INFO mac_info;
|
||||
|
||||
NdisZeroMemory((UCHAR *)&mac_info, sizeof(mac_info));
|
||||
|
||||
mac_info.FRAG = FALSE;
|
||||
mac_info.CFACK = FALSE;
|
||||
mac_info.InsTimestamp = FALSE;
|
||||
mac_info.AMPDU = FALSE;
|
||||
mac_info.BM = 1;
|
||||
mac_info.Ack = FALSE;
|
||||
mac_info.NSeq = TRUE;
|
||||
mac_info.BASize = 0;
|
||||
mac_info.WCID = 0;
|
||||
mac_info.Length = frmLen;
|
||||
mac_info.PID = PID_MGMT;
|
||||
mac_info.TID = 0;
|
||||
mac_info.TxRate = 0;
|
||||
mac_info.Txopmode = IFS_HTTXOP;
|
||||
mac_info.q_idx = Q_IDX_BCN;
|
||||
mac_info.hdr_len = 24;
|
||||
mac_info.bss_idx = apidx;
|
||||
mac_info.SpeEn = 1;
|
||||
mac_info.Preamble = LONG_PREAMBLE;
|
||||
write_tmac_info(pAd, tmac_buf, &mac_info, BeaconTransmit);
|
||||
}
|
||||
|
||||
VOID APMakeBssTimFrame(RTMP_ADAPTER *pAd, INT apidx)
|
||||
{
|
||||
BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx];
|
||||
HEADER_802_11 TimHdr;
|
||||
LARGE_INTEGER FakeTimestamp;
|
||||
ULONG FrameLen = 0;
|
||||
UCHAR *pTimFrame, *ptr, *tmac_info;
|
||||
HTTRANSMIT_SETTING TimTransmit = {.word = 0}; /* MGMT frame PHY rate setting when operatin at HT rate. */
|
||||
//UINT8 TXWISize = pAd->chipCap.TXWISize;
|
||||
UINT8 tx_hw_hdr_len = pAd->chipCap.tx_hw_hdr_len;
|
||||
UCHAR Cat = 11;//Tim Category field
|
||||
UCHAR Act = 0;//Tim Action field
|
||||
UCHAR ChkBcn = 0;//Check Beacon field init from 0.
|
||||
//UCHAR *pTim;
|
||||
//UCHAR ID_1B, TimFirst, TimLast;
|
||||
//UINT i;
|
||||
|
||||
if(!TimTransmitRequired(pAd, apidx, pMbss))
|
||||
return;
|
||||
|
||||
if (pMbss->tim_buf.TimPkt == NULL) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s():Invalid TimPkt for MBSS[%d]\n",
|
||||
__func__, apidx));
|
||||
return;
|
||||
}
|
||||
|
||||
tmac_info = (UCHAR *)GET_OS_PKT_DATAPTR(pMbss->tim_buf.TimPkt);
|
||||
pTimFrame = (UCHAR *)(tmac_info + tx_hw_hdr_len);
|
||||
|
||||
ActHeaderInit(pAd,
|
||||
&TimHdr,
|
||||
BROADCAST_ADDR,
|
||||
pMbss->wdev.if_addr,
|
||||
pMbss->wdev.bssid);
|
||||
|
||||
|
||||
MakeOutgoingFrame(pTimFrame, &FrameLen,
|
||||
sizeof(HEADER_802_11), &TimHdr,
|
||||
1, &Cat,
|
||||
1, &Act,
|
||||
1, &ChkBcn,
|
||||
TIMESTAMP_LEN, &FakeTimestamp,
|
||||
END_OF_ARGS);
|
||||
|
||||
TimTransmit.word = 0;
|
||||
|
||||
pMbss->TimIELocationInTim = (UCHAR)FrameLen;
|
||||
|
||||
/*
|
||||
step 2 - update TIM IE
|
||||
TODO: enlarge TIM bitmap to support up to 64 STAs
|
||||
TODO: re-measure if RT2600 TBTT interrupt happens faster than BEACON sent out time
|
||||
*/
|
||||
ptr = pTimFrame + (UCHAR)FrameLen;
|
||||
*ptr = IE_TIM;
|
||||
*(ptr+1) = 0x0e;
|
||||
*(ptr + 2) = pAd->ApCfg.DtimCount;
|
||||
*(ptr + 3) = pAd->ApCfg.DtimPeriod;
|
||||
|
||||
*(ptr + 4) = 0xa0;
|
||||
*(ptr + 5) = 0xa0;
|
||||
*(ptr + 6) = 0xa0;
|
||||
*(ptr + 7) = 0xa0;
|
||||
*(ptr + 8) = 0xa0;
|
||||
*(ptr + 9) = 0xa0;
|
||||
*(ptr + 10) = 0xa0;
|
||||
*(ptr + 11) = 0xa0;
|
||||
*(ptr + 12) = 0xa0;
|
||||
*(ptr + 13) = 0xa0;
|
||||
*(ptr + 14) = 0xa0;
|
||||
*(ptr + 15) = 0xa0;
|
||||
|
||||
|
||||
// /* find the smallest AID (PS mode) */
|
||||
// TimFirst = 0; /* record first TIM byte != 0x00 */
|
||||
// TimLast = 0; /* record last TIM byte != 0x00 */
|
||||
// pTim = pMbss->TimBitmaps;
|
||||
//
|
||||
// for(ID_1B=0; ID_1B<WLAN_MAX_NUM_OF_TIM; ID_1B++)
|
||||
// {
|
||||
// /* get the TIM indicating PS packets for 8 stations */
|
||||
// UCHAR tim_1B = pTim[ID_1B];
|
||||
//
|
||||
// if (ID_1B == 0)
|
||||
// tim_1B &= 0xfe; /* skip bit0 bc/mc */
|
||||
//
|
||||
// if (tim_1B == 0)
|
||||
// continue; /* find next 1B */
|
||||
//
|
||||
// if (TimFirst == 0)
|
||||
// TimFirst = ID_1B;
|
||||
//
|
||||
// TimLast = ID_1B;
|
||||
// }
|
||||
//
|
||||
// /* fill TIM content to beacon buffer */
|
||||
// if (TimFirst & 0x01)
|
||||
// TimFirst --; /* find the even offset byte */
|
||||
//
|
||||
// *(ptr + 1) = 3+(TimLast-TimFirst+1); /* TIM IE length */
|
||||
// *(ptr + 4) = TimFirst;
|
||||
//
|
||||
// for(i=TimFirst; i<=TimLast; i++)
|
||||
// *(ptr + 5 + i - TimFirst) = pTim[i];
|
||||
//
|
||||
// /* bit0 means backlogged mcast/bcast */
|
||||
// /* per spec, this bit in TIM frame shall always 0. */
|
||||
// //TODO: MTK proprietary mechanism.
|
||||
// //if (pAd->ApCfg.DtimCount == 0)
|
||||
// //*(ptr + 4) |= (pMbss->TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] & 0x01);
|
||||
// *(ptr + 4) = 0;
|
||||
|
||||
/* adjust TIM length according to the new TIM */
|
||||
FrameLen += 16;//(2 + *(ptr+1));
|
||||
|
||||
/* When Beacon is use CCK to send, TIM shall use OFDM to send. and it's mandatory. */
|
||||
if (pAd->CommonCfg.Channel <= 14) {
|
||||
TimTransmit.field.MODE = MODE_OFDM;
|
||||
TimTransmit.field.MCS = MCS_RATE_6;
|
||||
}
|
||||
|
||||
write_tmac_info_tim(pAd, apidx, tmac_info, &TimTransmit, FrameLen);
|
||||
|
||||
// asic_write_bcn_buf(pAd,
|
||||
// tmac_info, TXWISize,
|
||||
// pTimFrame, FrameLen,
|
||||
// pAd->BeaconOffset[pMbss->bcn_buf.BcnBufIdx]);
|
||||
|
||||
RT28xx_UpdateTimToAsic(pAd, apidx, FrameLen);
|
||||
|
||||
//+++Add by shiang for debug
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s(): Dump the Beacon Packet of BSS%d!\n", __FUNCTION__, apidx));
|
||||
hex_dump("Initial BeaconBuf", tmac_info, FrameLen + tx_hw_hdr_len);
|
||||
//---Add by shiang for debug
|
||||
}
|
||||
|
||||
static UCHAR GetTimNum(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
int i;
|
||||
int NumTim;
|
||||
TIM_BUF_STRUC *tim_info;
|
||||
|
||||
NumTim = 0;
|
||||
for (i=0; i<pAd->ApCfg.BssidNum; i++)
|
||||
{
|
||||
tim_info = &pAd->ApCfg.MBSSID[i].tim_buf;
|
||||
if (tim_info->bTimSntReq)
|
||||
{
|
||||
tim_info->TimBufIdx = NumTim;
|
||||
NumTim ++;
|
||||
}
|
||||
}
|
||||
|
||||
return NumTim;
|
||||
}
|
||||
|
||||
VOID APMakeAllTimFrame(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
INT i;
|
||||
//UCHAR NumOfTims;
|
||||
|
||||
/* choose the Beacon number */
|
||||
/*NumOfTims =*/ GetTimNum(pAd);
|
||||
|
||||
for(i=0; i<pAd->ApCfg.BssidNum; i++) {
|
||||
APMakeBssTimFrame(pAd, i);
|
||||
// APMakeBssTimFrame2(pAd, i);//Carter, for test tttt 2 pkt purpose
|
||||
}
|
||||
}
|
||||
|
||||
INT wdev_tim_buf_init(RTMP_ADAPTER *pAd, TIM_BUF_STRUC *tim_info)
|
||||
{
|
||||
//bcn_info->bBcnSntReq = FALSE;
|
||||
tim_info->TimBufIdx = HW_BEACON_MAX_NUM;
|
||||
|
||||
if (!tim_info->TimPkt) {
|
||||
RTMPAllocateNdisPacket(pAd, &tim_info->TimPkt, NULL, 0, NULL, MAX_TIM_SIZE);
|
||||
//NdisAllocateSpinLock(pAd, &bcn_info->bcn_lock);
|
||||
} else {
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():TimPkt is allocated!\n", __func__));
|
||||
|
||||
}
|
||||
// if (!tim_info->TimPkt2) {
|
||||
// RTMPAllocateNdisPacket(pAd, &tim_info->TimPkt2, NULL, NULL, NULL, MAX_TIM_SIZE);
|
||||
//NdisAllocateSpinLock(pAd, &bcn_info->bcn_lock);
|
||||
// } else {
|
||||
// DBGPRINT(RT_DEBUG_OFF, ("%s():TimPkt2 is allocated!\n", __func__));
|
||||
//}
|
||||
tim_info->bTimSntReq = TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
#endif /* MT_MAC */
|
||||
923
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_qload.c
Normal file
923
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_qload.c
Normal file
@ -0,0 +1,923 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Abstract:
|
||||
|
||||
Provide information on the current STA population and traffic levels
|
||||
in the QBSS.
|
||||
|
||||
This attribute is available only at a QAP. This attribute, when TRUE,
|
||||
indicates that the QAP implementation is capable of generating and
|
||||
transmitting the QBSS load element in the Beacon and Probe Response frames.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
#ifdef AP_QLOAD_SUPPORT
|
||||
|
||||
typedef struct GNU_PACKED _ELM_QBSS_LOAD{
|
||||
|
||||
UINT8 ElementId;
|
||||
UINT8 Length;
|
||||
|
||||
/* the total number of STAs currently associated with this QBSS */
|
||||
UINT16 StationCount;
|
||||
|
||||
/* defined as the percentage of time, nomalized to 255, the QAP sensed the
|
||||
medium busy, as indicated by either the physical or virtual carrier
|
||||
sense mechanism.
|
||||
This percentage is computed using the formula:
|
||||
((channel busy time / (dot11ChannelUtilizationBeaconIntervals *
|
||||
dot11BeaconPeriod * 1024)) * 255) */
|
||||
UINT8 ChanUtil;
|
||||
|
||||
/* specifies the remaining amount of medium time available via explicit
|
||||
admission control, in units of 32 microsecond periods per 1 second.
|
||||
The field is helpful for roaming non-AP QSTAs to select a QAP that is
|
||||
likely to accept future admission control requests, but it does not
|
||||
represent a guarantee that the HC will admit these requests. */
|
||||
UINT16 AvalAdmCap;
|
||||
|
||||
} ELM_QBSS_LOAD;
|
||||
|
||||
#define ELM_QBSS_LOAD_ID 11
|
||||
#define ELM_QBSS_LOAD_LEN 5
|
||||
|
||||
/*
|
||||
We will send a alarm when channel busy time (primary or secondary) >=
|
||||
Time Threshold and Num Threshold.
|
||||
|
||||
QBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD = 0 means alarm function is disabled.
|
||||
|
||||
If you want to enable it, use command
|
||||
"iwpriv ra0 set qloadalarmtimethres=90"
|
||||
*/
|
||||
#define QBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD 0 /* unit: % */
|
||||
#define QBSS_LOAD_ALRAM_BUSY_NUM_THRESHOLD 10 /* unit: 1 */
|
||||
|
||||
/* a alarm will not re-issued until QBSS_LOAD_ALARM_DURATION * TBTT */
|
||||
#define QBSS_LOAD_ALARM_DURATION 100 /* unit: TBTT */
|
||||
|
||||
|
||||
static VOID QBSS_LoadAlarmSuspend(
|
||||
IN RTMP_ADAPTER *pAd);
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/* handle a alarm */
|
||||
static VOID QBSS_LoadAlarm(
|
||||
IN RTMP_ADAPTER *pAd);
|
||||
static VOID QBSS_LoadAlarmBusyTimeThresholdReset(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UINT32 TimePeriod);
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
|
||||
|
||||
|
||||
/* --------------------------------- Private -------------------------------- */
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Handle a alarm.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
You can use different methods to handle QBSS Load alarm here.
|
||||
|
||||
Current methods are:
|
||||
1. Change 20/40 to 20-only.
|
||||
2. Change channel to the clear channel.
|
||||
========================================================================
|
||||
*/
|
||||
static VOID QBSS_LoadAlarm(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
/* suspend alarm until channel switch */
|
||||
QBSS_LoadAlarmSuspend(pAd);
|
||||
|
||||
pAd->phy_ctrl.QloadAlarmNumber ++;
|
||||
|
||||
/* check if we have already been 20M bandwidth */
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
#ifdef DOT11N_DRAFT3
|
||||
if ((pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset != 0) &&
|
||||
(pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth != 0))
|
||||
{
|
||||
MAC_TABLE *pMacTable;
|
||||
UINT32 StaId;
|
||||
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("qbss> Alarm! Change to 20 bw...\n"));
|
||||
|
||||
/* disassociate stations without D3 2040Coexistence function */
|
||||
pMacTable = &pAd->MacTab;
|
||||
|
||||
for(StaId=1; StaId<MAX_LEN_OF_MAC_TABLE; StaId++)
|
||||
{
|
||||
MAC_TABLE_ENTRY *pEntry = &pMacTable->Content[StaId];
|
||||
BOOLEAN bDisconnectSta = FALSE;
|
||||
|
||||
if (!IS_ENTRY_CLIENT(pEntry))
|
||||
continue;
|
||||
|
||||
if (pEntry->Sst != SST_ASSOC)
|
||||
continue;
|
||||
|
||||
if (pEntry->BSS2040CoexistenceMgmtSupport)
|
||||
bDisconnectSta = TRUE;
|
||||
|
||||
if (bDisconnectSta)
|
||||
{
|
||||
/* send wireless event - for ageout */
|
||||
RTMPSendWirelessEvent(pAd, IW_AGEOUT_EVENT_FLAG, pEntry->Addr, 0, 0);
|
||||
|
||||
{
|
||||
PUCHAR pOutBuffer = NULL;
|
||||
NDIS_STATUS NStatus;
|
||||
ULONG FrameLen = 0;
|
||||
HEADER_802_11 DeAuthHdr;
|
||||
USHORT Reason;
|
||||
|
||||
/* send out a DISASSOC request frame */
|
||||
NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);
|
||||
if (NStatus != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, (" MlmeAllocateMemory fail ..\n"));
|
||||
/*NdisReleaseSpinLock(&pAd->MacTabLock); */
|
||||
continue;
|
||||
}
|
||||
|
||||
Reason = REASON_DEAUTH_STA_LEAVING;
|
||||
MgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0,
|
||||
pEntry->Addr,
|
||||
pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.if_addr,
|
||||
pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev.bssid);
|
||||
MakeOutgoingFrame(pOutBuffer, &FrameLen,
|
||||
sizeof(HEADER_802_11), &DeAuthHdr,
|
||||
2, &Reason,
|
||||
END_OF_ARGS);
|
||||
MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
|
||||
MlmeFreeMemory(pAd, pOutBuffer);
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("qbss> Alarm! Deauth the station "
|
||||
"%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
PRINT_MAC(pEntry->Addr)));
|
||||
|
||||
MacTableDeleteEntry(pAd, pEntry->wcid, pEntry->Addr);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* for 11n */
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0;
|
||||
|
||||
/* always 20M */
|
||||
pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;
|
||||
|
||||
/* mark alarm flag */
|
||||
pAd->phy_ctrl.FlgQloadAlarm = TRUE;
|
||||
|
||||
QBSS_LoadAlarmResume(pAd);
|
||||
}
|
||||
else
|
||||
#endif /* DOT11N_DRAFT3 */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
{
|
||||
/* we are in 20MHz bandwidth so try to switch channel */
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("qbss> Alarm! Switch channel...\n"));
|
||||
|
||||
/* send command to switch channel */
|
||||
RTEnqueueInternalCmd(pAd, CMDTHREAD_CHAN_RESCAN, NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Re-calculate busy time threshold.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
TimePeriod - TBTT
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
EX: TBTT=100ms, 90%, pAd->QloadBusyTimeThreshold = 90ms
|
||||
========================================================================
|
||||
*/
|
||||
static VOID QBSS_LoadAlarmBusyTimeThresholdReset(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UINT32 TimePeriod)
|
||||
{
|
||||
pAd->phy_ctrl.QloadBusyTimeThreshold = TimePeriod;
|
||||
pAd->phy_ctrl.QloadBusyTimeThreshold *= pAd->phy_ctrl.QloadAlarmBusyTimeThreshold;
|
||||
pAd->phy_ctrl.QloadBusyTimeThreshold /= 100;
|
||||
pAd->phy_ctrl.QloadBusyTimeThreshold <<= 10; /* translate mini-sec to micro-sec */
|
||||
}
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize ASIC Channel Busy Calculation mechanism.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
Init Condition: WMM must be enabled.
|
||||
========================================================================
|
||||
*/
|
||||
VOID QBSS_LoadInit(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UINT32 IdBss;
|
||||
|
||||
|
||||
/* check whether any BSS enables WMM feature */
|
||||
for(IdBss=0; IdBss<pAd->ApCfg.BssidNum; IdBss++)
|
||||
{
|
||||
if ((pAd->ApCfg.MBSSID[IdBss].wdev.bWmmCapable)
|
||||
#ifdef DOT11K_RRM_SUPPORT
|
||||
|| (IS_RRM_ENABLE(pAd, IdBss))
|
||||
#endif /* DOT11K_RRM_SUPPORT */
|
||||
)
|
||||
{
|
||||
pAd->phy_ctrl.FlgQloadEnable = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pAd->phy_ctrl.FlgQloadEnable == TRUE)
|
||||
{
|
||||
/* default value is 50, please reference to IEEE802.11e 2005 Annex D */
|
||||
pAd->phy_ctrl.QloadChanUtilBeaconInt = 50;
|
||||
}
|
||||
AsicSetChBusyStat(pAd, pAd->phy_ctrl.FlgQloadEnable);
|
||||
|
||||
pAd->phy_ctrl.QloadChanUtilTotal = 0;
|
||||
pAd->phy_ctrl.QloadUpTimeLast = 0;
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_STATS
|
||||
/* clear busy time statistics */
|
||||
NdisZeroMemory(pAd->phy_ctrl.QloadBusyCountPri, sizeof(pAd->phy_ctrl.QloadBusyCountPri));
|
||||
NdisZeroMemory(pAd->phy_ctrl.QloadBusyCountSec, sizeof(pAd->phy_ctrl.QloadBusyCountSec));
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_STATS */
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/* init threshold before QBSS_LoadAlarmReset */
|
||||
pAd->phy_ctrl.QloadAlarmBusyTimeThreshold = QBSS_LOAD_ALRAM_BUSY_TIME_THRESHOLD;
|
||||
pAd->phy_ctrl.QloadAlarmBusyNumThreshold = QBSS_LOAD_ALRAM_BUSY_NUM_THRESHOLD;
|
||||
|
||||
QBSS_LoadAlarmReset(pAd);
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Reset alarm function.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID QBSS_LoadAlarmReset(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
pAd->phy_ctrl.FlgQloadAlarm = FALSE;
|
||||
pAd->phy_ctrl.QloadAlarmDuration = 0;
|
||||
pAd->phy_ctrl.QloadAlarmNumber = 0;
|
||||
|
||||
pAd->phy_ctrl.FlgQloadAlarmIsSuspended = FALSE;
|
||||
|
||||
QBSS_LoadAlarmBusyTimeThresholdReset(pAd, pAd->CommonCfg.BeaconPeriod);
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Resume alarm function.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID QBSS_LoadAlarmResume(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
pAd->phy_ctrl.FlgQloadAlarmIsSuspended = FALSE;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Suspend alarm function.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
static VOID QBSS_LoadAlarmSuspend(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
pAd->phy_ctrl.FlgQloadAlarmIsSuspended = TRUE;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Get average busy time in current channel.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
average busy time
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
UINT32 QBSS_LoadBusyTimeGet(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
if (pAd->phy_ctrl.QloadChanUtilBeaconCnt == 0)
|
||||
return pAd->phy_ctrl.QloadChanUtilTotal;
|
||||
|
||||
return (pAd->phy_ctrl.QloadChanUtilTotal / pAd->phy_ctrl.QloadChanUtilBeaconCnt);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Check if a alarm is occurred and clear the alarm.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
TRUE - alarm occurs
|
||||
FALSE - no alarm
|
||||
|
||||
Note:
|
||||
We will clear the alarm in the function.
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN QBSS_LoadIsAlarmIssued(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
BOOLEAN FlgQloadAlarm = pAd->phy_ctrl.FlgQloadAlarm;
|
||||
|
||||
pAd->phy_ctrl.FlgQloadAlarm = FALSE;
|
||||
return FlgQloadAlarm;
|
||||
#else
|
||||
|
||||
return FALSE;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Check if the busy time is accepted.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
TURE - ok
|
||||
FALSE - fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN QBSS_LoadIsBusyTimeAccepted(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UINT32 BusyTime)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
if (pAd->phy_ctrl.QloadAlarmBusyTimeThreshold == 0)
|
||||
return TRUE; /* always ok */
|
||||
|
||||
if (BusyTime >= pAd->phy_ctrl.QloadBusyTimeThreshold)
|
||||
return FALSE;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTSPOT_R2
|
||||
UINT32 QBSS_LoadElementAppend_HSTEST(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
OUT UINT8 *pBeaconBuf,
|
||||
IN UCHAR apidx)
|
||||
{
|
||||
ELM_QBSS_LOAD load, *pLoad = &load;
|
||||
ULONG ElmLen;
|
||||
|
||||
/* check whether channel busy time calculation is enabled */
|
||||
if (pAd->phy_ctrl.FlgQloadEnable == 0)
|
||||
return 0;
|
||||
/* End of if */
|
||||
|
||||
/* init */
|
||||
pLoad->ElementId = ELM_QBSS_LOAD_ID;
|
||||
pLoad->Length = ELM_QBSS_LOAD_LEN;
|
||||
|
||||
pLoad->StationCount = le2cpu16(pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.QLoadStaCnt);
|
||||
pLoad->ChanUtil = pAd->ApCfg.MBSSID[apidx].HotSpotCtrl.QLoadCU;
|
||||
|
||||
/* because no ACM is supported, the available bandwidth is 1 sec */
|
||||
pLoad->AvalAdmCap = le2cpu16(0xffff); /* 0x7a12 * 32us = 1 second */
|
||||
|
||||
|
||||
/* copy the element to the frame */
|
||||
MakeOutgoingFrame(pBeaconBuf, &ElmLen,
|
||||
sizeof(ELM_QBSS_LOAD), pLoad,
|
||||
END_OF_ARGS);
|
||||
|
||||
return ElmLen;
|
||||
} /* End of QBSS_LoadElementAppend */
|
||||
#endif
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Append the QBSS Load element to the beacon frame.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
*pBeaconBuf - the beacon or probe response frame
|
||||
|
||||
Return Value:
|
||||
the element total Length
|
||||
|
||||
Note:
|
||||
Append Condition: You must check whether WMM is enabled before the
|
||||
function is using.
|
||||
========================================================================
|
||||
*/
|
||||
UINT32 QBSS_LoadElementAppend(RTMP_ADAPTER *pAd, UINT8 *pBeaconBuf)
|
||||
{
|
||||
ELM_QBSS_LOAD load, *pLoad = &load;
|
||||
ULONG ElmLen;
|
||||
|
||||
|
||||
/* check whether channel busy time calculation is enabled */
|
||||
if (pAd->phy_ctrl.FlgQloadEnable == 0)
|
||||
return 0;
|
||||
|
||||
/* init */
|
||||
pLoad->ElementId = ELM_QBSS_LOAD_ID;
|
||||
pLoad->Length = ELM_QBSS_LOAD_LEN;
|
||||
|
||||
pLoad->StationCount = le2cpu16(MacTableAssocStaNumGet(pAd));
|
||||
pLoad->ChanUtil = pAd->phy_ctrl.QloadChanUtil;
|
||||
|
||||
/* because no ACM is supported, the available bandwidth is 1 sec */
|
||||
pLoad->AvalAdmCap = le2cpu16(0x7a12); /* 0x7a12 * 32us = 1 second */
|
||||
|
||||
|
||||
/* copy the element to the frame */
|
||||
MakeOutgoingFrame(pBeaconBuf, &ElmLen,
|
||||
sizeof(ELM_QBSS_LOAD), pLoad,
|
||||
END_OF_ARGS);
|
||||
|
||||
return ElmLen;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Update Channel Utilization.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
UpTime - current up time
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
UpTime is used in QLOAD_FUNC_BUSY_TIME_STATS & QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
|
||||
If UpTime != 0, it means that the time period calling the function
|
||||
maybe not TBTT so we need to re-calculate the time period.
|
||||
|
||||
If you call the function in kernel thread, the time period sometimes
|
||||
will not accurate due to kernel thread is not real-time, so we need to
|
||||
recalculate the time period.
|
||||
========================================================================
|
||||
*/
|
||||
VOID QBSS_LoadUpdate(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN ULONG UpTime)
|
||||
{
|
||||
UINT32 ChanUtilNu, ChanUtilDe;
|
||||
UINT32 BusyTime = 0;
|
||||
UINT32 BusyTimeId;
|
||||
UINT32 TimePeriod = pAd->CommonCfg.BeaconPeriod;
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
BOOLEAN FlgIsBusyOverThreshold = FALSE;
|
||||
BOOLEAN FlgIsAlarmNeeded = FALSE;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
|
||||
/* check whether channel busy time calculation is enabled */
|
||||
if ((pAd->phy_ctrl.FlgQloadEnable == 0) ||
|
||||
(pAd->phy_ctrl.FlgQloadAlarmIsSuspended == TRUE))
|
||||
return;
|
||||
|
||||
/* calculate new time period if needed */
|
||||
if ((UpTime > 0) &&
|
||||
(pAd->phy_ctrl.QloadUpTimeLast > 0) &&
|
||||
(UpTime > pAd->phy_ctrl.QloadUpTimeLast))
|
||||
{
|
||||
/* re-calculate time period */
|
||||
TimePeriod = (UINT32)(UpTime - pAd->phy_ctrl.QloadUpTimeLast);
|
||||
|
||||
/* translate to mini-second */
|
||||
TimePeriod = (TimePeriod*1000)/OS_HZ;
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/* re-calculate QloadBusyTimeThreshold */
|
||||
if (TimePeriod != pAd->phy_ctrl.QloadTimePeriodLast)
|
||||
QBSS_LoadAlarmBusyTimeThresholdReset(pAd, TimePeriod);
|
||||
|
||||
pAd->phy_ctrl.QloadTimePeriodLast = TimePeriod;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
/* update up time */
|
||||
pAd->phy_ctrl.QloadUpTimeLast = UpTime;
|
||||
|
||||
/* do busy time statistics */
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if ((pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset != 0) &&
|
||||
(pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth != 0))
|
||||
{
|
||||
/* in 20MHz, no need to check busy time of secondary channel */
|
||||
BusyTime = AsicGetChBusyCnt(pAd, 1);
|
||||
pAd->phy_ctrl.QloadLatestChannelBusyTimeSec = BusyTime;
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_STATS
|
||||
BusyTimeId = BusyTime >> 10; /* translate us to ms */
|
||||
|
||||
/* ex:95ms, 95*20/100 = 19 */
|
||||
BusyTimeId = (BusyTimeId*QLOAD_BUSY_INTERVALS)/TimePeriod;
|
||||
|
||||
if (BusyTimeId >= QLOAD_BUSY_INTERVALS)
|
||||
BusyTimeId = QLOAD_BUSY_INTERVALS - 1;
|
||||
|
||||
pAd->phy_ctrl.QloadBusyCountSec[BusyTimeId] ++;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_STATS */
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
if ((pAd->phy_ctrl.FlgQloadAlarmIsSuspended == FALSE) &&
|
||||
(pAd->phy_ctrl.QloadAlarmBusyTimeThreshold > 0))
|
||||
{
|
||||
/* Alarm is not suspended and is enabled */
|
||||
|
||||
if ((pAd->phy_ctrl.QloadBusyTimeThreshold != 0) &&
|
||||
(BusyTime >= pAd->phy_ctrl.QloadBusyTimeThreshold))
|
||||
{
|
||||
FlgIsBusyOverThreshold = TRUE;
|
||||
}
|
||||
}
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
|
||||
/* do busy time statistics for primary channel */
|
||||
BusyTime = AsicGetChBusyCnt(pAd, 0);
|
||||
pAd->phy_ctrl.QloadLatestChannelBusyTimePri = BusyTime;
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_STATS
|
||||
BusyTimeId = BusyTime >> 10; /* translate us to ms */
|
||||
|
||||
/* ex:95ms, 95*20/100 = 19 */
|
||||
BusyTimeId = (BusyTimeId*QLOAD_BUSY_INTERVALS)/TimePeriod;
|
||||
|
||||
if (BusyTimeId >= QLOAD_BUSY_INTERVALS)
|
||||
BusyTimeId = QLOAD_BUSY_INTERVALS - 1;
|
||||
|
||||
pAd->phy_ctrl.QloadBusyCountPri[BusyTimeId] ++;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_STATS */
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
if ((pAd->phy_ctrl.FlgQloadAlarmIsSuspended == FALSE) &&
|
||||
(pAd->phy_ctrl.QloadAlarmBusyTimeThreshold > 0))
|
||||
{
|
||||
/* Alarm is not suspended and is enabled */
|
||||
|
||||
if ((pAd->phy_ctrl.QloadBusyTimeThreshold != 0) &&
|
||||
(BusyTime >= pAd->phy_ctrl.QloadBusyTimeThreshold))
|
||||
{
|
||||
FlgIsBusyOverThreshold = TRUE;
|
||||
}
|
||||
}
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
/* accumulate channel busy time for primary channel */
|
||||
pAd->phy_ctrl.QloadChanUtilTotal += BusyTime;
|
||||
|
||||
/* update new channel utilization for primary channel */
|
||||
if (++pAd->phy_ctrl.QloadChanUtilBeaconCnt >= pAd->phy_ctrl.QloadChanUtilBeaconInt)
|
||||
{
|
||||
ChanUtilNu = pAd->phy_ctrl.QloadChanUtilTotal;
|
||||
ChanUtilNu *= 255;
|
||||
|
||||
ChanUtilDe = pAd->phy_ctrl.QloadChanUtilBeaconInt;
|
||||
|
||||
/*
|
||||
Still use pAd->CommonCfg.BeaconPeriod.
|
||||
Because we change QloadChanUtil not every TBTT.
|
||||
*/
|
||||
ChanUtilDe *= pAd->CommonCfg.BeaconPeriod;
|
||||
|
||||
ChanUtilDe <<= 10; /* ms to us */
|
||||
|
||||
pAd->phy_ctrl.QloadChanUtil = (UINT8)(ChanUtilNu/ChanUtilDe);
|
||||
|
||||
/* re-accumulate channel busy time */
|
||||
pAd->phy_ctrl.QloadChanUtilBeaconCnt = 0;
|
||||
pAd->phy_ctrl.QloadChanUtilTotal = 0;
|
||||
}
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/* check if alarm function is enabled */
|
||||
if ((pAd->phy_ctrl.FlgQloadAlarmIsSuspended == FALSE) &&
|
||||
(pAd->phy_ctrl.QloadAlarmBusyTimeThreshold > 0))
|
||||
{
|
||||
/* Alarm is not suspended and is enabled */
|
||||
|
||||
/* check if we need to issue a alarm */
|
||||
if (FlgIsBusyOverThreshold == TRUE)
|
||||
{
|
||||
if (pAd->phy_ctrl.QloadAlarmDuration == 0)
|
||||
{
|
||||
/* last alarm ended so we can check new alarm */
|
||||
|
||||
pAd->phy_ctrl.QloadAlarmBusyNum ++;
|
||||
|
||||
if (pAd->phy_ctrl.QloadAlarmBusyNum >= pAd->phy_ctrl.QloadAlarmBusyNumThreshold)
|
||||
{
|
||||
/*
|
||||
The continued number of busy time >= threshold is larger
|
||||
than number threshold so issuing a alarm.
|
||||
*/
|
||||
FlgIsAlarmNeeded = TRUE;
|
||||
pAd->phy_ctrl.QloadAlarmDuration ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
pAd->phy_ctrl.QloadAlarmBusyNum = 0;
|
||||
|
||||
if (pAd->phy_ctrl.QloadAlarmDuration > 0)
|
||||
{
|
||||
/*
|
||||
New alarm occurs so we can not re-issue new alarm during
|
||||
QBSS_LOAD_ALARM_DURATION * TBTT.
|
||||
*/
|
||||
if (++pAd->phy_ctrl.QloadAlarmDuration >= QBSS_LOAD_ALARM_DURATION)
|
||||
{
|
||||
/* can re-issue next alarm */
|
||||
pAd->phy_ctrl.QloadAlarmDuration = 0;
|
||||
pAd->phy_ctrl.QloadAlarmBusyNum = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (FlgIsAlarmNeeded == TRUE)
|
||||
QBSS_LoadAlarm(pAd);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* clear statistics counts */
|
||||
pAd->phy_ctrl.QloadAlarmBusyNum = 0;
|
||||
pAd->phy_ctrl.QloadAlarmDuration = 0;
|
||||
pAd->phy_ctrl.FlgQloadAlarm = FALSE;
|
||||
}
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Clear QoS Load information.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID QBSS_LoadStatusClear(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_STATS
|
||||
/* clear busy time statistics */
|
||||
NdisZeroMemory(pAd->phy_ctrl.QloadBusyCountPri, sizeof(pAd->phy_ctrl.QloadBusyCountPri));
|
||||
NdisZeroMemory(pAd->phy_ctrl.QloadBusyCountSec, sizeof(pAd->phy_ctrl.QloadBusyCountSec));
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_STATS */
|
||||
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
/* clear alarm function variables */
|
||||
pAd->phy_ctrl.QloadChanUtilTotal = 0;
|
||||
pAd->phy_ctrl.FlgQloadAlarm = FALSE;
|
||||
pAd->phy_ctrl.QloadAlarmBusyNum = 0;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Show QoS Load information.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Arg - Input arguments
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT Show_QoSLoad_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_STATS
|
||||
UINT32 BusyTimeId;
|
||||
#ifdef DBG
|
||||
UINT32 Time;
|
||||
Time = pAd->CommonCfg.BeaconPeriod / QLOAD_BUSY_INTERVALS;
|
||||
#endif /* DBG */
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\n\tPrimary Busy Time\tTimes\n"));
|
||||
|
||||
for(BusyTimeId=0; BusyTimeId<QLOAD_BUSY_INTERVALS; BusyTimeId++)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t%dms ~ %dms\t\t%d\n",
|
||||
BusyTimeId*Time,
|
||||
(BusyTimeId+1)*Time,
|
||||
pAd->phy_ctrl.QloadBusyCountPri[BusyTimeId]));
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\n\tSecondary Busy Time\tTimes\n"));
|
||||
|
||||
for(BusyTimeId=0; BusyTimeId<QLOAD_BUSY_INTERVALS; BusyTimeId++)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t%dms ~ %dms\t\t%d\n",
|
||||
BusyTimeId*Time,
|
||||
(BusyTimeId+1)*Time,
|
||||
pAd->phy_ctrl.QloadBusyCountSec[BusyTimeId]));
|
||||
}
|
||||
#else
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\tBusy time statistics is not included into the driver!\n"));
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_STATS */
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Command for QoS Load information clear.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Arg - Input arguments
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT Set_QloadClr_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
QBSS_LoadStatusClear(pAd);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Command for QoS Alarm Time Threshold set.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Arg - Input arguments
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT Set_QloadAlarmTimeThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
pAd->phy_ctrl.QloadAlarmBusyTimeThreshold = (UCHAR)simple_strtol(Arg, 0, 10);
|
||||
|
||||
QBSS_LoadAlarmReset(pAd);
|
||||
|
||||
pAd->phy_ctrl.QloadTimePeriodLast = pAd->CommonCfg.BeaconPeriod;
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Command for QoS Alarm Number Threshold set.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Arg - Input arguments
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT Set_QloadAlarmNumThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *Arg)
|
||||
{
|
||||
#ifdef QLOAD_FUNC_BUSY_TIME_ALARM
|
||||
pAd->phy_ctrl.QloadAlarmBusyNumThreshold = (UCHAR)simple_strtol(Arg, 0, 10);
|
||||
#endif /* QLOAD_FUNC_BUSY_TIME_ALARM */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* AP_QLOAD_SUPPORT */
|
||||
|
||||
1027
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_repeater.c
Normal file
1027
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_repeater.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,30 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_sanity.c
|
||||
|
||||
Abstract:
|
||||
Handle association related requests either from WSTA or from local MLME
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
John Chang 08-14-2003 created for 11g soft-AP
|
||||
John Chang 12-30-2004 merge with STA driver for RT2600
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
2296
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_sync.c
Normal file
2296
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_sync.c
Normal file
File diff suppressed because it is too large
Load Diff
1403
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_wds.c
Normal file
1403
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_wds.c
Normal file
File diff suppressed because it is too large
Load Diff
113
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_wds_inf.c
Normal file
113
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_wds_inf.c
Normal file
@ -0,0 +1,113 @@
|
||||
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ap_wds.c
|
||||
|
||||
Abstract:
|
||||
Support WDS function.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
------ ---------- ----------------------------------------------
|
||||
Fonchi 02-13-2007 created
|
||||
*/
|
||||
#define RTMP_MODULE_OS
|
||||
|
||||
#ifdef WDS_SUPPORT
|
||||
|
||||
/*#include "rt_config.h" */
|
||||
#include "rtmp_comm.h"
|
||||
#include "rt_os_util.h"
|
||||
#include "rt_os_net.h"
|
||||
|
||||
|
||||
NET_DEV_STATS *RT28xx_get_wds_ether_stats(PNET_DEV net_dev);
|
||||
|
||||
|
||||
/* Register WDS interface */
|
||||
VOID RT28xx_WDS_Init(VOID *pAd, PNET_DEV net_dev)
|
||||
{
|
||||
RTMP_OS_NETDEV_OP_HOOK netDevOpHook;
|
||||
|
||||
NdisZeroMemory((PUCHAR)&netDevOpHook, sizeof(RTMP_OS_NETDEV_OP_HOOK));
|
||||
netDevOpHook.open = WdsVirtualIF_open;
|
||||
netDevOpHook.stop = WdsVirtualIF_close;
|
||||
netDevOpHook.xmit = rt28xx_send_packets;
|
||||
netDevOpHook.ioctl = rt28xx_ioctl;
|
||||
netDevOpHook.get_stats = RT28xx_get_wds_ether_stats;
|
||||
NdisMoveMemory(&netDevOpHook.devAddr[0], RTMP_OS_NETDEV_GET_PHYADDR(net_dev), MAC_ADDR_LEN);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("The new WDS interface MAC = %02X:%02X:%02X:%02X:%02X:%02X\n",
|
||||
PRINT_MAC(netDevOpHook.devAddr)));
|
||||
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_WDS_INIT,
|
||||
0, &netDevOpHook, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
INT WdsVirtualIF_open(PNET_DEV dev)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
/* increase MODULE use count */
|
||||
RT_MOD_INC_USE_COUNT();
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> VirtualIF_open\n", RTMP_OS_NETDEV_GET_DEVNAME(dev)));
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(dev);
|
||||
if (VIRTUAL_IF_UP(pAd) != 0)
|
||||
return -1;
|
||||
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_REG(dev);
|
||||
#endif
|
||||
RTMP_OS_NETDEV_START_QUEUE(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT WdsVirtualIF_close(PNET_DEV dev)
|
||||
{
|
||||
VOID *pAd;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> VirtualIF_close\n", RTMP_OS_NETDEV_GET_DEVNAME(dev)));
|
||||
|
||||
|
||||
pAd = RTMP_OS_NETDEV_GET_PRIV(dev);
|
||||
|
||||
//RTMP_OS_NETDEV_CARRIER_OFF(dev);
|
||||
RTMP_OS_NETDEV_STOP_QUEUE(dev);
|
||||
|
||||
#ifdef CONFIG_RA_HW_NAT_WIFI_NEW_ARCH
|
||||
RT_MOD_HNAT_DEREG(dev);
|
||||
#endif
|
||||
VIRTUAL_IF_DOWN(pAd);
|
||||
|
||||
RT_MOD_DEC_USE_COUNT();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xx_WDS_Remove(VOID *pAd)
|
||||
{
|
||||
RTMP_AP_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_WDS_REMOVE, 0, NULL, 0);
|
||||
}
|
||||
|
||||
#endif /* WDS_SUPPORT */
|
||||
1545
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_wpa.c
Normal file
1545
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/ap_wpa.c
Normal file
File diff suppressed because it is too large
Load Diff
1288
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/apcli_assoc.c
Normal file
1288
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/apcli_assoc.c
Normal file
File diff suppressed because it is too large
Load Diff
1132
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/apcli_auth.c
Normal file
1132
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/apcli_auth.c
Normal file
File diff suppressed because it is too large
Load Diff
2105
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/apcli_ctrl.c
Normal file
2105
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/apcli_ctrl.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,144 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2006, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
apcli_ctrl.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Fonchi 2006-06-23 modified for rt61-APClinent
|
||||
*/
|
||||
#ifdef APCLI_SUPPORT
|
||||
#ifdef APCLI_LINK_COVER_SUPPORT
|
||||
#include "rt_config.h"
|
||||
|
||||
extern VOID* p5G_pAd;
|
||||
extern VOID* p2G_pAd;
|
||||
|
||||
INT ApcliLinkMonitorThread(
|
||||
IN ULONG Context)
|
||||
{
|
||||
RTMP_ADAPTER *pAd;
|
||||
RTMP_ADAPTER *pAd_other_band;
|
||||
RTMP_OS_TASK *pTask;
|
||||
int status;
|
||||
status = 0;
|
||||
|
||||
pTask = (RTMP_OS_TASK *)Context;
|
||||
pAd = (PRTMP_ADAPTER)RTMP_OS_TASK_DATA_GET(pTask);
|
||||
|
||||
RtmpOSTaskCustomize(pTask);
|
||||
|
||||
if (p2G_pAd == NULL) {
|
||||
printk("##### no 2G pAd!!!\n");
|
||||
//RtmpOSTaskNotifyToExit(pTask);
|
||||
// return 0;
|
||||
} else if (p5G_pAd == NULL) {
|
||||
printk("##### no 5G pAd!!!\n");
|
||||
//RtmpOSTaskNotifyToExit(pTask);
|
||||
// return 0;
|
||||
}
|
||||
if (p5G_pAd == pAd) {
|
||||
printk("we are 5G interface, wait 2G link update\n");
|
||||
pAd_other_band = p2G_pAd;
|
||||
}
|
||||
else {
|
||||
printk("we are 2G interface, wait 5G link update\n");
|
||||
pAd_other_band = p5G_pAd;
|
||||
}
|
||||
|
||||
while (pTask && !RTMP_OS_TASK_IS_KILLED(pTask) && (pAd_other_band != NULL))
|
||||
{
|
||||
if (RtmpOSTaskWait(pAd, pTask, &status) == FALSE)
|
||||
{
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
|
||||
break;
|
||||
}
|
||||
if (status != 0)
|
||||
break;
|
||||
//TODO: wait_for_completion
|
||||
}
|
||||
|
||||
/* notify the exit routine that we're actually exiting now
|
||||
*
|
||||
* complete()/wait_for_completion() is similar to up()/down(),
|
||||
* except that complete() is safe in the case where the structure
|
||||
* is getting deleted in a parallel mode of execution (i.e. just
|
||||
* after the down() -- that's necessary for the thread-shutdown
|
||||
* case.
|
||||
*
|
||||
* complete_and_exit() goes even further than this -- it is safe in
|
||||
* the case that the thread of the caller is going away (not just
|
||||
* the structure) -- this is necessary for the module-remove case.
|
||||
* This is important in preemption kernels, which transfer the flow
|
||||
* of execution immediately upon a complete().
|
||||
*/
|
||||
printk("<---ApcliLinkMonitorThread\n");
|
||||
|
||||
//if (pTask)
|
||||
// RtmpOSTaskNotifyToExit(pTask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
NDIS_STATUS RtmpApcliLinkTaskInit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
RTMP_OS_TASK *pTask;
|
||||
NDIS_STATUS status;
|
||||
|
||||
printk("##### %s\n", __func__);
|
||||
/* Creat ApCli Link Monitor Thread */
|
||||
pTask = &pAd->apcliLinkTask;
|
||||
RTMP_OS_TASK_INIT(pTask, "LinkMonitorTask", pAd);
|
||||
//status = RtmpOSTaskAttach(pTask, RTPCICmdThread, (ULONG)pTask);
|
||||
status = RtmpOSTaskAttach(pTask, ApcliLinkMonitorThread, (ULONG)pTask);
|
||||
if (status == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
/* printk ("%s: unable to start RTPCICmdThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev)); */
|
||||
printk ("%s: Unable to start ApcliLinkMonitorThread!\n", get_dev_name_prefix(pAd, INT_APCLI));
|
||||
return NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
VOID RtmpApcliLinkTaskExit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
INT ret;
|
||||
|
||||
printk("##### %s\n", __func__);
|
||||
/* Terminate cmdQ thread */
|
||||
RTMP_OS_TASK_LEGALITY(&pAd->apcliLinkTask)
|
||||
{
|
||||
/*RTUSBCMDUp(&pAd->cmdQTask); */
|
||||
ret = RtmpOSTaskKill(&pAd->apcliLinkTask);
|
||||
if (ret == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Kill command task fail!\n"));
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
#endif /* APCLI_LINK_COVER_SUPPORT */
|
||||
#endif /* APCLI_SUPPORT */
|
||||
|
||||
1581
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/apcli_sync.c
Normal file
1581
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/apcli_sync.c
Normal file
File diff suppressed because it is too large
Load Diff
551
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/sniffer_mib.c
Normal file
551
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ap/sniffer_mib.c
Normal file
@ -0,0 +1,551 @@
|
||||
|
||||
#ifdef SNIFFER_MIB_CMD
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
VOID sniffer_timeout(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3);
|
||||
|
||||
BUILD_TIMER_FUNCTION(sniffer_timeout);
|
||||
|
||||
INT sniffer_channel_restore(IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
INT bw, ch;
|
||||
pAd->hw_cfg.bbp_bw = pAd->ApCfg.sniffer_mib_ctrl.bbp_bw;
|
||||
#ifdef DOT11_VHT_AC
|
||||
pAd->CommonCfg.vht_cent_ch = pAd->ApCfg.sniffer_mib_ctrl.vht_cent_ch;
|
||||
#endif /* DOT11_VHT_AC */
|
||||
pAd->CommonCfg.CentralChannel = pAd->ApCfg.sniffer_mib_ctrl.CentralChannel;
|
||||
pAd->CommonCfg.Channel = pAd->ApCfg.sniffer_mib_ctrl.Channel;
|
||||
|
||||
bbp_set_bw(pAd, pAd->hw_cfg.bbp_bw);
|
||||
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (pAd->hw_cfg.bbp_bw == BW_80)
|
||||
ch = pAd->CommonCfg.vht_cent_ch;
|
||||
else
|
||||
#endif /* DOT11_VHT_AC */
|
||||
if (pAd->hw_cfg.bbp_bw == BW_40)
|
||||
ch = pAd->CommonCfg.CentralChannel;
|
||||
else
|
||||
ch = pAd->CommonCfg.Channel;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ch_restore - End of Monitor, restore to %dMHz channel %d\n",
|
||||
bw, ch));
|
||||
|
||||
ASSERT((ch != 0));
|
||||
AsicSwitchChannel(pAd, ch, FALSE);
|
||||
AsicLockChannel(pAd, ch);
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
void sniffer_timeout(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl = (SNIFFER_MIB_CTRL *)FunctionContext;
|
||||
PRTMP_ADAPTER pAd = psniffer_mib_ctrl->pAd;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s\n", __FUNCTION__));
|
||||
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s: fRTMP_ADAPTER_HALT_IN_PROGRESS\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
//set back the sniffer mode to off
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
Set_MonitorMode_Proc(pAd,"0");
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
|
||||
//if (psniffer_mib_ctrl->scan_channel != 0) // restore to original channel
|
||||
{
|
||||
//sniffer_channel_restore(pAd);
|
||||
RTEnqueueInternalCmd(pAd, CMDTHREAD_CHAN_RESTORE, NULL, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
VOID vSnifferMacTimeout(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
INT32 i4AvgRssi = 0;
|
||||
SNIFFER_MAC_CTRL *pMACEntry = (SNIFFER_MAC_CTRL *)FunctionContext;
|
||||
PSNIFFER_MAC_NOTIFY_T pMACEntryNotify = NULL;
|
||||
UCHAR bssid[MAC_ADDR_LEN] = {0}; //report zero bssid, to prevent too many check
|
||||
|
||||
if(pMACEntry == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s():%d: pMACEntry is NULL!\n", __FUNCTION__,__LINE__));
|
||||
return;
|
||||
}
|
||||
|
||||
pMACEntryNotify = &pMACEntry->rNotify;
|
||||
if(pMACEntryNotify->i4RxPacketConut > 0)
|
||||
{
|
||||
i4AvgRssi = pMACEntryNotify->i4RssiAccum/pMACEntryNotify->i4RxPacketConut;
|
||||
wext_send_event(pMACEntryNotify->pNetDev,pMACEntry->MACAddr,bssid,pMACEntryNotify->u4Channel,i4AvgRssi,FBT_LINK_STA_FOUND_NOTIFY);
|
||||
|
||||
// Only clear data for next collection.
|
||||
NdisZeroMemory(pMACEntryNotify,sizeof(*pMACEntryNotify));
|
||||
}
|
||||
}
|
||||
BUILD_TIMER_FUNCTION(vSnifferMacTimeout);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
|
||||
VOID sniffer_mib_ctrlInit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
NdisZeroMemory(psniffer_mib_ctrl, sizeof(SNIFFER_MIB_CTRL));
|
||||
psniffer_mib_ctrl->AgeOutTime = 100 ; //set default 100 ms
|
||||
psniffer_mib_ctrl->pAd = pAd;
|
||||
|
||||
RTMPInitTimer(pAd, &psniffer_mib_ctrl->AgeOutTimer,
|
||||
GET_TIMER_FUNCTION(sniffer_timeout), psniffer_mib_ctrl, FALSE);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = FALSE;
|
||||
|
||||
NdisAllocateSpinLock(pAd, &psniffer_mib_ctrl->MAC_ListLock);
|
||||
|
||||
DlListInit(&psniffer_mib_ctrl->MAC_List);
|
||||
|
||||
psniffer_mib_ctrl->MAC_ListNum = 0 ; // if we don't set MAC to listen, we expect to sniffer all
|
||||
}
|
||||
|
||||
|
||||
VOID sniffer_mib_ctrlExit(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
BOOLEAN Cancelled;
|
||||
SNIFFER_MAC_CTRL *pMACEntry, *pMACEntryTmp;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
|
||||
if(psniffer_mib_ctrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&psniffer_mib_ctrl->AgeOutTimer, &Cancelled);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
RTMPReleaseTimer(&psniffer_mib_ctrl->AgeOutTimer, &Cancelled);
|
||||
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEachSafe(pMACEntry, pMACEntryTmp, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
RTMPReleaseTimer(&pMACEntry->rNotifyTimer, &Cancelled);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
DlListDel(&pMACEntry->List);
|
||||
os_free_mem(NULL, pMACEntry);
|
||||
}
|
||||
DlListInit(&psniffer_mib_ctrl->MAC_List);
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
|
||||
NdisFreeSpinLock(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
}
|
||||
|
||||
INT exsta_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
BOOLEAN find_list = FALSE;
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
SNIFFER_MAC_CTRL *pMACEntry;
|
||||
UCHAR macAddr[MAC_ADDR_LEN];
|
||||
RTMP_STRING *value;
|
||||
INT i;
|
||||
|
||||
BOOLEAN Cancelled;
|
||||
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
if (psniffer_mib_ctrl->MAC_ListNum >= (MAX_NUM_OF_SNIFFER_MAC - 1))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN, ("%s : sniffer mac table is full, and no more entry can join the list!\n",__FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if(strlen(arg) != 17) /*Mac address acceptable format 01:02:03:04:05:06 length 17 */
|
||||
return FALSE;
|
||||
|
||||
for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":"))
|
||||
{
|
||||
if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) )
|
||||
return FALSE; /*Invalid */
|
||||
|
||||
AtoH(value, (UCHAR *)&macAddr[i++], 1);
|
||||
}
|
||||
|
||||
//need to cancel timer ?
|
||||
if(psniffer_mib_ctrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&psniffer_mib_ctrl->AgeOutTimer, &Cancelled);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
if (MAC_ADDR_EQUAL(pMACEntry->MACAddr, macAddr))
|
||||
{
|
||||
find_list = TRUE;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : duplicate mac =%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,PRINT_MAC(macAddr)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
|
||||
if (find_list == FALSE)
|
||||
os_alloc_mem(NULL, (UCHAR **)&pMACEntry, sizeof(*pMACEntry));
|
||||
|
||||
if (!pMACEntry)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s Not available memory\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (find_list == FALSE)
|
||||
{
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
NdisZeroMemory(pMACEntry,sizeof(*pMACEntry));
|
||||
NdisMoveMemory(pMACEntry->MACAddr, macAddr, MAC_ADDR_LEN);
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
RTMPInitTimer(pAd, &pMACEntry->rNotifyTimer, GET_TIMER_FUNCTION(vSnifferMacTimeout), pMACEntry, TRUE);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
DlListAddTail(&psniffer_mib_ctrl->MAC_List, &pMACEntry->List);
|
||||
psniffer_mib_ctrl->MAC_ListNum ++;
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT exsta_list_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
SNIFFER_MAC_CTRL *pMACEntry;
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
INT i=0;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: MAC [%d]=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__,i++, PRINT_MAC(pMACEntry->MACAddr)));
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s:: MAC count=%d\n", __FUNCTION__,i));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT exsta_clear_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
BOOLEAN Cancelled;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
SNIFFER_MAC_CTRL *pMACEntry, *pMACEntryTmp;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
|
||||
if(psniffer_mib_ctrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&psniffer_mib_ctrl->AgeOutTimer, &Cancelled);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = FALSE;
|
||||
}
|
||||
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEachSafe(pMACEntry, pMACEntryTmp, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
RTMPReleaseTimer(&pMACEntry->rNotifyTimer, &Cancelled);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
DlListDel(&pMACEntry->List);
|
||||
os_free_mem(NULL, pMACEntry);
|
||||
}
|
||||
DlListInit(&psniffer_mib_ctrl->MAC_List);
|
||||
|
||||
psniffer_mib_ctrl->MAC_ListNum = 0;
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT set_monitor_channel(IN RTMP_ADAPTER *ad, IN INT bw, IN INT channel, IN INT pri_idx)
|
||||
{
|
||||
UINT8 ext_ch;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): bw = %d, channel = %d, pri_idx = %d\n", __FUNCTION__, bw, channel, pri_idx));
|
||||
|
||||
ad->CommonCfg.Channel = channel;
|
||||
if (bw == BW_40) {
|
||||
if (pri_idx == 0) {
|
||||
ad->CommonCfg.CentralChannel = ad->CommonCfg.Channel + 2;
|
||||
ext_ch = EXTCHA_ABOVE;
|
||||
} else if (pri_idx == 1) {
|
||||
ext_ch = EXTCHA_BELOW;
|
||||
if (channel == 14) {
|
||||
ad->CommonCfg.CentralChannel = ad->CommonCfg.Channel - 1;
|
||||
} else {
|
||||
ad->CommonCfg.CentralChannel = ad->CommonCfg.Channel - 2;
|
||||
}
|
||||
} else {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("pri_idx(%d) is invalid\n"));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (bw == BW_20) {
|
||||
ad->CommonCfg.CentralChannel = channel;
|
||||
} else if ((bw == BW_80) && channel > 14) {
|
||||
#ifdef DOT11_VHT_AC
|
||||
ad->CommonCfg.vht_bw = VHT_BW_80;
|
||||
ad->CommonCfg.vht_cent_ch = vht_cent_ch_freq(ad, ad->CommonCfg.Channel);
|
||||
#endif
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bbp_set_bw(ad, bw);
|
||||
|
||||
/* TX/Rx : control channel setting */
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
if (ad->chipCap.hif_type == HIF_RTMP || ad->chipCap.hif_type == HIF_RLT)
|
||||
rtmp_mac_set_ctrlch(ad, ext_ch);
|
||||
#endif /* defined(RTMP_MAC) || defined(RLT_MAC) */
|
||||
|
||||
#ifdef MT_MAC
|
||||
if (ad->chipCap.hif_type == HIF_MT)
|
||||
mt_mac_set_ctrlch(ad, ext_ch);
|
||||
#endif /* MT_MAC */
|
||||
|
||||
bbp_set_ctrlch(ad, ext_ch);
|
||||
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (ad->CommonCfg.BBPCurrentBW == BW_80)
|
||||
ad->hw_cfg.cent_ch = ad->CommonCfg.vht_cent_ch;
|
||||
else
|
||||
#endif /* DOT11_VHT_AC */
|
||||
ad->hw_cfg.cent_ch = ad->CommonCfg.CentralChannel;
|
||||
|
||||
AsicSwitchChannel(ad, ad->hw_cfg.cent_ch, FALSE);
|
||||
AsicLockChannel(ad, ad->hw_cfg.cent_ch);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* trigger sniffer timmer*/
|
||||
INT exsta_scan_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
BOOLEAN Cancelled;
|
||||
ULONG start = 0;
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
SNIFFER_MAC_CTRL *pMACEntry = NULL;
|
||||
PSNIFFER_MAC_NOTIFY_T pMACEntryNotify = NULL;
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
start = simple_strtol(arg, 0, 10);
|
||||
|
||||
if(psniffer_mib_ctrl->AgeOutTimer_Running == TRUE)
|
||||
{
|
||||
RTMPCancelTimer(&psniffer_mib_ctrl->AgeOutTimer, &Cancelled);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = FALSE;
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
if(pMACEntry)
|
||||
{
|
||||
RTMPCancelTimer(&pMACEntry->rNotifyTimer, &Cancelled);
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
}
|
||||
|
||||
if(start)
|
||||
{
|
||||
if (psniffer_mib_ctrl->AgeOutTime)
|
||||
{
|
||||
RTMPSetTimer(&psniffer_mib_ctrl->AgeOutTimer, psniffer_mib_ctrl->AgeOutTime);
|
||||
psniffer_mib_ctrl->AgeOutTimer_Running = TRUE;
|
||||
|
||||
psniffer_mib_ctrl->bbp_bw = pAd->CommonCfg.BBPCurrentBW;//pAd->hw_cfg.bbp_bw;
|
||||
#ifdef DOT11_VHT_AC
|
||||
psniffer_mib_ctrl->vht_cent_ch = pAd->CommonCfg.vht_cent_ch;
|
||||
#endif /* DOT11_VHT_AC */
|
||||
psniffer_mib_ctrl->CentralChannel = pAd->CommonCfg.CentralChannel;
|
||||
psniffer_mib_ctrl->Channel = pAd->CommonCfg.Channel;
|
||||
|
||||
#ifdef DOT11_VHT_AC
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->bbp_bw=%d,psniffer_mib_ctrl->CentralChannel=%d,psniffer_mib_ctrl->Channel\n",__FUNCTION__,
|
||||
psniffer_mib_ctrl->bbp_bw,psniffer_mib_ctrl->CentralChannel,psniffer_mib_ctrl->Channel));
|
||||
#else /* DOT11_VHT_AC */
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->bbp_bw=%d, psniffer_mib_ctrl->vht_cent_ch=%d,psniffer_mib_ctrl->CentralChannel=%d,psniffer_mib_ctrl->Channel\n",__FUNCTION__,
|
||||
psniffer_mib_ctrl->bbp_bw,psniffer_mib_ctrl->vht_cent_ch,psniffer_mib_ctrl->CentralChannel,psniffer_mib_ctrl->Channel));
|
||||
#endif /* !DOT11_VHT_AC */
|
||||
|
||||
// no cmd to set bw, keep the original bw
|
||||
if (psniffer_mib_ctrl->scan_channel == 0)
|
||||
{
|
||||
;// do nothing, don't switch channel
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pAd->hw_cfg.bbp_bw !=BW_20 )
|
||||
{
|
||||
if (psniffer_mib_ctrl->scan_channel <=7 ) //EXTCHA_ABOVE , ch 1~7 use EXTCHA_ABOVE
|
||||
{
|
||||
set_monitor_channel(pAd,psniffer_mib_ctrl->bbp_bw, psniffer_mib_ctrl->scan_channel, 0);
|
||||
}
|
||||
else // others use EXTCHA_BELOW
|
||||
{
|
||||
set_monitor_channel(pAd,psniffer_mib_ctrl->bbp_bw, psniffer_mib_ctrl->scan_channel, 1);
|
||||
}
|
||||
}
|
||||
else //BW_20 case
|
||||
{
|
||||
set_monitor_channel(pAd,psniffer_mib_ctrl->bbp_bw, psniffer_mib_ctrl->scan_channel, 0);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SNIFFER_SUPPORT
|
||||
#ifdef ALL_NET_EVENT
|
||||
RTMP_SEM_LOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
DlListForEach(pMACEntry, &psniffer_mib_ctrl->MAC_List, SNIFFER_MAC_CTRL, List)
|
||||
{
|
||||
if(pMACEntry)
|
||||
{
|
||||
pMACEntryNotify = &pMACEntry->rNotify;
|
||||
NdisZeroMemory(pMACEntryNotify,sizeof(*pMACEntryNotify));
|
||||
RTMPSetTimer(&pMACEntry->rNotifyTimer, SNIFFER_MAC_TIMEOUT);
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&psniffer_mib_ctrl->MAC_ListLock);
|
||||
#endif /* ALL_NET_EVENT */
|
||||
#endif /* CONFIG_SNIFFER_SUPPORT */
|
||||
Set_MonitorMode_Proc(pAd,"2");
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->AgeOutTime=%lu, not start timer!\n",__FUNCTION__,psniffer_mib_ctrl->AgeOutTime));
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT set_mib_passive_scan_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
|
||||
ULONG scan_type = (ULONG) simple_strtol(arg, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
if (scan_type == PASSIVE_TYPE)
|
||||
{
|
||||
psniffer_mib_ctrl->scan_type = PASSIVE_TYPE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: not implement yet !, force set to PASSIVE_TYPE\n",__FUNCTION__));
|
||||
psniffer_mib_ctrl->scan_type = PASSIVE_TYPE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->scan_type=%u\n",__FUNCTION__,psniffer_mib_ctrl->scan_type));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT set_mib_scan_interval_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
ULONG interval = (ULONG) simple_strtol(arg, 0, 10);
|
||||
|
||||
psniffer_mib_ctrl->AgeOutTime = interval;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==> psniffer_mib_ctrl->AgeOutTime=%u\n",__FUNCTION__,psniffer_mib_ctrl->AgeOutTime));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT set_mib_scan_scope_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
ULONG scope = (ULONG) simple_strtol(arg, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
if (scope == SCAN_ONE)
|
||||
{
|
||||
psniffer_mib_ctrl->scan_scope = SCAN_ONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: not implement yet !, force set to SCAN_ONE\n",__FUNCTION__));
|
||||
psniffer_mib_ctrl->scan_scope = SCAN_ONE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->scan_scope=%u\n",__FUNCTION__,psniffer_mib_ctrl->scan_scope));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT set_mib_scan_channel_proc(IN RTMP_ADAPTER *pAd, IN RTMP_STRING *arg)
|
||||
{
|
||||
PSNIFFER_MIB_CTRL psniffer_mib_ctrl;
|
||||
psniffer_mib_ctrl = &pAd->ApCfg.sniffer_mib_ctrl;
|
||||
ULONG channel;
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==>\n",__FUNCTION__));
|
||||
|
||||
channel = (ULONG) simple_strtol(arg, 0, 10);
|
||||
if ((channel>0) && (channel <=14))
|
||||
{
|
||||
psniffer_mib_ctrl->scan_channel = channel;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ==> error channel=%u, force set to channel 0\n",__FUNCTION__,channel));
|
||||
psniffer_mib_ctrl->scan_channel = 0; // 0 means current channel
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: psniffer_mib_ctrl->scan_channel = %u\n",__FUNCTION__,psniffer_mib_ctrl->scan_channel));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* SNIFFER_MIB_CMD */
|
||||
|
||||
|
||||
1231
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ate/ate_agent.c
Normal file
1231
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ate/ate_agent.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,243 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of MediaTek. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of MediaTek, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ate.h
|
||||
*/
|
||||
|
||||
#ifndef __ATE_H__
|
||||
#define __ATE_H__
|
||||
|
||||
#define ATE_ON(_p) ((((_p)->ATECtrl.Mode) & ATE_START) == ATE_START)
|
||||
INT32 ATEInit(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 ATEExit(struct _RTMP_ADAPTER *pAd);
|
||||
|
||||
/*
|
||||
Use bitmap to allow coexist of ATE_TXFRAME
|
||||
and ATE_RXFRAME(i.e.,to support LoopBack mode).
|
||||
*/
|
||||
#define fATE_IDLE (1 << 0)
|
||||
#define fATE_TX_ENABLE (1 << 1)
|
||||
#define fATE_RX_ENABLE (1 << 2)
|
||||
#define fATE_TXCONT_ENABLE (1 << 3)
|
||||
#define fATE_TXCARR_ENABLE (1 << 4)
|
||||
#define fATE_TXCARRSUPP_ENABLE (1 << 5)
|
||||
#define fATE_RESERVED_1 (1 << 6)
|
||||
#define fATE_RFTEST_ENABLE (1 << 7)
|
||||
#define fATE_EXIT (1 << 8)
|
||||
|
||||
/* Stop Transmission */
|
||||
#define ATE_TXSTOP ((~(fATE_TX_ENABLE))&(~(fATE_TXCONT_ENABLE))&(~(fATE_TXCARR_ENABLE))&(~(fATE_TXCARRSUPP_ENABLE)))
|
||||
/* Stop Receiving Frames */
|
||||
#define ATE_RXSTOP (~(fATE_RX_ENABLE))
|
||||
|
||||
|
||||
/* Enter/Reset ATE */
|
||||
#define ATE_START (fATE_IDLE)
|
||||
/* Stop/Exit ATE */
|
||||
#define ATE_STOP (fATE_EXIT)
|
||||
/* Continuous Transmit Frames (without time gap) */
|
||||
#define ATE_TXCONT ((fATE_TX_ENABLE)|(fATE_TXCONT_ENABLE))
|
||||
/* Transmit Carrier */
|
||||
#define ATE_TXCARR ((fATE_TX_ENABLE)|(fATE_TXCARR_ENABLE))
|
||||
/* Transmit Carrier Suppression (information without carrier) */
|
||||
#define ATE_TXCARRSUPP ((fATE_TX_ENABLE)|(fATE_TXCARRSUPP_ENABLE))
|
||||
/* Transmit Frames */
|
||||
#define ATE_TXFRAME (fATE_TX_ENABLE)
|
||||
/* Receive Frames */
|
||||
#define ATE_RXFRAME (fATE_RX_ENABLE)
|
||||
|
||||
|
||||
#define ATE_RFTEST (fATE_RFTEST_ENABLE)
|
||||
|
||||
#define BULK_OUT_LOCK(pLock, IrqFlags) \
|
||||
if(1 /*!(in_interrupt() & 0xffff0000)*/) \
|
||||
RTMP_IRQ_LOCK((pLock), IrqFlags);
|
||||
|
||||
#define BULK_OUT_UNLOCK(pLock, IrqFlags) \
|
||||
if(1 /*!(in_interrupt() & 0xffff0000)*/) \
|
||||
RTMP_IRQ_UNLOCK((pLock), IrqFlags);
|
||||
|
||||
/* ContiTxTone */
|
||||
#define WF0_TX_ONE_TONE_5M 0x0
|
||||
#define WF0_TX_TWO_TONE_5M 0x1
|
||||
#define WF1_TX_ONE_TONE_5M 0x2
|
||||
#define WF1_TX_TWO_TONE_5M 0x3
|
||||
#define WF0_TX_ONE_TONE_10M 0x4
|
||||
#define WF1_TX_ONE_TONE_10M 0x5
|
||||
#define WF0_TX_ONE_TONE_DC 0x6
|
||||
#define WF1_TX_ONE_TONE_DC 0x7
|
||||
|
||||
struct _RTMP_ADAPTER;
|
||||
struct _RX_BLK;
|
||||
|
||||
typedef struct _ATE_OPERATION {
|
||||
INT32 (*ATEStart)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*ATEStop)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*StartTx)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*StartRx)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*StopTx)(struct _RTMP_ADAPTER *pAd, UINT32 Mode);
|
||||
INT32 (*StopRx)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*SetTxPath)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*SetRxPath)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*SetTxPower0)(struct _RTMP_ADAPTER *pAd, CHAR Value);
|
||||
INT32 (*SetTxPower1)(struct _RTMP_ADAPTER *pAd, CHAR Value);
|
||||
INT32 (*SetTxAntenna)(struct _RTMP_ADAPTER *pAd, CHAR Ant);
|
||||
INT32 (*SetRxAntenna)(struct _RTMP_ADAPTER *pAd, CHAR Ant);
|
||||
INT32 (*SetTxFreqOffset)(struct _RTMP_ADAPTER *pAd, UINT32 FreqOffset);
|
||||
INT32 (*SetChannel)(struct _RTMP_ADAPTER *pAd, INT16 Value);
|
||||
INT32 (*SetBW)(struct _RTMP_ADAPTER *pAd, INT16 Value);
|
||||
INT32 (*SampleRssi)(struct _RTMP_ADAPTER *pAd, struct _RX_BLK *pRxBlk);
|
||||
INT32 (*SetAIFS)(struct _RTMP_ADAPTER *pAd, CHAR Value);
|
||||
INT32 (*SetTSSI)(struct _RTMP_ADAPTER *pAd, CHAR WFSel, CHAR Setting);
|
||||
INT32 (*SetDPD)(struct _RTMP_ADAPTER *pAd, CHAR WFSel, CHAR Setting);
|
||||
INT32 (*StartTxTone)(struct _RTMP_ADAPTER *pAd, UINT32 Mode);
|
||||
INT32 (*SetTxTonePower)(struct _RTMP_ADAPTER *pAd, INT32 pwr1, INT pwr2);
|
||||
INT32 (*StopTxTone)(struct _RTMP_ADAPTER *pAd);
|
||||
INT32 (*StartContinousTx)(struct _RTMP_ADAPTER *pAd, CHAR WFSel);
|
||||
INT32 (*RfRegWrite)(struct _RTMP_ADAPTER *pAd, UINT32 WFSel, UINT32 Offset, UINT32 Value);
|
||||
INT32 (*RfRegRead)(struct _RTMP_ADAPTER *pAd, UINT32 WFSel, UINT32 Offset, UINT32 *Value);
|
||||
INT32 (*GetFWInfo)(struct _RTMP_ADAPTER *pAd, UCHAR *FWInfo);
|
||||
} ATE_OPERATION;
|
||||
|
||||
typedef struct _ATE_CTRL {
|
||||
ATE_OPERATION *ATEOp;
|
||||
#ifdef RTMP_MAC_PCI
|
||||
PVOID AteAllocVa[TX_RING_SIZE];
|
||||
PNDIS_PACKET pAtePacket[TX_RING_SIZE];
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
UINT32 Mode;
|
||||
BOOLEAN PassiveMode;
|
||||
CHAR TxPower0;
|
||||
CHAR TxPower1;
|
||||
CHAR TxPower2;
|
||||
CHAR MinTxPowerBandA; /* Power range of early chipsets is -7~15 in A band */
|
||||
CHAR MaxTxPowerBandA; /* Power range of early chipsets is -7~15 in A band */
|
||||
CHAR TxAntennaSel;
|
||||
CHAR RxAntennaSel;
|
||||
USHORT TxInfoLen;
|
||||
USHORT TxWILen;
|
||||
USHORT QID;
|
||||
UCHAR *TemplateFrame;
|
||||
UCHAR Addr1[MAC_ADDR_LEN];
|
||||
UCHAR Addr2[MAC_ADDR_LEN];
|
||||
UCHAR Addr3[MAC_ADDR_LEN];
|
||||
UCHAR Channel;
|
||||
UCHAR ControlChl;
|
||||
UCHAR BW;
|
||||
UCHAR PhyMode;
|
||||
UCHAR Stbc;
|
||||
UCHAR Sgi;
|
||||
UCHAR Mcs;
|
||||
UCHAR Preamble;
|
||||
UCHAR Payload; /* Payload pattern */
|
||||
BOOLEAN bFixedPayload;
|
||||
UCHAR TxMethod; /* Early chipsets must be applied old TXCONT/TXCARR/TXCARS mechanism. */
|
||||
UINT32 TxLength;
|
||||
UINT32 TxCount;
|
||||
UINT32 TxDoneCount; /* Tx DMA Done */
|
||||
UINT32 RFFreqOffset;
|
||||
UINT32 IPG;
|
||||
BOOLEAN bRxFER; /* Show Rx Frame Error Rate */
|
||||
/* Used when using QA Tool */
|
||||
BOOLEAN bQAEnabled; /* QA is used. */
|
||||
BOOLEAN bQATxStart; /* Have compiled QA in and use it to ATE tx. */
|
||||
BOOLEAN bQARxStart; /* Have compiled QA in and use it to ATE rx. */
|
||||
BOOLEAN bAutoTxAlc; /* Set Auto Tx Alc */
|
||||
BOOLEAN bAutoVcoCal; /* Set Auto VCO periodic calibration. */
|
||||
BOOLEAN bLowTemperature; /* Trigger Temperature Sensor */
|
||||
BOOLEAN bTestTimeReduction; /* Set ATE test time reduction. */
|
||||
#ifdef RTMP_MAC_PCI
|
||||
BOOLEAN bFWLoading; /* Reload firmware when ATE is done. */
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
UINT32 RxTotalCnt;
|
||||
UINT32 RxCntPerSec;
|
||||
|
||||
CHAR LastSNR0; /* last received SNR */
|
||||
CHAR LastSNR1; /* last received SNR for 2nd antenna */
|
||||
CHAR LastSNR2;
|
||||
CHAR LastRssi0; /* last received RSSI */
|
||||
CHAR LastRssi1; /* last received RSSI for 2nd antenna */
|
||||
CHAR LastRssi2; /* last received RSSI for 3rd antenna */
|
||||
CHAR AvgRssi0; /* last 8 frames' average RSSI */
|
||||
CHAR AvgRssi1; /* last 8 frames' average RSSI */
|
||||
CHAR AvgRssi2; /* last 8 frames' average RSSI */
|
||||
SHORT AvgRssi0X8; /* sum of last 8 frames' RSSI */
|
||||
SHORT AvgRssi1X8; /* sum of last 8 frames' RSSI */
|
||||
SHORT AvgRssi2X8; /* sum of last 8 frames' RSSI */
|
||||
UINT32 NumOfAvgRssiSample;
|
||||
UINT32 Default_TX_PIN_CFG;
|
||||
USHORT HLen; /* Header Length */
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
/* Tx frame */
|
||||
USHORT PLen; /* Pattern Length */
|
||||
UCHAR Header[32]; /* Header buffer */
|
||||
UCHAR Pattern[32]; /* Pattern buffer */
|
||||
USHORT DLen; /* Data Length */
|
||||
USHORT seq;
|
||||
UINT32 CID;
|
||||
RTMP_OS_PID AtePid;
|
||||
/* counters */
|
||||
UINT32 U2M;
|
||||
UINT32 OtherData;
|
||||
UINT32 Beacon;
|
||||
UINT32 OtherCount;
|
||||
UINT32 TxAc0;
|
||||
UINT32 TxAc1;
|
||||
UINT32 TxAc2;
|
||||
UINT32 TxAc3;
|
||||
UINT32 TxHCCA;
|
||||
UINT32 TxMgmt;
|
||||
UINT32 RSSI0;
|
||||
UINT32 RSSI1;
|
||||
UINT32 RSSI2;
|
||||
UINT32 SNR0;
|
||||
UINT32 SNR1;
|
||||
UINT32 SNR2;
|
||||
INT32 BF_SNR[3]; /* Last RXWI BF SNR. Units=0.25 dB */
|
||||
/* TxStatus : 0 --> task is idle, 1 --> task is running */
|
||||
UCHAR TxStatus;
|
||||
UINT32 RCPI0;
|
||||
UINT32 RCPI1;
|
||||
UINT32 RCPI2;
|
||||
UINT32 FreqOffsetFromRx;
|
||||
UINT32 RxMacFCSErrCount;
|
||||
UINT32 RxMacMdrdyCount;
|
||||
UINT32 thermal_val;
|
||||
#endif
|
||||
RTMP_OS_COMPLETION cmd_done;
|
||||
ULONG cmd_expire;
|
||||
RALINK_TIMER_STRUCT PeriodicTimer;
|
||||
ULONG OneSecPeriodicRound;
|
||||
ULONG PeriodicRound;
|
||||
OS_NDIS_SPIN_LOCK TssiSemLock;
|
||||
UINT32 tssi0_wf0_cr;
|
||||
UINT32 tssi0_wf1_cr;
|
||||
UINT32 tssi1_wf0_cr;
|
||||
UINT32 tssi1_wf1_cr;
|
||||
UINT32 phy_mux_27;
|
||||
UINT32 rmac_pcr1;
|
||||
UINT32 rmac_pcr;
|
||||
} ATE_CTRL;
|
||||
VOID RtmpDmaEnable(RTMP_ADAPTER *pAd, INT Enable);
|
||||
|
||||
|
||||
VOID ATE_RTUSBBulkOutDataPacket(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR BulkOutPipeId);
|
||||
|
||||
VOID ATE_RTUSBCancelPendingBulkInIRP(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
|
||||
#endif /* __ATE_H__ */
|
||||
@ -0,0 +1,83 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of MediaTek. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of MediaTek, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ate_agent.h
|
||||
*/
|
||||
|
||||
#ifndef __ATE_AGENT_H__
|
||||
#define __ATE_AGENT_H__
|
||||
|
||||
struct _RTMP_ADAPTER;
|
||||
|
||||
INT32 SetTxStop(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetRxStop(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 RtmpDoAte(struct _RTMP_ADAPTER *pAd, RTMP_IOCTL_INPUT_STRUCT *wrq, RTMP_STRING *wrq_name);
|
||||
VOID ATE_QA_Statistics(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *pRxWI, RXINFO_STRUC *pRxInfo, PHEADER_802_11 pHeader);
|
||||
|
||||
#ifdef DBG
|
||||
INT32 SetEERead(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetEEWrite(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetBBPRead(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetBBPWrite(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetRFWrite(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
#endif /* DBG */
|
||||
VOID rt_ee_read_all(struct _RTMP_ADAPTER *pAd, UINT16 *Data);
|
||||
VOID rt_ee_write_all(struct _RTMP_ADAPTER pAd, UINT16 *Data);
|
||||
VOID rt_ee_write_bulk(struct _RTMP_ADAPTER pAd, UINT16 *Data, UINT16 offset, UINT16 length);
|
||||
INT32 SetATEDa(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATESa(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEBssid(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEInitChan(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetADCDump(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxPower0(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxPower1(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxPowerEvaluation(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxAntenna(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATERxAntenna(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 Default_Set_ATE_TX_FREQ_OFFSET_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxFreqOffset(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 Default_Set_ATE_TX_BW_Proc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxLength(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxCount(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxMcs(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxStbc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxMode(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxGi(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATERxFer(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEReadRF(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATELoadE2p(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
#ifdef RTMP_EFUSE_SUPPORT
|
||||
INT32 SetATELoadE2pFromBuf(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
#endif /* RTMP_EFUSE_SUPPORT */
|
||||
INT32 SetATEReadE2p(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEAutoAlc(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxGi(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETempSensor(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEIpg(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEPayload(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEFixedPayload(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETtr(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEShow(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEHelp(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
VOID ATESampleRssi(struct _RTMP_ADAPTER *pAd, RXWI_STRUC *pRxWI);
|
||||
VOID ATEPeriodicExec(PVOID SystemSpecific1, PVOID FunctionContext,
|
||||
PVOID SystemSpecific2, PVOID SystemSpecific3);
|
||||
INT32 SetATE(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATEChannel(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 SetATETxBw(struct _RTMP_ADAPTER *pAd, RTMP_STRING *Arg);
|
||||
INT32 MT_ATEInit(struct _RTMP_ADAPTER *pAd);
|
||||
PNDIS_PACKET ATEPayloadInit(struct _RTMP_ADAPTER *pAd, UINT32 TxIdx);
|
||||
INT32 ATEPayloadAlloc(struct _RTMP_ADAPTER *pAd, UINT32 Index);
|
||||
VOID EEReadAll(struct _RTMP_ADAPTER *pAd, UINT16 *Data);
|
||||
#endif
|
||||
|
||||
@ -0,0 +1,82 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of MediaTek. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of MediaTek, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
qa_agent.h
|
||||
*/
|
||||
|
||||
#ifndef __QA_AGENT_H__
|
||||
#define __QA_AGENT_H__
|
||||
|
||||
#define HQA_CMD_MAGIC_NO 0x18142880
|
||||
|
||||
/* RX STAT */
|
||||
#define HQA_RX_STAT_MACFCSERRCNT 0x1
|
||||
#define HQA_RX_STAT_MAC_MDRDYCNT 0x2
|
||||
#define HQA_RX_STAT_PHY_MDRDYCNT 0x3
|
||||
#define HQA_RX_STAT_PHY_FCSERRCNT 0x4
|
||||
#define HQA_RX_STAT_PD 0x5
|
||||
#define HQA_RX_STAT_CCK_SIG_SFD 0x6
|
||||
#define HQA_RX_STAT_OFDM_SIG_TAG 0x7
|
||||
#define HQA_RX_STAT_RSSI 0x8
|
||||
#define HQA_RX_RESET_PHY_COUNT 0x9
|
||||
|
||||
/* FW Event Callback */
|
||||
VOID HQA_GetThermalValue_CB(struct cmd_msg *msg, char *Data, UINT16 Len);
|
||||
|
||||
|
||||
typedef struct _HQA_CMD_FRAME {
|
||||
UINT32 MagicNo;
|
||||
UINT16 Type;
|
||||
UINT16 Id;
|
||||
UINT16 Length;
|
||||
UINT16 Sequence;
|
||||
UCHAR Data[2048];
|
||||
} __attribute__((packed))HQA_CMD_FRAME;
|
||||
|
||||
typedef INT32 (*HQA_CMD_HANDLER)(
|
||||
struct _RTMP_ADAPTER *pAd,
|
||||
RTMP_IOCTL_INPUT_STRUCT *wrq,
|
||||
HQA_CMD_FRAME *HqaCmdFrame);
|
||||
|
||||
typedef struct _HQA_CMD_TABLE{
|
||||
HQA_CMD_HANDLER *CmdSet;
|
||||
UINT32 CmdSetSize;
|
||||
UINT32 CmdOffset;
|
||||
} HQA_CMD_TABLE;
|
||||
|
||||
typedef struct _HQA_RX_STAT{
|
||||
UINT32 MacFCSErr;
|
||||
UINT32 MacMdrdy;
|
||||
UINT32 FCSErr_CCK;
|
||||
UINT32 FCSErr_OFDM;
|
||||
UINT32 CCK_PD;
|
||||
UINT32 OFDM_PD;
|
||||
UINT32 CCK_SIG_Err;
|
||||
UINT32 CCK_SFD_Err;
|
||||
UINT32 OFDM_SIG_Err;
|
||||
UINT32 OFDM_TAG_Err;
|
||||
UINT32 WB_RSSSI0;
|
||||
UINT32 IB_RSSSI0;
|
||||
UINT32 WB_RSSSI1;
|
||||
UINT32 IB_RSSSI1;
|
||||
UINT32 PhyMdrdyCCK;
|
||||
UINT32 PhyMdrdyOFDM;
|
||||
UINT32 DriverRxCount;
|
||||
UINT32 RCPI0;
|
||||
UINT32 RCPI1;
|
||||
UINT32 FreqOffsetFromRX;
|
||||
UINT32 RSSI0;
|
||||
UINT32 RSSI1;
|
||||
} __attribute__((packed))HQA_RX_STAT;
|
||||
|
||||
#endif /* __QA_AGENT_H__ */
|
||||
@ -0,0 +1,799 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2010, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt_ate.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
*/
|
||||
|
||||
#ifndef __RT_ATE_H__
|
||||
#define __RT_ATE_H__
|
||||
|
||||
#ifdef CONFIG_ATE
|
||||
#ifndef STATS_COUNT_SUPPORT
|
||||
#error "For ATE support, please set HAS_ATE=y and HAS_STATS_COUNT=y."
|
||||
#endif /* !STATS_COUNT_SUPPORT */
|
||||
#endif /* CONFIG_ATE */
|
||||
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
#include "mac/mac_ral/rtmp_mac.h"
|
||||
#elif defined(MT_MAC)
|
||||
#include "mac/mac_mt/mt_mac.h"
|
||||
#endif
|
||||
#include "phy/phy.h"
|
||||
|
||||
// TODO: shiang-6590, remove it after ATE code is re-organized!!
|
||||
#define BBP_R1 1
|
||||
#define BBP_R3 3
|
||||
#define BBP_R4 4
|
||||
#define BBP_R21 21
|
||||
#define BBP_R22 22
|
||||
#define BBP_R24 24
|
||||
#define BBP_R27 27
|
||||
#define BBP_R50 50
|
||||
#define BBP_R51 51
|
||||
#define BBP_R52 52
|
||||
#define BBP_R60 60
|
||||
#define BBP_R66 66
|
||||
#define BBP_R69 69
|
||||
#define BBP_R70 70
|
||||
#define BBP_R174 174
|
||||
#define BBP_R182 182
|
||||
// TODO: ---End
|
||||
|
||||
typedef struct _ATE_CHIP_STRUCT {
|
||||
/* functions */
|
||||
VOID (*ChannelSwitch)(PRTMP_ADAPTER pAd);
|
||||
INT (*TxPwrHandler)(PRTMP_ADAPTER pAd, char index);
|
||||
INT (*TxPwrEvaluation)(PRTMP_ADAPTER pAd);
|
||||
INT (*TssiCalibration)(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
INT (*ExtendedTssiCalibration)(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
VOID (*RxVGAInit)(PRTMP_ADAPTER pAd);
|
||||
VOID (*AsicSetTxRxPath)(PRTMP_ADAPTER pAd);
|
||||
VOID (*AdjustTxPower)(PRTMP_ADAPTER pAd);
|
||||
VOID (*AsicExtraPowerOverMAC)(PRTMP_ADAPTER pAd);
|
||||
VOID (*AsicCalibration)(PRTMP_ADAPTER pAd, UCHAR ate_mode);
|
||||
VOID (*TemperCompensation)(RTMP_ADAPTER *pAd);
|
||||
|
||||
/* command handlers */
|
||||
INT (*Set_BW_Proc)(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
INT (*Set_FREQ_OFFSET_Proc)(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
/* variables */
|
||||
INT maxTxPwrCnt;
|
||||
BOOLEAN bBBPStoreTXCARR;
|
||||
BOOLEAN bBBPStoreTXCARRSUPP;
|
||||
BOOLEAN bBBPStoreTXCONT;
|
||||
BOOLEAN bBBPLoadATESTOP;
|
||||
|
||||
/* TSSI related */
|
||||
INT32 tssi_slope[2];
|
||||
INT32 tssi_offset[3][2];
|
||||
INT32 pwr_diff_pre[2];
|
||||
INT32 ant_pwr_offset[2];
|
||||
INT32 curr_temperature;
|
||||
}ATE_CHIP_STRUCT, *PATE_CHIP_STRUCT;
|
||||
|
||||
typedef union _CAPTURE_MODE_SHARE_MEMORY {
|
||||
struct
|
||||
{
|
||||
UINT32 LOW_BYTE0:8;
|
||||
UINT32 LOW_BYTE1:8;
|
||||
UINT32 HIGH_BYTE0:8;
|
||||
UINT32 HIGH_BYTE1:8;
|
||||
} field;
|
||||
UINT32 Value;
|
||||
}CAPTURE_MODE_SHARE_MEMORY, *PCAPTURE_MODE_SHARE_MEMORY;
|
||||
|
||||
typedef struct _ATE_INFO {
|
||||
PATE_CHIP_STRUCT pChipStruct;
|
||||
#ifdef RTMP_MAC_PCI
|
||||
PVOID AteAllocVa[TX_RING_SIZE];
|
||||
PNDIS_PACKET pAtePacket[TX_RING_SIZE];
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
UCHAR Mode;
|
||||
BOOLEAN PassiveMode;
|
||||
#ifdef RT3350
|
||||
UCHAR PABias;
|
||||
#endif /* RT3350 */
|
||||
CHAR TxPower0;
|
||||
CHAR TxPower1;
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
CHAR TxPower2;
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
CHAR MinTxPowerBandA; /* Power range of early chipsets is -7~15 in A band */
|
||||
CHAR MaxTxPowerBandA; /* Power range of early chipsets is -7~15 in A band */
|
||||
CHAR TxAntennaSel;
|
||||
CHAR RxAntennaSel;
|
||||
USHORT TxInfoLen;
|
||||
USHORT TxWILen;
|
||||
TXINFO_STRUC TxInfo; /* TxInfo */
|
||||
TXWI_STRUC TxWI; /* TXWI */
|
||||
USHORT QID;
|
||||
UCHAR Addr1[MAC_ADDR_LEN];
|
||||
UCHAR Addr2[MAC_ADDR_LEN];
|
||||
UCHAR Addr3[MAC_ADDR_LEN];
|
||||
UCHAR Channel;
|
||||
UCHAR Payload; /* Payload pattern */
|
||||
BOOLEAN bFixedPayload;
|
||||
UCHAR TxMethod; /* Early chipsets must be applied old TXCONT/TXCARR/TXCARS mechanism. */
|
||||
UINT32 TxLength;
|
||||
UINT32 TxCount;
|
||||
UINT32 TxDoneCount; /* Tx DMA Done */
|
||||
UINT32 RFFreqOffset;
|
||||
UINT32 IPG;
|
||||
BOOLEAN bRxFER; /* Show Rx Frame Error Rate */
|
||||
BOOLEAN bQAEnabled; /* QA is used. */
|
||||
BOOLEAN bQATxStart; /* Have compiled QA in and use it to ATE tx. */
|
||||
BOOLEAN bQARxStart; /* Have compiled QA in and use it to ATE rx. */
|
||||
BOOLEAN bAutoTxAlc; /* Set Auto Tx Alc */
|
||||
BOOLEAN bAutoVcoCal; /* Set Auto VCO periodic calibration. */
|
||||
BOOLEAN bLowTemperature; /* Trigger Temperature Sensor */
|
||||
BOOLEAN bTestTimeReduction; /* Set ATE test time reduction. */
|
||||
#ifdef RTMP_INTERNAL_TX_ALC
|
||||
#if defined(RT3350) || defined(RT3352)
|
||||
BOOLEAN bTSSICalbrEnableG; /* Enable TSSI calibration */
|
||||
CHAR TssiRefPerChannel[CFG80211_NUM_OF_CHAN_2GHZ];
|
||||
CHAR TssiDeltaPerChannel[CFG80211_NUM_OF_CHAN_2GHZ];
|
||||
#endif /* defined(RT3350) || defined(RT3352) */
|
||||
#endif /* RTMP_INTERNAL_TX_ALC */
|
||||
#ifdef RTMP_MAC_PCI
|
||||
BOOLEAN bFWLoading; /* Reload firmware when ATE is done. */
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
UINT32 RxTotalCnt;
|
||||
UINT32 RxCntPerSec;
|
||||
UCHAR forceBBPReg; /* force to not update the specific BBP register, now used for ATE TxBF */
|
||||
|
||||
CHAR LastSNR0; /* last received SNR */
|
||||
CHAR LastSNR1; /* last received SNR for 2nd antenna */
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
CHAR LastSNR2;
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
CHAR LastRssi0; /* last received RSSI */
|
||||
CHAR LastRssi1; /* last received RSSI for 2nd antenna */
|
||||
CHAR LastRssi2; /* last received RSSI for 3rd antenna */
|
||||
CHAR AvgRssi0; /* last 8 frames' average RSSI */
|
||||
CHAR AvgRssi1; /* last 8 frames' average RSSI */
|
||||
CHAR AvgRssi2; /* last 8 frames' average RSSI */
|
||||
SHORT AvgRssi0X8; /* sum of last 8 frames' RSSI */
|
||||
SHORT AvgRssi1X8; /* sum of last 8 frames' RSSI */
|
||||
SHORT AvgRssi2X8; /* sum of last 8 frames' RSSI */
|
||||
UINT32 NumOfAvgRssiSample;
|
||||
UINT32 Default_TX_PIN_CFG;
|
||||
USHORT HLen; /* Header Length */
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
/* Tx frame */
|
||||
USHORT PLen; /* Pattern Length */
|
||||
UCHAR Header[32]; /* Header buffer */
|
||||
UCHAR Pattern[32]; /* Pattern buffer */
|
||||
USHORT DLen; /* Data Length */
|
||||
USHORT seq;
|
||||
UINT32 CID;
|
||||
RTMP_OS_PID AtePid;
|
||||
/* counters */
|
||||
UINT32 U2M;
|
||||
UINT32 OtherData;
|
||||
UINT32 Beacon;
|
||||
UINT32 OtherCount;
|
||||
UINT32 TxAc0;
|
||||
UINT32 TxAc1;
|
||||
UINT32 TxAc2;
|
||||
UINT32 TxAc3;
|
||||
UINT32 TxHCCA;
|
||||
UINT32 TxMgmt;
|
||||
UINT32 RSSI0;
|
||||
UINT32 RSSI1;
|
||||
UINT32 RSSI2;
|
||||
UINT32 SNR0;
|
||||
UINT32 SNR1;
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
UINT32 SNR2;
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
INT32 BF_SNR[3]; /* Last RXWI BF SNR. Units=0.25 dB */
|
||||
/* TxStatus : 0 --> task is idle, 1 --> task is running */
|
||||
UCHAR TxStatus;
|
||||
#ifdef DOT11_VHT_AC
|
||||
UCHAR vht_nss;
|
||||
#endif /* DOT11_VHT_AC */
|
||||
#endif /* CONFIG_QA */
|
||||
RALINK_TIMER_STRUCT PeriodicTimer;
|
||||
ULONG OneSecPeriodicRound;
|
||||
ULONG PeriodicRound;
|
||||
OS_NDIS_SPIN_LOCK TssiSemLock;
|
||||
} ATE_INFO, *PATE_INFO;
|
||||
|
||||
/*
|
||||
Use bitmap to allow coexist of ATE_TXFRAME
|
||||
and ATE_RXFRAME(i.e.,to support LoopBack mode).
|
||||
*/
|
||||
#define fATE_IDLE 0x00
|
||||
#define fATE_TX_ENABLE 0x01
|
||||
#define fATE_RX_ENABLE 0x02
|
||||
#define fATE_TXCONT_ENABLE 0x04
|
||||
#define fATE_TXCARR_ENABLE 0x08
|
||||
#define fATE_TXCARRSUPP_ENABLE 0x10
|
||||
#define fATE_RESERVED_1 0x20
|
||||
#define fATE_RESERVED_2 0x40
|
||||
#define fATE_EXIT 0x80
|
||||
|
||||
/* Enter/Reset ATE */
|
||||
#define ATE_START (fATE_IDLE)
|
||||
/* Stop/Exit ATE */
|
||||
#define ATE_STOP (fATE_EXIT)
|
||||
/* Continuous Transmit Frames (without time gap) */
|
||||
#define ATE_TXCONT ((fATE_TX_ENABLE)|(fATE_TXCONT_ENABLE))
|
||||
/* Transmit Carrier */
|
||||
#define ATE_TXCARR ((fATE_TX_ENABLE)|(fATE_TXCARR_ENABLE))
|
||||
/* Transmit Carrier Suppression (information without carrier) */
|
||||
#define ATE_TXCARRSUPP ((fATE_TX_ENABLE)|(fATE_TXCARRSUPP_ENABLE))
|
||||
/* Transmit Frames */
|
||||
#define ATE_TXFRAME (fATE_TX_ENABLE)
|
||||
/* Receive Frames */
|
||||
#define ATE_RXFRAME (fATE_RX_ENABLE)
|
||||
|
||||
|
||||
#ifdef RTMP_INTERNAL_TX_ALC
|
||||
#define EEPROM_TSSI_ENABLE 0x36
|
||||
#define EEPROM_TSSI_MODE_EXTEND 0x76
|
||||
|
||||
#define ATE_MDSM_NORMAL_TX_POWER 0x00
|
||||
#define ATE_MDSM_DROP_TX_POWER_BY_6dBm 0x01
|
||||
#define ATE_MDSM_DROP_TX_POWER_BY_12dBm 0x02
|
||||
#define ATE_MDSM_ADD_TX_POWER_BY_6dBm 0x03
|
||||
#define ATE_MDSM_BBP_R1_STATIC_TX_POWER_CONTROL_MASK 0x03
|
||||
#endif /* RTMP_INTERNAL_TX_ALC */
|
||||
|
||||
#define LEN_OF_ARG 16
|
||||
#define ATE_ON(_p) (((_p)->ate.Mode) != ATE_STOP)
|
||||
#define TX_METHOD_0 0 /* Early chipsets must be applied this original TXCONT/TXCARR/TXCARS mechanism. */
|
||||
#define TX_METHOD_1 1 /* Default TXCONT/TXCARR/TXCARS mechanism is TX_METHOD_1 */
|
||||
#define ANT_ALL 0
|
||||
#define ANT_0 1
|
||||
#define ANT_1 2
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
#define ANT_2 3
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
|
||||
#define ATE_ASIC_CALIBRATION(__pAd, __ate_mode) \
|
||||
do { \
|
||||
if (__pAd->ate.pChipStruct->AsicCalibration != NULL) \
|
||||
__pAd->ate.pChipStruct->AsicCalibration(__pAd, __ate_mode); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#define ATE_MAC_TX_ENABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) |= (1 << 2); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
#define ATE_MAC_TX_DISABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) &= ~(1 << 2); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
#define ATE_MAC_RX_ENABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) |= (1 << 3); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
#define ATE_MAC_RX_DISABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) &= ~(1 << 3); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Set MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 1. */
|
||||
#define ATE_MAC_TX_CTS_ENABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) |= (1 << 4); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Clear MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 0. */
|
||||
#define ATE_MAC_TX_CTS_DISABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, _I, _pV); \
|
||||
(*(_pV)) &= ~(1 << 4); \
|
||||
RTMP_IO_WRITE32(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Clear BBP R22 to reset Tx Mode (bit7~bit0) = 0. */
|
||||
#ifdef RTMP_BBP
|
||||
#define ATE_BBP_RESET_TX_MODE(_A, _I, _pV) \
|
||||
{ \
|
||||
ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV); \
|
||||
(*(_pV)) &= (0x00); \
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV))); \
|
||||
}
|
||||
#endif /* RTMP_BBP */
|
||||
|
||||
/* Set BBP R22 to start Continuous Tx Mode (bit7) = 1. */
|
||||
#define ATE_BBP_START_CTS_TX_MODE(_A, _I, _pV) \
|
||||
{ \
|
||||
ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV); \
|
||||
(*(_pV)) |= (1 << 7); \
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Clear BBP R22 to stop Continuous Tx Mode (bit7) = 0. */
|
||||
#define ATE_BBP_STOP_CTS_TX_MODE(_A, _I, _pV) \
|
||||
{ \
|
||||
ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV); \
|
||||
(*(_pV)) &= ~(1 << 7); \
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Set BBP R24 to send out Continuous Tx sin wave (bit0) = 1. */
|
||||
#define ATE_BBP_CTS_TX_SIN_WAVE_ENABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV); \
|
||||
(*(_pV)) |= (1 << 0); \
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/* Clear BBP R24 to stop Continuous Tx sin wave (bit0) = 0. */
|
||||
#define ATE_BBP_CTS_TX_SIN_WAVE_DISABLE(_A, _I, _pV) \
|
||||
{ \
|
||||
ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV); \
|
||||
(*(_pV)) &= ~(1 << 0); \
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, (*(_pV))); \
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
This routine sets initial value of VGA in the RX chain.
|
||||
AGC is the abbreviation of "Automatic Gain Controller",
|
||||
while VGA (Variable Gain Amplifier) is a part of AGC loop.
|
||||
(i.e., VGA + level detector + feedback loop = AGC)
|
||||
|
||||
Return:
|
||||
VOID
|
||||
==========================================================================
|
||||
*/
|
||||
#define ATE_CHIP_RX_VGA_GAIN_INIT(__pAd) \
|
||||
if (__pAd->ate.pChipStruct->RxVGAInit != NULL) \
|
||||
__pAd->ate.pChipStruct->RxVGAInit(__pAd)
|
||||
|
||||
#define ATE_CHIP_SET_TX_RX_PATH(__pAd) \
|
||||
if (__pAd->ate.pChipStruct->AsicSetTxRxPath != NULL) \
|
||||
__pAd->ate.pChipStruct->AsicSetTxRxPath(__pAd)
|
||||
|
||||
|
||||
#ifdef RTMP_MAC_PCI
|
||||
#define ATEPCIReadBBPRegister(_A, _I, _pV) \
|
||||
{ \
|
||||
BBP_CSR_CFG_STRUC BbpCsr; \
|
||||
int j, k; \
|
||||
if (!IS_RT65XX(_A)) {\
|
||||
for (j=0; j<MAX_BUSY_COUNT; j++) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, BBP_CSR_CFG, &BbpCsr.word); \
|
||||
if (BbpCsr.field.Busy == BUSY) \
|
||||
{ \
|
||||
continue; \
|
||||
} \
|
||||
BbpCsr.word = 0; \
|
||||
BbpCsr.field.fRead = 1; \
|
||||
BbpCsr.field.BBP_RW_MODE = 1; \
|
||||
BbpCsr.field.Busy = 1; \
|
||||
BbpCsr.field.RegNum = _I; \
|
||||
RTMP_IO_WRITE32(_A, BBP_CSR_CFG, BbpCsr.word); \
|
||||
for (k=0; k<MAX_BUSY_COUNT; k++) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, BBP_CSR_CFG, &BbpCsr.word); \
|
||||
if (BbpCsr.field.Busy == IDLE) \
|
||||
break; \
|
||||
} \
|
||||
if ((BbpCsr.field.Busy == IDLE) && \
|
||||
(BbpCsr.field.RegNum == _I)) \
|
||||
{ \
|
||||
*(_pV) = (UCHAR)BbpCsr.field.Value; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (BbpCsr.field.Busy == BUSY) \
|
||||
{ \
|
||||
DBGPRINT_ERR(("BBP read R%d fail\n", _I)); \
|
||||
*(_pV) = (_A)->BbpWriteLatch[_I]; \
|
||||
} \
|
||||
}\
|
||||
}
|
||||
|
||||
#define ATEPCIWriteBBPRegister(_A, _I, _V) \
|
||||
{ \
|
||||
BBP_CSR_CFG_STRUC BbpCsr; \
|
||||
int BusyCnt; \
|
||||
if (!IS_RT65XX(_A)) {\
|
||||
for (BusyCnt=0; BusyCnt<MAX_BUSY_COUNT; BusyCnt++) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_A, BBP_CSR_CFG, &BbpCsr.word); \
|
||||
if (BbpCsr.field.Busy == BUSY) \
|
||||
continue; \
|
||||
BbpCsr.word = 0; \
|
||||
BbpCsr.field.fRead = 0; \
|
||||
BbpCsr.field.BBP_RW_MODE = 1; \
|
||||
BbpCsr.field.Busy = 1; \
|
||||
BbpCsr.field.Value = _V; \
|
||||
BbpCsr.field.RegNum = _I; \
|
||||
RTMP_IO_WRITE32(_A, BBP_CSR_CFG, BbpCsr.word); \
|
||||
(_A)->BbpWriteLatch[_I] = _V; \
|
||||
break; \
|
||||
} \
|
||||
if (BusyCnt == MAX_BUSY_COUNT) \
|
||||
{ \
|
||||
DBGPRINT_ERR(("BBP write R%d fail\n", _I)); \
|
||||
} \
|
||||
}\
|
||||
}
|
||||
|
||||
|
||||
#define ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV) ATEPCIReadBBPRegister(_A, _I, _pV)
|
||||
#define ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V) ATEPCIWriteBBPRegister(_A, _I, _V)
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
|
||||
|
||||
INT DefaultATETxPwrHandler(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN char index);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(RT28xx) || defined(RT2880)
|
||||
VOID RT28xxATEAsicSwitchChannel(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
INT RT28xxATETxPwrHandler(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN char index);
|
||||
#endif /* defined(RT28xx) || defined(RT2880) */
|
||||
|
||||
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
VOID ATE_QA_Statistics(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN RXWI_STRUC *pRxWI,
|
||||
IN RXINFO_STRUC *pRxInfo,
|
||||
IN PHEADER_802_11 pHeader);
|
||||
|
||||
INT RtmpDoAte(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN RTMP_IOCTL_INPUT_STRUCT *wrq,
|
||||
IN RTMP_STRING *wrq_name);
|
||||
|
||||
INT Set_TxStop_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_RxStop_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#ifdef DBG
|
||||
INT Set_EERead_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_EEWrite_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_BBPRead_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_BBPWrite_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_RFWrite_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* DBG */
|
||||
#endif /* CONFIG_QA */
|
||||
|
||||
#ifdef RTMP_RF_RW_SUPPORT
|
||||
#ifdef RLT_RF
|
||||
#define ATE_RF_IO_READ8_BY_REG_ID(_A, _B, _I, _pV) rlt_rf_read(_A, _B, _I, _pV)
|
||||
#define ATE_RF_IO_WRITE8_BY_REG_ID(_A, _B, _I, _V) rlt_rf_write(_A, _B, _I, _V)
|
||||
#endif /* RLT_RF */
|
||||
#ifdef RTMP_RF
|
||||
#define ATE_RF_IO_READ8_BY_REG_ID(_A, _I, _pV) RT30xxReadRFRegister(_A, _I, _pV)
|
||||
#define ATE_RF_IO_WRITE8_BY_REG_ID(_A, _I, _V) RT30xxWriteRFRegister(_A, _I, _V)
|
||||
#endif /* RTMP_RF */
|
||||
#ifdef MT_RF
|
||||
#define ATE_RF_IO_READ8_BY_REG_ID(_A, _I, _pV)
|
||||
#define ATE_RF_IO_WRITE8_BY_REG_ID(_A, _I, _V)
|
||||
#endif /* MT_RF */
|
||||
#endif /* RTMP_RF_RW_SUPPORT */
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
#define SYNC_CHANNEL_WITH_QA(_A, _pV)\
|
||||
if ((_A->bQATxStart == TRUE) || (_A->bQARxStart == TRUE))\
|
||||
{\
|
||||
return;\
|
||||
}\
|
||||
else\
|
||||
*_pV = _A->Channel
|
||||
#else
|
||||
#define SYNC_CHANNEL_WITH_QA(_A, _pV)\
|
||||
*_pV = _A->Channel
|
||||
#endif /* CONFIG_QA */
|
||||
|
||||
VOID rt_ee_read_all(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT USHORT *Data);
|
||||
|
||||
VOID rt_ee_write_all(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT *Data);
|
||||
|
||||
VOID rt_ee_write_bulk(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT *Data,
|
||||
IN USHORT offset,
|
||||
IN USHORT length);
|
||||
|
||||
INT Set_ATE_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_DA_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_SA_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_BSSID_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
INT Set_ATE_CHANNEL_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_INIT_CHAN_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ADCDump_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)
|
||||
INT Set_ATE_TSSI_CALIBRATION_EX_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) */
|
||||
|
||||
#ifdef RTMP_INTERNAL_TX_ALC
|
||||
INT Set_ATE_TSSI_CALIBRATION_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TSSI_CALIBRATION_EX_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
#if defined(RT3350) || defined(RT3352)
|
||||
INT RT335x_Set_ATE_TSSI_CALIBRATION_ENABLE_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
CHAR InsertTssi(
|
||||
IN UCHAR InChannel,
|
||||
IN UCHAR Channel0,
|
||||
IN UCHAR Channel1,
|
||||
IN CHAR Tssi0,
|
||||
IN CHAR Tssi1);
|
||||
|
||||
INT RT335xATETssiCalibrationExtend(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* defined(RT3350) || defined(RT3352) */
|
||||
|
||||
CHAR ATEGetDesiredTSSI(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
#endif /* RTMP_INTERNAL_TX_ALC */
|
||||
|
||||
#ifdef RTMP_TEMPERATURE_CALIBRATION
|
||||
INT Set_ATE_TEMP_CAL_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_SHOW_TSSI_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#endif /* RTMP_TEMPERATURE_CALIBRATION */
|
||||
|
||||
#ifdef RTMP_TEMPERATURE_COMPENSATION
|
||||
|
||||
INT Set_ATE_READ_EXTERNAL_TSSI_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* RTMP_TEMPERATURE_COMPENSATION */
|
||||
|
||||
INT Set_ATE_TX_POWER0_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_POWER1_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
INT Set_ATE_TX_POWER2_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
|
||||
INT Set_ATE_TX_POWER_EVALUATION_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_Antenna_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_RX_Antenna_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
VOID DefaultATEAsicExtraPowerOverMAC(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
VOID ATEAsicExtraPowerOverMAC(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
#ifdef RT3350
|
||||
INT Set_ATE_PA_Bias_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* RT3350 */
|
||||
|
||||
INT Default_Set_ATE_TX_FREQ_OFFSET_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(RT28xx) || defined(RT2880)
|
||||
INT RT28xx_Set_ATE_TX_FREQ_OFFSET_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* defined(RT28xx) || defined(RT2880) */
|
||||
|
||||
|
||||
INT Set_ATE_TX_FREQ_OFFSET_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Default_Set_ATE_TX_BW_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(RT28xx) || defined(RT2880)
|
||||
INT RT28xx_Set_ATE_TX_BW_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* defined(RT28xx) || defined(RT2880) */
|
||||
|
||||
|
||||
INT Set_ATE_TX_BW_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_LENGTH_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_COUNT_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_MCS_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_STBC_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_MODE_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TX_GI_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
INT Set_ATE_RX_FER_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Read_RF_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#if (!defined(RTMP_RF_RW_SUPPORT)) && (!defined(RLT_RF))
|
||||
INT Set_ATE_Write_RF1_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Write_RF2_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Write_RF3_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Write_RF4_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* (!defined(RTMP_RF_RW_SUPPORT)) && (!defined(RLT_RF)) */
|
||||
|
||||
INT Set_ATE_Load_E2P_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#ifdef RTMP_EFUSE_SUPPORT
|
||||
INT Set_ATE_Load_E2P_From_Buf_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
#endif /* RTMP_EFUSE_SUPPORT */
|
||||
|
||||
INT Set_ATE_Read_E2P_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
#ifdef LED_CONTROL_SUPPORT
|
||||
#endif /* LED_CONTROL_SUPPORT */
|
||||
|
||||
INT Set_ATE_AUTO_ALC_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_TEMP_SENSOR_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_IPG_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Payload_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Fixed_Payload_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
|
||||
|
||||
INT Set_ATE_TTR_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Show_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
INT Set_ATE_Help_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg);
|
||||
|
||||
VOID DefaultATEAsicAdjustTxPower(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
|
||||
|
||||
|
||||
VOID ATEAsicAdjustTxPower(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
|
||||
VOID ATESampleRssi(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RXWI_STRUC *pRxWI);
|
||||
|
||||
#ifdef RTMP_MAC_PCI
|
||||
NDIS_STATUS ATEPayloadAlloc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 idx);
|
||||
|
||||
PNDIS_PACKET ATEPayloadInit(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 TxIdx);
|
||||
|
||||
NDIS_STATUS TxRingGetReady(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
|
||||
|
||||
INT TxDmaBusy(RTMP_ADAPTER *pAd);
|
||||
INT RxDmaBusy(RTMP_ADAPTER *pAd);
|
||||
|
||||
VOID RtmpDmaEnable(RTMP_ADAPTER *pAd, INT Enable);
|
||||
|
||||
INT ATESetUpFrame(RTMP_ADAPTER *pAd, UINT32 TxIdx);
|
||||
|
||||
|
||||
|
||||
NDIS_STATUS ChipStructAssign(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
NDIS_STATUS ATEInit(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
VOID ReadQATxTypeFromBBP(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
#endif /* CONFIG_QA */
|
||||
|
||||
#ifdef RTMP_BBP
|
||||
NDIS_STATUS ATEBBPWriteWithRxChain(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UCHAR bbpId,
|
||||
IN CHAR bbpVal,
|
||||
IN RX_CHAIN_IDX rx_ch_idx);
|
||||
#endif /* RTMP_BBP */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(RT28xx) || defined(RT2880)
|
||||
VOID RT28xxATERxVGAInit(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
#endif /* defined(RT28xx) || defined(RT2880) */
|
||||
|
||||
|
||||
|
||||
VOID ATEPeriodicExec(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3);
|
||||
|
||||
VOID ATEAsicSetTxRxPath(RTMP_ADAPTER *pAd);
|
||||
|
||||
VOID RtmpRfIoWrite(RTMP_ADAPTER *pAd);
|
||||
|
||||
VOID ATEAsicSwitchChannel(RTMP_ADAPTER *pAd);
|
||||
|
||||
VOID BbpSoftReset(RTMP_ADAPTER *pAd);
|
||||
|
||||
|
||||
#endif /* __RT_ATE_H__ */
|
||||
|
||||
@ -0,0 +1,179 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2010, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt_qa.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
*/
|
||||
|
||||
#ifndef __RT_QA_H__
|
||||
#define __RT_QA_H__
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
#ifndef CONFIG_ATE
|
||||
#error "For supporting QA GUI, please set HAS_ATE=y and HAS_QA_SUPPORT=y."
|
||||
#endif /* CONFIG_ATE */
|
||||
|
||||
#include "rt_ate.h"
|
||||
|
||||
typedef struct ate_racfghdr {
|
||||
UINT32 magic_no;
|
||||
USHORT command_type;
|
||||
USHORT command_id;
|
||||
USHORT length;
|
||||
USHORT sequence;
|
||||
USHORT status;
|
||||
UCHAR data[2046];
|
||||
} __attribute__((packed))RACFGHDR, *pRACFGHDR;
|
||||
|
||||
/* Stop Transmission */
|
||||
#define ATE_TXSTOP ((~(fATE_TX_ENABLE))&(~(fATE_TXCONT_ENABLE))&(~(fATE_TXCARR_ENABLE))&(~(fATE_TXCARRSUPP_ENABLE)))
|
||||
/* Stop Receiving Frames */
|
||||
#define ATE_RXSTOP (~(fATE_RX_ENABLE))
|
||||
|
||||
/* NOTE : may be different with chipset in the future ++ */
|
||||
#define BBP22_TXFRAME 0x00 /* Transmit Frames */
|
||||
#define BBP22_TXCONT_OR_CARRSUPP 0x80 /* Continuous Transmit or Carrier Suppression */
|
||||
#define BBP22_TXCARR 0xc1 /* Transmit Carrier */
|
||||
#define BBP24_TXCONT 0x00 /* Continuous Transmit */
|
||||
#define BBP24_CARRSUPP 0x01 /* Carrier Suppression */
|
||||
/* NOTE : may be different with chipset in the future -- */
|
||||
|
||||
/* Eth QA RACFG Command */
|
||||
#define RACFG_MAGIC_NO 0x18142880
|
||||
/* command id with Cmd Type == 0x0005(for iNIC)/0x0008(for others) */
|
||||
#define RACFG_CMD_RF_WRITE_ALL 0x0000
|
||||
#define RACFG_CMD_E2PROM_READ16 0x0001
|
||||
#define RACFG_CMD_E2PROM_WRITE16 0x0002
|
||||
#define RACFG_CMD_E2PROM_READ_ALL 0x0003
|
||||
#define RACFG_CMD_E2PROM_WRITE_ALL 0x0004
|
||||
#define RACFG_CMD_IO_READ 0x0005
|
||||
#define RACFG_CMD_IO_WRITE 0x0006
|
||||
#define RACFG_CMD_IO_READ_BULK 0x0007
|
||||
#define RACFG_CMD_BBP_READ8 0x0008
|
||||
#define RACFG_CMD_BBP_WRITE8 0x0009
|
||||
#define RACFG_CMD_BBP_READ_ALL 0x000a
|
||||
#define RACFG_CMD_GET_COUNTER 0x000b
|
||||
#define RACFG_CMD_CLEAR_COUNTER 0x000c
|
||||
|
||||
#define RACFG_CMD_RSV1 0x000d
|
||||
#define RACFG_CMD_RSV2 0x000e
|
||||
#define RACFG_CMD_RSV3 0x000f
|
||||
|
||||
#define RACFG_CMD_TX_START 0x0010
|
||||
#define RACFG_CMD_GET_TX_STATUS 0x0011
|
||||
#define RACFG_CMD_TX_STOP 0x0012
|
||||
#define RACFG_CMD_RX_START 0x0013
|
||||
#define RACFG_CMD_RX_STOP 0x0014
|
||||
#define RACFG_CMD_GET_NOISE_LEVEL 0x0015
|
||||
|
||||
#define RACFG_CMD_ATE_START 0x0080
|
||||
#define RACFG_CMD_ATE_STOP 0x0081
|
||||
|
||||
#define RACFG_CMD_ATE_START_TX_CARRIER 0x0100
|
||||
#define RACFG_CMD_ATE_START_TX_CONT 0x0101
|
||||
#define RACFG_CMD_ATE_START_TX_FRAME 0x0102
|
||||
#define RACFG_CMD_ATE_SET_BW 0x0103
|
||||
#define RACFG_CMD_ATE_SET_TX_POWER0 0x0104
|
||||
#define RACFG_CMD_ATE_SET_TX_POWER1 0x0105
|
||||
#define RACFG_CMD_ATE_SET_FREQ_OFFSET 0x0106
|
||||
#define RACFG_CMD_ATE_GET_STATISTICS 0x0107
|
||||
#define RACFG_CMD_ATE_RESET_COUNTER 0x0108
|
||||
#define RACFG_CMD_ATE_SEL_TX_ANTENNA 0x0109
|
||||
#define RACFG_CMD_ATE_SEL_RX_ANTENNA 0x010a
|
||||
#define RACFG_CMD_ATE_SET_PREAMBLE 0x010b
|
||||
#define RACFG_CMD_ATE_SET_CHANNEL 0x010c
|
||||
#define RACFG_CMD_ATE_SET_ADDR1 0x010d
|
||||
#define RACFG_CMD_ATE_SET_ADDR2 0x010e
|
||||
#define RACFG_CMD_ATE_SET_ADDR3 0x010f
|
||||
#define RACFG_CMD_ATE_SET_RATE 0x0110
|
||||
#define RACFG_CMD_ATE_SET_TX_FRAME_LEN 0x0111
|
||||
#define RACFG_CMD_ATE_SET_TX_FRAME_COUNT 0x0112
|
||||
#define RACFG_CMD_ATE_START_RX_FRAME 0x0113
|
||||
#define RACFG_CMD_ATE_E2PROM_READ_BULK 0x0114
|
||||
#define RACFG_CMD_ATE_E2PROM_WRITE_BULK 0x0115
|
||||
#define RACFG_CMD_ATE_IO_WRITE_BULK 0x0116
|
||||
#define RACFG_CMD_ATE_BBP_READ_BULK 0x0117
|
||||
#define RACFG_CMD_ATE_BBP_WRITE_BULK 0x0118
|
||||
#define RACFG_CMD_ATE_RF_READ_BULK 0x0119
|
||||
#define RACFG_CMD_ATE_RF_WRITE_BULK 0x011a
|
||||
#define RACFG_CMD_ATE_SET_TX_POWER2 0x011b
|
||||
#ifdef RLT_RF
|
||||
#define RACFG_CMD_ATE_RF_READ_BULK_BANK 0x0123
|
||||
#define RACFG_CMD_ATE_RF_WRITE_BULK_BANK 0x0124
|
||||
#endif /* RLT_RF */
|
||||
#define RACFG_CMD_TX_START_V2 0x0125
|
||||
|
||||
|
||||
|
||||
/* QA RACFG Command for ate test from localhost */
|
||||
#define RACFG_CMD_ATE_SHOW_PARAM 0xff00
|
||||
|
||||
/* ATE export paramters to uppler layer */
|
||||
typedef struct __ATE_EX_PARAM
|
||||
{
|
||||
unsigned char mode;
|
||||
char TxPower0;
|
||||
char TxPower1;
|
||||
#ifdef DOT11N_SS3_SUPPORT
|
||||
char TxPower2;
|
||||
#endif /* DOT11N_SS3_SUPPORT */
|
||||
char TxAntennaSel;
|
||||
char RxAntennaSel;
|
||||
unsigned char DA[MAC_ADDR_LEN];
|
||||
unsigned char SA[MAC_ADDR_LEN];
|
||||
unsigned char BSSID[MAC_ADDR_LEN];
|
||||
unsigned char MCS;
|
||||
unsigned char PhyMode;
|
||||
BOOLEAN ShortGI;
|
||||
BOOLEAN BW;
|
||||
unsigned int Channel;
|
||||
unsigned int TxLength;
|
||||
unsigned int TxCount;
|
||||
unsigned int RFFreqOffset;
|
||||
unsigned int IPG;
|
||||
unsigned int RxTotalCnt;
|
||||
unsigned int RxCntPerSec;
|
||||
char LastSNR0;
|
||||
char LastSNR1;
|
||||
char LastSNR2;
|
||||
char LastRssi0;
|
||||
char LastRssi1;
|
||||
char LastRssi2;
|
||||
char AvgRssi0;
|
||||
char AvgRssi1;
|
||||
char AvgRssi2;
|
||||
short AvgRssi0X8;
|
||||
short AvgRssi1X8;
|
||||
short AvgRssi2X8;
|
||||
}ATE_EX_PARAM, *pATE_EX_PARAM;
|
||||
|
||||
NDIS_STATUS TXSTOP(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
NDIS_STATUS RXSTOP(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
#endif /* CONFIG_QA */
|
||||
|
||||
#endif /* __RT_QA_H__ */
|
||||
@ -0,0 +1,530 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2006, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ate_pci.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
*/
|
||||
|
||||
#ifdef RTMP_MAC_PCI
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
/* 802.11 MAC Header, Type:Data, Length:24bytes + 6 bytes QOS/HTC + 2 bytes padding */
|
||||
extern UCHAR TemplateFrame[32];
|
||||
|
||||
INT TxDmaBusy(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT result;
|
||||
WPDMA_GLO_CFG_STRUC GloCfg;
|
||||
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); /* disable DMA */
|
||||
#elif defined(MT_MAC)
|
||||
RTMP_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); /* disable DMA */
|
||||
#endif
|
||||
result = (GloCfg.field.TxDMABusy) ? TRUE : FALSE;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
INT RxDmaBusy(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT result;
|
||||
WPDMA_GLO_CFG_STRUC GloCfg;
|
||||
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); /* disable DMA */
|
||||
#elif defined(MT_MAC)
|
||||
RTMP_IO_READ32(pAd, MT_WPDMA_GLO_CFG, &GloCfg.word); /* disable DMA */
|
||||
#endif
|
||||
result = (GloCfg.field.RxDMABusy) ? TRUE : FALSE;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
VOID RtmpDmaEnable(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN INT Enable)
|
||||
{
|
||||
ULONG WaitCnt = 0;
|
||||
|
||||
/* check if DMA is in busy mode or not. */
|
||||
while (TxDmaBusy(pAd) || RxDmaBusy(pAd))
|
||||
{
|
||||
RtmpusecDelay(10);
|
||||
if (WaitCnt++ > 100)
|
||||
break;
|
||||
}
|
||||
|
||||
AsicSetWPDMA(pAd, PDMA_TX_RX, (Enable > 0 ? TRUE : FALSE));
|
||||
|
||||
RtmpOsMsDelay(5);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Write TxWI for ATE mode.
|
||||
|
||||
Return Value:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID ATEWriteTxWI(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN TXWI_STRUC *pOutTxWI,
|
||||
IN BOOLEAN FRAG,
|
||||
IN BOOLEAN CFACK,
|
||||
IN BOOLEAN InsTimestamp,
|
||||
IN BOOLEAN AMPDU,
|
||||
IN BOOLEAN Ack,
|
||||
IN BOOLEAN NSeq, /* HW new a sequence. */
|
||||
IN UCHAR BASize,
|
||||
IN UCHAR WCID,
|
||||
IN ULONG Length,
|
||||
IN UCHAR PID,
|
||||
IN UCHAR TID,
|
||||
IN UCHAR TxRate,
|
||||
IN UCHAR Txopmode,
|
||||
IN BOOLEAN CfAck,
|
||||
IN HTTRANSMIT_SETTING *pTransmit)
|
||||
{
|
||||
TXWI_STRUC TxWI, *pTxWI;
|
||||
UINT8 TXWISize = pAd->chipCap.TXWISize;
|
||||
UCHAR bw;
|
||||
|
||||
/* If CCK or OFDM, BW must be 20 */
|
||||
bw = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);
|
||||
|
||||
OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);
|
||||
NdisZeroMemory(&TxWI, TXWISize);
|
||||
pTxWI = &TxWI;
|
||||
|
||||
#ifdef RLT_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RLT) {
|
||||
struct _TXWI_NMAC *txwi_n = (struct _TXWI_NMAC *)pTxWI;
|
||||
|
||||
txwi_n->FRAG= FRAG;
|
||||
txwi_n->CFACK = CFACK;
|
||||
txwi_n->TS= InsTimestamp;
|
||||
txwi_n->AMPDU = AMPDU;
|
||||
txwi_n->ACK = Ack;
|
||||
txwi_n->txop = Txopmode;
|
||||
txwi_n->NSEQ= NSeq;
|
||||
txwi_n->BAWinSize = BASize;
|
||||
txwi_n->wcid = WCID;
|
||||
txwi_n->MPDUtotalByteCnt = Length;
|
||||
txwi_n->BW = bw;
|
||||
txwi_n->ShortGI = pTransmit->field.ShortGI;
|
||||
txwi_n->STBC = pTransmit->field.STBC;
|
||||
txwi_n->MCS = pTransmit->field.MCS;
|
||||
txwi_n->PHYMODE = pTransmit->field.MODE;
|
||||
txwi_n->CFACK = CfAck;
|
||||
txwi_n->MIMOps = 0;
|
||||
txwi_n->MpduDensity = 0;
|
||||
txwi_n->TxPktId = txwi_n->MCS;
|
||||
}
|
||||
#endif /* RLT_MAC */
|
||||
|
||||
#ifdef RTMP_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RTMP) {
|
||||
struct _TXWI_OMAC *txwi_o = (struct _TXWI_OMAC *)pTxWI;
|
||||
|
||||
txwi_o->FRAG= FRAG;
|
||||
txwi_o->CFACK = CFACK;
|
||||
txwi_o->TS= InsTimestamp;
|
||||
txwi_o->AMPDU = AMPDU;
|
||||
txwi_o->ACK = Ack;
|
||||
txwi_o->txop = Txopmode;
|
||||
txwi_o->NSEQ = NSeq;
|
||||
txwi_o->BAWinSize = BASize;
|
||||
txwi_o->wcid = WCID;
|
||||
txwi_o->MPDUtotalByteCnt = Length;
|
||||
txwi_o->BW = bw;
|
||||
txwi_o->ShortGI = pTransmit->field.ShortGI;
|
||||
txwi_o->STBC = pTransmit->field.STBC;
|
||||
txwi_o->MCS = pTransmit->field.MCS;
|
||||
txwi_o->PHYMODE = pTransmit->field.MODE;
|
||||
txwi_o->CFACK = CfAck;
|
||||
txwi_o->MIMOps = 0;
|
||||
txwi_o->MpduDensity = 0;
|
||||
txwi_o->PacketId = txwi_o->MCS;
|
||||
}
|
||||
#endif /* RTMP_MAC */
|
||||
|
||||
NdisMoveMemory(pOutTxWI, &TxWI, TXWISize);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Allocate Frame payload buffer.
|
||||
NOTE:
|
||||
This routine should only be used in ATE mode.
|
||||
==========================================================================
|
||||
*/
|
||||
NDIS_STATUS ATEPayloadAlloc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 idx)
|
||||
{
|
||||
ATE_INFO *pATEInfo = &(pAd->ate);
|
||||
NDIS_PHYSICAL_ADDRESS AllocPa;
|
||||
|
||||
/* alloc buffer for payload */
|
||||
#ifdef CONFIG_QA
|
||||
if ((pATEInfo->bQAEnabled == TRUE) && (pATEInfo->DLen != 0))
|
||||
{
|
||||
pATEInfo->pAtePacket[idx] = RTMP_AllocateRxPacketBuffer(pAd, ((POS_COOKIE)(pAd->OS_Cookie))->pci_dev,
|
||||
pATEInfo->DLen + 0x100, FALSE, &pATEInfo->AteAllocVa[idx], &AllocPa);
|
||||
}
|
||||
else
|
||||
#endif /* CONFIG_QA */
|
||||
{
|
||||
pATEInfo->pAtePacket[idx] = RTMP_AllocateRxPacketBuffer(pAd, ((POS_COOKIE)(pAd->OS_Cookie))->pci_dev,
|
||||
pATEInfo->TxLength, FALSE, &pATEInfo->AteAllocVa[idx], &AllocPa);
|
||||
}
|
||||
|
||||
if (pATEInfo->pAtePacket[idx] == NULL)
|
||||
{
|
||||
pATEInfo->TxCount = 0;
|
||||
DBGPRINT_ERR(("%s : fail to alloc packet space.\n", __FUNCTION__));
|
||||
return (NDIS_STATUS_RESOURCES);
|
||||
}
|
||||
|
||||
return (NDIS_STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Initialize Frame payload.
|
||||
NOTE:
|
||||
This routine should only be used in ATE mode.
|
||||
==========================================================================
|
||||
*/
|
||||
PNDIS_PACKET ATEPayloadInit(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 idx)
|
||||
{
|
||||
ATE_INFO *pATEInfo = &(pAd->ate);
|
||||
RTMP_TX_RING *pTxRing = &pAd->TxRing[QID_AC_BE];
|
||||
PNDIS_PACKET pPacket = pTxRing->Cell[idx].pNdisPacket;
|
||||
PUCHAR pDest = (PUCHAR)pATEInfo->AteAllocVa[idx];
|
||||
UINT pos = 0;
|
||||
|
||||
#ifdef CONFIG_QA
|
||||
if ((pATEInfo->bQATxStart == TRUE) && (pATEInfo->DLen != 0))
|
||||
{
|
||||
GET_OS_PKT_LEN(pPacket) = pATEInfo->DLen;
|
||||
#ifndef LINUX
|
||||
GET_OS_PKT_TOTAL_LEN(pPacket) = pATEInfo->DLen;
|
||||
#endif /* LIMUX */
|
||||
}
|
||||
else
|
||||
#endif /* CONFIG_QA */
|
||||
{
|
||||
GET_OS_PKT_LEN(pPacket) = pATEInfo->TxLength - pATEInfo->HLen;
|
||||
#ifndef LINUX
|
||||
GET_OS_PKT_TOTAL_LEN(pPacket) = pATEInfo->TxLength - pATEInfo->HLen;
|
||||
#endif /* LINUX */
|
||||
}
|
||||
|
||||
/* prepare frame payload */
|
||||
#ifdef CONFIG_QA
|
||||
if ((pATEInfo->bQATxStart == TRUE) && (pATEInfo->DLen != 0))
|
||||
{
|
||||
/* copy pattern to payload */
|
||||
if ((pATEInfo->PLen != 0))
|
||||
{
|
||||
for (pos = 0; pos < pATEInfo->DLen; pos += pATEInfo->PLen)
|
||||
{
|
||||
memcpy(GET_OS_PKT_DATAPTR(pPacket) + pos, pATEInfo->Pattern, pATEInfo->PLen);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif /* CONFIG_QA */
|
||||
{
|
||||
for (pos = 0; pos < GET_OS_PKT_LEN(pPacket); pos++)
|
||||
{
|
||||
if ( pATEInfo->bFixedPayload )
|
||||
{
|
||||
/* default payload is 0xA5 */
|
||||
pDest[pos] = pATEInfo->Payload;
|
||||
}
|
||||
else
|
||||
{
|
||||
pDest[pos] = RandomByte(pAd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return pPacket;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Setup Frame format.
|
||||
NOTE:
|
||||
This routine should only be used in ATE mode.
|
||||
==========================================================================
|
||||
*/
|
||||
INT ATESetUpFrame(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 TxIdx)
|
||||
{
|
||||
PATE_INFO pATEInfo = &(pAd->ate);
|
||||
TXINFO_STRUC *pTxInfo;
|
||||
TXD_STRUC *pTxD;
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
TXD_STRUC *pDestTxD;
|
||||
UCHAR tx_hw_info[TXD_SIZE];
|
||||
#endif /* RT_BIG_ENDIAN */
|
||||
PNDIS_PACKET pPacket=NULL;
|
||||
PUCHAR pDest=NULL;
|
||||
HTTRANSMIT_SETTING TxHTPhyMode;
|
||||
|
||||
RTMP_TX_RING *pTxRing = &pAd->TxRing[QID_AC_BE];
|
||||
TXWI_STRUC *pTxWI = (TXWI_STRUC *)pTxRing->Cell[TxIdx].DmaBuf.AllocVa;
|
||||
PUCHAR pDMAHeaderBufVA = (PUCHAR) pTxRing->Cell[TxIdx].DmaBuf.AllocVa;
|
||||
UINT8 TXWISize = pAd->chipCap.TXWISize;
|
||||
#ifdef CONFIG_QA
|
||||
PHEADER_802_11 pHeader80211;
|
||||
#endif /* CONFIG_QA */
|
||||
UCHAR bw, sgi, stbc, mcs, phy_mode, frag, cfack, ts, ampdu, ack, nseq, bawinsize, pkt_id, txop;
|
||||
USHORT byte_cnt;
|
||||
|
||||
bw = sgi = stbc = mcs = phy_mode = frag = cfack = ts =0;
|
||||
ampdu = ack = nseq = bawinsize = pkt_id = txop = 0;
|
||||
byte_cnt = 0;
|
||||
#ifdef RLT_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RLT)
|
||||
{
|
||||
bw = pATEInfo->TxWI.TXWI_N.BW;
|
||||
sgi = pATEInfo->TxWI.TXWI_N.ShortGI;
|
||||
stbc = pATEInfo->TxWI.TXWI_N.STBC;
|
||||
mcs = pATEInfo->TxWI.TXWI_N.MCS;
|
||||
phy_mode = pATEInfo->TxWI.TXWI_N.PHYMODE;
|
||||
|
||||
frag = pATEInfo->TxWI.TXWI_N.FRAG;
|
||||
cfack = pATEInfo->TxWI.TXWI_N.CFACK,
|
||||
ts = pATEInfo->TxWI.TXWI_N.TS;
|
||||
ampdu = pATEInfo->TxWI.TXWI_N.AMPDU;
|
||||
ack = pATEInfo->TxWI.TXWI_N.ACK;
|
||||
nseq = pATEInfo->TxWI.TXWI_N.NSEQ;
|
||||
bawinsize =pATEInfo->TxWI.TXWI_N.BAWinSize;
|
||||
byte_cnt = pATEInfo->TxWI.TXWI_N.MPDUtotalByteCnt;
|
||||
pkt_id = pATEInfo->TxWI.TXWI_N.TxPktId;
|
||||
txop = pATEInfo->TxWI.TXWI_N.txop;
|
||||
cfack = pATEInfo->TxWI.TXWI_N.CFACK;
|
||||
}
|
||||
#endif /* RLT_MAC */
|
||||
#ifdef RTMP_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RTMP)
|
||||
{
|
||||
bw = pATEInfo->TxWI.TXWI_O.BW;
|
||||
sgi = pATEInfo->TxWI.TXWI_O.ShortGI;
|
||||
stbc = pATEInfo->TxWI.TXWI_O.STBC;
|
||||
mcs = pATEInfo->TxWI.TXWI_O.MCS;
|
||||
phy_mode = pATEInfo->TxWI.TXWI_O.PHYMODE;
|
||||
|
||||
frag = pATEInfo->TxWI.TXWI_O.FRAG;
|
||||
cfack = pATEInfo->TxWI.TXWI_O.CFACK,
|
||||
ts = pATEInfo->TxWI.TXWI_O.TS;
|
||||
ampdu = pATEInfo->TxWI.TXWI_O.AMPDU;
|
||||
ack = pATEInfo->TxWI.TXWI_O.ACK;
|
||||
nseq = pATEInfo->TxWI.TXWI_O.NSEQ;
|
||||
bawinsize =pATEInfo->TxWI.TXWI_O.BAWinSize;
|
||||
byte_cnt = pATEInfo->TxWI.TXWI_O.MPDUtotalByteCnt;
|
||||
pkt_id = pATEInfo->TxWI.TXWI_O.PacketId;
|
||||
txop = pATEInfo->TxWI.TXWI_O.txop;
|
||||
cfack = pATEInfo->TxWI.TXWI_O.CFACK;
|
||||
}
|
||||
#endif /* RTMP_MAC */
|
||||
|
||||
/* fill TxWI */
|
||||
TxHTPhyMode.field.BW = bw;
|
||||
TxHTPhyMode.field.ShortGI = sgi;
|
||||
TxHTPhyMode.field.STBC = stbc;
|
||||
TxHTPhyMode.field.MCS = mcs;
|
||||
TxHTPhyMode.field.MODE = phy_mode;
|
||||
|
||||
if (pATEInfo->bQATxStart == TRUE)
|
||||
{
|
||||
/* always use QID_AC_BE and FIFO_EDCA */
|
||||
ATEWriteTxWI(pAd, pTxWI, frag, cfack,
|
||||
ts, ampdu, ack,
|
||||
nseq, bawinsize, 0,
|
||||
byte_cnt, pkt_id, 0, 0,
|
||||
txop, cfack,
|
||||
&TxHTPhyMode);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
ATEWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
|
||||
4, 0, pATEInfo->TxLength, 0, 0, 0, IFS_HTTXOP, FALSE, &TxHTPhyMode);
|
||||
|
||||
}
|
||||
|
||||
/* fill 802.11 header */
|
||||
#ifdef CONFIG_QA
|
||||
if (pATEInfo->bQATxStart == TRUE)
|
||||
{
|
||||
NdisMoveMemory(pDMAHeaderBufVA + TXWISize, pATEInfo->Header, pATEInfo->HLen);
|
||||
}
|
||||
else
|
||||
#endif /* CONFIG_QA */
|
||||
{
|
||||
pATEInfo->HLen = LENGTH_802_11;
|
||||
NdisMoveMemory(pDMAHeaderBufVA + TXWISize, TemplateFrame, pATEInfo->HLen);
|
||||
NdisMoveMemory(pDMAHeaderBufVA + TXWISize + 4, pATEInfo->Addr1, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(pDMAHeaderBufVA + TXWISize + 10, pATEInfo->Addr2, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(pDMAHeaderBufVA + TXWISize + 16, pATEInfo->Addr3, MAC_ADDR_LEN);
|
||||
}
|
||||
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
RTMPFrameEndianChange(pAd, (((PUCHAR)pDMAHeaderBufVA) + TXWISize), DIR_READ, FALSE);
|
||||
#endif /* RT_BIG_ENDIAN */
|
||||
|
||||
pPacket = ATEPayloadInit(pAd, TxIdx);
|
||||
/* error check */
|
||||
if (pPacket == NULL)
|
||||
{
|
||||
pATEInfo->TxCount = 0;
|
||||
DBGPRINT_ERR(("%s : fail to init frame payload.\n", __FUNCTION__));
|
||||
return -1;
|
||||
}
|
||||
pTxRing->Cell[TxIdx].pNdisPacket = pPacket;
|
||||
|
||||
/* build Tx descriptor */
|
||||
#ifndef RT_BIG_ENDIAN
|
||||
pTxD = (TXD_STRUC *) pTxRing->Cell[TxIdx].AllocVa;
|
||||
pTxInfo = (TXINFO_STRUC *)(pTxRing->Cell[TxIdx].AllocVa + sizeof(TXD_STRUC));
|
||||
#else
|
||||
pDestTxD = (TXD_STRUC *)pTxRing->Cell[TxIdx].AllocVa;
|
||||
NdisMoveMemory(&tx_hw_info[0], (UCHAR *)pDestTxD, TXD_SIZE);
|
||||
pTxD = (TXD_STRUC *)&tx_hw_info[0];
|
||||
pTxInfo = (TXINFO_STRUC *)(&tx_hw_info[0] + sizeof(TXD_STRUC));
|
||||
#endif /* !RT_BIG_ENDIAN */
|
||||
{
|
||||
/* prepare TxD */
|
||||
TX_BLK txblk;
|
||||
txblk.SrcBufLen = GET_OS_PKT_LEN(pATEInfo->pAtePacket[TxIdx]);
|
||||
txblk.pSrcBufData = (PUCHAR)pATEInfo->AteAllocVa[TxIdx];
|
||||
NdisZeroMemory(pTxD, TXD_SIZE);
|
||||
/* build Tx descriptor */
|
||||
pTxD->SDPtr0 = RTMP_GetPhysicalAddressLow (pTxRing->Cell[TxIdx].DmaBuf.AllocPa);
|
||||
pTxD->SDLen0 = TXWISize + pATEInfo->HLen;
|
||||
pTxD->LastSec0 = 0;
|
||||
pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, &txblk, 0, 1, RTMP_PCI_DMA_TODEVICE);
|
||||
pTxD->SDLen1 = GET_OS_PKT_LEN(pATEInfo->pAtePacket[TxIdx]);
|
||||
pTxD->LastSec1 = 1;
|
||||
pTxD->Burst = 0;
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
ral_write_txd(pAd, pTxD, pTxInfo, FALSE, FIFO_EDCA);
|
||||
#endif /* defined(RTMP_MAC) || defined(RLT_MAC) */
|
||||
#ifdef MT_MAC
|
||||
mt_write_txd(pAd, pTxD);
|
||||
#endif /* MT_MAC */
|
||||
}
|
||||
#ifdef CONFIG_QA
|
||||
if (pATEInfo->bQATxStart == TRUE)
|
||||
{
|
||||
pDest = (PUCHAR)pTxWI;
|
||||
pDest += TXWISize;
|
||||
pHeader80211 = (PHEADER_802_11)pDest;
|
||||
|
||||
/* modify sequence number... */
|
||||
if (pATEInfo->TxDoneCount == 0)
|
||||
pATEInfo->seq = pHeader80211->Sequence;
|
||||
else
|
||||
pHeader80211->Sequence = ++pATEInfo->seq;
|
||||
}
|
||||
#endif /* CONFIG_QA */
|
||||
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
RTMPWIEndianChange(pAd, (PUCHAR)pTxWI, TYPE_TXWI);
|
||||
RTMPFrameEndianChange(pAd, (((PUCHAR)pDMAHeaderBufVA) + TXWISize), DIR_WRITE, FALSE);
|
||||
RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD);
|
||||
WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD);
|
||||
#endif /* RT_BIG_ENDIAN */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Tx ring skb hook and ring index setting.
|
||||
NOTE:
|
||||
This routine should only be used in ATE mode.
|
||||
==========================================================================
|
||||
*/
|
||||
NDIS_STATUS TxRingGetReady(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
ATE_INFO *pATEInfo = &(pAd->ate);
|
||||
RTMP_TX_RING *pTxRing = &pAd->TxRing[QID_AC_BE];
|
||||
UINT32 TxIdx = 0;
|
||||
UINT32 ring_idx = 0;
|
||||
RTMP_IO_READ32(pAd, pTxRing->hw_didx_addr, &pTxRing->TxDmaIdx);
|
||||
pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx;
|
||||
pTxRing->TxCpuIdx = pTxRing->TxDmaIdx;
|
||||
RTMP_IO_WRITE32(pAd, pTxRing->hw_cidx_addr, pTxRing->TxCpuIdx);
|
||||
|
||||
for (ring_idx = 0; (ring_idx < TX_RING_SIZE) && (ring_idx < pATEInfo->TxCount); ring_idx++)
|
||||
{
|
||||
TxIdx = pTxRing->TxCpuIdx;
|
||||
|
||||
if (ATESetUpFrame(pAd, TxIdx) != 0)
|
||||
{
|
||||
return (NDIS_STATUS_FAILURE);
|
||||
}
|
||||
|
||||
if (((ring_idx + 1) < TX_RING_SIZE) && (ring_idx < pATEInfo->TxCount))
|
||||
{
|
||||
INC_RING_INDEX(pTxRing->TxCpuIdx, TX_RING_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
return (NDIS_STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
|
||||
@ -0,0 +1,29 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2006, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
ate_usb.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
*/
|
||||
|
||||
|
||||
1183
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ate/mt_mac/mt_ate.c
Normal file
1183
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ate/mt_mac/mt_ate.c
Normal file
File diff suppressed because it is too large
Load Diff
2094
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ate/qa_agent.c
Normal file
2094
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/ate/qa_agent.c
Normal file
File diff suppressed because it is too large
Load Diff
1389
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/chips/mt7603.c
Normal file
1389
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/chips/mt7603.c
Normal file
File diff suppressed because it is too large
Load Diff
1018
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/chips/mt7628.c
Normal file
1018
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/chips/mt7628.c
Normal file
File diff suppressed because it is too large
Load Diff
1036
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/chips/mt7636.c
Normal file
1036
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/chips/mt7636.c
Normal file
File diff suppressed because it is too large
Load Diff
400
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/chips/rt28xx.c
Normal file
400
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/chips/rt28xx.c
Normal file
@ -0,0 +1,400 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt2860.c
|
||||
|
||||
Abstract:
|
||||
Specific funcitons and variables for RT3070
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#ifdef RT28xx
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
#if defined(RT28xx) || defined(RT2883)
|
||||
/* Reset the RFIC setting to new series */
|
||||
RTMP_RF_REGS RF2850RegTable[] = {
|
||||
/* ch R1 R2 R3(TX0~4=0) R4*/
|
||||
{1, 0x98402ecc, 0x984c0786, 0x9816b455, 0x9800510b},
|
||||
{2, 0x98402ecc, 0x984c0786, 0x98168a55, 0x9800519f},
|
||||
{3, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800518b},
|
||||
{4, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800519f},
|
||||
{5, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800518b},
|
||||
{6, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800519f},
|
||||
{7, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800518b},
|
||||
{8, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800519f},
|
||||
{9, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800518b},
|
||||
{10, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800519f},
|
||||
{11, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800518b},
|
||||
{12, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800519f},
|
||||
{13, 0x98402ecc, 0x984c079e, 0x98168a55, 0x9800518b},
|
||||
{14, 0x98402ecc, 0x984c07a2, 0x98168a55, 0x98005193},
|
||||
|
||||
/* 802.11 UNI / HyperLan 2*/
|
||||
{36, 0x98402ecc, 0x984c099a, 0x98158a55, 0x980ed1a3},
|
||||
{38, 0x98402ecc, 0x984c099e, 0x98158a55, 0x980ed193},
|
||||
{40, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed183},
|
||||
{44, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed1a3},
|
||||
{46, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed18b},
|
||||
{48, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed19b},
|
||||
{52, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed193},
|
||||
{54, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed1a3},
|
||||
{56, 0x98402ec8, 0x984c068e, 0x98158a55, 0x980ed18b},
|
||||
{60, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed183},
|
||||
{62, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed193},
|
||||
{64, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed1a3}, /* Plugfest#4, Day4, change RFR3 left4th 9->5.*/
|
||||
|
||||
/* 802.11 HyperLan 2*/
|
||||
{100, 0x98402ec8, 0x984c06b2, 0x98178a55, 0x980ed783},
|
||||
|
||||
/* 2008.04.30 modified */
|
||||
/* The system team has AN to improve the EVM value */
|
||||
/* for channel 102 to 108 for the RT2850/RT2750 dual band solution.*/
|
||||
{102, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed793},
|
||||
{104, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed1a3},
|
||||
{108, 0x98402ecc, 0x985c0a32, 0x98578a55, 0x980ed193},
|
||||
|
||||
{110, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed183},
|
||||
{112, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed19b},
|
||||
{116, 0x98402ecc, 0x984c0a3a, 0x98178a55, 0x980ed1a3},
|
||||
{118, 0x98402ecc, 0x984c0a3e, 0x98178a55, 0x980ed193},
|
||||
{120, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed183},
|
||||
{124, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed193},
|
||||
{126, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed15b}, /* 0x980ed1bb->0x980ed15b required by Rory 20070927*/
|
||||
{128, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed1a3},
|
||||
{132, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed18b},
|
||||
{134, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed193},
|
||||
{136, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed19b},
|
||||
{140, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed183},
|
||||
|
||||
/* 802.11 UNII*/
|
||||
{149, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed1a7},
|
||||
{151, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed187},
|
||||
{153, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed18f},
|
||||
{157, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed19f},
|
||||
{159, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed1a7},
|
||||
{161, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed187},
|
||||
{165, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed197},
|
||||
{167, 0x98402ec4, 0x984c03d2, 0x98179855, 0x9815531f},
|
||||
{169, 0x98402ec4, 0x984c03d2, 0x98179855, 0x98155327},
|
||||
{171, 0x98402ec4, 0x984c03d6, 0x98179855, 0x98155307},
|
||||
{173, 0x98402ec4, 0x984c03d6, 0x98179855, 0x9815530f},
|
||||
|
||||
/* Japan*/
|
||||
{184, 0x95002ccc, 0x9500491e, 0x9509be55, 0x950c0a0b},
|
||||
{188, 0x95002ccc, 0x95004922, 0x9509be55, 0x950c0a13},
|
||||
{192, 0x95002ccc, 0x95004926, 0x9509be55, 0x950c0a1b},
|
||||
{196, 0x95002ccc, 0x9500492a, 0x9509be55, 0x950c0a23},
|
||||
{208, 0x95002ccc, 0x9500493a, 0x9509be55, 0x950c0a13},
|
||||
{212, 0x95002ccc, 0x9500493e, 0x9509be55, 0x950c0a1b},
|
||||
{216, 0x95002ccc, 0x95004982, 0x9509be55, 0x950c0a23},
|
||||
|
||||
/* still lack of MMAC(Japan) ch 34,38,42,46*/
|
||||
};
|
||||
UCHAR NUM_OF_2850_CHNL = (sizeof(RF2850RegTable) / sizeof(RTMP_RF_REGS));
|
||||
#endif /* defined(RT28xx) || defined(RT2883) */
|
||||
|
||||
|
||||
VOID RT28xx_ch_tunning(RTMP_ADAPTER *pAd, UINT8 bw)
|
||||
{
|
||||
if (pAd->MACVersion != 0x28600100)
|
||||
return;
|
||||
|
||||
|
||||
if (bw == BW_20)
|
||||
{
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
|
||||
}
|
||||
else if (bw == BW_40)
|
||||
{
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n"));
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xx_ChipSwitchChannel(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR Channel,
|
||||
IN BOOLEAN bScan)
|
||||
{
|
||||
CHAR TxPwer = 0, TxPwer2 = DEFAULT_RF_TX_POWER; /*Bbp94 = BBPR94_DEFAULT, TxPwer2 = DEFAULT_RF_TX_POWER;*/
|
||||
UCHAR index;
|
||||
UINT32 Value = 0; /*BbpReg, Value;*/
|
||||
UCHAR RFValue = 0;
|
||||
UINT32 i = 0;
|
||||
ULONG R2 = 0, R3 = DEFAULT_RF_TX_POWER, R4 = 0;
|
||||
RTMP_RF_REGS *RFRegTable;
|
||||
CHAR lan_gain;
|
||||
|
||||
|
||||
/* Search Tx power value*/
|
||||
/*
|
||||
We can't use ChannelList to search channel, since some central channl's txpowr doesn't list
|
||||
in ChannelList, so use TxPower array instead.
|
||||
*/
|
||||
for (index = 0; index < MAX_NUM_OF_CHANNELS; index++)
|
||||
{
|
||||
if (Channel == pAd->TxPower[index].Channel)
|
||||
{
|
||||
TxPwer = pAd->TxPower[index].Power;
|
||||
TxPwer2 = pAd->TxPower[index].Power2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (index == MAX_NUM_OF_CHANNELS)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): Can't find the Channel#%d \n", __FUNCTION__, Channel));
|
||||
}
|
||||
|
||||
RFRegTable = RF2850RegTable;
|
||||
|
||||
switch (pAd->RfIcType)
|
||||
{
|
||||
case RFIC_2820:
|
||||
case RFIC_2850:
|
||||
case RFIC_2720:
|
||||
case RFIC_2750:
|
||||
for (index = 0; index < NUM_OF_2850_CHNL; index++)
|
||||
{
|
||||
if (Channel == RFRegTable[index].Channel)
|
||||
{
|
||||
R2 = RFRegTable[index].R2;
|
||||
if (pAd->Antenna.field.TxPath == 1)
|
||||
{
|
||||
R2 |= 0x4000; /*If TXpath is 1, bit 14 = 1;*/
|
||||
}
|
||||
|
||||
if ((pAd->Antenna.field.RxPath == 2)
|
||||
#ifdef GREENAP_SUPPORT
|
||||
&& (pAd->ApCfg.bGreenAPActive == FALSE)
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
)
|
||||
{
|
||||
R2 |= 0x40; /*write 1 to off Rxpath.*/
|
||||
}
|
||||
else if ((pAd->Antenna.field.RxPath == 1)
|
||||
#ifdef GREENAP_SUPPORT
|
||||
|| (pAd->ApCfg.bGreenAPActive == TRUE)
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
)
|
||||
{
|
||||
R2 |= 0x20040; /*write 1 to off RxPath*/
|
||||
}
|
||||
|
||||
if (Channel > 14)
|
||||
{
|
||||
/* initialize R3, R4*/
|
||||
R3 = (RFRegTable[index].R3 & 0xffffc1ff);
|
||||
R4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pAd->RfFreqOffset << 15);
|
||||
|
||||
/* 5G band power range: 0xF9~0X0F, TX0 Reg3 bit9/TX1 Reg4 bit6="0" means the TX power reduce 7dB*/
|
||||
/*R3*/
|
||||
if ((TxPwer >= -7) && (TxPwer < 0))
|
||||
{
|
||||
TxPwer = (7+TxPwer);
|
||||
|
||||
/* TxPwer is not possible larger than 15 */
|
||||
|
||||
R3 |= (TxPwer << 10);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): TxPwer=%d \n", __FUNCTION__, TxPwer));
|
||||
}
|
||||
else
|
||||
{
|
||||
TxPwer = (TxPwer > 0xF) ? (0xF) : (TxPwer);
|
||||
R3 |= (TxPwer << 10) | (1 << 9);
|
||||
}
|
||||
|
||||
/* R4*/
|
||||
if ((TxPwer2 >= -7) && (TxPwer2 < 0))
|
||||
{
|
||||
TxPwer2 = (7+TxPwer2);
|
||||
|
||||
R4 |= (TxPwer2 << 7);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): TxPwer2=%d \n", __FUNCTION__, TxPwer2));
|
||||
}
|
||||
else
|
||||
{
|
||||
TxPwer2 = (TxPwer2 > 0xF) ? (0xF) : (TxPwer2);
|
||||
R4 |= (TxPwer2 << 7) | (1 << 6);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
R3 = (RFRegTable[index].R3 & 0xffffc1ff) | (TxPwer << 9); /* set TX power0*/
|
||||
R4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pAd->RfFreqOffset << 15) | (TxPwer2 <<6);/* Set freq Offset & TxPwr1*/
|
||||
}
|
||||
|
||||
/* Based on BBP current mode before changing RF channel.*/
|
||||
if (!bScan && (pAd->CommonCfg.BBPCurrentBW == BW_40)
|
||||
#ifdef GREENAP_SUPPORT
|
||||
&& (pAd->ApCfg.bGreenAPActive == 0)
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
)
|
||||
{
|
||||
R4 |=0x200000;
|
||||
}
|
||||
|
||||
/* Update variables*/
|
||||
pAd->LatchRfRegs.Channel = Channel;
|
||||
pAd->hw_cfg.lan_gain = GET_LNA_GAIN(pAd);
|
||||
pAd->LatchRfRegs.R1 = RFRegTable[index].R1;
|
||||
pAd->LatchRfRegs.R2 = R2;
|
||||
pAd->LatchRfRegs.R3 = R3;
|
||||
pAd->LatchRfRegs.R4 = R4;
|
||||
|
||||
/* Set RF value 1's set R3[bit2] = [0]*/
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);
|
||||
RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04)));
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);
|
||||
|
||||
RtmpusecDelay(200);
|
||||
|
||||
/* Set RF value 2's set R3[bit2] = [1]*/
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);
|
||||
RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 | 0x04));
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);
|
||||
|
||||
RtmpusecDelay(200);
|
||||
|
||||
/* Set RF value 3's set R3[bit2] = [0]*/
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1);
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2);
|
||||
RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04)));
|
||||
RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, Pwr0=%lu, Pwr1=%lu, %dT) to , R1=0x%08x, R2=0x%08x, R3=0x%08x, R4=0x%08x\n",
|
||||
Channel,
|
||||
pAd->RfIcType,
|
||||
(R3 & 0x00003e00) >> 9,
|
||||
(R4 & 0x000007c0) >> 6,
|
||||
pAd->Antenna.field.TxPath,
|
||||
pAd->LatchRfRegs.R1,
|
||||
pAd->LatchRfRegs.R2,
|
||||
pAd->LatchRfRegs.R3,
|
||||
pAd->LatchRfRegs.R4));
|
||||
break;
|
||||
|
||||
default:
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d : unknown RFIC=%d\n", Channel, pAd->RfIcType));
|
||||
break;
|
||||
}
|
||||
|
||||
/* Change BBP setting during siwtch from a->g, g->a*/
|
||||
lan_gain = pAd->hw_cfg.lan_gain;
|
||||
if (Channel <= 14)
|
||||
{
|
||||
ULONG TxPinCfg = 0x00050F0A; /*Gary 2007/08/09 0x050A0A*/
|
||||
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0);/*(0x44 - lan_gain)); According the Rory's suggestion to solve the middle range issue.*/
|
||||
|
||||
/* Rx High power VGA offset for LNA select*/
|
||||
{
|
||||
if (pAd->NicConfig2.field.ExternalLNAForG)
|
||||
{
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x62);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46);
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x84);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50);
|
||||
}
|
||||
}
|
||||
|
||||
/* 5G band selection PIN, bit1 and bit2 are complement*/
|
||||
rtmp_mac_set_band(pAd, BAND_24G);
|
||||
|
||||
/* Turn off unused PA or LNA when only 1T or 1R*/
|
||||
if (pAd->Antenna.field.TxPath == 1)
|
||||
TxPinCfg &= 0xFFFFFFF3;
|
||||
if (pAd->Antenna.field.RxPath == 1)
|
||||
TxPinCfg &= 0xFFFFF3FF;
|
||||
RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);
|
||||
|
||||
filter_coefficient_ctrl(pAd, Channel);
|
||||
}
|
||||
else
|
||||
{
|
||||
ULONG TxPinCfg = 0x00050F05;/*Gary 2007/8/9 0x050505*/
|
||||
UINT8 bbpValue;
|
||||
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - lan_gain));
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0); /*(0x44 - lan_gain)); According the Rory's suggestion to solve the middle range issue. */
|
||||
|
||||
/* Set the BBP_R82 value here */
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0xF2);
|
||||
|
||||
|
||||
/* Rx High power VGA offset for LNA select*/
|
||||
bbpValue = (pAd->NicConfig2.field.ExternalLNAForA) ? 0x46 : 0x50;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, bbpValue);
|
||||
|
||||
/* 5G band selection PIN, bit1 and bit2 are complement*/
|
||||
rtmp_mac_set_band(pAd, BAND_5G);
|
||||
|
||||
/* Turn off unused PA or LNA when only 1T or 1R*/
|
||||
if (pAd->Antenna.field.TxPath == 1)
|
||||
TxPinCfg &= 0xFFFFFFF3;
|
||||
if (pAd->Antenna.field.RxPath == 1)
|
||||
TxPinCfg &= 0xFFFFF3FF;
|
||||
RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);
|
||||
}
|
||||
|
||||
/*
|
||||
On 11A, We should delay and wait RF/BBP to be stable
|
||||
and the appropriate time should be 1000 micro seconds
|
||||
005/06/05 - On 11G, We also need this delay time. Otherwise it's difficult to pass the WHQL.
|
||||
|
||||
*/
|
||||
RtmpusecDelay(1000);
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xx_chip_Init(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
rtmp_phy_probe(pAd);
|
||||
pAd->ChipOps.ChipSwitchChannel = RT28xx_ChipSwitchChannel;
|
||||
}
|
||||
|
||||
#endif /*RT28xx */
|
||||
|
||||
@ -0,0 +1,29 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt65xx.c
|
||||
|
||||
Abstract:
|
||||
Specific funcitons and configurations for RT65xx
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
@ -0,0 +1,539 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt_chip.c
|
||||
|
||||
Abstract:
|
||||
Ralink Wireless driver CHIP related functions
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
BOOLEAN rt28xx_eeprom_read16(RTMP_ADAPTER *pAd, USHORT offset, USHORT *value)
|
||||
{
|
||||
if (pAd->chipOps.eeread) {
|
||||
return pAd->chipOps.eeread(pAd, offset, value);
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
write high memory.
|
||||
if firmware do not support auto high/low memory switching, we should switch to high memory by ourself.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Offset - Memory offsets
|
||||
Value - Written value
|
||||
Unit - Unit in "Byte"
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RtmpChipWriteHighMemory(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN USHORT Offset,
|
||||
IN UINT32 Value,
|
||||
IN UINT8 Unit)
|
||||
{
|
||||
#ifdef RTMP_MAC_PCI
|
||||
#endif /* RTMP_MAC_PCI */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
write memory
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
Offset - Memory offsets
|
||||
Value - Written value
|
||||
Unit - Unit in "Byte"
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RtmpChipWriteMemory(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN USHORT Offset,
|
||||
IN UINT32 Value,
|
||||
IN UINT8 Unit)
|
||||
{
|
||||
switch(Unit)
|
||||
{
|
||||
case 1:
|
||||
RTMP_IO_WRITE8(pAd, Offset, Value);
|
||||
break;
|
||||
case 2:
|
||||
RTMP_IO_WRITE16(pAd, Offset, Value);
|
||||
break;
|
||||
case 4:
|
||||
RTMP_IO_WRITE32(pAd, Offset, Value);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize specific beacon frame architecture.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RtmpChipBcnSpecInit(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize normal beacon frame architecture.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RtmpChipBcnInit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;
|
||||
|
||||
|
||||
pChipCap->FlgIsSupSpecBcnBuf = FALSE;
|
||||
pChipCap->BcnMaxHwNum = 8;
|
||||
pChipCap->BcnMaxNum = (pChipCap->BcnMaxHwNum - MAX_MESH_NUM - MAX_APCLI_NUM);
|
||||
pChipCap->BcnMaxHwSize = 0x1000;
|
||||
|
||||
pChipCap->BcnBase[0] = 0x7800;
|
||||
pChipCap->BcnBase[1] = 0x7A00;
|
||||
pChipCap->BcnBase[2] = 0x7C00;
|
||||
pChipCap->BcnBase[3] = 0x7E00;
|
||||
pChipCap->BcnBase[4] = 0x7200;
|
||||
pChipCap->BcnBase[5] = 0x7400;
|
||||
pChipCap->BcnBase[6] = 0x5DC0;
|
||||
pChipCap->BcnBase[7] = 0x5BC0;
|
||||
|
||||
/*
|
||||
If the MAX_MBSSID_NUM is larger than 6,
|
||||
it shall reserve some WCID space(wcid 222~253) for beacon frames.
|
||||
- these wcid 238~253 are reserved for beacon#6(ra6).
|
||||
- these wcid 222~237 are reserved for beacon#7(ra7).
|
||||
*/
|
||||
if (pChipCap->BcnMaxNum == 8)
|
||||
pChipCap->WcidHwRsvNum = 222;
|
||||
else if (pChipCap->BcnMaxNum == 7)
|
||||
pChipCap->WcidHwRsvNum = 238;
|
||||
else
|
||||
pChipCap->WcidHwRsvNum = 255;
|
||||
|
||||
pAd->chipOps.BeaconUpdate = RtmpChipWriteMemory;
|
||||
}
|
||||
|
||||
|
||||
#ifdef MT_MAC
|
||||
VOID mt_bcn_buf_init(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;
|
||||
|
||||
pChipCap->FlgIsSupSpecBcnBuf = FALSE;
|
||||
pChipCap->BcnMaxHwNum = 16;
|
||||
pChipCap->BcnMaxNum = 16;
|
||||
|
||||
#if defined(MT7603_FPGA) || defined(MT7628_FPGA) || defined(MT7636_FPGA)
|
||||
pChipCap->WcidHwRsvNum = 20;
|
||||
#else
|
||||
pChipCap->WcidHwRsvNum = 127;
|
||||
#endif /* MT7603_FPGA */
|
||||
pChipCap->BcnMaxHwSize = 0x2000; // useless!!
|
||||
|
||||
pChipCap->BcnBase[0] = 0;
|
||||
pChipCap->BcnBase[1] = 0;
|
||||
pChipCap->BcnBase[2] = 0;
|
||||
pChipCap->BcnBase[3] = 0;
|
||||
pChipCap->BcnBase[4] = 0;
|
||||
pChipCap->BcnBase[5] = 0;
|
||||
pChipCap->BcnBase[6] = 0;
|
||||
pChipCap->BcnBase[7] = 0;
|
||||
pChipCap->BcnBase[8] = 0;
|
||||
pChipCap->BcnBase[9] = 0;
|
||||
pChipCap->BcnBase[10] = 0;
|
||||
pChipCap->BcnBase[11] = 0;
|
||||
pChipCap->BcnBase[12] = 0;
|
||||
pChipCap->BcnBase[13] = 0;
|
||||
pChipCap->BcnBase[14] = 0;
|
||||
pChipCap->BcnBase[15] = 0;
|
||||
|
||||
#ifdef CONFIG_MULTI_CHANNEL
|
||||
/* Record HW Null Frame offset */
|
||||
pAd->NullBufOffset[0] = 0;
|
||||
pAd->NullBufOffset[1] = 0;
|
||||
#endif /* CONFIG_MULTI_CHANNEL */
|
||||
|
||||
pAd->chipOps.BeaconUpdate = NULL;
|
||||
|
||||
// TODO: shiang-7603
|
||||
if (pAd->chipCap.hif_type == HIF_MT) {
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s(%d): Not support for HIF_MT yet!\n",
|
||||
__FUNCTION__, __LINE__));
|
||||
}
|
||||
|
||||
}
|
||||
#endif /* MT_MAC */
|
||||
|
||||
|
||||
#ifdef RLT_MAC
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize specific beacon frame architecture.
|
||||
|
||||
Arguments:
|
||||
pAd - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID rlt_bcn_buf_init(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;
|
||||
|
||||
pChipCap->FlgIsSupSpecBcnBuf = FALSE;
|
||||
{
|
||||
pChipCap->BcnMaxHwNum = 16;
|
||||
pChipCap->WcidHwRsvNum = 255;
|
||||
}
|
||||
|
||||
/*
|
||||
In 16-MBSS support mode, if AP-Client is enabled,
|
||||
the last 8-MBSS would be occupied for AP-Client using.
|
||||
*/
|
||||
#ifdef APCLI_SUPPORT
|
||||
pChipCap->BcnMaxNum = (8 - MAX_MESH_NUM);
|
||||
#else
|
||||
pChipCap->BcnMaxNum = (pChipCap->BcnMaxHwNum - MAX_MESH_NUM);
|
||||
#endif /* APCLI_SUPPORT */
|
||||
|
||||
pChipCap->BcnMaxHwSize = 0x2000;
|
||||
|
||||
pChipCap->BcnBase[0] = 0xc000;
|
||||
pChipCap->BcnBase[1] = 0xc200;
|
||||
pChipCap->BcnBase[2] = 0xc400;
|
||||
pChipCap->BcnBase[3] = 0xc600;
|
||||
pChipCap->BcnBase[4] = 0xc800;
|
||||
pChipCap->BcnBase[5] = 0xca00;
|
||||
pChipCap->BcnBase[6] = 0xcc00;
|
||||
pChipCap->BcnBase[7] = 0xce00;
|
||||
pChipCap->BcnBase[8] = 0xd000;
|
||||
pChipCap->BcnBase[9] = 0xd200;
|
||||
pChipCap->BcnBase[10] = 0xd400;
|
||||
pChipCap->BcnBase[11] = 0xd600;
|
||||
pChipCap->BcnBase[12] = 0xd800;
|
||||
pChipCap->BcnBase[13] = 0xda00;
|
||||
pChipCap->BcnBase[14] = 0xdc00;
|
||||
pChipCap->BcnBase[15] = 0xde00;
|
||||
|
||||
#ifdef CONFIG_MULTI_CHANNEL
|
||||
/* Record HW Null Frame offset */
|
||||
//pAd->NullBufOffset[0] = 0xd000;
|
||||
pAd->NullBufOffset[0] = 0xd000;
|
||||
pAd->NullBufOffset[1] = 0xd200;
|
||||
#endif /* CONFIG_MULTI_CHANNEL */
|
||||
|
||||
pAd->chipOps.BeaconUpdate = RtmpChipWriteMemory;
|
||||
}
|
||||
#endif /* RLT_MAC */
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef HW_ANTENNA_DIVERSITY_SUPPORT
|
||||
UINT32 SetHWAntennaDivsersity(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN BOOLEAN Enable)
|
||||
{
|
||||
if (Enable == TRUE)
|
||||
{
|
||||
UINT8 BBPValue = 0, RFValue = 0;
|
||||
USHORT value;
|
||||
|
||||
// RF_R29 bit7:6
|
||||
RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_GAIN, value);
|
||||
|
||||
RT30xxReadRFRegister(pAd, RF_R29, &RFValue);
|
||||
RFValue &= 0x3f; // clear bit7:6
|
||||
RFValue |= (value << 6);
|
||||
RT30xxWriteRFRegister(pAd, RF_R29, RFValue);
|
||||
|
||||
// BBP_R47 bit7=1
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R47, &BBPValue);
|
||||
BBPValue |= 0x80;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R47, BBPValue);
|
||||
|
||||
BBPValue = 0xbe;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, BBPValue);
|
||||
BBPValue = 0xb0;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, BBPValue);
|
||||
BBPValue = 0x23;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, BBPValue);
|
||||
BBPValue = 0x3a;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R153, BBPValue);
|
||||
BBPValue = 0x10;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R154, BBPValue);
|
||||
BBPValue = 0x3b;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R155, BBPValue);
|
||||
BBPValue = 0x04;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R253, BBPValue);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("HwAnDi> Enable!\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT8 BBPValue = 0;
|
||||
|
||||
/*
|
||||
main antenna: BBP_R152 bit7=1
|
||||
aux antenna: BBP_R152 bit7=0
|
||||
*/
|
||||
if (pAd->FixDefaultAntenna == 0)
|
||||
{
|
||||
/* fix to main antenna */
|
||||
/* do not care BBP R153, R155, R253 */
|
||||
BBPValue = 0x3e;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, BBPValue);
|
||||
BBPValue = 0x30;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, BBPValue);
|
||||
BBPValue = 0x23;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, BBPValue);
|
||||
BBPValue = 0x00;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R154, BBPValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* fix to aux antenna */
|
||||
/* do not care BBP R153, R155, R253 */
|
||||
BBPValue = 0x3e;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R150, BBPValue);
|
||||
BBPValue = 0x30;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R151, BBPValue);
|
||||
BBPValue = 0xa3;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R152, BBPValue);
|
||||
BBPValue = 0x00;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R154, BBPValue);
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("HwAnDi> Disable!\n"));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif // HW_ANTENNA_DIVERSITY_SUPPORT //
|
||||
|
||||
|
||||
|
||||
|
||||
UINT8 NICGetBandSupported(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
if (BOARD_IS_5G_ONLY(pAd))
|
||||
{
|
||||
return RFIC_5GHZ;
|
||||
}
|
||||
else if (BOARD_IS_2G_ONLY(pAd))
|
||||
{
|
||||
return RFIC_24GHZ;
|
||||
}
|
||||
else if (RFIC_IS_5G_BAND(pAd))
|
||||
{
|
||||
return RFIC_DUAL_BAND;
|
||||
}
|
||||
else
|
||||
return RFIC_24GHZ;
|
||||
}
|
||||
|
||||
|
||||
INT WaitForAsicReady(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
// TODO: shiang-7603
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT AsicGetMacVersion(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UINT32 reg = 0;
|
||||
|
||||
// TODO: shiang-7603
|
||||
if (pAd->chipCap.hif_type == HIF_MT) {
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s(%d): Not support for HIF_MT yet!\n",
|
||||
__FUNCTION__, __LINE__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
reg = MAC_CSR0;
|
||||
|
||||
#endif /* defined(RTMP_MAC) || defined(RLT_MAC) */
|
||||
|
||||
if (WaitForAsicReady(pAd) == TRUE)
|
||||
{
|
||||
RTMP_IO_READ32(pAd, reg, &pAd->MACVersion);
|
||||
DBGPRINT(RT_DEBUG_OFF, ("MACVersion[Ver:Rev]=0x%08x : 0x%08x\n",
|
||||
pAd->MACVersion, pAd->ChipID));
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s() failed!\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initialize chip related information.
|
||||
|
||||
Arguments:
|
||||
pCB - WLAN control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
int RtmpChipOpsHook(VOID *pCB)
|
||||
{
|
||||
RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pCB;
|
||||
RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC) || defined(RT65xx)
|
||||
UINT32 MacValue;
|
||||
#endif /* defined(RTMP_MAC) || defined(RLT_MAC) || defined(RT65xx) */
|
||||
int ret = 0;
|
||||
#ifdef GREENAP_SUPPORT
|
||||
RTMP_CHIP_OP *pChipOps = &pAd->chipOps;
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
|
||||
/* sanity check */
|
||||
if (WaitForAsicReady(pAd) == FALSE)
|
||||
return -1;
|
||||
|
||||
// TODO: shiang-7603
|
||||
if (IS_MT7603(pAd) || IS_MT7628(pAd)) {
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(%d): Not support for HIF_MT yet!\n",
|
||||
__FUNCTION__, __LINE__));
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined(RTMP_MAC) || defined(RLT_MAC)
|
||||
RTMP_IO_READ32(pAd, MAC_CSR0, &MacValue);
|
||||
pAd->MACVersion = MacValue;
|
||||
#endif /* defined(RTMP_MAC) || defined(RLT_MAC) */
|
||||
}
|
||||
|
||||
if (pAd->MACVersion == 0xffffffff)
|
||||
return -1;
|
||||
|
||||
|
||||
/* default init */
|
||||
RTMP_DRS_ALG_INIT(pAd, RATE_ALG_LEGACY);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef MT7603
|
||||
if (IS_MT7603(pAd)) {
|
||||
mt7603_init(pAd);
|
||||
goto done;
|
||||
}
|
||||
#endif /* MT7603 */
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef GREENAP_SUPPORT
|
||||
#if defined (MT7603) || defined (MT7628)
|
||||
pChipOps->EnableAPMIMOPS = EnableAPMIMOPSv2;
|
||||
pChipOps->DisableAPMIMOPS = DisableAPMIMOPSv2;
|
||||
#else
|
||||
pChipOps->EnableAPMIMOPS = EnableAPMIMOPSv1;
|
||||
pChipOps->DisableAPMIMOPS = DisableAPMIMOPSv1;
|
||||
#endif
|
||||
#endif /* GREENAP_SUPPORT */
|
||||
|
||||
#ifdef RTMP_MAC
|
||||
// TODO: default settings for rest of the chips!! change this to really default chip.
|
||||
RTxx_default_Init(pAd);
|
||||
#endif /* RTMP_MAC */
|
||||
|
||||
/* We depends on RfICType and MACVersion to assign the corresponding operation callbacks. */
|
||||
|
||||
|
||||
|
||||
done:
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Chip specific bbpRegTbSize=%d!\n", pChipCap->bbpRegTbSize));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Chip VCO calibration mode = %d!\n", pChipCap->FlgIsVcoReCalMode));
|
||||
#ifdef DOT11W_PMF_SUPPORT
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("[PMF] Encryption mode = %d\n", pChipCap->FlgPMFEncrtptMode));
|
||||
#endif /* DOT11W_PMF_SUPPORT */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
395
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/chips/rtxx_dft.c
Normal file
395
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/chips/rtxx_dft.c
Normal file
@ -0,0 +1,395 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtxx_dft.c
|
||||
|
||||
Abstract:
|
||||
Ralink Wireless driver chip default init functions
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
|
||||
FREQUENCY_ITEM RtmpFreqItems3020[] =
|
||||
{
|
||||
/* ISM : 2.4 to 2.483 GHz, 11g */
|
||||
/*-CH---N-------R---K-----------*/
|
||||
{1, 241, 2, 2},
|
||||
{2, 241, 2, 7},
|
||||
{3, 242, 2, 2},
|
||||
{4, 242, 2, 7},
|
||||
{5, 243, 2, 2},
|
||||
{6, 243, 2, 7},
|
||||
{7, 244, 2, 2},
|
||||
{8, 244, 2, 7},
|
||||
{9, 245, 2, 2},
|
||||
{10, 245, 2, 7},
|
||||
{11, 246, 2, 2},
|
||||
{12, 246, 2, 7},
|
||||
{13, 247, 2, 2},
|
||||
{14, 248, 2, 4},
|
||||
};
|
||||
|
||||
FREQUENCY_ITEM FreqItems3020_Xtal20M[] =
|
||||
{
|
||||
/*
|
||||
* RF_R08:
|
||||
* <7:0>: pll_N<7:0>
|
||||
*
|
||||
* RF_R09:
|
||||
* <3:0>: pll_K<3:0>
|
||||
* <4>: pll_N<8>
|
||||
* <7:5>pll_N<11:9>
|
||||
*
|
||||
*/
|
||||
/*-CH---N--------R---N[7:4]K[3:0]------*/
|
||||
{1, 0xE2, 2, 0x14},
|
||||
{2, 0xE3, 2, 0x14},
|
||||
{3, 0xE4, 2, 0x14},
|
||||
{4, 0xE5, 2, 0x14},
|
||||
{5, 0xE6, 2, 0x14},
|
||||
{6, 0xE7, 2, 0x14},
|
||||
{7, 0xE8, 2, 0x14},
|
||||
{8, 0xE9, 2, 0x14},
|
||||
{9, 0xEA, 2, 0x14},
|
||||
{10, 0xEB, 2, 0x14},
|
||||
{11, 0xEC, 2, 0x14},
|
||||
{12, 0xED, 2, 0x14},
|
||||
{13, 0xEE, 2, 0x14},
|
||||
{14, 0xF0, 2, 0x18},
|
||||
};
|
||||
|
||||
UCHAR NUM_OF_3020_CHNL = (sizeof(RtmpFreqItems3020) / sizeof(FREQUENCY_ITEM));
|
||||
|
||||
FREQUENCY_ITEM *FreqItems3020 = RtmpFreqItems3020;
|
||||
|
||||
|
||||
#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)
|
||||
|
||||
/* The Tx power tuning entry*/
|
||||
const TX_POWER_TUNING_ENTRY_STRUCT TxPowerTuningTableOrg[] =
|
||||
{
|
||||
/* idxTxPowerTable Tx power control over RF Tx power control over MAC*/
|
||||
/* (zero-based array) { RF R12[4:0]: Tx0 ALC}, {MAC 0x1314~0x1324}*/
|
||||
/* 0 */ {0x00, -15},
|
||||
/* 1 */ {0x01, -15},
|
||||
/* 2 */ {0x00, -14},
|
||||
/* 3 */ {0x01, -14},
|
||||
/* 4 */ {0x00, -13},
|
||||
/* 5 */ {0x01, -13},
|
||||
/* 6 */ {0x00, -12},
|
||||
/* 7 */ {0x01, -12},
|
||||
/* 8 */ {0x00, -11},
|
||||
/* 9 */ {0x01, -11},
|
||||
/* 10 */ {0x00, -10},
|
||||
/* 11 */ {0x01, -10},
|
||||
/* 12 */ {0x00, -9},
|
||||
/* 13 */ {0x01, -9},
|
||||
/* 14 */ {0x00, -8},
|
||||
/* 15 */ {0x01, -8},
|
||||
/* 16 */ {0x00, -7},
|
||||
/* 17 */ {0x01, -7},
|
||||
/* 18 */ {0x00, -6},
|
||||
/* 19 */ {0x01, -6},
|
||||
/* 20 */ {0x00, -5},
|
||||
/* 21 */ {0x01, -5},
|
||||
/* 22 */ {0x00, -4},
|
||||
/* 23 */ {0x01, -4},
|
||||
/* 24 */ {0x00, -3},
|
||||
/* 25 */ {0x01, -3},
|
||||
/* 26 */ {0x00, -2},
|
||||
/* 27 */ {0x01, -2},
|
||||
/* 28 */ {0x00, -1},
|
||||
/* 29 */ {0x01, -1},
|
||||
/* 30 */ {0x00, 0},
|
||||
/* 31 */ {0x01, 0},
|
||||
/* 32 */ {0x02, 0},
|
||||
/* 33 */ {0x03, 0},
|
||||
/* 34 */ {0x04, 0},
|
||||
/* 35 */ {0x05, 0},
|
||||
/* 36 */ {0x06, 0},
|
||||
/* 37 */ {0x07, 0},
|
||||
/* 38 */ {0x08, 0},
|
||||
/* 39 */ {0x09, 0},
|
||||
/* 40 */ {0x0A, 0},
|
||||
/* 41 */ {0x0B, 0},
|
||||
/* 42 */ {0x0C, 0},
|
||||
/* 43 */ {0x0D, 0},
|
||||
/* 44 */ {0x0E, 0},
|
||||
/* 45 */ {0x0F, 0},
|
||||
/* 46 */ {0x0F-1, 1},
|
||||
/* 47 */ {0x0F, 1},
|
||||
/* 48 */ {0x0F-1, 2},
|
||||
/* 49 */ {0x0F, 2},
|
||||
/* 50 */ {0x0F-1, 3},
|
||||
/* 51 */ {0x0F, 3},
|
||||
/* 52 */ {0x0F-1, 4},
|
||||
/* 53 */ {0x0F, 4},
|
||||
/* 54 */ {0x0F-1, 5},
|
||||
/* 55 */ {0x0F, 5},
|
||||
/* 56 */ {0x0F-1, 6},
|
||||
/* 57 */ {0x0F, 6},
|
||||
/* 58 */ {0x0F-1, 7},
|
||||
/* 59 */ {0x0F, 7},
|
||||
/* 60 */ {0x0F-1, 8},
|
||||
/* 61 */ {0x0F, 8},
|
||||
/* 62 */ {0x0F-1, 9},
|
||||
/* 63 */ {0x0F, 9},
|
||||
/* 64 */ {0x0F-1, 10},
|
||||
/* 65 */ {0x0F, 10},
|
||||
/* 66 */ {0x0F-1, 11},
|
||||
/* 67 */ {0x0F, 11},
|
||||
/* 68 */ {0x0F-1, 12},
|
||||
/* 69 */ {0x0F, 12},
|
||||
/* 70 */ {0x0F-1, 13},
|
||||
/* 71 */ {0x0F, 13},
|
||||
/* 72 */ {0x0F-1, 14},
|
||||
/* 73 */ {0x0F, 14},
|
||||
/* 74 */ {0x0F-1, 15},
|
||||
/* 75 */ {0x0F, 15},
|
||||
};
|
||||
#endif /* RTMP_INTERNAL_TX_ALC || RTMP_TEMPERATURE_COMPENSATION */
|
||||
|
||||
|
||||
|
||||
|
||||
static VOID RxSensitivityTuning(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UCHAR R66 = 0x26 + pAd->hw_cfg.lan_gain;
|
||||
|
||||
#ifdef CONFIG_ATE
|
||||
if (ATE_ON(pAd))
|
||||
{
|
||||
ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
|
||||
}
|
||||
else
|
||||
#endif /* CONFIG_ATE */
|
||||
{
|
||||
bbp_set_agc(pAd, R66, RX_CHAIN_ALL);
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE,("turn off R17 tuning, restore to 0x%02x\n", R66));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static VOID ChipBBPAdjust(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UCHAR bbp_val;
|
||||
UINT8 rf_bw, ext_ch;
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if (get_ht_cent_ch(pAd, &rf_bw, &ext_ch) == FALSE)
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
{
|
||||
rf_bw = BW_20;
|
||||
ext_ch = EXTCHA_NONE;
|
||||
pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
|
||||
}
|
||||
|
||||
bbp_set_bw(pAd, rf_bw);
|
||||
|
||||
/* TX/RX : control channel setting */
|
||||
rtmp_mac_set_ctrlch(pAd, ext_ch);
|
||||
bbp_set_ctrlch(pAd, ext_ch);
|
||||
|
||||
/* request by Gary 20070208 for middle and long range G Band*/
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if (rf_bw == BW_40)
|
||||
bbp_val = (pAd->CommonCfg.Channel > 14) ? 0x48 : 0x38;
|
||||
else
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
bbp_val = (pAd->CommonCfg.Channel > 14) ? 0x40 : 0x38;
|
||||
bbp_set_agc(pAd, bbp_val, RX_CHAIN_ALL);
|
||||
|
||||
|
||||
if (pAd->MACVersion == 0x28600100)
|
||||
{
|
||||
#ifdef RT28xx
|
||||
RT28xx_ch_tunning(pAd, BW_40);
|
||||
#endif /* RT28xx */
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x12);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x10);
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): BW_%s, ChannelWidth=%d, Channel=%d, ExtChanOffset=%d(%d) \n",
|
||||
__FUNCTION__, (rf_bw == BW_40 ? "40" : "20"),
|
||||
pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth,
|
||||
pAd->CommonCfg.Channel,
|
||||
pAd->CommonCfg.RegTransmitSetting.field.EXTCHA,
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset));
|
||||
|
||||
/* request by Gary 20070208 for middle and long range A Band*/
|
||||
if (pAd->CommonCfg.Channel > 14)
|
||||
bbp_val = 0x1D;
|
||||
else
|
||||
bbp_val = 0x2D;
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, bbp_val);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, bbp_val);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, bbp_val);
|
||||
/*RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, bbp_val);*/
|
||||
}
|
||||
|
||||
|
||||
static VOID Default_ChipSwitchChannel(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR Channel,
|
||||
IN BOOLEAN bScan)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): dummy channel switch function!\n", __FUNCTION__));
|
||||
|
||||
pAd->LatchRfRegs.Channel = Channel;
|
||||
pAd->hw_cfg.lan_gain = GET_LNA_GAIN(pAd);
|
||||
}
|
||||
|
||||
|
||||
static VOID Default_ChipAGCInit(RTMP_ADAPTER *pAd, UCHAR BandWidth)
|
||||
{
|
||||
UCHAR R66 = 0x30, lan_gain;
|
||||
|
||||
|
||||
lan_gain = pAd->hw_cfg.lan_gain;
|
||||
if (pAd->LatchRfRegs.Channel <= 14)
|
||||
{ // BG band
|
||||
{
|
||||
R66 = 0x2E + lan_gain;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ //A band
|
||||
{
|
||||
if (BandWidth == BW_20)
|
||||
R66 = (UCHAR)(0x32 + (lan_gain * 5) / 3);
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
else
|
||||
R66 = (UCHAR)(0x3A + (lan_gain * 5) / 3);
|
||||
#endif // DOT11_N_SUPPORT //
|
||||
}
|
||||
}
|
||||
bbp_set_agc(pAd, R66, RX_CHAIN_ALL);
|
||||
|
||||
}
|
||||
|
||||
|
||||
static VOID AsicAntennaDefaultReset(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN EEPROM_ANTENNA_STRUC *pAntenna)
|
||||
{
|
||||
{
|
||||
|
||||
pAntenna->word = 0;
|
||||
pAntenna->field.RfIcType = RFIC_2820;
|
||||
pAntenna->field.TxPath = 1;
|
||||
pAntenna->field.RxPath = 2;
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", pAntenna->word));
|
||||
}
|
||||
|
||||
|
||||
VOID NetDevNickNameInit(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
VOID RTxx_default_Init(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
RTMP_CHIP_OP *pChipOps = &pAd->chipOps;
|
||||
RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;
|
||||
|
||||
|
||||
/* init default value whatever chipsets */
|
||||
/* default pChipOps content will be 0x00 */
|
||||
pChipCap->bbpRegTbSize = 0;
|
||||
pChipCap->MaxNumOfRfId = 31;
|
||||
pChipCap->MaxNumOfBbpId = 136;
|
||||
pChipCap->SnrFormula = SNR_FORMULA1;
|
||||
pChipCap->RfReg17WtMethod = RF_REG_WT_METHOD_NONE;
|
||||
pChipCap->TXWISize = 16;
|
||||
pChipCap->RXWISize = 16;
|
||||
#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)
|
||||
pChipCap->TxPowerTuningTable_2G = TxPowerTuningTableOrg;
|
||||
#ifdef A_BAND_SUPPORT
|
||||
pChipCap->TxPowerTuningTable_5G = TxPowerTuningTableOrg;
|
||||
#endif /* A_BAND_SUPPORT */
|
||||
#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) */
|
||||
pChipOps->AsicMacInit = NULL;
|
||||
pChipOps->AsicBbpInit = NULL;
|
||||
pChipOps->AsicRfInit = NULL;
|
||||
|
||||
#ifdef RTMP_EFUSE_SUPPORT
|
||||
pChipCap->EFUSE_USAGE_MAP_START = 0x2d0;
|
||||
pChipCap->EFUSE_USAGE_MAP_END = 0x2fc;
|
||||
pChipCap->EFUSE_USAGE_MAP_SIZE = 45;
|
||||
pChipCap->EFUSE_RESERVED_SIZE = pChipCap->EFUSE_USAGE_MAP_SIZE - 5;
|
||||
#endif /* RTMP_EFUSE_SUPPORT */
|
||||
|
||||
pChipCap->VcoPeriod = 10;
|
||||
pChipCap->FlgIsVcoReCalMode = VCO_CAL_DISABLE;
|
||||
pChipCap->WPDMABurstSIZE = 2; /* default 64B */
|
||||
pChipCap->MBSSIDMode = MBSSID_MODE0;
|
||||
|
||||
#ifdef DOT11W_PMF_SUPPORT
|
||||
pChipCap->FlgPMFEncrtptMode = PMF_ENCRYPT_MODE_0;
|
||||
#endif /* DOT11W_PMF_SUPPORT */
|
||||
|
||||
RtmpChipBcnInit(pAd);
|
||||
|
||||
pChipOps->RxSensitivityTuning = RxSensitivityTuning;
|
||||
pChipOps->ChipBBPAdjust = ChipBBPAdjust;
|
||||
pChipOps->ChipSwitchChannel = Default_ChipSwitchChannel;
|
||||
|
||||
/* TX ALC */
|
||||
pChipCap->bTempCompTxALC = FALSE;
|
||||
pChipOps->AsicGetTxPowerOffset = NULL;
|
||||
pChipOps->InitDesiredTSSITable = NULL;
|
||||
pChipOps->AsicTxAlcGetAutoAgcOffset = NULL;
|
||||
pChipOps->AsicExtraPowerOverMAC = NULL;
|
||||
pChipOps->AsicAdjustTxPower = AsicAdjustTxPower;
|
||||
|
||||
pChipOps->ChipAGCInit = Default_ChipAGCInit;
|
||||
pChipOps->AsicAntennaDefaultReset = AsicAntennaDefaultReset;
|
||||
pChipOps->NetDevNickNameInit = NetDevNickNameInit;
|
||||
/* Init value. If pChipOps->AsicResetBbpAgent==NULL, "AsicResetBbpAgent" as default. If your chipset has specific routine, please re-hook it at self init function */
|
||||
pChipOps->AsicResetBbpAgent = NULL;
|
||||
|
||||
pChipOps->InitTemperCompensation = NULL;
|
||||
pChipOps->TemperCompensation = NULL;
|
||||
|
||||
#ifdef RT28xx
|
||||
RT28xx_chip_Init(pAd);
|
||||
#endif /* RT28xx */
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
pChipCap->carrier_func = DISABLE_TONE_RADAR;
|
||||
pChipOps->ToneRadarProgram = NULL;
|
||||
#endif /* CARRIER_DETECTOIN_SUPPORT */
|
||||
#ifdef DFS_SUPPORT
|
||||
pChipCap->DfsEngineNum = 4;
|
||||
#endif /* DFS_SUPPORT */
|
||||
pChipOps->CckMrcStatusCtrl = NULL;
|
||||
pChipOps->RadarGLRTCompensate = NULL;
|
||||
}
|
||||
|
||||
Binary file not shown.
731
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/a4_conn.c
Normal file
731
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/a4_conn.c
Normal file
@ -0,0 +1,731 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2009, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
|
||||
Module Name:
|
||||
a4_conn.c
|
||||
|
||||
Abstract:
|
||||
This is A4 connection function used to process those 4-addr of connected APClient or STA.
|
||||
Used by MWDS and MAP feature
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
--------- ---------- ----------------------------------------------
|
||||
*/
|
||||
#ifdef A4_CONN
|
||||
#include "rt_config.h"
|
||||
|
||||
#define ETH_TYPE_VLAN 0x8100
|
||||
#define ETH_TYPE_IPv4 0x0800
|
||||
#define ETH_TYPE_IPv6 0x86dd
|
||||
#define ETH_TYPE_ARP 0x0806
|
||||
#define ETH_TYPE_EAPOL 0x888e
|
||||
#define ETH_TYPE_WAI 0x88b4
|
||||
|
||||
BOOLEAN a4_interface_init(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN BOOLEAN is_ap,
|
||||
IN UCHAR a4_type
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
BOOLEAN add_inf = FALSE;
|
||||
|
||||
if (is_ap) {
|
||||
if (if_index >= HW_BEACON_MAX_NUM)
|
||||
return FALSE;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
if (mbss->a4_init == 0) {
|
||||
NdisAllocateSpinLock(adapter, &mbss->a4_entry_lock);
|
||||
DlListInit(&mbss->a4_entry_list);
|
||||
RoutingTabInit(adapter, if_index, ROUTING_ENTRY_A4);
|
||||
add_inf = TRUE;
|
||||
}
|
||||
mbss->a4_init |= (1 << a4_type);
|
||||
}
|
||||
#ifdef APCLI_SUPPORT
|
||||
else {
|
||||
PAPCLI_STRUCT apcli_entry;
|
||||
|
||||
if (if_index >= MAX_APCLI_NUM)
|
||||
return FALSE;
|
||||
apcli_entry = &adapter->ApCfg.ApCliTab[if_index];
|
||||
if (apcli_entry->a4_init == 0)
|
||||
add_inf = TRUE;
|
||||
apcli_entry->a4_init |= (1 << a4_type);
|
||||
}
|
||||
#else
|
||||
else
|
||||
return FALSE;
|
||||
#endif
|
||||
|
||||
if (add_inf)
|
||||
adapter->a4_interface_count++;
|
||||
|
||||
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("a4_interface_init a4_interface_count: %d\n",
|
||||
adapter->a4_interface_count));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_interface_deinit(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN BOOLEAN is_ap,
|
||||
IN UCHAR a4_type
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL, pConnEntryTmp = NULL;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
PMAC_TABLE_ENTRY entry = NULL;
|
||||
BOOLEAN delete_inf = FALSE;
|
||||
|
||||
if (is_ap) {
|
||||
if (if_index >= HW_BEACON_MAX_NUM)
|
||||
return FALSE;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
if (mbss->a4_init) {
|
||||
a4_entry_list = &mbss->a4_entry_list;
|
||||
DlListForEachSafe(a4_entry, pConnEntryTmp, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry) {
|
||||
entry = &adapter->MacTab.Content[a4_entry->wcid];
|
||||
a4_ap_peer_disable(adapter, entry, a4_type);
|
||||
}
|
||||
}
|
||||
|
||||
mbss->a4_init &= ~(1 << a4_type);
|
||||
if (!mbss->a4_init) {
|
||||
NdisFreeSpinLock(&mbss->a4_entry_lock);
|
||||
RoutingTabDestory(adapter, if_index, ROUTING_ENTRY_A4);
|
||||
delete_inf = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef APCLI_SUPPORT
|
||||
else {
|
||||
PAPCLI_STRUCT apcli_entry;
|
||||
|
||||
if (if_index >= MAX_APCLI_NUM)
|
||||
return FALSE;
|
||||
apcli_entry = &adapter->ApCfg.ApCliTab[if_index];
|
||||
if (apcli_entry->a4_init) {
|
||||
apcli_entry->a4_init &= ~(1 << a4_type);
|
||||
if (!apcli_entry->a4_init)
|
||||
delete_inf = TRUE;
|
||||
}
|
||||
}
|
||||
#else
|
||||
else
|
||||
return FALSE;
|
||||
#endif
|
||||
|
||||
if (delete_inf)
|
||||
adapter->a4_interface_count--;
|
||||
|
||||
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("a4_interface_init a4_interface_count: %d\n",
|
||||
adapter->a4_interface_count));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
INT a4_get_entry_count(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index
|
||||
)
|
||||
{
|
||||
int count = 0;
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
|
||||
if (if_index >= HW_BEACON_MAX_NUM)
|
||||
return 0;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
|
||||
if (!mbss->a4_init)
|
||||
return 0;
|
||||
|
||||
count = DlListLen(&mbss->a4_entry_list);
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_lookup_entry_by_wcid(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN UCHAR wcid
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
BOOLEAN found = FALSE;
|
||||
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return FALSE;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
a4_entry_list = &mbss->a4_entry_list;
|
||||
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry &&
|
||||
a4_entry->valid &&
|
||||
(a4_entry->wcid == wcid)) {
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_lookup_entry_by_addr(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN PUCHAR mac_addr
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
PMAC_TABLE_ENTRY entry = NULL;
|
||||
BOOLEAN found = FALSE;
|
||||
|
||||
if ((a4_get_entry_count(adapter, if_index) == 0) ||
|
||||
(mac_addr == NULL))
|
||||
return FALSE;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
a4_entry_list = &mbss->a4_entry_list;
|
||||
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry && a4_entry->valid && VALID_WCID(a4_entry->wcid)) {
|
||||
entry = &adapter->MacTab.Content[a4_entry->wcid];
|
||||
|
||||
if (MAC_ADDR_EQUAL(mac_addr, entry->Addr)) {
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
VOID a4_add_entry(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN UCHAR wcid
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
|
||||
if (a4_lookup_entry_by_wcid(adapter, if_index, wcid))
|
||||
return;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
os_alloc_mem(adapter, (UCHAR **)&a4_entry, sizeof(A4_CONNECT_ENTRY));
|
||||
|
||||
if (a4_entry) {
|
||||
NdisZeroMemory(a4_entry, sizeof(A4_CONNECT_ENTRY));
|
||||
a4_entry->valid = 1;
|
||||
a4_entry->wcid = wcid;
|
||||
RTMP_SEM_LOCK(&mbss->a4_entry_lock);
|
||||
DlListAddTail(&mbss->a4_entry_list, &a4_entry->List);
|
||||
RTMP_SEM_UNLOCK(&mbss->a4_entry_lock);
|
||||
} else
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
|
||||
("%s: Fail to alloc memory for pNewConnEntry\n", __func__));
|
||||
}
|
||||
|
||||
|
||||
VOID a4_delete_entry(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN UCHAR wcid
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
a4_entry_list = &mbss->a4_entry_list;
|
||||
RTMP_SEM_LOCK(&mbss->a4_entry_lock);
|
||||
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry &&
|
||||
a4_entry->valid &&
|
||||
(a4_entry->wcid == wcid)) {
|
||||
DlListDel(&a4_entry->List);
|
||||
os_free_mem(adapter, a4_entry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_SEM_UNLOCK(&mbss->a4_entry_lock);
|
||||
}
|
||||
|
||||
|
||||
VOID a4_proxy_delete(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN PUCHAR mac_addr
|
||||
)
|
||||
{
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return;
|
||||
|
||||
RoutingTabSetOneFree(adapter, if_index, mac_addr, ROUTING_ENTRY_A4);
|
||||
}
|
||||
|
||||
BOOLEAN a4_get_dst_ip(void *pkt, unsigned char *ip)
|
||||
{
|
||||
UCHAR *pSrcBuf;
|
||||
UINT16 TypeLen;
|
||||
UINT32 type_len_idx = 12;
|
||||
UCHAR *ip_header = NULL;
|
||||
|
||||
pSrcBuf = pkt;
|
||||
TypeLen = (pSrcBuf[type_len_idx] << 8) | pSrcBuf[type_len_idx + 1];
|
||||
while (TypeLen == ETH_TYPE_VLAN) {
|
||||
type_len_idx += 2;
|
||||
TypeLen = (pSrcBuf[type_len_idx] << 8) | pSrcBuf[type_len_idx + 1];
|
||||
}
|
||||
if (TypeLen == ETH_TYPE_IPv4) {
|
||||
ip_header = &pSrcBuf[type_len_idx + 2];
|
||||
NdisCopyMemory(ip, ip_header + 16, 4);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOLEAN a4_proxy_lookup(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN PUCHAR mac_addr,
|
||||
IN BOOLEAN update_alive_time,
|
||||
IN BOOLEAN is_rx,
|
||||
OUT UCHAR *wcid
|
||||
)
|
||||
{
|
||||
#ifdef WAPP_SUPPORT
|
||||
UINT8 ip[4] = {0};
|
||||
#endif
|
||||
|
||||
*wcid = 0;
|
||||
|
||||
if (a4_get_entry_count(adapter, if_index) == 0) {
|
||||
#ifdef WAPP_SUPPORT
|
||||
if (!is_rx && a4_get_dst_ip(mac_addr, ip))
|
||||
wapp_send_a4_entry_missing(adapter, if_index, ip);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (RoutingTabLookup(adapter, if_index, mac_addr, update_alive_time, wcid) != NULL)
|
||||
return TRUE;
|
||||
else {
|
||||
#ifdef WAPP_SUPPORT
|
||||
if (!is_rx && a4_get_dst_ip(mac_addr, ip))
|
||||
wapp_send_a4_entry_missing(adapter, if_index, ip);
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID a4_proxy_update(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN UCHAR wcid,
|
||||
IN PUCHAR mac_addr,
|
||||
IN UINT32 ip /* ARP Sender IP*/
|
||||
)
|
||||
{
|
||||
UCHAR proxy_wcid = 0;
|
||||
BOOLEAN found = FALSE;
|
||||
PROUTING_ENTRY routing_entry = NULL;
|
||||
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return;
|
||||
|
||||
if (!VALID_WCID(wcid) || !mac_addr)
|
||||
return;
|
||||
|
||||
routing_entry = RoutingTabLookup(adapter, if_index, mac_addr, TRUE, &proxy_wcid);
|
||||
found = (routing_entry != NULL) ? TRUE : FALSE;
|
||||
|
||||
if (found) {
|
||||
if (ROUTING_ENTRY_TEST_FLAG(routing_entry, ROUTING_ENTRY_A4)) {
|
||||
/* Mean the target change to other ProxyAP */
|
||||
if (proxy_wcid != wcid) {
|
||||
RoutingTabSetOneFree(adapter, if_index, mac_addr, ROUTING_ENTRY_A4);
|
||||
routing_entry = NULL;
|
||||
found = FALSE;
|
||||
}
|
||||
} else {
|
||||
/* Assign A4 falg to this one if found. */
|
||||
SET_ROUTING_ENTRY(routing_entry, ROUTING_ENTRY_A4);
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
/* Allocate a new one if not found. */
|
||||
routing_entry = RoutingTabGetFree(adapter, if_index);
|
||||
|
||||
if (routing_entry) {
|
||||
SET_ROUTING_ENTRY(routing_entry, ROUTING_ENTRY_A4);
|
||||
RoutingEntrySet(adapter, if_index, wcid, mac_addr, routing_entry);
|
||||
}
|
||||
}
|
||||
|
||||
if (routing_entry != NULL && (ip != 0)) /* ARP Sender IP Update*/
|
||||
RoutingTabARPLookupUpdate(adapter, if_index, routing_entry, ip);
|
||||
}
|
||||
|
||||
|
||||
VOID a4_proxy_maintain(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index
|
||||
)
|
||||
{
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return;
|
||||
|
||||
RoutingTabMaintain(adapter, if_index);
|
||||
}
|
||||
|
||||
|
||||
INT a4_hard_transmit(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN struct wifi_dev *wdev,
|
||||
IN PNDIS_PACKET pkt
|
||||
)
|
||||
{
|
||||
INT ret = NDIS_STATUS_SUCCESS;
|
||||
|
||||
if (wdev->tx_pkt_handle)
|
||||
ret = wdev->tx_pkt_handle(adapter, pkt);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
PNDIS_PACKET a4_clone_packet(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN PNET_DEV if_dev,
|
||||
IN PNDIS_PACKET pkt
|
||||
)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
PNDIS_PACKET pkt_clone = NULL;
|
||||
|
||||
skb = skb_copy(RTPKT_TO_OSPKT(pkt), GFP_ATOMIC);
|
||||
|
||||
if (skb) {
|
||||
skb->dev = if_dev;
|
||||
pkt_clone = OSPKT_TO_RTPKT(skb);
|
||||
}
|
||||
|
||||
return pkt_clone;
|
||||
}
|
||||
|
||||
void a4_send_clone_pkt(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN UCHAR if_index,
|
||||
IN PNDIS_PACKET pkt,
|
||||
IN PUCHAR exclude_mac_addr
|
||||
)
|
||||
{
|
||||
struct wifi_dev *wdev = NULL;
|
||||
PNDIS_PACKET pkt_clone = NULL;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
PROUTING_ENTRY routing_entry = NULL;
|
||||
PMAC_TABLE_ENTRY entry = NULL;
|
||||
BOOLEAN found = FALSE;
|
||||
UCHAR wcid = 0;
|
||||
#if (defined(WH_EZ_SETUP) && defined(EZ_DUAL_BAND_SUPPORT))
|
||||
struct wifi_dev *ap_wdev = NULL;
|
||||
BOOLEAN drop_pkt_to_dup_ez_apcli = FALSE;
|
||||
#endif
|
||||
|
||||
if (!pkt)
|
||||
return;
|
||||
|
||||
if ((a4_get_entry_count(adapter, if_index) > 0)) {
|
||||
#if (defined(WH_EZ_SETUP) && defined(EZ_DUAL_BAND_SUPPORT))
|
||||
ap_wdev = &adapter->ApCfg.MBSSID[if_index].wdev;
|
||||
|
||||
#endif
|
||||
|
||||
if (exclude_mac_addr) {
|
||||
routing_entry = RoutingTabLookup(adapter, if_index, exclude_mac_addr, FALSE, &wcid);
|
||||
|
||||
if (routing_entry && ROUTING_ENTRY_TEST_FLAG(routing_entry, ROUTING_ENTRY_A4))
|
||||
found = TRUE;
|
||||
else
|
||||
found = FALSE;
|
||||
}
|
||||
|
||||
a4_entry_list = &adapter->ApCfg.MBSSID[if_index].a4_entry_list;
|
||||
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry && a4_entry->valid && VALID_WCID(a4_entry->wcid)) {
|
||||
if (found && (wcid == a4_entry->wcid))
|
||||
continue;
|
||||
|
||||
entry = &adapter->MacTab.Content[a4_entry->wcid];
|
||||
wdev = entry->wdev;
|
||||
|
||||
#if (defined(WH_EZ_SETUP) && defined(EZ_DUAL_BAND_SUPPORT))
|
||||
|
||||
if ((wdev->enable_easy_setup)
|
||||
#ifdef EZ_API_SUPPORT
|
||||
&& (wdev->ez_security.ez_api_mode != CONNECTION_OFFLOAD)
|
||||
#endif
|
||||
) {
|
||||
/* todo: fill it based on ez_peer_securtity cli_duplicate info */
|
||||
if (drop_pkt_to_dup_ez_apcli && entry->link_duplicate) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
pkt_clone = a4_clone_packet(adapter, wdev->if_dev, pkt);
|
||||
if (pkt_clone == NULL) {
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR,
|
||||
("%s: Fail to alloc memory for pPacketClone\n", __func__));
|
||||
return;
|
||||
}
|
||||
|
||||
RTMP_SET_PACKET_WCID(pkt_clone, entry->wcid);
|
||||
RTMP_SET_PACKET_WDEV(pkt_clone, wdev->wdev_idx);
|
||||
RTMP_SET_PACKET_MOREDATA(pkt_clone, FALSE);
|
||||
/*RTMP_SET_PACKET_QUEIDX(pPacketClone, QID_AC_BE);*/
|
||||
a4_hard_transmit(adapter, wdev, pkt_clone);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_ap_peer_enable(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN PMAC_TABLE_ENTRY entry,
|
||||
IN UCHAR type
|
||||
)
|
||||
{
|
||||
BSS_STRUCT *mbss = NULL;
|
||||
UCHAR if_index;
|
||||
|
||||
if (!entry || !IS_ENTRY_CLIENT(entry))
|
||||
return FALSE;
|
||||
|
||||
if_index = entry->func_tb_idx;
|
||||
if (if_index >= HW_BEACON_MAX_NUM)
|
||||
return FALSE;
|
||||
|
||||
mbss = &adapter->ApCfg.MBSSID[if_index];
|
||||
#ifdef WSC_AP_SUPPORT
|
||||
if (mbss &&
|
||||
(mbss->WscControl.WscConfMode != WSC_DISABLE) &&
|
||||
(mbss->WscControl.bWscTrigger == TRUE)) {
|
||||
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF,
|
||||
("%s fail due to wps\n", __func__));
|
||||
return FALSE;
|
||||
}
|
||||
#endif /* WSC_AP_SUPPORT */
|
||||
|
||||
if (IS_ENTRY_A4(entry) == FALSE) {
|
||||
/* To check and remove entry which is created from another side. */
|
||||
a4_proxy_delete(adapter, if_index, entry->Addr);
|
||||
a4_add_entry(adapter, if_index, entry->wcid);
|
||||
}
|
||||
|
||||
if (type > GET_ENTRY_A4(entry)) {
|
||||
SET_ENTRY_A4(entry, type);
|
||||
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("SET_A4_ENTRY type:%d OK!\n", type));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_ap_peer_disable(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN PMAC_TABLE_ENTRY entry,
|
||||
IN UCHAR type
|
||||
)
|
||||
{
|
||||
UCHAR if_index;
|
||||
|
||||
if (!entry || !IS_ENTRY_CLIENT(entry))
|
||||
return FALSE;
|
||||
|
||||
if_index = entry->func_tb_idx;
|
||||
if (if_index >= HW_BEACON_MAX_NUM)
|
||||
return FALSE;
|
||||
|
||||
if (type == GET_ENTRY_A4(entry)) {
|
||||
SET_ENTRY_A4(entry, A4_TYPE_NONE);
|
||||
a4_delete_entry(adapter, if_index, entry->wcid);
|
||||
RoutingTabSetAllFree(adapter, if_index, entry->wcid, ROUTING_ENTRY_A4);
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN,
|
||||
("a4_ap_peer_disable: Disable A4 for entry : %02x-%02x-%02x-%02x-%02x-%02x\n",
|
||||
PRINT_MAC(entry->Addr)));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
#ifdef APCLI_SUPPORT
|
||||
BOOLEAN a4_apcli_peer_enable(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN PAPCLI_STRUCT apcli_entry,
|
||||
IN PMAC_TABLE_ENTRY entry,
|
||||
IN UCHAR type
|
||||
)
|
||||
{
|
||||
if (!apcli_entry || !entry || !IS_ENTRY_APCLI(entry))
|
||||
return FALSE;
|
||||
|
||||
#ifdef WSC_AP_SUPPORT
|
||||
if (((apcli_entry->WscControl.WscConfMode != WSC_DISABLE) &&
|
||||
(apcli_entry->WscControl.bWscTrigger == TRUE)))
|
||||
return FALSE;
|
||||
#endif /* WSC_AP_SUPPORT */
|
||||
|
||||
if (IS_ENTRY_A4(entry) == FALSE)
|
||||
MTWF_LOG(DBG_CAT_AP, DBG_SUBCAT_ALL, DBG_LVL_WARN,
|
||||
("%s entry:%02x-%02x-%02x-%02x-%02x-%02x\n",
|
||||
__func__, PRINT_MAC(entry->Addr)));
|
||||
|
||||
if (type > GET_ENTRY_A4(entry)) {
|
||||
SET_APCLI_A4(apcli_entry, type);
|
||||
SET_ENTRY_A4(entry, type);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN a4_apcli_peer_disable(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN PAPCLI_STRUCT apcli_entry,
|
||||
IN PMAC_TABLE_ENTRY entry,
|
||||
IN UCHAR type
|
||||
)
|
||||
{
|
||||
|
||||
if (!apcli_entry || !entry)
|
||||
return FALSE;
|
||||
|
||||
if (type == GET_ENTRY_A4(entry)) {
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN,
|
||||
("a4_apcli_peer_disable, Disable A4 for entry:%02x-%02x-%02x-%02x-%02x-%02x\n",
|
||||
PRINT_MAC(entry->Addr)));
|
||||
SET_APCLI_A4(apcli_entry, A4_TYPE_NONE);
|
||||
SET_ENTRY_A4(entry, A4_TYPE_NONE);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* APCLI_SUPPORT */
|
||||
|
||||
|
||||
INT Set_APProxy_Status_Show_Proc(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
POS_COOKIE obj;
|
||||
UCHAR if_index;
|
||||
INT32 i, count = 0;
|
||||
UINT32 ip_addr = 0;
|
||||
ULONG now = 0, AliveTime = 0;
|
||||
PDL_LIST a4_entry_list = NULL;
|
||||
PA4_CONNECT_ENTRY a4_entry = NULL;
|
||||
PROUTING_ENTRY routing_entry = NULL, *routing_entry_list[ROUTING_POOL_SIZE];
|
||||
UCHAR *proxy_mac_addr = NULL, proxy_ip[64];
|
||||
|
||||
obj = (POS_COOKIE) adapter->OS_Cookie;
|
||||
if_index = obj->ioctl_if;
|
||||
|
||||
if ((obj->ioctl_if_type != INT_MBSSID) && (obj->ioctl_if_type != INT_MAIN))
|
||||
return FALSE;
|
||||
|
||||
if (a4_get_entry_count(adapter, if_index) == 0)
|
||||
return TRUE;
|
||||
|
||||
a4_entry_list = &adapter->ApCfg.MBSSID[if_index].a4_entry_list;
|
||||
NdisGetSystemUpTime(&now);
|
||||
DlListForEach(a4_entry, a4_entry_list, A4_CONNECT_ENTRY, List) {
|
||||
if (a4_entry && a4_entry->valid && VALID_WCID(a4_entry->wcid)) {
|
||||
count = 0;
|
||||
proxy_mac_addr = adapter->MacTab.Content[a4_entry->wcid].Addr;
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
|
||||
("Proxy Mac: %02X:%02X:%02X:%02X:%02X:%02X\n",
|
||||
PRINT_MAC(proxy_mac_addr)));
|
||||
|
||||
if (GetRoutingEntryAll(adapter, if_index, a4_entry->wcid, ROUTING_ENTRY_A4,
|
||||
ROUTING_POOL_SIZE, (ROUTING_ENTRY **)&routing_entry_list, &count)) {
|
||||
for (i = 0; i < count; i++) {
|
||||
routing_entry = (PROUTING_ENTRY)routing_entry_list[i];
|
||||
|
||||
if (!routing_entry)
|
||||
continue;
|
||||
|
||||
if (routing_entry->KeepAliveTime >= now)
|
||||
AliveTime = ((routing_entry->KeepAliveTime - now) / OS_HZ);
|
||||
else
|
||||
AliveTime = 0;
|
||||
|
||||
if (routing_entry->IPAddr != 0) {
|
||||
ip_addr = routing_entry->IPAddr;
|
||||
sprintf(proxy_ip, "%d.%d.%d.%d",
|
||||
(ip_addr & 0xff),
|
||||
((ip_addr & (0xff << 8)) >> 8),
|
||||
((ip_addr & (0xff << 16)) >> 16),
|
||||
((ip_addr & (0xff << 24)) >> 24));
|
||||
} else
|
||||
strcpy(proxy_ip, "0.0.0.0");
|
||||
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF,
|
||||
("MAC:%02X:%02X:%02X:%02X:%02X:%02X, IP:%s, AgeOut:%lus, Retry:(%d,%d)\n",
|
||||
PRINT_MAC(routing_entry->Mac), proxy_ip, AliveTime,
|
||||
routing_entry->Retry, ROUTING_ENTRY_MAX_RETRY));
|
||||
}
|
||||
|
||||
MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("Total Count = %d\n\n", count));
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT Set_APProxy_Refresh_Proc(
|
||||
IN PRTMP_ADAPTER adapter,
|
||||
IN RTMP_STRING * arg)
|
||||
{
|
||||
adapter->a4_need_refresh = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* A4_CONN */
|
||||
1185
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/action.c
Normal file
1185
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/action.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,20 @@
|
||||
#ifdef ALL_NET_EVENT
|
||||
#include "rt_config.h"
|
||||
|
||||
void wext_send_event(PNET_DEV net_dev, const char *peer_mac_addr,
|
||||
const char *bssid, UINT32 channel, INT32 rssi, FBT_NOTIFY_E event_type)
|
||||
{
|
||||
FBT_NOTIFY_ST event_data;
|
||||
|
||||
memcpy(&event_data.FbtNotifyExtApMac, bssid, 6);
|
||||
event_data.FbtChannel = channel;
|
||||
event_data.FbtRSSI = rssi;
|
||||
|
||||
event_data.FbtNotifyType = event_type;
|
||||
memcpy(&event_data.FbtNotifyMac, peer_mac_addr, 6);
|
||||
|
||||
RtmpOSWrielessEventSend(net_dev, RT_WLAN_EVENT_CUSTOM,
|
||||
IW_ALL_NET_EVENT, NULL, (PUCHAR)&event_data, sizeof(event_data));
|
||||
|
||||
}
|
||||
#endif /* ALL_NET_EVENT */
|
||||
2320
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/ba_action.c
Normal file
2320
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/ba_action.c
Normal file
File diff suppressed because it is too large
Load Diff
6977
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/bn_lib.c
Normal file
6977
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/bn_lib.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,192 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
client_wds.c
|
||||
|
||||
Abstract:
|
||||
*/
|
||||
|
||||
|
||||
#ifdef CLIENT_WDS
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
VOID CliWds_ProxyTabInit(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT idx;
|
||||
ULONG i;
|
||||
|
||||
NdisAllocateSpinLock(pAd, &pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
os_alloc_mem(pAd, (UCHAR **)&(pAd->ApCfg.pCliWdsEntryPool), sizeof(CLIWDS_PROXY_ENTRY) * CLIWDS_POOL_SIZE);
|
||||
if (pAd->ApCfg.pCliWdsEntryPool)
|
||||
{
|
||||
NdisZeroMemory(pAd->ApCfg.pCliWdsEntryPool, sizeof(CLIWDS_PROXY_ENTRY) * CLIWDS_POOL_SIZE);
|
||||
initList(&pAd->ApCfg.CliWdsEntryFreeList);
|
||||
for (i = 0; i < CLIWDS_POOL_SIZE; i++)
|
||||
insertTailList(&pAd->ApCfg.CliWdsEntryFreeList, (RT_LIST_ENTRY *)(pAd->ApCfg.pCliWdsEntryPool + (ULONG)i));
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s Fail to alloc memory for pAd->CommonCfg.pCliWdsEntryPool", __FUNCTION__));
|
||||
}
|
||||
|
||||
for (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++)
|
||||
initList(&pAd->ApCfg.CliWdsProxyTb[idx]);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
VOID CliWds_ProxyTabDestory(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT idx;
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntry;
|
||||
|
||||
NdisFreeSpinLock(&pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
for (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++)
|
||||
{
|
||||
pCliWdsEntry =
|
||||
(PCLIWDS_PROXY_ENTRY)pAd->ApCfg.CliWdsProxyTb[idx].pHead;
|
||||
while(pCliWdsEntry)
|
||||
{
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntryNext = pCliWdsEntry->pNext;
|
||||
CliWdsEntyFree(pAd, pCliWdsEntry);
|
||||
pCliWdsEntry = pCliWdsEntryNext;
|
||||
}
|
||||
}
|
||||
|
||||
if (pAd->ApCfg.pCliWdsEntryPool)
|
||||
os_free_mem(NULL, pAd->ApCfg.pCliWdsEntryPool);
|
||||
pAd->ApCfg.pCliWdsEntryPool = NULL;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
PCLIWDS_PROXY_ENTRY CliWdsEntyAlloc(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntry;
|
||||
|
||||
RTMP_SEM_LOCK(&pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
pCliWdsEntry = (PCLIWDS_PROXY_ENTRY)removeHeadList(&pAd->ApCfg.CliWdsEntryFreeList);
|
||||
|
||||
RTMP_SEM_UNLOCK(&pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
return pCliWdsEntry;
|
||||
}
|
||||
|
||||
|
||||
VOID CliWdsEntyFree(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PCLIWDS_PROXY_ENTRY pCliWdsEntry)
|
||||
{
|
||||
RTMP_SEM_LOCK(&pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
insertTailList(&pAd->ApCfg.CliWdsEntryFreeList, (RT_LIST_ENTRY *)pCliWdsEntry);
|
||||
|
||||
RTMP_SEM_UNLOCK(&pAd->ApCfg.CliWdsTabLock);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
UCHAR *CliWds_ProxyLookup(RTMP_ADAPTER *pAd, UCHAR *pMac)
|
||||
{
|
||||
UINT8 HashId = (*(pMac + 5) & (CLIWDS_HASH_TAB_SIZE - 1));
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntry;
|
||||
|
||||
pCliWdsEntry = (PCLIWDS_PROXY_ENTRY)pAd->ApCfg.CliWdsProxyTb[HashId].pHead;
|
||||
while (pCliWdsEntry)
|
||||
{
|
||||
if (MAC_ADDR_EQUAL(pMac, pCliWdsEntry->Addr))
|
||||
{
|
||||
ULONG Now;
|
||||
NdisGetSystemUpTime(&Now);
|
||||
|
||||
pCliWdsEntry->LastRefTime = Now;
|
||||
if (VALID_WCID(pCliWdsEntry->Aid))
|
||||
return pAd->MacTab.Content[pCliWdsEntry->Aid].Addr;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
pCliWdsEntry = pCliWdsEntry->pNext;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
VOID CliWds_ProxyTabUpdate(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN SHORT Aid,
|
||||
IN PUCHAR pMac)
|
||||
{
|
||||
UINT8 HashId = (*(pMac + 5) & (CLIWDS_HASH_TAB_SIZE - 1));
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntry;
|
||||
|
||||
if (CliWds_ProxyLookup(pAd, pMac) != NULL)
|
||||
return;
|
||||
|
||||
pCliWdsEntry = CliWdsEntyAlloc(pAd);
|
||||
if (pCliWdsEntry)
|
||||
{
|
||||
ULONG Now;
|
||||
NdisGetSystemUpTime(&Now);
|
||||
|
||||
pCliWdsEntry->Aid = Aid;
|
||||
COPY_MAC_ADDR(&pCliWdsEntry->Addr, pMac);
|
||||
pCliWdsEntry->LastRefTime = Now;
|
||||
pCliWdsEntry->pNext = NULL;
|
||||
insertTailList(&pAd->ApCfg.CliWdsProxyTb[HashId], (RT_LIST_ENTRY *)pCliWdsEntry);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
VOID CliWds_ProxyTabMaintain(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
ULONG idx;
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntry;
|
||||
ULONG Now;
|
||||
|
||||
NdisGetSystemUpTime(&Now);
|
||||
for (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++)
|
||||
{
|
||||
pCliWdsEntry = (PCLIWDS_PROXY_ENTRY)(pAd->ApCfg.CliWdsProxyTb[idx].pHead);
|
||||
while(pCliWdsEntry)
|
||||
{
|
||||
PCLIWDS_PROXY_ENTRY pCliWdsEntryNext = pCliWdsEntry->pNext;
|
||||
if (RTMP_TIME_AFTER(Now, pCliWdsEntry->LastRefTime + (CLI_WDS_ENTRY_AGEOUT * OS_HZ / 1000)))
|
||||
{
|
||||
delEntryList(&pAd->ApCfg.CliWdsProxyTb[idx], (RT_LIST_ENTRY *)pCliWdsEntry);
|
||||
CliWdsEntyFree(pAd, pCliWdsEntry);
|
||||
}
|
||||
pCliWdsEntry = pCliWdsEntryNext;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
#endif /* CLIENT_WDS */
|
||||
|
||||
1153
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_aes.c
Normal file
1153
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_aes.c
Normal file
File diff suppressed because it is too large
Load Diff
2771
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_cfg.c
Normal file
2771
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_cfg.c
Normal file
File diff suppressed because it is too large
Load Diff
179
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_cmd.c
Normal file
179
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_cmd.c
Normal file
@ -0,0 +1,179 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2006, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_cmd.c
|
||||
|
||||
Abstract:
|
||||
All command related API.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
Paul Lin 06-25-2004 created
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
|
||||
IRQL =
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTInitializeCmdQ(
|
||||
IN PCmdQ cmdq)
|
||||
{
|
||||
cmdq->head = NULL;
|
||||
cmdq->tail = NULL;
|
||||
cmdq->size = 0;
|
||||
cmdq->CmdQState = RTMP_TASK_STAT_INITED;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
|
||||
IRQL =
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTThreadDequeueCmd(
|
||||
IN PCmdQ cmdq,
|
||||
OUT PCmdQElmt *pcmdqelmt)
|
||||
{
|
||||
*pcmdqelmt = cmdq->head;
|
||||
|
||||
if (*pcmdqelmt != NULL)
|
||||
{
|
||||
cmdq->head = cmdq->head->next;
|
||||
cmdq->size--;
|
||||
if (cmdq->size == 0)
|
||||
cmdq->tail = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
|
||||
IRQL =
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
NDIS_STATUS RTEnqueueInternalCmd(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN NDIS_OID Oid,
|
||||
IN PVOID pInformationBuffer,
|
||||
IN UINT32 InformationBufferLength)
|
||||
{
|
||||
NDIS_STATUS status;
|
||||
PCmdQElmt cmdqelmt = NULL;
|
||||
ULONG flag;
|
||||
|
||||
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("--->RTEnqueueInternalCmd - NIC is not exist!!\n"));
|
||||
return NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt, sizeof(CmdQElmt));
|
||||
if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL))
|
||||
return (NDIS_STATUS_RESOURCES);
|
||||
NdisZeroMemory(cmdqelmt, sizeof(CmdQElmt));
|
||||
|
||||
if(InformationBufferLength > 0)
|
||||
{
|
||||
status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt->buffer, InformationBufferLength);
|
||||
if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL))
|
||||
{
|
||||
os_free_mem(pAd, cmdqelmt);
|
||||
return (NDIS_STATUS_RESOURCES);
|
||||
}
|
||||
else
|
||||
{
|
||||
NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength);
|
||||
cmdqelmt->bufferlength = InformationBufferLength;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cmdqelmt->buffer = NULL;
|
||||
cmdqelmt->bufferlength = 0;
|
||||
}
|
||||
|
||||
cmdqelmt->command = Oid;
|
||||
cmdqelmt->CmdFromNdis = FALSE;
|
||||
|
||||
if (cmdqelmt != NULL)
|
||||
{
|
||||
//NdisAcquireSpinLock(&pAd->CmdQLock);
|
||||
RTMP_SPIN_LOCK_IRQSAVE(&pAd->CmdQLock,&flag);
|
||||
if (pAd->CmdQ.CmdQState & RTMP_TASK_CAN_DO_INSERT)
|
||||
{
|
||||
EnqueueCmd((&pAd->CmdQ), cmdqelmt);
|
||||
status = NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = NDIS_STATUS_FAILURE;
|
||||
}
|
||||
//NdisReleaseSpinLock(&pAd->CmdQLock);
|
||||
RTMP_SPIN_UNLOCK_IRQRESTORE(&pAd->CmdQLock,&flag);
|
||||
|
||||
if (status == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
if (cmdqelmt->buffer)
|
||||
os_free_mem(pAd, cmdqelmt->buffer);
|
||||
os_free_mem(pAd, cmdqelmt);
|
||||
}
|
||||
else
|
||||
RTCMDUp(&pAd->cmdQTask);
|
||||
}
|
||||
return(NDIS_STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
880
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_cs.c
Normal file
880
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_cs.c
Normal file
@ -0,0 +1,880 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_cs.c
|
||||
|
||||
Abstract:
|
||||
Carrier Sensing related functions
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
---------------------------------------------------------------------
|
||||
*/
|
||||
#include "rt_config.h"
|
||||
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
static ULONG time[20];
|
||||
static ULONG idle[20];
|
||||
static ULONG busy[20];
|
||||
static ULONG cd_idx=0;
|
||||
|
||||
static void ToneRadarProgram(PRTMP_ADAPTER pAd);
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
static inline VOID CarrierDetectionResetStatus(PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if(pAd->chipCap.carrier_func == TONE_RADAR_V3)
|
||||
{
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R1, 0x3);
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static inline VOID CarrierDetectionStatusGet(PRTMP_ADAPTER pAd,
|
||||
PUINT8 pStatus)
|
||||
{
|
||||
*pStatus = 0;
|
||||
|
||||
if(pAd->chipCap.carrier_func == TONE_RADAR_V3)
|
||||
{
|
||||
UINT32 mac_value = 0;
|
||||
RTMP_BBP_IO_READ32(pAd, TR_R1, &mac_value);
|
||||
*pStatus = (UINT8) mac_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_CARRIER_IO_READ8(pAd, 1, pStatus);
|
||||
}
|
||||
}
|
||||
|
||||
static inline VOID CarrierDetectionEnable(PRTMP_ADAPTER pAd,
|
||||
BOOLEAN bEnable)
|
||||
{
|
||||
if(pAd->chipCap.carrier_func == TONE_RADAR_V3)
|
||||
{
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R0, bEnable);
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 0, bEnable);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Check current CS state, indicating Silient state (carrier exist) or not
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
TRUE if the current state is SILENT state, FALSE other wise
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT isCarrierDetectExist(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if (pAd->CommonCfg.CarrierDetect.CD_State == CD_SILENCE)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Enable or Disable Carrier Detection feature (AP ioctl).
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
Usage:
|
||||
1.) iwpriv ra0 set CarrierDetect=[1/0]
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierDetect_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
UCHAR apidx = pObj->ioctl_if;
|
||||
UINT Enable;
|
||||
|
||||
if (apidx != MAIN_MBSSID)
|
||||
return FALSE;
|
||||
|
||||
Enable = (UINT) simple_strtol(arg, 0, 10);
|
||||
|
||||
pAd->CommonCfg.CarrierDetect.Enable = (BOOLEAN)(Enable == 0 ? FALSE : TRUE);
|
||||
|
||||
RTMP_CHIP_RADAR_GLRT_COMPENSATE(pAd);
|
||||
RTMP_CHIP_CCK_MRC_STATUS_CTRL(pAd);
|
||||
|
||||
if (pAd->CommonCfg.CarrierDetect.Enable == TRUE)
|
||||
CarrierDetectionStart(pAd);
|
||||
else
|
||||
CarrierDetectionStop(pAd);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s:: %s\n", __FUNCTION__,
|
||||
pAd->CommonCfg.CarrierDetect.Enable == TRUE ? "Enable Carrier Detection":"Disable Carrier Detection"));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
When h/w interrupt is not available for CS, this function monitor necessary parameters that determine the CS
|
||||
state periodically. (every 100ms)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID CarrierDetectionPeriodicStateCtrl(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PCARRIER_DETECTION_STRUCT pCarrierDetect = &pAd->CommonCfg.CarrierDetect;
|
||||
CD_STATE *pCD_State = &pCarrierDetect->CD_State;
|
||||
ULONG *pOneSecIntCount = &pCarrierDetect->OneSecIntCount;
|
||||
|
||||
#ifdef CONFIG_ATE
|
||||
/* Nothing to do in ATE mode */
|
||||
if (ATE_ON(pAd))
|
||||
return;
|
||||
#endif /* CONFIG_ATE */
|
||||
|
||||
// TODO: shiang-7603
|
||||
if (pAd->chipCap.hif_type == HIF_MT) {
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s(%d): Not support for HIF_MT yet!\n",
|
||||
__FUNCTION__, __LINE__));
|
||||
return;
|
||||
}
|
||||
|
||||
if (pCarrierDetect->bCsInit == FALSE)
|
||||
return;
|
||||
|
||||
if (pAd->chipCap.carrier_func == TONE_RADAR_V3)
|
||||
{
|
||||
UINT8 TrStatus = 0;
|
||||
|
||||
CarrierDetectionStatusGet(pAd, &TrStatus);
|
||||
if (TrStatus)
|
||||
{
|
||||
if (*pCD_State == CD_NORMAL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF,
|
||||
("Carrier Detected ! (TrStatus = 0x%x)\n", TrStatus));
|
||||
*pCD_State = CD_SILENCE;
|
||||
/* stop all TX actions including Beacon sending.*/
|
||||
AsicDisableSync(pAd);
|
||||
}
|
||||
*pOneSecIntCount = pCarrierDetect->CarrierGoneThreshold;
|
||||
CarrierDetectionResetStatus(pAd);
|
||||
|
||||
}
|
||||
else
|
||||
*pOneSecIntCount = 0;
|
||||
|
||||
/*CarrierDetectionResetStatus(pAd);*/
|
||||
}
|
||||
|
||||
#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT
|
||||
|
||||
if (pAd->chipCap.carrier_func == TONE_RADAR_V2)
|
||||
{
|
||||
CARRIER_DETECT_PARAM CarrDetectParam;
|
||||
|
||||
/* tell firmware to prepare Recheck and RadarToneCount */
|
||||
AsicSendCommandToMcu(pAd, CD_CHECKOUT_MCU_CMD, 0xff, 0x00, 0x00, FALSE);
|
||||
/* Debug */
|
||||
if (pAd->CommonCfg.CarrierDetect.Debug == RT_DEBUG_TRACE)
|
||||
{
|
||||
CARRIER_DETECT_DEBUG CarrDetectDebug;
|
||||
RTUSBMultiRead(pAd, 0x4CB0, (PUCHAR) &CarrDetectDebug, sizeof(CarrDetectDebug));
|
||||
printk("delta_div = 0x%02X, rRadarToneCount = %u, Recheck = %u, Criteria = %u, Threshold = 0x%08X, VGA_Mask = 0x%04X\n",
|
||||
CarrDetectDebug.delta_div,
|
||||
CarrDetectDebug.RadarToneCount,
|
||||
CarrDetectDebug.ReCheck,
|
||||
CarrDetectDebug.Criteria << 6, /* ms -> 16us*/
|
||||
CarrDetectDebug.Threshold,
|
||||
CarrDetectDebug.VGA_Mask);
|
||||
}
|
||||
|
||||
RTUSBMultiRead(pAd, RADAR_TONE_COUNT, (PUCHAR) &CarrDetectParam, sizeof(CarrDetectParam));
|
||||
switch(*pCD_State)
|
||||
{
|
||||
case CD_NORMAL:
|
||||
if (CarrDetectParam.ReCheck == 0)
|
||||
{
|
||||
*pCD_State = CD_SILENCE;
|
||||
if (pAd->CommonCfg.CarrierDetect.Debug != RT_DEBUG_TRACE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Carrier Detected\n"));
|
||||
|
||||
/* stop all TX actions including Beacon sending.*/
|
||||
AsicDisableSync(pAd);
|
||||
}
|
||||
else
|
||||
printk("Carrier Detected\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case CD_SILENCE:
|
||||
*pOneSecIntCount += CarrDetectParam.RadarToneCount;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
When there is no f/w taking care of CS operation, this function depends on h/w interrupts for every possible carrier
|
||||
tone to judge the CS state
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID RTMPHandleRadarInterrupt(PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UINT32 value, delta;
|
||||
UCHAR bbp=0;
|
||||
PCARRIER_DETECTION_STRUCT pCarrierDetect = &pAd->CommonCfg.CarrierDetect;
|
||||
|
||||
if (pAd->chipCap.carrier_func > TONE_RADAR_V2)
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RTMPHandleRadarInterrupt()\n"));
|
||||
RTMP_IO_READ32(pAd, PBF_LIFE_TIMER, &value);
|
||||
RTMP_IO_READ32(pAd, CH_IDLE_STA, &pCarrierDetect->idle_time);
|
||||
pCarrierDetect->busy_time = AsicGetChBusyCnt(pAd, 0);
|
||||
delta = (value >> 4) - pCarrierDetect->TimeStamp;
|
||||
pCarrierDetect->TimeStamp = value >> 4;
|
||||
pCarrierDetect->OneSecIntCount++;
|
||||
|
||||
if(pAd->chipCap.carrier_func==TONE_RADAR_V2)
|
||||
{
|
||||
#ifdef RTMP_BBP
|
||||
CarrierDetectionStatusGet(pAd, &bbp);
|
||||
if (!(bbp & 0x1))
|
||||
return;
|
||||
else
|
||||
#endif /* RTMP_BBP */
|
||||
{
|
||||
UINT32 RadarInt = 0;
|
||||
#ifdef RLT_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RLT)
|
||||
RadarInt = RLT_RadarInt;
|
||||
#endif /* RLT_MAC*/
|
||||
#ifdef RTMP_MAC
|
||||
if (pAd->chipCap.hif_type == HIF_RTMP)
|
||||
RadarInt = RTMP_RadarInt;
|
||||
#endif /* RTMP_MAC */
|
||||
/* Disable carrier detection and clear the status bit*/
|
||||
CarrierDetectionEnable(pAd, 0);
|
||||
CarrierDetectionResetStatus(pAd);
|
||||
/* Clear interrupt */
|
||||
RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, RadarInt);
|
||||
}
|
||||
}
|
||||
|
||||
if (pCarrierDetect->Debug)
|
||||
{
|
||||
if (cd_idx < 20)
|
||||
{
|
||||
time[cd_idx] = delta;
|
||||
idle[cd_idx] = pCarrierDetect->idle_time;
|
||||
busy[cd_idx] = pCarrierDetect->busy_time;
|
||||
cd_idx++;
|
||||
}
|
||||
else
|
||||
{
|
||||
int i;
|
||||
pCarrierDetect->Debug = 0;
|
||||
for (i = 0; i < 20; i++)
|
||||
{
|
||||
printk("%3d %4ld %ld %ld\n", i, time[i], idle[i], busy[i]);
|
||||
}
|
||||
cd_idx = 0;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (pCarrierDetect->CD_State == CD_NORMAL)
|
||||
{
|
||||
if ((delta < pCarrierDetect->criteria) && (pCarrierDetect->recheck))
|
||||
pCarrierDetect->recheck --;
|
||||
else
|
||||
pCarrierDetect->recheck = pCarrierDetect->recheck1;
|
||||
|
||||
if (pCarrierDetect->recheck == 0)
|
||||
{
|
||||
/* declare carrier sense*/
|
||||
pCarrierDetect->CD_State = CD_SILENCE;
|
||||
|
||||
if (pCarrierDetect->Debug != RT_DEBUG_TRACE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Carrier Detected\n"));
|
||||
|
||||
/* stop all TX actions including Beacon sending.*/
|
||||
AsicDisableSync(pAd);
|
||||
}
|
||||
else
|
||||
{
|
||||
printk("Carrier Detected\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(pAd->chipCap.carrier_func == TONE_RADAR_V2)
|
||||
{
|
||||
CarrierDetectionStatusGet(pAd, &bbp);
|
||||
|
||||
if (bbp & 0x1)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("CS bit not cleared!!!\n"));
|
||||
CarrierDetectionResetStatus(pAd);
|
||||
}
|
||||
/* re-enable carrier detection */
|
||||
CarrierDetectionEnable(pAd, 1);
|
||||
}
|
||||
else if(pAd->chipCap.carrier_func == TONE_RADAR_V1 &&
|
||||
pCarrierDetect->Enable)
|
||||
{
|
||||
ToneRadarProgram(pAd);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Reset CS state to NORMAL state.
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT CarrierDetectReset(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.CD_State = CD_NORMAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Criteria in CS is a timing difference threshold for a pair of carrier tones. This function is a ioctl uesed to adjust the
|
||||
Criteria. (unit: 16us)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierCriteria_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
UINT32 Value;
|
||||
|
||||
Value = simple_strtol(arg, 0, 10);
|
||||
|
||||
pAd->CommonCfg.CarrierDetect.criteria = Value;
|
||||
#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT
|
||||
{
|
||||
USHORT sVal = (USHORT) (Value >> 6); /* convert unit from 16us to ms:(2^4 /2^10) */
|
||||
RTUSBMultiWrite(pAd, CD_CRITERIA, (PUCHAR) &sVal, 2, FALSE);
|
||||
/* send enable cmd to mcu to take effect */
|
||||
AsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x01, 0x00, FALSE);
|
||||
}
|
||||
#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
ReCheck in CS is a value indicating how many continuous incoming carrier tones is enough us to announce that there
|
||||
is carrier tone (and hence enter SILENT state). This function is a ioctl uesed to adjust the ReCheck value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierReCheck_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.recheck1 = simple_strtol(arg, 0, 10);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Set Recheck = %u\n", pAd->CommonCfg.CarrierDetect.recheck1));
|
||||
#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT
|
||||
RTMP_IO_WRITE8(pAd, CD_CHECK_COUNT, pAd->CommonCfg.CarrierDetect.recheck1);
|
||||
/* send enable cmd to mcu to take effect */
|
||||
AsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x01, 0x00, FALSE);
|
||||
#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
CarrierGoneThreshold is used to determine whether we should leave SILENT state. When the number of carrier
|
||||
tones in a certain period of time is less than CarrierGoneThreshold, we should return to NORMAL state. This function
|
||||
is a ioctl uesed to adjust the CarrierGoneThreshold.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierGoneThreshold_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.CarrierGoneThreshold = simple_strtol(arg, 0, 10);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Set CarrierGoneThreshold = %u\n", pAd->CommonCfg.CarrierDetect.CarrierGoneThreshold));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Setting up the carrier debug level. set 0 means to turning off the carrier debug
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierDebug_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.Debug = simple_strtol(arg, 0, 10);
|
||||
printk("pAd->CommonCfg.CarrierDetect.Debug = %ld\n", pAd->CommonCfg.CarrierDetect.Debug);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Delta control the delay line characteristic of the cross correlation energy calculation.
|
||||
This function is a ioctl uesed to adjust the Delta value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierDelta_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.delta = simple_strtol(arg, 0, 10);
|
||||
printk("Delta = %d\n", pAd->CommonCfg.CarrierDetect.delta);
|
||||
CarrierDetectionStart(pAd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To set ON/OFF of the "Not Divide Flag"
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierDivFlag_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.div_flag = simple_strtol(arg, 0, 10);
|
||||
printk("DivFlag = %d\n", pAd->CommonCfg.CarrierDetect.div_flag);
|
||||
CarrierDetectionStart(pAd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Carrier Threshold is the energy threshold for h/w to determine a carrier tone or not.
|
||||
This function is a ioctl uesed to adjust the Threshold value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierThrd_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.threshold = simple_strtol(arg, 0, 10);
|
||||
printk("CarrThrd = %d(0x%x)\n", pAd->CommonCfg.CarrierDetect.threshold, pAd->CommonCfg.CarrierDetect.threshold);
|
||||
CarrierDetectionStart(pAd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Carrier SymRund is the number of round bits in Radar Symmetric Round Bits Option.
|
||||
This function is a ioctl uesed to adjust the SymRund. (unit: bit)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierSymRund_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.SymRund= simple_strtol(arg, 0, 10);
|
||||
printk("SymRund = %d\n", pAd->CommonCfg.CarrierDetect.SymRund);
|
||||
CarrierDetectionStart(pAd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Carrier Masks are used to prevent false trigger while doing Rx_PE, Packet_End, and AGC tuning.
|
||||
This function is a ioctl uesed to adjust these three mask. (unit: 100ns)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CarrierMask_Proc(RTMP_ADAPTER *pAd, RTMP_STRING *arg)
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.VGA_Mask = simple_strtol(arg, 0, 10);
|
||||
pAd->CommonCfg.CarrierDetect.Packet_End_Mask = simple_strtol(arg, 0, 10);
|
||||
pAd->CommonCfg.CarrierDetect.Rx_PE_Mask = simple_strtol(arg, 0, 10);
|
||||
printk("CarrMask = %u(%x)\n", pAd->CommonCfg.CarrierDetect.VGA_Mask, pAd->CommonCfg.CarrierDetect.VGA_Mask);
|
||||
CarrierDetectionStart(pAd);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Initialize CS parameters.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID CSInit(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
PCARRIER_DETECTION_STRUCT pCarrierDetect = &pAd->CommonCfg.CarrierDetect;
|
||||
|
||||
pCarrierDetect->TimeStamp = 0;
|
||||
pCarrierDetect->recheck = pCarrierDetect->recheck1;
|
||||
pCarrierDetect->OneSecIntCount = 0;
|
||||
pCarrierDetect->bCsInit = FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To trigger CS start
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID CarrierDetectionStart(PRTMP_ADAPTER pAd)
|
||||
{
|
||||
/*ULONG Value;*/
|
||||
/* Enable Bandwidth usage monitor*/
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("CarrierDetectionStart\n"));
|
||||
/*RTMP_IO_READ32(pAd, CH_TIME_CFG, &Value);*/
|
||||
/*RTMP_IO_WRITE32(pAd, CH_TIME_CFG, Value | 0x1f); */
|
||||
|
||||
/* Init Carrier Detect*/
|
||||
if (pAd->CommonCfg.CarrierDetect.Enable)
|
||||
{
|
||||
CSInit(pAd);
|
||||
ToneRadarProgram(pAd);
|
||||
#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT
|
||||
{
|
||||
USHORT criteria = (USHORT) (pAd->CommonCfg.CarrierDetect.criteria >> 6); /* convert unit from 16us to 1ms:(2^4 /2^10) */
|
||||
RTUSBMultiWrite(pAd, CD_CRITERIA, (PUCHAR) &criteria, 2, FALSE);
|
||||
RTMP_IO_WRITE8(pAd, CD_CHECK_COUNT, pAd->CommonCfg.CarrierDetect.recheck1);
|
||||
AsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x01, 0x00, FALSE);
|
||||
}
|
||||
#else
|
||||
#ifndef MT760x
|
||||
/* trun on interrupt polling for pcie device */
|
||||
if (pAd->infType == RTMP_DEV_INF_PCIE)
|
||||
AsicSendCommandToMcu(pAd, CD_INT_POLLING_CMD, 0xff, 0x01, 0x00, FALSE);
|
||||
#endif /* MT760x */
|
||||
#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */
|
||||
pAd->CommonCfg.CarrierDetect.bCsInit = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To stop CS
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID CarrierDetectionStop(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
CarrierDetectReset(pAd);
|
||||
CarrierDetectionEnable(pAd, 0);
|
||||
#ifdef CARRIER_DETECTION_FIRMWARE_SUPPORT
|
||||
/* Stop firmware CS action */
|
||||
AsicSendCommandToMcu(pAd, CD_ONOFF_MCU_CMD, 0xff, 0x00, 0x00, FALSE);
|
||||
#endif /* CARRIER_DETECTION_FIRMWARE_SUPPORT */
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To program CS related BBP registers (CS initialization)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
static VOID ToneRadarProgram(PRTMP_ADAPTER pAd)
|
||||
{
|
||||
ULONG threshold;
|
||||
/* if wireless mode is 20Mhz mode, then the threshold should div by 2 */
|
||||
if (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_20)
|
||||
threshold = pAd->CommonCfg.CarrierDetect.threshold >> 1;
|
||||
else
|
||||
threshold = pAd->CommonCfg.CarrierDetect.threshold;
|
||||
/* Call ToneRadarProgram_v1/ToneRadarProgram_v2*/
|
||||
RTMP_CHIP_CARRIER_PROGRAM(pAd, threshold);
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To program CS v1 related BBP registers (CS initialization)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID ToneRadarProgram_v1(PRTMP_ADAPTER pAd, ULONG threshold)
|
||||
{
|
||||
UCHAR bbp;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ToneRadarProgram v1\n"));
|
||||
/* programe delta delay & division bit*/
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0xf0);
|
||||
bbp = pAd->CommonCfg.CarrierDetect.delta << 4;
|
||||
bbp |= (pAd->CommonCfg.CarrierDetect.div_flag & 0x1) << 3;
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, bbp);
|
||||
|
||||
/* program threshold*/
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x34);
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, (threshold & 0xff000000) >> 24);
|
||||
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x24);
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, (threshold & 0xff0000) >> 16);
|
||||
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x14);
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, (threshold & 0xff00) >> 8);
|
||||
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x04);
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R185, threshold & 0xff);
|
||||
|
||||
/* ToneRadarEnable v1 */
|
||||
BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R184, 0x05);
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To program CS v2 related BBP registers (CS initialization)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID ToneRadarProgram_v2(PRTMP_ADAPTER pAd, ULONG threshold)
|
||||
{
|
||||
UCHAR bbp;
|
||||
|
||||
/* programe delta delay & division bit*/
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ToneRadarProgram v2\n"));
|
||||
bbp = pAd->CommonCfg.CarrierDetect.delta | \
|
||||
((pAd->CommonCfg.CarrierDetect.SymRund & 0x3) << 4) | \
|
||||
((pAd->CommonCfg.CarrierDetect.div_flag & 0x1) << 6) | \
|
||||
0x80; /* Full 40MHz Detection Mode */
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 5, bbp);
|
||||
|
||||
/* program *_mask*/
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 2, pAd->CommonCfg.CarrierDetect.VGA_Mask);
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 3, pAd->CommonCfg.CarrierDetect.Packet_End_Mask);
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 4, pAd->CommonCfg.CarrierDetect.Rx_PE_Mask);
|
||||
|
||||
/* program threshold*/
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 6, threshold & 0xff);
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 7, (threshold & 0xff00) >> 8);
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 8, (threshold & 0xff0000) >> 16);
|
||||
RTMP_CARRIER_IO_WRITE8(pAd, 9, (threshold & 0xff000000) >> 24);
|
||||
|
||||
/* ToneRadarEnable v2 */
|
||||
CarrierDetectionEnable(pAd, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
To program CS v3 related BBP registers (CS initialization)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
==========================================================================
|
||||
*/
|
||||
VOID ToneRadarProgram_v3(PRTMP_ADAPTER pAd, ULONG threshold)
|
||||
{
|
||||
/*
|
||||
Carrier Sense (Tone Radar) BBP initialization
|
||||
(MT7650 Carrier sense programming guide_v1_20120824.docx)
|
||||
*/
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ToneRadarProgram v3\n"));
|
||||
CarrierDetectionEnable(pAd, 0);
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R2, 0x002d002d);
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R3, 0x0003002d);
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R5, 0x80000000);
|
||||
RTMP_BBP_IO_WRITE32(pAd, TR_R6, 0x80100000);
|
||||
CarrierDetectionEnable(pAd, 1);
|
||||
}
|
||||
|
||||
|
||||
#endif /* CARRIER_DETECTION_SUPPORT */
|
||||
|
||||
5293
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_data.c
Normal file
5293
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_data.c
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,147 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of MediaTek. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of MediaTek, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_data_sdio.c
|
||||
*/
|
||||
|
||||
|
||||
#include "rt_config.h"
|
||||
#include "rtmp.h"
|
||||
|
||||
|
||||
|
||||
USHORT MtSDIO_WriteSubTxResource(struct _RTMP_ADAPTER *pAd, struct _TX_BLK *pTxBlk, BOOLEAN bIsLast, USHORT *freeCnt)
|
||||
{
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
USHORT MtSDIO_WriteFragTxResource(
|
||||
RTMP_ADAPTER *pAd,
|
||||
struct _TX_BLK *pTxBlk,
|
||||
UCHAR fragNum,
|
||||
USHORT *freeCnt)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
USHORT MtSDIO_WriteSingleTxResource(
|
||||
RTMP_ADAPTER *pAd,
|
||||
struct _TX_BLK *pTxBlk,
|
||||
BOOLEAN bIsLast,
|
||||
USHORT *freeCnt)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
USHORT MtSDIO_WriteMultiTxResource(
|
||||
RTMP_ADAPTER *pAd,
|
||||
struct _TX_BLK *pTxBlk,
|
||||
UCHAR frmNum,
|
||||
USHORT *freeCnt)
|
||||
{
|
||||
NDIS_STATUS Status = 0;
|
||||
|
||||
return(Status);
|
||||
}
|
||||
|
||||
|
||||
VOID MtSDIO_FinalWriteTxResource(
|
||||
RTMP_ADAPTER *pAd,
|
||||
struct _TX_BLK *pTxBlk,
|
||||
USHORT totalMPDUSize,
|
||||
USHORT TxIdx)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID MtSDIODataLastTxIdx(
|
||||
RTMP_ADAPTER *pAd,
|
||||
UCHAR QueIdx,
|
||||
USHORT TxIdx)
|
||||
{
|
||||
/* DO nothing for USB.*/
|
||||
}
|
||||
|
||||
|
||||
VOID MtSDIODataKickOut(
|
||||
RTMP_ADAPTER *pAd,
|
||||
struct _TX_BLK *pTxBlk,
|
||||
UCHAR QueIdx)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int MtSDIOMgmtKickOut(
|
||||
RTMP_ADAPTER *pAd,
|
||||
UCHAR QueIdx,
|
||||
PNDIS_PACKET pPacket,
|
||||
UCHAR *pSrcBufVA,
|
||||
UINT SrcBufLen)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
PNDIS_PACKET GetPacketFromRxRing(
|
||||
RTMP_ADAPTER *pAd,
|
||||
RX_BLK *pRxBlk,
|
||||
BOOLEAN *pbReschedule,
|
||||
UINT32 *pRxPending,
|
||||
UCHAR RxRingNo)
|
||||
|
||||
{
|
||||
UINT8 RXWISize = pAd->chipCap.RXWISize;
|
||||
UINT8 rx_hw_hdr_len = pAd->chipCap.RXWISize;
|
||||
PNDIS_PACKET pRxPacket = pAd->SDIORxPacket;
|
||||
PUCHAR buf = GET_OS_PKT_DATAPTR(pRxPacket);
|
||||
UINT32 len=GET_OS_PKT_LEN(pRxPacket);
|
||||
UINT32 i;
|
||||
|
||||
pRxBlk->Flags = 0;
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s===========start\n",__FUNCTION__));
|
||||
if(!pRxPacket){
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s=====return NULL !!!!!\n",__FUNCTION__));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for(i=0;i<len;i++){
|
||||
// printk("%x,",*(buf+i));
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%x",*(buf+i)));
|
||||
}
|
||||
printk("before parse_rx_packet_type \n");
|
||||
|
||||
|
||||
rx_hw_hdr_len = parse_rx_packet_type(pAd, pRxBlk, pRxPacket);
|
||||
|
||||
if (rx_hw_hdr_len == 0)
|
||||
{
|
||||
pRxBlk->DataSize = 0;
|
||||
}
|
||||
if (RX_BLK_TEST_FLAG(pRxBlk, fRX_CMD_RSP))
|
||||
{
|
||||
RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pRxBlk->pRxPacket = pRxPacket;
|
||||
pRxBlk->pData = (UCHAR *)GET_OS_PKT_DATAPTR(pRxPacket);
|
||||
pRxBlk->pHeader = (HEADER_802_11 *)(pRxBlk->pData);
|
||||
|
||||
return pRxPacket;
|
||||
}
|
||||
|
||||
2677
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_dfs.c
Normal file
2677
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_dfs.c
Normal file
File diff suppressed because it is too large
Load Diff
9797
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_info.c
Normal file
9797
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_info.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,32 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2009, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_loft_cal.c
|
||||
|
||||
Abstract:
|
||||
Tx LOFT calibration and profile related functions
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
3274
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_mac_pci.c
Normal file
3274
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_mac_pci.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,170 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
VOID RT28xx_UpdateBeaconToAsic(
|
||||
RTMP_ADAPTER *pAd,
|
||||
INT apidx,
|
||||
ULONG FrameLen,
|
||||
ULONG UpdatePos)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID RTMPResetTxRxRingMemory(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
VOID RTMPFreeTxRxRingMemory(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UINT32 Index;
|
||||
|
||||
for (Index = 0; Index < NUM_OF_TX_RING; Index++)
|
||||
{
|
||||
NdisFreeSpinLock(&SDIOTxPacketListLock[Index]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS RTMPAllocTxRxRingMemory(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
|
||||
INT32 Index;
|
||||
ULONG ErrorValue = 0;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("-->RTMPAllocTxRxRingMemory\n"));
|
||||
|
||||
|
||||
for (Index = 0; Index < NUM_OF_TX_RING; Index++)
|
||||
{
|
||||
NdisAllocateSpinLock(pAd, &pAd->SDIOTxPacketListLock[Index]);
|
||||
}
|
||||
|
||||
/* Alloc MGMT ring desc buffer except Tx ring allocated eariler */
|
||||
|
||||
|
||||
/* Alloc Beacon ring desc buffer */
|
||||
|
||||
/* Allocate Tx ring descriptor's memory (BMC)*/
|
||||
|
||||
/* Alloc RX ring desc memory except Tx ring allocated eariler */
|
||||
|
||||
|
||||
|
||||
DBGPRINT_S(("<-- RTMPAllocTxRxRingMemory, Status=%x\n", Status));
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS RTMPInitTxRxRingMemory(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
NDIS_STATUS Status;
|
||||
UINT32 Index;
|
||||
unsigned long Flags;
|
||||
|
||||
for (Index = 0; Index < NUM_OF_TX_RING; Index++)
|
||||
{
|
||||
/*
|
||||
* (5 TX rings = 4 ACs + 1 HCCA)
|
||||
*/
|
||||
RTMP_SPIN_LOCK_IRQSAVE(&pAd->SDIOTxPacketListLock[Index], &Flags);
|
||||
DlListInit(&pAd->SDIOTxPacketList[Index]);
|
||||
RTMP_SPIN_UNLOCK_IRQRESTORE(&pAd->SDIOTxPacketListLock[Index], &Flags);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Disable DMA.
|
||||
|
||||
Arguments:
|
||||
*pAd the raxx interface data pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28XXDMADisable(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
/* no use*/
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Enable DMA.
|
||||
|
||||
Arguments:
|
||||
*pAd the raxx interface data pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT28XXDMAEnable(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* SDIO Radio on/off Related functions.
|
||||
*
|
||||
********************************************************************/
|
||||
VOID RT28xxSdioMlmeRadioOn(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xxSdioMlmeRadioOFF(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xxSdioAsicRadioOff(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("--> %s\n", __FUNCTION__));
|
||||
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<== %s\n", __FUNCTION__));
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID RT28xxSdioAsicRadioOn(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
/* make some traffic to invoke EvtDeviceD0Entry callback function*/
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<== %s\n", __FUNCTION__));
|
||||
}
|
||||
|
||||
|
||||
474
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_mat.c
Normal file
474
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_mat.c
Normal file
@ -0,0 +1,474 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_mat.c
|
||||
|
||||
Abstract:
|
||||
Support Mac Address Translation function.
|
||||
|
||||
Note:
|
||||
MAC Address Translation(MAT) engine subroutines, we should just take care
|
||||
packet to bridge.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------------- ---------- ----------------------------------------------
|
||||
Shiang 02-26-2007 Init version
|
||||
*/
|
||||
|
||||
#ifdef MAT_SUPPORT
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
extern MATProtoOps MATProtoIPHandle;
|
||||
extern MATProtoOps MATProtoARPHandle;
|
||||
extern MATProtoOps MATProtoPPPoEDisHandle;
|
||||
extern MATProtoOps MATProtoPPPoESesHandle;
|
||||
extern MATProtoOps MATProtoIPv6Handle;
|
||||
|
||||
extern UCHAR SNAP_802_1H[];
|
||||
extern UCHAR SNAP_BRIDGE_TUNNEL[];
|
||||
|
||||
#define MAX_MAT_NODE_ENTRY_NUM 128 /* We support maximum 128 node entry for our system */
|
||||
#define MAT_NODE_ENTRY_SIZE 40 /*28 // bytes //change to 40 for IPv6Mac Table */
|
||||
|
||||
typedef struct _MATNodeEntry
|
||||
{
|
||||
UCHAR data[MAT_NODE_ENTRY_SIZE];
|
||||
struct _MATNodeEntry *next;
|
||||
}MATNodeEntry, *PMATNodeEntry;
|
||||
|
||||
|
||||
#ifdef KMALLOC_BATCH
|
||||
/*static MATNodeEntry *MATNodeEntryPoll = NULL; */
|
||||
#endif
|
||||
|
||||
static MATProtoTable MATProtoTb[]=
|
||||
{
|
||||
{ETH_P_IP, &MATProtoIPHandle}, /* IP handler */
|
||||
{ETH_P_ARP, &MATProtoARPHandle}, /* ARP handler */
|
||||
{ETH_P_PPP_DISC, &MATProtoPPPoEDisHandle}, /* PPPoE discovery stage handler */
|
||||
{ETH_P_PPP_SES, &MATProtoPPPoESesHandle}, /* PPPoE session stage handler */
|
||||
{ETH_P_IPV6, &MATProtoIPv6Handle}, /* IPv6 handler */
|
||||
};
|
||||
|
||||
#define MAX_MAT_SUPPORT_PROTO_NUM (sizeof(MATProtoTb)/sizeof(MATProtoTable))
|
||||
|
||||
|
||||
/* --------------------------------- Public Function-------------------------------- */
|
||||
NDIS_STATUS MATDBEntryFree(
|
||||
IN MAT_STRUCT *pMatStruct,
|
||||
IN PUCHAR NodeEntry)
|
||||
{
|
||||
#ifdef KMALLOC_BATCH
|
||||
MATNodeEntry *pPtr, *pMATNodeEntryPoll;
|
||||
|
||||
pMATNodeEntryPoll = (MATNodeEntry *)pAd->MatCfg.MATNodeEntryPoll;
|
||||
pPtr = (MATNodeEntry *)NodeEntry;
|
||||
NdisZeroMemory(pPtr, sizeof(MATNodeEntry));
|
||||
if (pMATNodeEntryPoll->next)
|
||||
{
|
||||
pPtr->next = pMATNodeEntryPoll->next;
|
||||
pMATNodeEntryPoll->next = pPtr;
|
||||
} else {
|
||||
pMATNodeEntryPoll->next = pPtr;
|
||||
}
|
||||
#else
|
||||
os_free_mem(NULL, NodeEntry);
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
PUCHAR MATDBEntryAlloc(IN MAT_STRUCT *pMatStruct, IN UINT32 size)
|
||||
{
|
||||
#ifdef KMALLOC_BATCH
|
||||
MATNodeEntry *pPtr = NULL, *pMATNodeEntryPoll;
|
||||
pMATNodeEntryPoll = (MATNodeEntry *)pMatStruct->pMATNodeEntryPoll;
|
||||
|
||||
if (pMATNodeEntryPoll->next)
|
||||
{
|
||||
pPtr = pMATNodeEntryPoll->next;
|
||||
pMATNodeEntryPoll->next = pPtr->next;
|
||||
}
|
||||
|
||||
#else
|
||||
UCHAR *pPtr = NULL;
|
||||
|
||||
if (pMatStruct->nodeCount >= 128)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
os_alloc_mem(NULL, (PUCHAR *)&pPtr, size);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return (PUCHAR)pPtr;
|
||||
}
|
||||
|
||||
|
||||
VOID dumpPkt(PUCHAR pHeader, int len)
|
||||
{
|
||||
|
||||
#ifdef DBG
|
||||
int i;
|
||||
RTMP_STRING *tmp;
|
||||
|
||||
tmp = (RTMP_STRING *)pHeader;
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("--StartDump\n"));
|
||||
for(i=0;i<len; i++)
|
||||
{
|
||||
if ( (i%16==0) && (i!=0))
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\n"));
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%02x ", tmp[i]& 0xff));
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\n--EndDump\n"));
|
||||
#endif /* DBG */
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
For each out-going packet, check the upper layer protocol type if need
|
||||
to handled by our APCLI convert engine. If yes, call corresponding handler
|
||||
to handle it.
|
||||
|
||||
Arguments:
|
||||
pAd =>Pointer to our adapter
|
||||
pPkt =>pointer to the 802.11 header of outgoing packet
|
||||
ifIdx =>Interface Index want to dispatch to.
|
||||
|
||||
Return Value:
|
||||
Success =>
|
||||
TRUE
|
||||
Mapped mac address if found, else return specific default mac address
|
||||
depends on the upper layer protocol type.
|
||||
Error =>
|
||||
FALSE.
|
||||
|
||||
Note:
|
||||
1.the pPktHdr must be a 802.3 packet.
|
||||
2.Maybe we need a TxD arguments?
|
||||
3.We check every packet here including group mac address becasue we need to
|
||||
handle DHCP packet.
|
||||
========================================================================
|
||||
*/
|
||||
PUCHAR MATEngineTxHandle(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PNDIS_PACKET pPkt,
|
||||
IN UINT ifIdx,
|
||||
IN UCHAR OpMode)
|
||||
{
|
||||
PUCHAR pLayerHdr = NULL, pPktHdr = NULL, pMacAddr = NULL;
|
||||
UINT16 protoType, protoType_ori;
|
||||
INT i;
|
||||
struct _MATProtoOps *pHandle = NULL;
|
||||
PUCHAR retSkb = NULL;
|
||||
BOOLEAN bVLANPkt = FALSE;
|
||||
|
||||
|
||||
if(pAd->MatCfg.status != MAT_ENGINE_STAT_INITED)
|
||||
return NULL;
|
||||
|
||||
pPktHdr = GET_OS_PKT_DATAPTR(pPkt);
|
||||
if (!pPktHdr)
|
||||
return NULL;
|
||||
|
||||
protoType_ori = get_unaligned((PUINT16)(pPktHdr + 12));
|
||||
|
||||
/* Get the upper layer protocol type of this 802.3 pkt. */
|
||||
protoType = OS_NTOHS(protoType_ori);
|
||||
|
||||
/* handle 802.1q enabled packet. Skip the VLAN tag field to get the protocol type. */
|
||||
if (protoType == 0x8100)
|
||||
{
|
||||
protoType_ori = get_unaligned((PUINT16)(pPktHdr + 12 + 4));
|
||||
protoType = OS_NTOHS(protoType_ori);
|
||||
bVLANPkt = TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* For differnet protocol, dispatch to specific handler */
|
||||
for (i=0; i < MAX_MAT_SUPPORT_PROTO_NUM; i++)
|
||||
{
|
||||
if (protoType == MATProtoTb[i].protocol)
|
||||
{
|
||||
pHandle = MATProtoTb[i].pHandle; /* the pHandle must not be null! */
|
||||
pLayerHdr = bVLANPkt ? (pPktHdr + MAT_VLAN_ETH_HDR_LEN) : (pPktHdr + MAT_ETHER_HDR_LEN);
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
#ifdef APCLI_SUPPORT
|
||||
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
|
||||
{
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
UCHAR tempIdx = ifIdx;
|
||||
UCHAR CliIdx = 0xFF;
|
||||
|
||||
if (tempIdx >= 64)
|
||||
{
|
||||
CliIdx = ((tempIdx - 64) % 16);
|
||||
tempIdx = ((tempIdx - 64) / 16);
|
||||
|
||||
pMacAddr = &pAd->ApCfg.ApCliTab[tempIdx].RepeaterCli[CliIdx].CurrentAddress[0];
|
||||
}
|
||||
else
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
pMacAddr = &pAd->ApCfg.ApCliTab[ifIdx].wdev.if_addr[0];
|
||||
}
|
||||
#endif /* APCLI_SUPPORT */
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
|
||||
if (pHandle->tx!=NULL)
|
||||
retSkb = pHandle->tx((PVOID)&pAd->MatCfg, RTPKT_TO_OSPKT(pPkt), pLayerHdr, pMacAddr);
|
||||
|
||||
return retSkb;
|
||||
}
|
||||
}
|
||||
return retSkb;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Depends on the Received packet, check the upper layer protocol type
|
||||
and search for specific mapping table to find out the real destination
|
||||
MAC address.
|
||||
|
||||
Arguments:
|
||||
pAd =>Pointer to our adapter
|
||||
pPkt =>pointer to the 802.11 header of receviced packet
|
||||
infIdx =>Interface Index want to dispatch to.
|
||||
|
||||
Return Value:
|
||||
Success =>
|
||||
Mapped mac address if found, else return specific default mac address
|
||||
depends on the upper layer protocol type.
|
||||
Error =>
|
||||
NULL
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
PUCHAR MATEngineRxHandle(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PNDIS_PACKET pPkt,
|
||||
IN UINT infIdx)
|
||||
{
|
||||
PUCHAR pMacAddr = NULL;
|
||||
PUCHAR pLayerHdr = NULL, pPktHdr = NULL;
|
||||
UINT16 protoType;
|
||||
INT i =0;
|
||||
struct _MATProtoOps *pHandle = NULL;
|
||||
|
||||
|
||||
if(pAd->MatCfg.status != MAT_ENGINE_STAT_INITED)
|
||||
return NULL;
|
||||
|
||||
pPktHdr = GET_OS_PKT_DATAPTR(pPkt);
|
||||
if (!pPktHdr)
|
||||
return NULL;
|
||||
|
||||
/* If it's a multicast/broadcast packet, we do nothing. */
|
||||
if (IS_GROUP_MAC(pPktHdr))
|
||||
return NULL;
|
||||
|
||||
/* Get the upper layer protocol type of this 802.3 pkt and dispatch to specific handler */
|
||||
protoType = OS_NTOHS(get_unaligned((PUINT16)(pPktHdr + 12)));
|
||||
|
||||
for (i=0; i<MAX_MAT_SUPPORT_PROTO_NUM; i++)
|
||||
{
|
||||
if (protoType == MATProtoTb[i].protocol)
|
||||
{
|
||||
pHandle = MATProtoTb[i].pHandle; /* the pHandle must not be null! */
|
||||
pLayerHdr = (pPktHdr + MAT_ETHER_HDR_LEN);
|
||||
/* RTMP_SEM_LOCK(&MATDBLock); */
|
||||
if(pHandle->rx!=NULL)
|
||||
pMacAddr = pHandle->rx((PVOID)&pAd->MatCfg, RTPKT_TO_OSPKT(pPkt), pLayerHdr, NULL);
|
||||
/* RTMP_SEM_UNLOCK(&MATDBLock); */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pMacAddr)
|
||||
NdisMoveMemory(pPktHdr, pMacAddr, MAC_ADDR_LEN);
|
||||
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN MATPktRxNeedConvert(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PNET_DEV net_dev)
|
||||
{
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
|
||||
{
|
||||
#ifdef APCLI_SUPPORT
|
||||
int i = 0;
|
||||
|
||||
/* Check if the packet will be send to apcli interface. */
|
||||
while(i<MAX_APCLI_NUM)
|
||||
{
|
||||
/*BSSID match the ApCliBssid ?(from a valid AP) */
|
||||
if ((pAd->ApCfg.ApCliTab[i].Valid == TRUE)
|
||||
&& (net_dev == pAd->ApCfg.ApCliTab[i].wdev.if_dev)
|
||||
#ifdef A4_CONN
|
||||
&& (IS_APCLI_A4(&pAd->ApCfg.ApCliTab[i]) == FALSE)
|
||||
#endif /* A4_CONN */
|
||||
){
|
||||
return TRUE;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
#endif /* APCLI_SUPPORT */
|
||||
}
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS MATEngineExit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
struct _MATProtoOps *pHandle = NULL;
|
||||
int i;
|
||||
|
||||
if(pAd->MatCfg.status == MAT_ENGINE_STAT_EXITED)
|
||||
return TRUE;
|
||||
|
||||
/* For each registered protocol, we call it's exit handler. */
|
||||
for (i=0; i<MAX_MAT_SUPPORT_PROTO_NUM; i++)
|
||||
{
|
||||
pHandle = MATProtoTb[i].pHandle;
|
||||
if (pHandle->exit!=NULL)
|
||||
pHandle->exit(&pAd->MatCfg);
|
||||
}
|
||||
|
||||
#ifdef KMALLOC_BATCH
|
||||
/* Free the memory used to store node entries. */
|
||||
if (pAd->MatCfg.pMATNodeEntryPoll)
|
||||
{
|
||||
os_free_mem(pAd, pAd->MatCfg.pMATNodeEntryPoll);
|
||||
pAd->MatCfg.pMATNodeEntryPoll = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
pAd->MatCfg.status = MAT_ENGINE_STAT_EXITED;
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS MATEngineInit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
MATProtoOps *pHandle = NULL;
|
||||
int i, status;
|
||||
|
||||
if(pAd->MatCfg.status == MAT_ENGINE_STAT_INITED)
|
||||
return TRUE;
|
||||
|
||||
#ifdef KMALLOC_BATCH
|
||||
/* Allocate memory for node entry, we totally allocate 128 entries and link them together. */
|
||||
os_alloc_mem_suspend(NULL, (UCHAR **)&(pAd->MatCfg.pMATNodeEntryPoll), sizeof(MATNodeEntry) * MAX_MAT_NODE_ENTRY_NUM);
|
||||
if (pAd->MatCfg.pMATNodeEntryPoll != NULL)
|
||||
{
|
||||
MATNodeEntry *pPtr=NULL;
|
||||
|
||||
NdisZeroMemory(pAd->MatCfg.pMATNodeEntryPoll, sizeof(MATNodeEntry) * MAX_MAT_NODE_ENTRY_NUM);
|
||||
pPtr = pAd->MatCfg.pMATNodeEntryPoll;
|
||||
for (i = 0; i < (MAX_MAT_NODE_ENTRY_NUM -1); i++)
|
||||
{
|
||||
pPtr->next = (MATNodeEntry *)(pPtr+1);
|
||||
pPtr = pPtr->next;
|
||||
}
|
||||
pPtr->next = NULL;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* For each specific protocol, call it's init function. */
|
||||
for (i = 0; i < MAX_MAT_SUPPORT_PROTO_NUM; i++)
|
||||
{
|
||||
pHandle = MATProtoTb[i].pHandle;
|
||||
ASSERT(pHandle);
|
||||
if (pHandle->init != NULL)
|
||||
{
|
||||
status = pHandle->init(&pAd->MatCfg);
|
||||
if (status == FALSE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("MATEngine Init Protocol (0x%x) failed, Stop the MAT Funciton initialization failed!\n", MATProtoTb[i].protocol));
|
||||
goto init_failed;
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("MATEngine Init Protocol (0x%04x) success!\n", MATProtoTb[i].protocol));
|
||||
}
|
||||
}
|
||||
|
||||
NdisAllocateSpinLock(pAd, &pAd->MatCfg.MATDBLock);
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
pAd->MatCfg.bMACRepeaterEn = FALSE;
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
pAd->MatCfg.pPriv = (VOID *)pAd;
|
||||
pAd->MatCfg.status = MAT_ENGINE_STAT_INITED;
|
||||
|
||||
return TRUE;
|
||||
|
||||
init_failed:
|
||||
/* For each specific protocol, call it's exit function. */
|
||||
for (i = 0; i < MAX_MAT_SUPPORT_PROTO_NUM; i++)
|
||||
{
|
||||
if ((pHandle = MATProtoTb[i].pHandle) != NULL)
|
||||
{
|
||||
if (pHandle->exit != NULL)
|
||||
{
|
||||
status = pHandle->exit(&pAd->MatCfg);
|
||||
if (status == FALSE)
|
||||
goto init_failed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef KMALLOC_BATCH
|
||||
if (pAd->MatCfg.pMATNodeEntryPoll)
|
||||
os_free_mem(pAd, pAd->MatCfg.pMATNodeEntryPoll);
|
||||
pAd->MatCfg.status = MAT_ENGINE_STAT_EXITED;
|
||||
#endif /* KMALLOC_BATCH */
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
#endif /* MAT_SUPPORT */
|
||||
|
||||
@ -0,0 +1,807 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_mat_iparp.c
|
||||
|
||||
Abstract:
|
||||
MAT convert engine subroutine for ip base protocols, currently now we
|
||||
just handle IP/ARP protocols.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Shiang 02/26/07 Init version
|
||||
*/
|
||||
#ifdef MAT_SUPPORT
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
static NDIS_STATUS MATProto_IP_Init(MAT_STRUCT *pMatCfg);
|
||||
static NDIS_STATUS MATProto_IP_Exit(MAT_STRUCT *pMatCfg);
|
||||
static PUCHAR MATProto_IP_Rx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pMacAddr);
|
||||
static PUCHAR MATProto_IP_Tx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pMacAddr);
|
||||
|
||||
static NDIS_STATUS MATProto_ARP_Init(MAT_STRUCT *pMatCfg);
|
||||
static NDIS_STATUS MATProto_ARP_Exit(MAT_STRUCT *pMatCfg);
|
||||
static PUCHAR MATProto_ARP_Rx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pMacAddr);
|
||||
static PUCHAR MATProto_ARP_Tx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb,PUCHAR pLayerHdr, PUCHAR pMacAddr);
|
||||
|
||||
#define IPV4_ADDR_LEN 4
|
||||
|
||||
#define NEED_UPDATE_IPMAC_TB(Mac, IP) (IS_UCAST_MAC(Mac) && IS_GOOD_IP(IP))
|
||||
|
||||
|
||||
typedef struct _IPMacMappingEntry
|
||||
{
|
||||
UINT ipAddr; /* In network order */
|
||||
UCHAR macAddr[MAC_ADDR_LEN];
|
||||
ULONG lastTime;
|
||||
struct _IPMacMappingEntry *pNext;
|
||||
}IPMacMappingEntry, *PIPMacMappingEntry;
|
||||
|
||||
|
||||
typedef struct _IPMacMappingTable
|
||||
{
|
||||
BOOLEAN valid;
|
||||
IPMacMappingEntry *hash[MAT_MAX_HASH_ENTRY_SUPPORT+1]; /*0~63 for specific station, 64 for broadcast MacAddress */
|
||||
UCHAR curMcastAddr[MAC_ADDR_LEN]; /* The multicast mac addr for currecnt received packet destined to ipv4 multicast addr */
|
||||
}IPMacMappingTable;
|
||||
|
||||
|
||||
struct _MATProtoOps MATProtoIPHandle =
|
||||
{
|
||||
.init = MATProto_IP_Init,
|
||||
.tx = MATProto_IP_Tx,
|
||||
.rx = MATProto_IP_Rx,
|
||||
.exit = MATProto_IP_Exit,
|
||||
};
|
||||
|
||||
struct _MATProtoOps MATProtoARPHandle =
|
||||
{
|
||||
.init = MATProto_ARP_Init,
|
||||
.tx = MATProto_ARP_Tx,
|
||||
.rx = MATProto_ARP_Rx,
|
||||
.exit =MATProto_ARP_Exit,
|
||||
};
|
||||
|
||||
|
||||
VOID dumpIPMacTb(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN int index)
|
||||
{
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
IPMacMappingEntry *pHead;
|
||||
int startIdx, endIdx;
|
||||
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
if (!pIPMacTable)
|
||||
return;
|
||||
|
||||
if (!pIPMacTable->valid)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():IPMacTable not init yet, so cannot do dump!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if(index < 0)
|
||||
{ /* dump all. */
|
||||
startIdx = 0;
|
||||
endIdx = MAT_MAX_HASH_ENTRY_SUPPORT;
|
||||
}
|
||||
else
|
||||
{ /* dump specific hash index. */
|
||||
startIdx = endIdx = index;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():\n", __FUNCTION__));
|
||||
for(; startIdx<= endIdx; startIdx++)
|
||||
{
|
||||
pHead = pIPMacTable->hash[startIdx];
|
||||
while(pHead)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("IPMac[%d]:\n", startIdx));
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t:IP=0x%x,Mac=%02x:%02x:%02x:%02x:%02x:%02x, lastTime=0x%lx, next=%p\n",
|
||||
pHead->ipAddr, pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],
|
||||
pHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5], pHead->lastTime,
|
||||
pHead->pNext));
|
||||
pHead = pHead->pNext;
|
||||
}
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t----EndOfDump!\n"));
|
||||
|
||||
}
|
||||
|
||||
|
||||
static inline NDIS_STATUS getDstIPFromIpPkt(
|
||||
IN PUCHAR pIpHdr,
|
||||
IN UINT *dstIP)
|
||||
{
|
||||
|
||||
if (!pIpHdr)
|
||||
return FALSE;
|
||||
|
||||
NdisMoveMemory(dstIP, (pIpHdr + 16), 4); /*shift 16 for IP header len before DstIP. */
|
||||
/* DBGPRINT(RT_DEBUG_TRACE, ("%s(): Get the dstIP=0x%x\n", __FUNCTION__, *dstIP)); */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static inline NDIS_STATUS getSrcIPFromIpPkt(
|
||||
IN PUCHAR pIpHdr,
|
||||
IN UINT *pSrcIP)
|
||||
{
|
||||
|
||||
if (!pIpHdr)
|
||||
return FALSE;
|
||||
|
||||
NdisMoveMemory(pSrcIP, (pIpHdr + 12), 4); /*shift 12 for IP header len before DstIP. */
|
||||
/* DBGPRINT(RT_DEBUG_TRACE, ("%s(): Get the srcIP=0x%x\n", __FUNCTION__, *pSrcIP)); */
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
static NDIS_STATUS IPMacTableUpdate(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PUCHAR pMacAddr,
|
||||
IN UINT ipAddr)
|
||||
{
|
||||
UINT hashIdx;
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
IPMacMappingEntry *pEntry = NULL, *pPrev = NULL, *pNewEntry =NULL;
|
||||
ULONG now;
|
||||
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
|
||||
if (!pIPMacTable)
|
||||
return FALSE;
|
||||
|
||||
if (!pIPMacTable->valid)
|
||||
return FALSE;
|
||||
|
||||
hashIdx = MAT_IP_ADDR_HASH_INDEX(ipAddr);
|
||||
|
||||
pEntry = pPrev = pIPMacTable->hash[hashIdx];
|
||||
while(pEntry)
|
||||
{
|
||||
NdisGetSystemUpTime(&now);
|
||||
|
||||
/* Find a existed IP-MAC Mapping entry */
|
||||
if (ipAddr == pEntry->ipAddr)
|
||||
{
|
||||
/* DBGPRINT(RT_DEBUG_TRACE, ("%s(): Got the Mac(%02x:%02x:%02x:%02x:%02x:%02x) of mapped IP(%d.%d.%d.%d)\n",
|
||||
__FUNCTION__, pEntry->macAddr[0],pEntry->macAddr[1],pEntry->macAddr[2], pEntry->macAddr[3],pEntry->macAddr[4],
|
||||
pEntry->macAddr[5], (ipAddr>>24) & 0xff, (ipAddr>>16) & 0xff, (ipAddr>>8) & 0xff, ipAddr & 0xff));
|
||||
*/
|
||||
/* compare is useless. So we directly copy it into the entry. */
|
||||
NdisMoveMemory(pEntry->macAddr, pMacAddr, 6);
|
||||
pEntry->lastTime = now;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{ /* handle the age-out situation */
|
||||
/*if ((Now - pEntry->lastTime) > MAT_TB_ENTRY_AGEOUT_TIME) */
|
||||
if (RTMP_TIME_AFTER(now, pEntry->lastTime + MAT_TB_ENTRY_AGEOUT_TIME))
|
||||
{
|
||||
/* Remove the aged entry */
|
||||
if (pEntry == pIPMacTable->hash[hashIdx])
|
||||
{
|
||||
pIPMacTable->hash[hashIdx]= pEntry->pNext;
|
||||
pPrev = pIPMacTable->hash[hashIdx];
|
||||
}
|
||||
else
|
||||
{
|
||||
pPrev->pNext = pEntry->pNext;
|
||||
}
|
||||
MATDBEntryFree(pMatCfg, (PUCHAR)pEntry);
|
||||
|
||||
pEntry = (pPrev == NULL ? NULL: pPrev->pNext);
|
||||
pMatCfg->nodeCount--;
|
||||
}
|
||||
else
|
||||
{
|
||||
pPrev = pEntry;
|
||||
pEntry = pEntry->pNext;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Allocate a new IPMacMapping entry and insert into the hash */
|
||||
pNewEntry = (IPMacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPMacMappingEntry));
|
||||
if (pNewEntry != NULL)
|
||||
{
|
||||
pNewEntry->ipAddr = ipAddr;
|
||||
NdisMoveMemory(pNewEntry->macAddr, pMacAddr, 6);
|
||||
pNewEntry->pNext = NULL;
|
||||
NdisGetSystemUpTime(&pNewEntry->lastTime);
|
||||
|
||||
if (pIPMacTable->hash[hashIdx] == NULL)
|
||||
{ /* Hash list is empty, directly assign it. */
|
||||
pIPMacTable->hash[hashIdx] = pNewEntry;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Ok, we insert the new entry into the root of hash[hashIdx] */
|
||||
pNewEntry->pNext = pIPMacTable->hash[hashIdx];
|
||||
pIPMacTable->hash[hashIdx] = pNewEntry;
|
||||
}
|
||||
/*dumpIPMacTb(pMatCfg, hashIdx); //for debug */
|
||||
|
||||
pMatCfg->nodeCount++;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
static PUCHAR IPMacTableLookUp(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN UINT ipAddr)
|
||||
{
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
UINT hashIdx, ip;
|
||||
IPMacMappingEntry *pEntry = NULL;
|
||||
PUCHAR pGroupMacAddr;
|
||||
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
|
||||
if (!pIPMacTable)
|
||||
return NULL;
|
||||
|
||||
if (!pIPMacTable->valid)
|
||||
return NULL;
|
||||
|
||||
/*if multicast ip, need converting multicast group address to ethernet address. */
|
||||
ip = ntohl(ipAddr);
|
||||
if (IS_MULTICAST_IP(ip))
|
||||
{
|
||||
pGroupMacAddr = (PUCHAR)(&pIPMacTable->curMcastAddr);
|
||||
ConvertMulticastIP2MAC((PUCHAR) &ipAddr, (UCHAR **)(&pGroupMacAddr), ETH_P_IP);
|
||||
return pIPMacTable->curMcastAddr;
|
||||
}
|
||||
|
||||
/* Use hash to find out the location of that entry and get the Mac address. */
|
||||
hashIdx = MAT_IP_ADDR_HASH_INDEX(ipAddr);
|
||||
|
||||
/* spin_lock_irqsave(&IPMacTabLock, irqFlag); */
|
||||
pEntry = pIPMacTable->hash[hashIdx];
|
||||
while(pEntry)
|
||||
{
|
||||
if (pEntry->ipAddr == ipAddr)
|
||||
{
|
||||
/* DBGPRINT(RT_DEBUG_TRACE, ("%s(): dstMac=%02x:%02x:%02x:%02x:%02x:%02x for mapped dstIP(%d.%d.%d.%d)\n",
|
||||
__FUNCTION__, pEntry->macAddr[0],pEntry->macAddr[1],pEntry->macAddr[2],
|
||||
pEntry->macAddr[3],pEntry->macAddr[4],pEntry->macAddr[5],
|
||||
(ipAddr>>24) & 0xff, (ipAddr>>16) & 0xff, (ipAddr>>8) & 0xff, ipAddr & 0xff));
|
||||
*/
|
||||
|
||||
/*Update the lastTime to prevent the aging before pDA processed! */
|
||||
NdisGetSystemUpTime(&pEntry->lastTime);
|
||||
|
||||
return pEntry->macAddr;
|
||||
}
|
||||
else
|
||||
pEntry = pEntry->pNext;
|
||||
}
|
||||
|
||||
/*
|
||||
We didn't find any matched Mac address, our policy is treat it as
|
||||
broadcast packet and send to all.
|
||||
*/
|
||||
return pIPMacTable->hash[IPMAC_TB_HASH_INDEX_OF_BCAST]->macAddr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS IPMacTable_RemoveAll(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
IPMacMappingEntry *pEntry;
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
INT i;
|
||||
|
||||
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
|
||||
if (!pIPMacTable)
|
||||
return TRUE;
|
||||
|
||||
if (pIPMacTable->valid)
|
||||
{
|
||||
pIPMacTable->valid = FALSE;
|
||||
for (i=0; i<IPMAC_TB_HASH_ENTRY_NUM; i++)
|
||||
{
|
||||
while((pEntry = pIPMacTable->hash[i]) != NULL)
|
||||
{
|
||||
pIPMacTable->hash[i] = pEntry->pNext;
|
||||
MATDBEntryFree(pMatCfg, (PUCHAR)pEntry);
|
||||
}
|
||||
}
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s() Set nodeCount to 0,nodeCount = %d\n", __FUNCTION__, pMatCfg->nodeCount));
|
||||
pMatCfg->nodeCount = 0;
|
||||
os_free_mem(NULL, pIPMacTable);
|
||||
pMatCfg->MatTableSet.IPMacTable = NULL;
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS IPMacTable_init(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
IPMacMappingEntry *pEntry = NULL;
|
||||
|
||||
|
||||
if (pMatCfg->MatTableSet.IPMacTable != NULL)
|
||||
{
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
}
|
||||
else
|
||||
{
|
||||
os_alloc_mem_suspend(NULL, (UCHAR **)&(pMatCfg->MatTableSet.IPMacTable), sizeof(IPMacMappingTable));
|
||||
if (pMatCfg->MatTableSet.IPMacTable)
|
||||
{
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
NdisZeroMemory(pIPMacTable, sizeof(IPMacMappingTable));
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("IPMacTable_init(): Allocate memory for IPMacTable failed!\n"));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (pIPMacTable->valid == FALSE)
|
||||
{
|
||||
/*Set the last hash entry (hash[64]) as our default broadcast Mac address */
|
||||
pEntry = (IPMacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPMacMappingEntry));
|
||||
if (!pEntry)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("IPMacTable_init(): Allocate memory for IPMacTable broadcast entry failed!\n"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
NdisZeroMemory(pEntry, sizeof(IPMacMappingEntry));
|
||||
NdisMoveMemory(&pEntry->macAddr[0], &BROADCAST_ADDR[0], 6);
|
||||
pEntry->pNext = NULL;
|
||||
pIPMacTable->hash[IPMAC_TB_HASH_INDEX_OF_BCAST] = pEntry;
|
||||
|
||||
pIPMacTable->valid = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): IPMacTable already inited!\n", __FUNCTION__));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_ARP_Exit(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
INT status;
|
||||
|
||||
status = IPMacTable_RemoveAll(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static PUCHAR MATProto_ARP_Rx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pMacAddr)
|
||||
{
|
||||
PUCHAR pArpHdr = NULL, pRealMac = NULL;
|
||||
PUCHAR tgtMac, tgtIP;
|
||||
BOOLEAN isUcastMac, isGoodIP;
|
||||
|
||||
|
||||
pArpHdr = pLayerHdr;
|
||||
|
||||
/*dumpPkt(RTPKT_TO_OSPKT(pSkb)->data, RTPKT_TO_OSPKT(pSkb)->len); */
|
||||
/* We just take care about the target(Mac/IP address) fields. */
|
||||
tgtMac = pArpHdr + 18;
|
||||
tgtIP = tgtMac + 6;
|
||||
|
||||
/* isUcastMac = !(00:00:00:00:00:00|| mcastMac); */
|
||||
isUcastMac = ((tgtMac[0]|tgtMac[1]|tgtMac[2]|tgtMac[3]|tgtMac[4]|tgtMac[5])!=0);
|
||||
isUcastMac &= ((tgtMac[0] & 0x1)==0);
|
||||
|
||||
/* isGoodIP = ip address is not 0.0.0.0 */
|
||||
isGoodIP = (*(UINT *)tgtIP != 0);
|
||||
|
||||
|
||||
if (isUcastMac && isGoodIP)
|
||||
pRealMac = IPMacTableLookUp(pMatCfg, *(UINT *)tgtIP);
|
||||
|
||||
/*
|
||||
For need replaced mac, we need to replace the targetMAC as correct one to make
|
||||
the real receiver can receive that.
|
||||
*/
|
||||
if (isUcastMac && pRealMac)
|
||||
NdisMoveMemory(tgtMac, pRealMac, MAC_ADDR_LEN);
|
||||
|
||||
if (pRealMac == NULL)
|
||||
pRealMac = &BROADCAST_ADDR[0];
|
||||
/* pRealMac = pIPMacTable->hash[IPMAC_TB_HASH_INDEX_OF_BCAST]->macAddr; */
|
||||
|
||||
return pRealMac;
|
||||
}
|
||||
|
||||
static PUCHAR MATProto_ARP_Tx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pMacAddr)
|
||||
{
|
||||
PUCHAR pSMac, pSIP;
|
||||
BOOLEAN isUcastMac, isGoodIP;
|
||||
NET_PRO_ARP_HDR *arpHdr;
|
||||
//PUCHAR pPktHdr;
|
||||
PNDIS_PACKET newSkb = NULL;
|
||||
|
||||
//pPktHdr = GET_OS_PKT_DATAPTR(pSkb);
|
||||
|
||||
arpHdr = (NET_PRO_ARP_HDR *)pLayerHdr;
|
||||
|
||||
/*
|
||||
Check the arp header.
|
||||
We just handle ether type hardware address and IPv4 internet
|
||||
address type and opcode is ARP reuqest/response.
|
||||
*/
|
||||
if ((arpHdr->ar_hrd != OS_HTONS(ARPHRD_ETHER)) || (arpHdr->ar_pro != OS_HTONS(ETH_P_IP)) ||
|
||||
(arpHdr->ar_op != OS_HTONS(ARPOP_REPLY) && arpHdr->ar_op != OS_HTONS(ARPOP_REQUEST)))
|
||||
return NULL;
|
||||
|
||||
/* We just take care about the sender(Mac/IP address) fields. */
|
||||
pSMac =(PUCHAR)(pLayerHdr + 8);
|
||||
pSIP = (PUCHAR)(pSMac + MAC_ADDR_LEN);
|
||||
|
||||
isUcastMac = IS_UCAST_MAC(pSMac);
|
||||
isGoodIP = IS_GOOD_IP(get_unaligned32((PUINT) pSIP));
|
||||
|
||||
/*
|
||||
DBGPRINT(RT_DEBUG_TRACE,("%s(): ARP Pkt=>senderIP=%d.%d.%d.%d, senderMac=%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
__FUNCTION__, pSIP[0], pSIP[1], pSIP[2], pSIP[3],
|
||||
pSMac[0],pSMac[1],pSMac[2],pSMac[3],pSMac[4],pSMac[5]));
|
||||
*/
|
||||
if (isUcastMac && isGoodIP)
|
||||
IPMacTableUpdate(pMatCfg, pSMac, get_unaligned32((PUINT) pSIP));
|
||||
|
||||
/*
|
||||
For outgoing unicast mac, we need to replace the senderMAC as ourself to make
|
||||
the receiver can send to us.
|
||||
*/
|
||||
if (isUcastMac)
|
||||
{
|
||||
if(OS_PKT_CLONED(pSkb))
|
||||
{
|
||||
newSkb = (PNDIS_PACKET)OS_PKT_COPY(pSkb);
|
||||
if(newSkb)
|
||||
{
|
||||
if (IS_VLAN_PACKET(GET_OS_PKT_DATAPTR(newSkb)))
|
||||
pSMac = (PUCHAR)(GET_OS_PKT_DATAPTR(newSkb) + MAT_VLAN_ETH_HDR_LEN + 8);
|
||||
else
|
||||
pSMac = (PUCHAR)(GET_OS_PKT_DATAPTR(newSkb) + MAT_ETHER_HDR_LEN + 8);
|
||||
}
|
||||
}
|
||||
|
||||
ASSERT(pMacAddr);
|
||||
NdisMoveMemory(pSMac, pMacAddr, MAC_ADDR_LEN);
|
||||
}
|
||||
|
||||
return (PUCHAR)newSkb;
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_ARP_Init(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
BOOLEAN status = FALSE;
|
||||
|
||||
status = IPMacTable_init(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_IP_Exit(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
INT status;
|
||||
|
||||
status = IPMacTable_RemoveAll(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static PUCHAR MATProto_IP_Rx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pDevMacAdr)
|
||||
{
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) pMatCfg->pPriv;
|
||||
USHORT wcid = 0xFF;
|
||||
PMAC_TABLE_ENTRY pEntry = NULL;
|
||||
PREPEATER_CLIENT_ENTRY pReptEntry = NULL;
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
PUCHAR pMacAddr;
|
||||
UINT dstIP;
|
||||
|
||||
/* Fetch the IP addres from the packet header. */
|
||||
getDstIPFromIpPkt(pLayerHdr, &dstIP);
|
||||
pMacAddr = IPMacTableLookUp(pMatCfg, dstIP);
|
||||
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
if (pAd == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s():ERROR! pAd is null!\n", __FUNCTION__));
|
||||
return pMacAddr;
|
||||
}
|
||||
|
||||
wcid = RTMP_GET_PACKET_WCID(pSkb);
|
||||
|
||||
pEntry = &pAd->MacTab.Content[wcid];
|
||||
pReptEntry = &pAd->ApCfg.ApCliTab[pEntry->func_tb_idx].RepeaterCli[pEntry->MatchReptCliIdx];
|
||||
|
||||
if (pAd->ApCfg.bMACRepeaterEn)
|
||||
{
|
||||
if (pEntry->bReptCli)
|
||||
{
|
||||
UINT ip;
|
||||
|
||||
ip = ntohl(dstIP);
|
||||
|
||||
/* avoid duplicate packet in IGMP case */
|
||||
if (IS_MULTICAST_IP(ip))
|
||||
return pReptEntry->OriginalAddress;
|
||||
}
|
||||
|
||||
|
||||
if ((pAd->ApCfg.MACRepeaterOuiMode != 1))
|
||||
{
|
||||
if (pEntry->bReptCli)
|
||||
{
|
||||
PUCHAR pPktHdr, pLayerHdr;
|
||||
|
||||
pPktHdr = GET_OS_PKT_DATAPTR(pSkb);
|
||||
pLayerHdr = (pPktHdr + MAT_ETHER_HDR_LEN);
|
||||
|
||||
/*For UDP packet, we need to check about the DHCP packet. */
|
||||
if (*(pLayerHdr + 9) == 0x11)
|
||||
{
|
||||
PUCHAR pUdpHdr;
|
||||
UINT16 srcPort, dstPort;
|
||||
BOOLEAN bHdrChanged = FALSE;
|
||||
|
||||
pUdpHdr = pLayerHdr + 20;
|
||||
srcPort = OS_NTOHS(get_unaligned((PUINT16)(pUdpHdr)));
|
||||
dstPort = OS_NTOHS(get_unaligned((PUINT16)(pUdpHdr+2)));
|
||||
|
||||
if (srcPort==67 && dstPort==68) /*It's a DHCP packet */
|
||||
{
|
||||
PUCHAR bootpHdr/*, dhcpHdr*/, pCliHwAddr;
|
||||
bootpHdr = pUdpHdr + 8;
|
||||
//dhcpHdr = bootpHdr + 236;
|
||||
pCliHwAddr = (bootpHdr+28);
|
||||
|
||||
if (pReptEntry)
|
||||
NdisMoveMemory(pCliHwAddr, pReptEntry->OriginalAddress, MAC_ADDR_LEN);
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s() MatchAPCLITabIdx = %u\n", __FUNCTION__, pEntry->func_tb_idx));
|
||||
}
|
||||
bHdrChanged = TRUE;
|
||||
}
|
||||
|
||||
if (bHdrChanged == TRUE)
|
||||
NdisZeroMemory((pUdpHdr+6), 2); /*modify the UDP chksum as zero */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
|
||||
return pMacAddr;
|
||||
}
|
||||
|
||||
static UCHAR DHCP_MAGIC[]= {0x63, 0x82, 0x53, 0x63};
|
||||
static PUCHAR MATProto_IP_Tx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pDevMacAdr)
|
||||
{
|
||||
PUCHAR pSrcMac;
|
||||
PUCHAR pSrcIP;
|
||||
BOOLEAN needUpdate;
|
||||
PUCHAR pPktHdr;
|
||||
|
||||
pPktHdr = GET_OS_PKT_DATAPTR(pSkb);
|
||||
|
||||
pSrcMac = pPktHdr + 6;
|
||||
pSrcIP = pLayerHdr + 12;
|
||||
|
||||
needUpdate = NEED_UPDATE_IPMAC_TB(pSrcMac, get_unaligned32((PUINT)(pSrcIP)));
|
||||
if (needUpdate)
|
||||
IPMacTableUpdate(pMatCfg, pSrcMac, get_unaligned32((PUINT)(pSrcIP)));
|
||||
|
||||
/*For UDP packet, we need to check about the DHCP packet, to modify the flag of DHCP discovey/request as broadcast. */
|
||||
if (*(pLayerHdr + 9) == 0x11)
|
||||
{
|
||||
PUCHAR udpHdr;
|
||||
UINT16 srcPort, dstPort;
|
||||
BOOLEAN bHdrChanged = FALSE;
|
||||
|
||||
udpHdr = pLayerHdr + 20;
|
||||
srcPort = OS_NTOHS(get_unaligned((PUINT16)(udpHdr)));
|
||||
dstPort = OS_NTOHS(get_unaligned((PUINT16)(udpHdr+2)));
|
||||
|
||||
if (srcPort==68 && dstPort==67) /*It's a DHCP packet */
|
||||
{
|
||||
PUCHAR bootpHdr;
|
||||
UINT16 bootpFlag;
|
||||
PUCHAR dhcpHdr;
|
||||
|
||||
bootpHdr = udpHdr + 8;
|
||||
bootpFlag = OS_NTOHS(get_unaligned((PUINT16)(bootpHdr+10)));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("is bootp packet! bootpFlag=0x%x\n", bootpFlag));
|
||||
dhcpHdr = bootpHdr + 236;
|
||||
|
||||
if (bootpFlag != 0x8000) /*check if it's a broadcast request. */
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("the DHCP flag is a unicast, dhcp_magic=%02x:%02x:%02x:%02x\n",
|
||||
dhcpHdr[0], dhcpHdr[1], dhcpHdr[2], dhcpHdr[3]));
|
||||
if (NdisEqualMemory(dhcpHdr, DHCP_MAGIC, 4))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("dhcp magic macthed!\n"));
|
||||
bootpFlag = OS_HTONS(0x8000);
|
||||
NdisMoveMemory((bootpHdr+10), &bootpFlag, 2); /*Set the bootp flag as broadcast */
|
||||
bHdrChanged = TRUE;
|
||||
}
|
||||
}
|
||||
#ifdef MAC_REPEATER_SUPPORT
|
||||
if (pMatCfg->bMACRepeaterEn)
|
||||
{
|
||||
UCHAR isLinkValid;
|
||||
|
||||
if (RTMPLookupRepeaterCliEntry(pMatCfg->pPriv, FALSE, pDevMacAdr, TRUE, &isLinkValid) != NULL)
|
||||
{
|
||||
NdisMoveMemory((bootpHdr+28), pDevMacAdr, MAC_ADDR_LEN);
|
||||
|
||||
if (NdisEqualMemory(dhcpHdr, DHCP_MAGIC, 4))
|
||||
{
|
||||
PUCHAR pOptCode, pOptLen;
|
||||
UINT16 udpLen;
|
||||
|
||||
udpLen = OS_NTOHS(get_unaligned((PUINT16)(udpHdr+4)));
|
||||
pOptCode = (dhcpHdr + 4);
|
||||
do
|
||||
{
|
||||
pOptLen = pOptCode + 1;
|
||||
if (*pOptCode == 61) /* Client Identifier */
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,
|
||||
("Client Identifier found, change Hardware Address to "
|
||||
"%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
pDevMacAdr[0], pDevMacAdr[1], pDevMacAdr[2],
|
||||
pDevMacAdr[3], pDevMacAdr[4], pDevMacAdr[5]));
|
||||
/* Change Hardware Address */
|
||||
NdisMoveMemory((pOptCode+3), pDevMacAdr, MAC_ADDR_LEN);
|
||||
break;
|
||||
}
|
||||
pOptCode += (2+*pOptLen);
|
||||
}while ((*pOptCode != 0xFF) && ((pOptCode - udpHdr) <= udpLen));
|
||||
}
|
||||
bHdrChanged = TRUE;
|
||||
}
|
||||
}
|
||||
#endif /* MAC_REPEATER_SUPPORT */
|
||||
}
|
||||
|
||||
if (bHdrChanged == TRUE)
|
||||
NdisZeroMemory((udpHdr+6), 2); /* Modify the UDP chksum as zero */
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_IP_Init(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
BOOLEAN status;
|
||||
|
||||
status = IPMacTable_init(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static inline void IPintToIPstr(int ipint, char Ipstr[20], ULONG BufLen)
|
||||
{
|
||||
int temp = 0;
|
||||
|
||||
temp = ipint & 0x000FF;
|
||||
snprintf(Ipstr, BufLen, "%d.", temp);
|
||||
temp = (ipint>>8) & 0x000FF;
|
||||
snprintf(Ipstr, BufLen, "%s%d.", Ipstr, temp);
|
||||
temp = (ipint>>16) & 0x000FF;
|
||||
snprintf(Ipstr, BufLen, "%s%d.", Ipstr, temp);
|
||||
temp = (ipint>>24) & 0x000FF;
|
||||
snprintf(Ipstr, BufLen, "%s%d", Ipstr, temp);
|
||||
}
|
||||
|
||||
|
||||
VOID getIPMacTbInfo(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN char *pOutBuf,
|
||||
IN ULONG BufLen)
|
||||
{
|
||||
IPMacMappingTable *pIPMacTable;
|
||||
IPMacMappingEntry *pHead;
|
||||
int startIdx, endIdx;
|
||||
char Ipstr[20] = {0};
|
||||
|
||||
|
||||
pIPMacTable = (IPMacMappingTable *)pMatCfg->MatTableSet.IPMacTable;
|
||||
if ((!pIPMacTable) || (!pIPMacTable->valid))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s():IPMacTable not init yet!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
/* dump all. */
|
||||
startIdx = 0;
|
||||
endIdx = MAT_MAX_HASH_ENTRY_SUPPORT;
|
||||
|
||||
sprintf(pOutBuf, "\n");
|
||||
sprintf(pOutBuf+strlen(pOutBuf), "%-18s%-20s\n", "IP", "MAC");
|
||||
for(; startIdx< endIdx; startIdx++)
|
||||
{
|
||||
pHead = pIPMacTable->hash[startIdx];
|
||||
while(pHead)
|
||||
{
|
||||
/* if (strlen(pOutBuf) > (IW_PRIV_SIZE_MASK - 30)) */
|
||||
if (RtmpOsCmdDisplayLenCheck(strlen(pOutBuf), 30) == FALSE)
|
||||
break;
|
||||
NdisZeroMemory(Ipstr, 20);
|
||||
IPintToIPstr(pHead->ipAddr, Ipstr, sizeof(Ipstr));
|
||||
sprintf(pOutBuf+strlen(pOutBuf), "%-18s%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
Ipstr, pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],
|
||||
pHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5]);
|
||||
pHead = pHead->pNext;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* MAT_SUPPORT */
|
||||
|
||||
@ -0,0 +1,821 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_mat_ipv6.c
|
||||
|
||||
Abstract:
|
||||
MAT convert engine subroutine for ipv6 base protocols, currently now we
|
||||
just handle IPv6/ICMPv6 packets without Authentication/Encryption headers.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Shiang 06/03/07 Init version
|
||||
*/
|
||||
#ifdef MAT_SUPPORT
|
||||
|
||||
#include "rt_config.h"
|
||||
#include "ipv6.h"
|
||||
|
||||
/*#include <asm/checksum.h> */
|
||||
/*#include <net/ip6_checksum.h> */
|
||||
|
||||
const UCHAR IPV6_LOOPBACKADDR[] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
|
||||
|
||||
static NDIS_STATUS MATProto_IPv6_Init(MAT_STRUCT *pMatCfg);
|
||||
static NDIS_STATUS MATProto_IPv6_Exit(MAT_STRUCT *pMatCfg);
|
||||
static PUCHAR MATProto_IPv6_Rx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pDevMacAdr);
|
||||
static PUCHAR MATProto_IPv6_Tx(MAT_STRUCT *pMatCfg, PNDIS_PACKET pSkb, PUCHAR pLayerHdr, PUCHAR pDevMacAdr);
|
||||
|
||||
#define RT_UDP_HDR_LEN 8
|
||||
|
||||
typedef struct _IPv6MacMappingEntry
|
||||
{
|
||||
UCHAR ipv6Addr[16]; /* In network order */
|
||||
UCHAR macAddr[MAC_ADDR_LEN];
|
||||
ULONG lastTime;
|
||||
struct _IPv6MacMappingEntry *pNext;
|
||||
}IPv6MacMappingEntry, *PIPv6MacMappingEntry;
|
||||
|
||||
|
||||
typedef struct _IPv6MacMappingTable
|
||||
{
|
||||
BOOLEAN valid;
|
||||
IPv6MacMappingEntry *hash[MAT_MAX_HASH_ENTRY_SUPPORT+1]; /*0~63 for specific station, 64 for broadcast MacAddress */
|
||||
UCHAR curMcastAddr[MAC_ADDR_LEN]; /* The multicast mac addr for currecnt received packet destined to ipv6 multicast addr */
|
||||
}IPv6MacMappingTable;
|
||||
|
||||
|
||||
struct _MATProtoOps MATProtoIPv6Handle =
|
||||
{
|
||||
.init = MATProto_IPv6_Init,
|
||||
.tx = MATProto_IPv6_Tx,
|
||||
.rx = MATProto_IPv6_Rx,
|
||||
.exit = MATProto_IPv6_Exit,
|
||||
};
|
||||
|
||||
static inline BOOLEAN needUpdateIPv6MacTB(
|
||||
UCHAR *pMac,
|
||||
RT_IPV6_ADDR *pIPv6Addr)
|
||||
{
|
||||
ASSERT(pIPv6Addr);
|
||||
|
||||
if (isMcastEtherAddr(pMac) || isZeroEtherAddr(pMac))
|
||||
return FALSE;
|
||||
|
||||
/* IPv6 multicast address */
|
||||
if (IS_MULTICAST_IPV6_ADDR(*pIPv6Addr))
|
||||
return FALSE;
|
||||
|
||||
/* unspecified address */
|
||||
if(IS_UNSPECIFIED_IPV6_ADDR(*pIPv6Addr))
|
||||
return FALSE;
|
||||
|
||||
/* loopback address */
|
||||
if (IS_LOOPBACK_IPV6_ADDR(*pIPv6Addr))
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
DBGPRINT(RT_DEBUG_INFO, ("%s(): Good IPv6 unicast addr=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
|
||||
__FUNCTION__, PRINT_IPV6_ADDR(*pIPv6Addr)));
|
||||
*/
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
IPv6 Header Format
|
||||
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|Version| Traffic Class | Flow Label |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Payload Length | Next Header | Hop Limit |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| Source Address |
|
||||
+ +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| |
|
||||
+ +
|
||||
| Destination Address |
|
||||
+ +
|
||||
| |
|
||||
+ +
|
||||
| |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
|
||||
ICMPv6 Format:
|
||||
|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Type | Code | Checksum |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Message Body |
|
||||
+ +
|
||||
| |
|
||||
......
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
|
||||
NDIS_STATUS dumpIPv6MacTb(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN int index)
|
||||
{
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
IPv6MacMappingEntry *pHead;
|
||||
int startIdx, endIdx;
|
||||
|
||||
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
if ((!pIPv6MacTable) || (!pIPv6MacTable->valid))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():IPv6MacTable not init yet, so cannot do dump!\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
if(index < 0)
|
||||
{ /* dump all. */
|
||||
startIdx = 0;
|
||||
endIdx = MAT_MAX_HASH_ENTRY_SUPPORT;
|
||||
}
|
||||
else
|
||||
{ /* dump specific hash index. */
|
||||
startIdx = endIdx = index;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():\n", __FUNCTION__));
|
||||
for(; startIdx<= endIdx; startIdx++)
|
||||
{
|
||||
pHead = pIPv6MacTable->hash[startIdx];
|
||||
while(pHead)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_OFF, ("IPv6Mac[%d]:\n", startIdx));
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t:IPv6=%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x,Mac=%02x:%02x:%02x:%02x:%02x:%02x, lastTime=0x%lx, next=%p\n",
|
||||
PRINT_IPV6_ADDR(*((RT_IPV6_ADDR *)(&pHead->ipv6Addr[0]))), pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],
|
||||
pHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5], pHead->lastTime, pHead->pNext));
|
||||
pHead = pHead->pNext;
|
||||
}
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_OFF, ("\t----EndOfDump!\n"));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static NDIS_STATUS IPv6MacTableUpdate(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PUCHAR pMacAddr,
|
||||
IN PCHAR pIPv6Addr)
|
||||
{
|
||||
UINT hashIdx;
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
IPv6MacMappingEntry *pEntry = NULL, *pPrev = NULL, *pNewEntry =NULL;
|
||||
ULONG now;
|
||||
|
||||
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
if ((!pIPv6MacTable) || (!pIPv6MacTable->valid))
|
||||
return FALSE;
|
||||
|
||||
hashIdx = MAT_IPV6_ADDR_HASH_INDEX(pIPv6Addr);
|
||||
pEntry = pPrev = pIPv6MacTable->hash[hashIdx];
|
||||
while(pEntry)
|
||||
{
|
||||
NdisGetSystemUpTime(&now);
|
||||
|
||||
/* Find a existed IP-MAC Mapping entry */
|
||||
if (NdisEqualMemory(pIPv6Addr, pEntry->ipv6Addr, IPV6_ADDR_LEN))
|
||||
{
|
||||
|
||||
/* comparison is useless. So we directly copy it into the entry. */
|
||||
NdisMoveMemory(pEntry->macAddr, pMacAddr, 6);
|
||||
NdisGetSystemUpTime(&pEntry->lastTime);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{ /* handle the aging-out situation */
|
||||
if (RTMP_TIME_AFTER(now, (pEntry->lastTime + MAT_TB_ENTRY_AGEOUT_TIME)))
|
||||
{
|
||||
/* Remove the aged entry */
|
||||
if (pEntry == pIPv6MacTable->hash[hashIdx])
|
||||
{
|
||||
pIPv6MacTable->hash[hashIdx]= pEntry->pNext;
|
||||
pPrev = pIPv6MacTable->hash[hashIdx];
|
||||
}
|
||||
else
|
||||
{
|
||||
pPrev->pNext = pEntry->pNext;
|
||||
}
|
||||
MATDBEntryFree(pMatCfg, (PUCHAR)pEntry);
|
||||
|
||||
pEntry = (pPrev == NULL ? NULL: pPrev->pNext);
|
||||
pMatCfg->nodeCount--;
|
||||
}
|
||||
else
|
||||
{
|
||||
pPrev = pEntry;
|
||||
pEntry = pEntry->pNext;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Allocate a new IPv6MacMapping entry and insert into the hash */
|
||||
pNewEntry = (IPv6MacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPv6MacMappingEntry));
|
||||
if (pNewEntry != NULL)
|
||||
{
|
||||
NdisMoveMemory(pNewEntry->ipv6Addr, pIPv6Addr, IPV6_ADDR_LEN);
|
||||
NdisMoveMemory(pNewEntry->macAddr, pMacAddr, 6);
|
||||
pNewEntry->pNext = NULL;
|
||||
NdisGetSystemUpTime(&pNewEntry->lastTime);
|
||||
|
||||
if (pIPv6MacTable->hash[hashIdx] == NULL)
|
||||
{ /* Hash list is empty, directly assign it. */
|
||||
pIPv6MacTable->hash[hashIdx] = pNewEntry;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Ok, we insert the new entry into the root of hash[hashIdx] */
|
||||
pNewEntry->pNext = pIPv6MacTable->hash[hashIdx];
|
||||
pIPv6MacTable->hash[hashIdx] = pNewEntry;
|
||||
}
|
||||
/*dumpIPv6MacTb(pMatCfg, hashIdx); //for debug */
|
||||
|
||||
pMatCfg->nodeCount++;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("IPv6MacTableUpdate():Insertion failed!\n"));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
static PUCHAR IPv6MacTableLookUp(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PUCHAR pIPv6Addr)
|
||||
{
|
||||
UINT hashIdx;
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
IPv6MacMappingEntry *pEntry = NULL;
|
||||
PUCHAR pGroupMacAddr;
|
||||
|
||||
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
if ((!pIPv6MacTable) ||(!pIPv6MacTable->valid))
|
||||
return NULL;
|
||||
|
||||
/*if IPV6 multicast address, need converting multicast group address to ethernet address. */
|
||||
if (IS_MULTICAST_IPV6_ADDR(*(RT_IPV6_ADDR *)pIPv6Addr))
|
||||
{
|
||||
pGroupMacAddr = (PUCHAR)&pIPv6MacTable->curMcastAddr;
|
||||
ConvertMulticastIP2MAC(pIPv6Addr, (UCHAR **)(&pGroupMacAddr), ETH_P_IPV6);
|
||||
return pIPv6MacTable->curMcastAddr;
|
||||
}
|
||||
|
||||
/* Use hash to find out the location of that entry and get the Mac address. */
|
||||
hashIdx = MAT_IPV6_ADDR_HASH_INDEX(pIPv6Addr);
|
||||
|
||||
/* spin_lock_irqsave(&IPMacTabLock, irqFlag); */
|
||||
pEntry = pIPv6MacTable->hash[hashIdx];
|
||||
while(pEntry)
|
||||
{
|
||||
if (NdisEqualMemory(pEntry->ipv6Addr, pIPv6Addr, IPV6_ADDR_LEN))
|
||||
{
|
||||
|
||||
/*Update the lastTime to prevent the aging before pDA processed! */
|
||||
NdisGetSystemUpTime(&pEntry->lastTime);
|
||||
|
||||
return pEntry->macAddr;
|
||||
}
|
||||
else
|
||||
{
|
||||
pEntry = pEntry->pNext;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
We didn't find any matched Mac address, our policy is treat it as
|
||||
broadcast packet and send to all.
|
||||
*/
|
||||
return pIPv6MacTable->hash[IPV6MAC_TB_HASH_INDEX_OF_BCAST]->macAddr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static inline unsigned short int icmpv6_csum(
|
||||
RT_IPV6_ADDR *saddr,
|
||||
RT_IPV6_ADDR *daddr,
|
||||
USHORT len,
|
||||
UCHAR proto,
|
||||
UCHAR *pICMPMsg)
|
||||
{
|
||||
int carry;
|
||||
UINT32 ulen;
|
||||
UINT32 uproto;
|
||||
int i;
|
||||
unsigned int csum = 0;
|
||||
unsigned short int chksum;
|
||||
|
||||
if (len % 4)
|
||||
return 0;
|
||||
|
||||
for( i = 0; i < 4; i++)
|
||||
{
|
||||
csum += saddr->ipv6_addr32[i];
|
||||
carry = (csum < saddr->ipv6_addr32[i]);
|
||||
csum += carry;
|
||||
}
|
||||
|
||||
for( i = 0; i < 4; i++)
|
||||
{
|
||||
csum += daddr->ipv6_addr32[i];
|
||||
carry = (csum < daddr->ipv6_addr32[i]);
|
||||
csum += carry;
|
||||
}
|
||||
|
||||
ulen = OS_HTONL((UINT32)len);
|
||||
csum += ulen;
|
||||
carry = (csum < ulen);
|
||||
csum += carry;
|
||||
|
||||
uproto = OS_HTONL((UINT32)proto);
|
||||
csum += uproto;
|
||||
carry = (csum < uproto);
|
||||
csum += carry;
|
||||
|
||||
for (i = 0; i < len; i += 4)
|
||||
{
|
||||
csum += get_unaligned32(((UINT32 *)&pICMPMsg[i]));
|
||||
carry = (csum < get_unaligned32(((UINT32 *)&pICMPMsg[i])));
|
||||
csum += carry;
|
||||
}
|
||||
|
||||
while (csum>>16)
|
||||
csum = (csum & 0xffff) + (csum >> 16);
|
||||
|
||||
chksum = ~csum;
|
||||
|
||||
return chksum;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static PUCHAR MATProto_IPv6_Rx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pDevMacAdr)
|
||||
{
|
||||
|
||||
PUCHAR pMacAddr;
|
||||
PUCHAR pDstIPv6Addr;
|
||||
|
||||
/* Fetch the IPv6 addres from the packet header. */
|
||||
pDstIPv6Addr = (UCHAR *)(&((RT_IPV6_HDR *)pLayerHdr)->dstAddr);
|
||||
|
||||
pMacAddr = IPv6MacTableLookUp(pMatCfg, pDstIPv6Addr);
|
||||
|
||||
return pMacAddr;
|
||||
|
||||
}
|
||||
|
||||
static PNDIS_PACKET ICMPv6_Handle_Tx(
|
||||
IN MAT_STRUCT *pMatSrtuct,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pDevMacAdr,
|
||||
IN UINT32 offset)
|
||||
{
|
||||
RT_IPV6_HDR *pIPv6Hdr;
|
||||
RT_ICMPV6_HDR *pICMPv6Hdr;
|
||||
RT_ICMPV6_OPTION_HDR *pOptHdr;
|
||||
|
||||
USHORT payloadLen;
|
||||
UINT32 ICMPOffset = 0, ICMPMsgLen = 0, leftLen;
|
||||
|
||||
PNDIS_PACKET newSkb = NULL;
|
||||
BOOLEAN needModify = FALSE;
|
||||
PUCHAR pSrcMac;
|
||||
|
||||
pIPv6Hdr = (RT_IPV6_HDR *)pLayerHdr;
|
||||
payloadLen = OS_NTOHS(pIPv6Hdr->payload_len);
|
||||
|
||||
pICMPv6Hdr = (RT_ICMPV6_HDR *)(pLayerHdr + offset);
|
||||
ICMPOffset = offset;
|
||||
ICMPMsgLen = payloadLen + IPV6_HDR_LEN - ICMPOffset;
|
||||
|
||||
|
||||
|
||||
leftLen = ICMPMsgLen;
|
||||
switch (pICMPv6Hdr->type)
|
||||
{
|
||||
case ICMPV6_MSG_TYPE_ROUTER_SOLICITATION:
|
||||
offset += ROUTER_SOLICITATION_FIXED_LEN;
|
||||
/* for unspecified source address, it should not include the option about link-layer address. */
|
||||
if (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))
|
||||
{
|
||||
while(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))
|
||||
{
|
||||
pOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);
|
||||
if (pOptHdr->len == 0)
|
||||
break; /* discard it, because it's invalid. */
|
||||
|
||||
if (pOptHdr->type == TYPE_SRC_LL_ADDR)
|
||||
{
|
||||
/*replace the src link-layer address as ours. */
|
||||
needModify = TRUE;
|
||||
offset += 2; /* 2 = "type, len" fields. Here indicate to the place of src mac. */
|
||||
|
||||
break;
|
||||
} else {
|
||||
offset += (pOptHdr->len * 8); /* in unit of 8 octets. */
|
||||
leftLen -= (pOptHdr->len * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ICMPV6_MSG_TYPE_ROUTER_ADVERTISEMENT:
|
||||
offset += ROUTER_ADVERTISEMENT_FIXED_LEN;
|
||||
/* for unspecified source address, it should not include the option about link-layer address. */
|
||||
if (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))
|
||||
{
|
||||
while(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))
|
||||
{
|
||||
pOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);
|
||||
if (pOptHdr->len == 0)
|
||||
break; /* discard it, because it's invalid. */
|
||||
|
||||
if (pOptHdr->type == TYPE_SRC_LL_ADDR)
|
||||
{
|
||||
/*replace the src link-layer address as ours. */
|
||||
needModify = TRUE;
|
||||
offset += 2; /* 2 = "type, len" fields. Here indicate to the place of src mac. */
|
||||
|
||||
break;
|
||||
} else {
|
||||
offset += (pOptHdr->len * 8); /* in unit of 8 octets. */
|
||||
leftLen -= (pOptHdr->len * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ICMPV6_MSG_TYPE_NEIGHBOR_SOLICITATION:
|
||||
offset += NEIGHBOR_SOLICITATION_FIXED_LEN;
|
||||
/* for unspecified source address, it should not include the option about link-layer address. */
|
||||
if (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))
|
||||
{
|
||||
while(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))
|
||||
{
|
||||
pOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);
|
||||
if (pOptHdr->len == 0)
|
||||
break; /* discard it, because it's invalid. */
|
||||
|
||||
if (pOptHdr->type == TYPE_SRC_LL_ADDR)
|
||||
{
|
||||
/*replace the src link-layer address as ours. */
|
||||
needModify = TRUE;
|
||||
offset += 2; /* 2 = "type, len" fields. Here indicate to the place of src mac. */
|
||||
|
||||
break;
|
||||
} else {
|
||||
offset += (pOptHdr->len * 8); /* in unit of 8 octets. */
|
||||
leftLen -= (pOptHdr->len * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ICMPV6_MSG_TYPE_NEIGHBOR_ADVERTISEMENT:
|
||||
offset += NEIGHBOR_ADVERTISEMENT_FIXED_LEN;
|
||||
/* for unspecified source address, it should not include the option about link-layer address. */
|
||||
if (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))
|
||||
{
|
||||
while(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))
|
||||
{
|
||||
pOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);
|
||||
if (pOptHdr->len == 0)
|
||||
break; /* discard it, because it's invalid. */
|
||||
|
||||
if (pOptHdr->type == TYPE_TGT_LL_ADDR)
|
||||
{
|
||||
/*replace the src link-layer address as ours. */
|
||||
needModify = TRUE;
|
||||
offset += 2; /* 2 = "type, len" fields. */
|
||||
|
||||
break;
|
||||
}else {
|
||||
offset += (pOptHdr->len * 8); /* in unit of 8 octets. */
|
||||
leftLen -= (pOptHdr->len * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ICMPV6_MSG_TYPE_REDIRECT:
|
||||
offset += REDIRECT_FIXED_LEN;
|
||||
/* for unspecified source address, it should not include the options about link-layer address. */
|
||||
if (!(IS_UNSPECIFIED_IPV6_ADDR(pIPv6Hdr->srcAddr)))
|
||||
{
|
||||
while(leftLen > sizeof(RT_ICMPV6_OPTION_HDR))
|
||||
{
|
||||
pOptHdr = (RT_ICMPV6_OPTION_HDR *)(pLayerHdr + offset);
|
||||
if (pOptHdr->len == 0)
|
||||
break; /* discard it, because it's invalid. */
|
||||
|
||||
if (pOptHdr->type == TYPE_TGT_LL_ADDR)
|
||||
{
|
||||
/* TODO: Need to check if the TGT_LL_ADDR is the inner MAC. */
|
||||
/*replace the src link-layer address as ours. */
|
||||
needModify = TRUE;
|
||||
offset += 2; /* 2 = "type, len" fields. */
|
||||
|
||||
break;
|
||||
}else {
|
||||
offset += (pOptHdr->len * 8); /* in unit of 8 octets. */
|
||||
leftLen -= (pOptHdr->len * 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Un-supported ICMPv6 msg type(0x%x)! Ignore it\n", pICMPv6Hdr->type));
|
||||
break;
|
||||
}
|
||||
|
||||
/* We need to handle about the solicitation/Advertisement packets. */
|
||||
if (needModify)
|
||||
{
|
||||
if(OS_PKT_CLONED(pSkb))
|
||||
{
|
||||
newSkb = (PNDIS_PACKET)OS_PKT_COPY(RTPKT_TO_OSPKT(pSkb));
|
||||
if(newSkb) {
|
||||
if (IS_VLAN_PACKET(GET_OS_PKT_DATAPTR(newSkb)))
|
||||
pIPv6Hdr = (RT_IPV6_HDR *)(GET_OS_PKT_DATAPTR(newSkb) + MAT_VLAN_ETH_HDR_LEN);
|
||||
else
|
||||
pIPv6Hdr = (RT_IPV6_HDR *)(GET_OS_PKT_DATAPTR(newSkb) + MAT_ETHER_HDR_LEN);
|
||||
}
|
||||
}
|
||||
|
||||
pICMPv6Hdr = (RT_ICMPV6_HDR *)((PUCHAR)pIPv6Hdr + ICMPOffset);
|
||||
pSrcMac = (PUCHAR)((PUCHAR)pIPv6Hdr + offset);
|
||||
NdisMoveMemory(pSrcMac, pDevMacAdr, MAC_ADDR_LEN);
|
||||
|
||||
/* Now re-calculate the Checksum. */
|
||||
pICMPv6Hdr->chksum = 0;
|
||||
pICMPv6Hdr->chksum = icmpv6_csum(&pIPv6Hdr->srcAddr, &pIPv6Hdr->dstAddr, ICMPMsgLen ,
|
||||
IPV6_NEXT_HEADER_ICMPV6, (PUCHAR)pICMPv6Hdr);
|
||||
}
|
||||
|
||||
return newSkb;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static PUCHAR MATProto_IPv6_Tx(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN PNDIS_PACKET pSkb,
|
||||
IN PUCHAR pLayerHdr,
|
||||
IN PUCHAR pDevMacAdr)
|
||||
{
|
||||
PUCHAR pSrcMac/*, pSrcIP*/;
|
||||
BOOLEAN needUpdate;
|
||||
UCHAR nextProtocol;
|
||||
UINT32 offset;
|
||||
HEADER_802_3 *pEthHdr;
|
||||
RT_IPV6_HDR *pIPv6Hdr;
|
||||
PNDIS_PACKET newSkb = NULL;
|
||||
|
||||
pIPv6Hdr = (RT_IPV6_HDR *)pLayerHdr;
|
||||
pEthHdr = (HEADER_802_3 *)(GET_OS_PKT_DATAPTR(pSkb));
|
||||
|
||||
pSrcMac = (UCHAR *)&pEthHdr->SAAddr2;
|
||||
//pSrcIP = (UCHAR *)&pIPv6Hdr->srcAddr;
|
||||
|
||||
|
||||
|
||||
needUpdate = needUpdateIPv6MacTB(pSrcMac, (RT_IPV6_ADDR *)(&pIPv6Hdr->srcAddr));
|
||||
if (needUpdate)
|
||||
IPv6MacTableUpdate(pMatCfg, pSrcMac, (CHAR *)(&pIPv6Hdr->srcAddr));
|
||||
|
||||
|
||||
/* We need to traverse the whole IPv6 Header and extend headers to check about the ICMPv6 pacekt. */
|
||||
nextProtocol = pIPv6Hdr->nextHdr;
|
||||
offset = IPV6_HDR_LEN;
|
||||
/*DBGPRINT(RT_DEBUG_INFO, ("NextProtocol=0x%x! payloadLen=%d! offset=%d!\n", nextProtocol, payloadLen, offset)); */
|
||||
while(nextProtocol != IPV6_NEXT_HEADER_ICMPV6 &&
|
||||
nextProtocol != IPV6_NEXT_HEADER_UDP &&
|
||||
nextProtocol != IPV6_NEXT_HEADER_TCP &&
|
||||
nextProtocol != IPV6_NEXT_HEADER_NONE)
|
||||
{
|
||||
if(IPv6ExtHdrHandle((RT_IPV6_EXT_HDR *)(pLayerHdr + offset), &nextProtocol, &offset) == FALSE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,("IPv6ExtHdrHandle failed!\n"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (nextProtocol)
|
||||
{
|
||||
case IPV6_NEXT_HEADER_ICMPV6:
|
||||
newSkb = ICMPv6_Handle_Tx(pMatCfg, pSkb, pLayerHdr, pDevMacAdr, offset);
|
||||
break;
|
||||
|
||||
case IPV6_NEXT_HEADER_UDP:
|
||||
/*newSkb = DHCPv6_Handle_Tx(pMatStrcut, pSkb, pLayerHdr, pMacAddr, offset); */
|
||||
break;
|
||||
|
||||
case IPV6_NEXT_HEADER_TCP:
|
||||
case IPV6_NEXT_HEADER_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return (PUCHAR)newSkb;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
static NDIS_STATUS IPv6MacTable_RemoveAll(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
IPv6MacMappingEntry *pEntry;
|
||||
UINT32 i;
|
||||
|
||||
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
if (!pIPv6MacTable)
|
||||
return TRUE;
|
||||
|
||||
if (pIPv6MacTable->valid)
|
||||
{
|
||||
pIPv6MacTable->valid = FALSE;
|
||||
for (i=0; i<IPV6MAC_TB_HASH_ENTRY_NUM; i++)
|
||||
{
|
||||
while((pEntry = pIPv6MacTable->hash[i]) != NULL)
|
||||
{
|
||||
pIPv6MacTable->hash[i] = pEntry->pNext;
|
||||
MATDBEntryFree(pMatCfg, (PUCHAR)pEntry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
os_free_mem(NULL, pIPv6MacTable);
|
||||
pMatCfg->MatTableSet.IPv6MacTable = NULL;
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS IPv6MacTable_init(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
IPv6MacMappingEntry *pEntry = NULL;
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
|
||||
|
||||
if (pMatCfg->MatTableSet.IPv6MacTable != NULL)
|
||||
{
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
}
|
||||
else
|
||||
{
|
||||
os_alloc_mem_suspend(NULL, (UCHAR **)&(pMatCfg->MatTableSet.IPv6MacTable), sizeof(IPv6MacMappingTable));
|
||||
if (pMatCfg->MatTableSet.IPv6MacTable)
|
||||
{
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
NdisZeroMemory(pIPv6MacTable, sizeof(IPv6MacMappingTable));
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("IPMacTable_init(): Allocate memory for IPv6MacTable failed!\n"));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (pIPv6MacTable->valid == FALSE)
|
||||
{
|
||||
/*Set the last hash entry (hash[64]) as our default broadcast Mac address */
|
||||
pEntry = (IPv6MacMappingEntry *)MATDBEntryAlloc(pMatCfg, sizeof(IPv6MacMappingEntry));
|
||||
if (!pEntry)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("IPMacTable_init(): Allocate memory for IPMacTable broadcast entry failed!\n"));
|
||||
return FALSE;
|
||||
}
|
||||
NdisZeroMemory(pEntry, sizeof(IPv6MacMappingEntry));
|
||||
NdisMoveMemory(pEntry->macAddr, BROADCAST_ADDR, MAC_ADDR_LEN);
|
||||
pEntry->pNext = NULL;
|
||||
pIPv6MacTable->hash[IPV6MAC_TB_HASH_INDEX_OF_BCAST] = pEntry;
|
||||
|
||||
pIPv6MacTable->valid = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s(): IPv6MacTable already inited!\n", __FUNCTION__));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_IPv6_Exit(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
INT status;
|
||||
|
||||
status = IPv6MacTable_RemoveAll(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
static NDIS_STATUS MATProto_IPv6_Init(
|
||||
IN MAT_STRUCT *pMatCfg)
|
||||
{
|
||||
|
||||
BOOLEAN status = FALSE;
|
||||
|
||||
status = IPv6MacTable_init(pMatCfg);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID getIPv6MacTbInfo(
|
||||
IN MAT_STRUCT *pMatCfg,
|
||||
IN char *pOutBuf,
|
||||
IN ULONG BufLen)
|
||||
{
|
||||
IPv6MacMappingTable *pIPv6MacTable;
|
||||
IPv6MacMappingEntry *pHead;
|
||||
int startIdx, endIdx;
|
||||
char Ipv6str[40] = {0};
|
||||
|
||||
|
||||
pIPv6MacTable = (IPv6MacMappingTable *)pMatCfg->MatTableSet.IPv6MacTable;
|
||||
if ((!pIPv6MacTable) || (!pIPv6MacTable->valid))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s():IPv6MacTable not init yet!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* dump all. */
|
||||
startIdx = 0;
|
||||
endIdx = MAT_MAX_HASH_ENTRY_SUPPORT;
|
||||
|
||||
sprintf(pOutBuf, "\n");
|
||||
sprintf(pOutBuf+strlen(pOutBuf), "%-40s%-20s\n", "IP", "MAC");
|
||||
for(; startIdx< endIdx; startIdx++)
|
||||
{
|
||||
pHead = pIPv6MacTable->hash[startIdx];
|
||||
|
||||
while(pHead)
|
||||
{
|
||||
/* if (strlen(pOutBuf) > (IW_PRIV_SIZE_MASK - 30)) */
|
||||
if (RtmpOsCmdDisplayLenCheck(strlen(pOutBuf), 30) == FALSE)
|
||||
break;
|
||||
NdisZeroMemory(Ipv6str, 40);
|
||||
sprintf(Ipv6str, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x", PRINT_IPV6_ADDR(*((RT_IPV6_ADDR *)(&pHead->ipv6Addr[0]))));
|
||||
sprintf(pOutBuf+strlen(pOutBuf), "%-40s%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
Ipv6str, pHead->macAddr[0],pHead->macAddr[1],pHead->macAddr[2],
|
||||
pHead->macAddr[3],pHead->macAddr[4],pHead->macAddr[5]);
|
||||
pHead = pHead->pNext;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* MAT_SUPPORT */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
5440
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_profile.c
Normal file
5440
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_profile.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,428 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_radar.c
|
||||
|
||||
Abstract:
|
||||
CS/DFS common functions.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
#include "rt_config.h"
|
||||
|
||||
/*----- 802.11H -----*/
|
||||
|
||||
/* Periodic Radar detection, switch channel will occur in RTMPHandleTBTTInterrupt()*/
|
||||
/* Before switch channel, driver needs doing channel switch announcement.*/
|
||||
VOID RadarDetectPeriodic(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT i, ChIdx = 0, bAnyUnavailableChannel = FALSE;
|
||||
|
||||
/*
|
||||
1. APStart(), CalBufTime = 0;
|
||||
2. if bAnyUnavailableChannel, CalBufTime = DEFAULT_CAL_BUF_TIME;
|
||||
3. if Calibrated, CalBufTime = DEFAULT_CAL_BUF_TIME_MAX;
|
||||
*/
|
||||
for (i=0; i<pAd->ChannelListNum; i++)
|
||||
{
|
||||
if (pAd->ChannelList[i].RemainingTimeForUse != 0)
|
||||
{
|
||||
bAnyUnavailableChannel = TRUE;
|
||||
}
|
||||
|
||||
if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)
|
||||
{
|
||||
ChIdx = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (bAnyUnavailableChannel)
|
||||
pAd->Dot11_H.CalBufTime = DEFAULT_CAL_BUF_TIME;
|
||||
|
||||
if (pAd->Dot11_H.RDMode == RD_SILENCE_MODE)
|
||||
{
|
||||
/* In Silent Mode, RDCount is use to check with the CAC Time */
|
||||
if (pAd->Dot11_H.RDCount++ > pAd->Dot11_H.ChMovingTime &&
|
||||
pAd->ChannelList[ChIdx].RemainingTimeForUse == 0)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Not found radar signal, start send beacon and radar detection in service monitor\n\n"));
|
||||
pAd->Dot11_H.RDMode = RD_NORMAL_MODE;
|
||||
AsicEnableBssSync(pAd, pAd->CommonCfg.BeaconPeriod);
|
||||
pAd->Dot11_H.RDCount = 0;
|
||||
}
|
||||
}
|
||||
else if (pAd->Dot11_H.RDMode == RD_NORMAL_MODE)
|
||||
{
|
||||
if (!bAnyUnavailableChannel)
|
||||
{
|
||||
pAd->Dot11_H.RDCount++;
|
||||
/* In Normal Mode, RDCount is use to check with the CalBufTime */
|
||||
if ((pAd->Dot11_H.RDCount >= pAd->Dot11_H.CalBufTime))
|
||||
{
|
||||
pAd->Dot11_H.CalBufTime = DEFAULT_CAL_BUF_TIME_MAX;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Radar channel check routine
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
TRUE need to do radar detect
|
||||
FALSE need not to do radar detect
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RadarChannelCheck(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR Ch)
|
||||
{
|
||||
INT i;
|
||||
BOOLEAN result = FALSE;
|
||||
|
||||
for (i=0; i<pAd->ChannelListNum; i++)
|
||||
{
|
||||
if (Ch == pAd->ChannelList[i].Channel)
|
||||
{
|
||||
result = pAd->ChannelList[i].DfsReq;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Determine the current radar state
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RadarStateCheck(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
pAd->Dot11_H.CalBufTime = 0;
|
||||
|
||||
if ((pAd->CommonCfg.Channel > 14) &&
|
||||
(pAd->CommonCfg.bIEEE80211H == 1) &&
|
||||
RadarChannelCheck(pAd, pAd->CommonCfg.Channel))
|
||||
{
|
||||
pAd->Dot11_H.RDMode = RD_SILENCE_MODE;
|
||||
pAd->Dot11_H.RDCount = 0;
|
||||
pAd->Dot11_H.InServiceMonitorCount = 0;
|
||||
}
|
||||
else
|
||||
pAd->Dot11_H.RDMode = RD_NORMAL_MODE;
|
||||
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
if ((pAd->CommonCfg.RDDurRegion == JAP)
|
||||
|| (pAd->CommonCfg.RDDurRegion == JAP_W53)
|
||||
|| (pAd->CommonCfg.RDDurRegion == JAP_W56))
|
||||
{
|
||||
|
||||
if ((pAd->CommonCfg.Channel > 14) ||
|
||||
(pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40))
|
||||
{
|
||||
pAd->CommonCfg.CarrierDetect.Enable = TRUE;
|
||||
}
|
||||
}
|
||||
#endif /* CARRIER_DETECTION_SUPPORT */
|
||||
}
|
||||
|
||||
|
||||
ULONG JapRadarType(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
ULONG i;
|
||||
const UCHAR Channel[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};
|
||||
|
||||
if (pAd->CommonCfg.RDDurRegion != JAP)
|
||||
{
|
||||
return pAd->CommonCfg.RDDurRegion;
|
||||
}
|
||||
|
||||
for (i=0; i<15; i++)
|
||||
{
|
||||
if (pAd->CommonCfg.Channel == Channel[i])
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < 4)
|
||||
return JAP_W53;
|
||||
else if (i < 15)
|
||||
return JAP_W56;
|
||||
else
|
||||
return JAP; /* W52*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
UCHAR get_channel_by_reference(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT8 mode)
|
||||
{
|
||||
UCHAR ch = 0;
|
||||
INT ch_idx;
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
USHORT min_time = 0xFFFF;
|
||||
/* select channel with least RemainingTimeForUse */
|
||||
for ( ch_idx = 0; ch_idx < pAd->ChannelListNum; ch_idx++)
|
||||
{
|
||||
if (pAd->ChannelList[ch_idx].RemainingTimeForUse < min_time)
|
||||
{
|
||||
min_time = pAd->ChannelList[ch_idx].RemainingTimeForUse;
|
||||
ch = pAd->ChannelList[ch_idx].Channel;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
ch = FirstChannel(pAd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE,("%s(): mode = %u, ch = %u\n",
|
||||
__FUNCTION__, mode, ch));
|
||||
return ch;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Channel switching count down process upon radar detection
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID ChannelSwitchingCountDownProc(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s():Channel Switching...(%d/%d)\n",
|
||||
__FUNCTION__, pAd->Dot11_H.CSCount, pAd->Dot11_H.CSPeriod));
|
||||
|
||||
pAd->Dot11_H.CSCount++;
|
||||
if (pAd->Dot11_H.CSCount >= pAd->Dot11_H.CSPeriod)
|
||||
{
|
||||
#ifdef DFS_SUPPORT
|
||||
pAd->CommonCfg.RadarDetect.DFSAPRestart = 1;
|
||||
schedule_dfs_task(pAd);
|
||||
#else
|
||||
APStop(pAd);
|
||||
APStartUp(pAd);
|
||||
#endif /* !DFS_SUPPORT */
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Set channel switch Period
|
||||
Return:
|
||||
TRUE if all parameters are OK, FALSE otherwise
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_CSPeriod_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
pAd->Dot11_H.CSPeriod = (USHORT) simple_strtol(arg, 0, 10);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Set_CSPeriod_Proc::(CSPeriod=%d)\n", pAd->Dot11_H.CSPeriod));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
change channel moving time for DFS testing.
|
||||
|
||||
Arguments:
|
||||
pAdapter Pointer to our adapter
|
||||
wrq Pointer to the ioctl argument
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
Usage:
|
||||
1.) iwpriv ra0 set ChMovTime=[value]
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_ChMovingTime_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
USHORT Value;
|
||||
|
||||
Value = (USHORT) simple_strtol(arg, 0, 10);
|
||||
|
||||
pAd->Dot11_H.ChMovingTime = Value;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: %d\n", __FUNCTION__,
|
||||
pAd->Dot11_H.ChMovingTime));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Reset channel block status.
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
arg Not used
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
Usage:
|
||||
1.) iwpriv ra0 set ChMovTime=[value]
|
||||
==========================================================================
|
||||
*/
|
||||
INT Set_BlockChReset_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
INT i;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: Reset channel block status.\n", __FUNCTION__));
|
||||
|
||||
for (i=0; i<pAd->ChannelListNum; i++)
|
||||
pAd->ChannelList[i].RemainingTimeForUse = 0;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
#if defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT)
|
||||
|
||||
INT Set_RadarShow_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN RTMP_STRING *arg)
|
||||
{
|
||||
#ifdef DFS_SUPPORT
|
||||
UINT8 idx;
|
||||
PRADAR_DETECT_STRUCT pRadarDetect = &pAd->CommonCfg.RadarDetect;
|
||||
PDFS_PROGRAM_PARAM pDfsProgramParam = &pRadarDetect->DfsProgramParam;
|
||||
PDFS_SW_DETECT_PARAM pDfsSwParam = &pRadarDetect->DfsSwParam;
|
||||
PCHAR RDMode[]= {"Normal State", "Switching State", "Silent State"};
|
||||
|
||||
printk("DFSUseTasklet = %d\n", pRadarDetect->use_tasklet);
|
||||
printk("McuRadarDebug = %x\n", (unsigned int)pRadarDetect->McuRadarDebug);
|
||||
printk("PollTime = %d\n", pRadarDetect->PollTime);
|
||||
printk("ChEnable = %d (0x%x)\n", pDfsProgramParam->ChEnable, pDfsProgramParam->ChEnable);
|
||||
printk("DeltaDelay = %d\n", pDfsProgramParam->DeltaDelay);
|
||||
printk("PeriodErr = %d\n", pDfsSwParam->dfs_period_err);
|
||||
printk("MaxPeriod = %d\n", (unsigned int)pDfsSwParam->dfs_max_period);
|
||||
printk("Ch0LErr = %d\n", pDfsSwParam->dfs_width_ch0_err_L);
|
||||
printk("Ch0HErr = %d\n", pDfsSwParam->dfs_width_ch0_err_H);
|
||||
printk("Ch1Shift = %d\n", pDfsSwParam->dfs_width_diff_ch1_Shift);
|
||||
printk("Ch2Shift = %d\n", pDfsSwParam->dfs_width_diff_ch2_Shift);
|
||||
printk("DfsRssiHigh = %d\n", pRadarDetect->DfsRssiHigh);
|
||||
printk("DfsRssiLow = %d\n", pRadarDetect->DfsRssiLow);
|
||||
printk("DfsSwDisable = %u\n", pRadarDetect->bDfsSwDisable);
|
||||
printk("CheckLoop = %d\n", pDfsSwParam->dfs_check_loop);
|
||||
printk("DeclareThres = %d\n", pDfsSwParam->dfs_declare_thres);
|
||||
for (idx=0; idx < pAd->chipCap.DfsEngineNum; idx++)
|
||||
printk("sw_idx[%u] = %u\n", idx, pDfsSwParam->sw_idx[idx]);
|
||||
for (idx=0; idx < pAd->chipCap.DfsEngineNum; idx++)
|
||||
printk("hw_idx[%u] = %u\n", idx, pDfsSwParam->hw_idx[idx]);
|
||||
|
||||
printk("pAd->Dot11_H.ChMovingTime = %d\n", pAd->Dot11_H.ChMovingTime);
|
||||
printk("pAd->Dot11_H.RDMode = %s\n", RDMode[pAd->Dot11_H.RDMode]);
|
||||
printk("pAd->Dot11_H.RDCount = %d\n", pAd->Dot11_H.RDCount);
|
||||
printk("pAd->Dot11_H.CalBufTime = %d\n", pAd->Dot11_H.CalBufTime);
|
||||
#endif /* DFS_SUPPORT */
|
||||
|
||||
#ifdef CARRIER_DETECTION_SUPPORT
|
||||
printk("pAd->CommonCfg.CarrierDetect.CD_State = %d\n", pAd->CommonCfg.CarrierDetect.CD_State);
|
||||
printk("pAd->CommonCfg.CarrierDetect.criteria = %d\n", pAd->CommonCfg.CarrierDetect.criteria);
|
||||
printk("pAd->CommonCfg.CarrierDetect.Delta = %d\n", pAd->CommonCfg.CarrierDetect.delta);
|
||||
printk("pAd->CommonCfg.CarrierDetect.DivFlag = %d\n", pAd->CommonCfg.CarrierDetect.div_flag);
|
||||
printk("pAd->CommonCfg.CarrierDetect.Threshold = %d(0x%x)\n", pAd->CommonCfg.CarrierDetect.threshold, pAd->CommonCfg.CarrierDetect.threshold);
|
||||
#endif /* CARRIER_DETECTION_SUPPORT */
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Control CCK_MRC Status
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
Return Value:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID CckMrcStatusCtrl(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Enhance DFS/CS when using GLRT.
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
Return Value:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RadarGLRTCompensate(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
}
|
||||
#endif /*defined(DFS_SUPPORT) || defined(CARRIER_DETECTION_SUPPORT) */
|
||||
|
||||
2996
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_rf_cal.c
Normal file
2996
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_rf_cal.c
Normal file
File diff suppressed because it is too large
Load Diff
2262
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_sanity.c
Normal file
2262
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_sanity.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,635 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_sync.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
John Chang 2004-09-01 modified for rt2561/2661
|
||||
*/
|
||||
#include "rt_config.h"
|
||||
|
||||
/*BaSizeArray follows the 802.11n definition as MaxRxFactor. 2^(13+factor) bytes. When factor =0, it's about Ba buffer size =8.*/
|
||||
UCHAR BaSizeArray[4] = {8,16,32,64};
|
||||
|
||||
extern COUNTRY_REGION_CH_DESC Country_Region_ChDesc_2GHZ[];
|
||||
extern UINT16 const Country_Region_GroupNum_2GHZ;
|
||||
extern COUNTRY_REGION_CH_DESC Country_Region_ChDesc_5GHZ[];
|
||||
extern UINT16 const Country_Region_GroupNum_5GHZ;
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Update StaCfg->ChannelList[] according to 1) Country Region 2) RF IC type,
|
||||
and 3) PHY-mode user selected.
|
||||
The outcome is used by driver when doing site survey.
|
||||
|
||||
IRQL = PASSIVE_LEVEL
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
==========================================================================
|
||||
*/
|
||||
VOID BuildChannelList(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
UCHAR i, j, index=0, num=0;
|
||||
PCH_DESC pChDesc = NULL;
|
||||
BOOLEAN bRegionFound = FALSE;
|
||||
PUCHAR pChannelList = NULL;
|
||||
PUCHAR pChannelListFlag = NULL;
|
||||
|
||||
|
||||
|
||||
NdisZeroMemory(pAd->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER));
|
||||
|
||||
/* if not 11a-only mode, channel list starts from 2.4Ghz band*/
|
||||
if (WMODE_CAP_2G(pAd->CommonCfg.PhyMode))
|
||||
{
|
||||
for (i = 0; i < Country_Region_GroupNum_2GHZ; i++)
|
||||
{
|
||||
if ((pAd->CommonCfg.CountryRegion & 0x7f) ==
|
||||
Country_Region_ChDesc_2GHZ[i].RegionIndex)
|
||||
{
|
||||
pChDesc = Country_Region_ChDesc_2GHZ[i].pChDesc;
|
||||
num = TotalChNum(pChDesc);
|
||||
bRegionFound = TRUE;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bRegionFound)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("CountryRegion=%d not support", pAd->CommonCfg.CountryRegion));
|
||||
return;
|
||||
}
|
||||
|
||||
if (num > 0)
|
||||
{
|
||||
os_alloc_mem(NULL, (UCHAR **)&pChannelList, num * sizeof(UCHAR));
|
||||
|
||||
if (!pChannelList)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelList failed\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
os_alloc_mem(NULL, (UCHAR **)&pChannelListFlag, num * sizeof(UCHAR));
|
||||
|
||||
if (!pChannelListFlag)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelListFlag failed\n", __FUNCTION__));
|
||||
os_free_mem(NULL, pChannelList);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
pChannelList[i] = GetChannel_2GHZ(pChDesc, i);
|
||||
pChannelListFlag[i] = GetChannelFlag(pChDesc, i);
|
||||
}
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
for (j = 0; j < MAX_NUM_OF_CHANNELS; j++)
|
||||
{
|
||||
if (pChannelList[i] == pAd->TxPower[j].Channel)
|
||||
NdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER));
|
||||
}
|
||||
|
||||
pAd->ChannelList[index + i].Flags = pChannelListFlag[i];
|
||||
/* TODO: shiang-7603, NdisMoveMemory may replace the
|
||||
* pAd->ChannelList[index+i].Channel as other values!
|
||||
*/
|
||||
pAd->ChannelList[index+i].Channel = pChannelList[i];
|
||||
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if (N_ChannelGroupCheck(pAd, pAd->ChannelList[index + i].Channel))
|
||||
pAd->ChannelList[index + i].Flags |= CHANNEL_40M_CAP;
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (vht80_channel_group(pAd, pAd->ChannelList[index + i].Channel))
|
||||
pAd->ChannelList[index + i].Flags |= CHANNEL_80M_CAP;
|
||||
#endif /* DOT11_VHT_AC */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
if (!strncmp((RTMP_STRING *) pAd->CommonCfg.CountryCode, "CN", 2))
|
||||
pAd->ChannelList[index+i].MaxTxPwr = pAd->MaxTxPwr;/*for CN CountryCode*/
|
||||
else
|
||||
pAd->ChannelList[index+i].MaxTxPwr = 20;
|
||||
}
|
||||
|
||||
index += num;
|
||||
|
||||
os_free_mem(NULL, pChannelList);
|
||||
os_free_mem(NULL, pChannelListFlag);
|
||||
}
|
||||
bRegionFound = FALSE;
|
||||
num = 0;
|
||||
}
|
||||
|
||||
if (WMODE_CAP_5G(pAd->CommonCfg.PhyMode))
|
||||
{
|
||||
for (i = 0; i < Country_Region_GroupNum_5GHZ; i++)
|
||||
{
|
||||
if ((pAd->CommonCfg.CountryRegionForABand & 0x7f) ==
|
||||
Country_Region_ChDesc_5GHZ[i].RegionIndex)
|
||||
{
|
||||
pChDesc = Country_Region_ChDesc_5GHZ[i].pChDesc;
|
||||
num = TotalChNum(pChDesc);
|
||||
bRegionFound = TRUE;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bRegionFound)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("CountryRegionABand=%d not support", pAd->CommonCfg.CountryRegionForABand));
|
||||
return;
|
||||
}
|
||||
|
||||
if (num > 0)
|
||||
{
|
||||
UCHAR RadarCh[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
UCHAR q=0;
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
os_alloc_mem(NULL, (UCHAR **)&pChannelList, num * sizeof(UCHAR));
|
||||
|
||||
if (!pChannelList)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelList failed\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
os_alloc_mem(NULL, (UCHAR **)&pChannelListFlag, num * sizeof(UCHAR));
|
||||
|
||||
if (!pChannelListFlag)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelListFlag failed\n", __FUNCTION__));
|
||||
os_free_mem(NULL, pChannelList);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
pChannelList[i] = GetChannel_5GHZ(pChDesc, i);
|
||||
pChannelListFlag[i] = GetChannelFlag(pChDesc, i);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
if((pAd->CommonCfg.bIEEE80211H == 0)|| ((pAd->CommonCfg.bIEEE80211H == 1) && (pAd->CommonCfg.RDDurRegion != FCC)))
|
||||
{
|
||||
pChannelList[q] = GetChannel_5GHZ(pChDesc, i);
|
||||
pChannelListFlag[q] = GetChannelFlag(pChDesc, i);
|
||||
q++;
|
||||
}
|
||||
/*Based on the requiremnt of FCC, some channles could not be used anymore when test DFS function.*/
|
||||
else if ((pAd->CommonCfg.bIEEE80211H == 1) &&
|
||||
(pAd->CommonCfg.RDDurRegion == FCC) &&
|
||||
(pAd->Dot11_H.bDFSIndoor == 1))
|
||||
{
|
||||
if((GetChannel_5GHZ(pChDesc, i) < 116) || (GetChannel_5GHZ(pChDesc, i) > 128))
|
||||
{
|
||||
pChannelList[q] = GetChannel_5GHZ(pChDesc, i);
|
||||
pChannelListFlag[q] = GetChannelFlag(pChDesc, i);
|
||||
q++;
|
||||
}
|
||||
}
|
||||
else if ((pAd->CommonCfg.bIEEE80211H == 1) &&
|
||||
(pAd->CommonCfg.RDDurRegion == FCC) &&
|
||||
(pAd->Dot11_H.bDFSIndoor == 0))
|
||||
{
|
||||
if((GetChannel_5GHZ(pChDesc, i) < 100) || (GetChannel_5GHZ(pChDesc, i) > 140) )
|
||||
{
|
||||
pChannelList[q] = GetChannel_5GHZ(pChDesc, i);
|
||||
pChannelListFlag[q] = GetChannelFlag(pChDesc, i);
|
||||
q++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
num = q;
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
for (i=0; i<num; i++)
|
||||
{
|
||||
for (j=0; j<MAX_NUM_OF_CHANNELS; j++)
|
||||
{
|
||||
if (pChannelList[i] == pAd->TxPower[j].Channel)
|
||||
NdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER));
|
||||
}
|
||||
|
||||
pAd->ChannelList[index + i].Flags = pChannelListFlag[i];
|
||||
/* TODO: shiang-7603, NdisMoveMemory may replace the
|
||||
* pAd->ChannelList[index+i].Channel as other values!
|
||||
*/
|
||||
pAd->ChannelList[index+i].Channel = pChannelList[i];
|
||||
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
if (N_ChannelGroupCheck(pAd, pAd->ChannelList[index + i].Channel))
|
||||
pAd->ChannelList[index + i].Flags |= CHANNEL_40M_CAP;
|
||||
#ifdef DOT11_VHT_AC
|
||||
if (vht80_channel_group(pAd, pAd->ChannelList[index + i].Channel))
|
||||
pAd->ChannelList[index + i].Flags |= CHANNEL_80M_CAP;
|
||||
#endif /* DOT11_VHT_AC */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
|
||||
for (j=0; j<15; j++)
|
||||
{
|
||||
if (pChannelList[i] == RadarCh[j])
|
||||
pAd->ChannelList[index+i].DfsReq = TRUE;
|
||||
}
|
||||
pAd->ChannelList[index+i].MaxTxPwr = 20;
|
||||
}
|
||||
index += num;
|
||||
|
||||
os_free_mem(NULL, pChannelList);
|
||||
os_free_mem(NULL, pChannelListFlag);
|
||||
}
|
||||
}
|
||||
|
||||
pAd->ChannelListNum = index;
|
||||
DBGPRINT(RT_DEBUG_TRACE,("CountryCode(2.4G/5G)=%d/%d, RFIC=%d, PHY mode=%d, support %d channels\n",
|
||||
pAd->CommonCfg.CountryRegion, pAd->CommonCfg.CountryRegionForABand, pAd->RfIcType, pAd->CommonCfg.PhyMode, pAd->ChannelListNum));
|
||||
|
||||
|
||||
#ifdef DBG
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SupportedChannelList:\n"));
|
||||
for (i=0; i<pAd->ChannelListNum; i++)
|
||||
{
|
||||
DBGPRINT_RAW(RT_DEBUG_TRACE,("\tChannel # %d: Pwr0/1 = %d/%d, Flags = %x\n ",
|
||||
pAd->ChannelList[i].Channel,
|
||||
pAd->ChannelList[i].Power,
|
||||
pAd->ChannelList[i].Power2,
|
||||
pAd->ChannelList[i].Flags));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef P2P_CHANNEL_LIST_SEPARATE
|
||||
VOID P2PBuildChannelList(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UCHAR i, index=0, num=0;
|
||||
PCH_DESC pChDesc = NULL;
|
||||
BOOLEAN bRegionFound = FALSE;
|
||||
PCFG80211_CTRL pCfg80211_Ctrl = &pAd->cfg80211_ctrl;
|
||||
|
||||
NdisZeroMemory(pCfg80211_Ctrl->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER));
|
||||
|
||||
/* if not 11a-only mode, channel list starts from 2.4Ghz band*/
|
||||
if (WMODE_CAP_2G(pAd->CommonCfg.PhyMode))
|
||||
{
|
||||
for (i = 0; i < Country_Region_GroupNum_2GHZ; i++)
|
||||
{
|
||||
if ((pCfg80211_Ctrl->CountryRegion & 0x7f) ==
|
||||
Country_Region_ChDesc_2GHZ[i].RegionIndex)
|
||||
{
|
||||
pChDesc = Country_Region_ChDesc_2GHZ[i].pChDesc;
|
||||
num = TotalChNum(pChDesc);
|
||||
bRegionFound = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bRegionFound)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s::P2PCountryRegion=%d not support", __FUNCTION__, pCfg80211_Ctrl->CountryRegion));
|
||||
return;
|
||||
}
|
||||
|
||||
if (num > 0)
|
||||
{
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
pCfg80211_Ctrl->ChannelList[i].Channel = GetChannel_2GHZ(pChDesc, i);
|
||||
pCfg80211_Ctrl->ChannelList[i].Flags = GetChannelFlag(pChDesc, i);
|
||||
}
|
||||
|
||||
index += num;
|
||||
}
|
||||
num = 0;
|
||||
}
|
||||
|
||||
if (WMODE_CAP_5G(pAd->CommonCfg.PhyMode))
|
||||
{
|
||||
for (i = 0; i < Country_Region_GroupNum_5GHZ; i++)
|
||||
{
|
||||
if ((pCfg80211_Ctrl->CountryRegionForABand & 0x7f) ==
|
||||
Country_Region_ChDesc_5GHZ[i].RegionIndex)
|
||||
{
|
||||
pChDesc = Country_Region_ChDesc_5GHZ[i].pChDesc;
|
||||
num = TotalChNum(pChDesc);
|
||||
bRegionFound = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bRegionFound)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s::P2PCountryRegionForABand=%d not support", __FUNCTION__, pCfg80211_Ctrl->CountryRegionForABand));
|
||||
return;
|
||||
}
|
||||
|
||||
if (num > 0)
|
||||
{
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
pCfg80211_Ctrl->ChannelList[index + i].Channel = GetChannel_5GHZ(pChDesc, i);
|
||||
pCfg80211_Ctrl->ChannelList[index + i].Flags = GetChannelFlag(pChDesc, i);
|
||||
}
|
||||
|
||||
index += num;
|
||||
}
|
||||
}
|
||||
|
||||
pCfg80211_Ctrl->ChannelListNum = index;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s::Channel list nubmer = %d\n", __FUNCTION__, pCfg80211_Ctrl->ChannelListNum));
|
||||
}
|
||||
#endif /* P2P_CHANNEL_LIST_SEPARATE */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
This routine return the first channel number according to the country
|
||||
code selection and RF IC selection (signal band or dual band). It is called
|
||||
whenever driver need to start a site survey of all supported channels.
|
||||
Return:
|
||||
ch - the first channel number of current country code setting
|
||||
|
||||
IRQL = PASSIVE_LEVEL
|
||||
|
||||
==========================================================================
|
||||
*/
|
||||
UCHAR FirstChannel(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
return pAd->ChannelList[0].Channel;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
This routine returns the next channel number. This routine is called
|
||||
during driver need to start a site survey of all supported channels.
|
||||
Return:
|
||||
next_channel - the next channel number valid in current country code setting.
|
||||
Note:
|
||||
return 0 if no more next channel
|
||||
==========================================================================
|
||||
*/
|
||||
UCHAR NextChannel(RTMP_ADAPTER *pAd, UCHAR channel)
|
||||
{
|
||||
int i;
|
||||
UCHAR next_channel = 0;
|
||||
|
||||
#ifdef P2P_CHANNEL_LIST_SEPARATE
|
||||
PCFG80211_CTRL pCfg80211_Ctrl = &pAd->cfg80211_ctrl;
|
||||
#endif /* P2P_CHANNEL_LIST_SEPARATE */
|
||||
|
||||
#ifdef P2P_CHANNEL_LIST_SEPARATE
|
||||
if ((pAd->ScanCtrl.ScanType == SCAN_P2P))
|
||||
{
|
||||
for (i = 0; i < (pCfg80211_Ctrl->ChannelListNum - 1); i++)
|
||||
{
|
||||
if (channel == pCfg80211_Ctrl->ChannelList[i].Channel)
|
||||
{
|
||||
next_channel = pCfg80211_Ctrl->ChannelList[i+1].Channel;
|
||||
return next_channel;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* P2P_CHANNEL_LIST_SEPARATE */
|
||||
|
||||
|
||||
|
||||
|
||||
for (i = 0; i < (pAd->ChannelListNum - 1); i++)
|
||||
{
|
||||
if (channel == pAd->ChannelList[i].Channel)
|
||||
{
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
#ifdef DOT11N_DRAFT3
|
||||
/* Only scan effected channel if this is a SCAN_2040_BSS_COEXIST*/
|
||||
/* 2009 PF#2: Nee to handle the second channel of AP fall into affected channel range.*/
|
||||
if ((pAd->ScanCtrl.ScanType == SCAN_2040_BSS_COEXIST) && (pAd->ChannelList[i+1].Channel >14))
|
||||
{
|
||||
channel = pAd->ChannelList[i+1].Channel;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
#endif /* DOT11N_DRAFT3 */
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
{
|
||||
/* Record this channel's idx in ChannelList array.*/
|
||||
next_channel = pAd->ChannelList[i+1].Channel;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return next_channel;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
|
||||
Return:
|
||||
scan_channel - channel to scan.
|
||||
Note:
|
||||
return 0 if no more next channel
|
||||
==========================================================================
|
||||
*/
|
||||
UCHAR RTMPFindScanChannel(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
UINT8 LastScanChannel)
|
||||
{
|
||||
UCHAR scan_channel = 0;
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
#ifdef AP_PARTIAL_SCAN_SUPPORT
|
||||
IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
|
||||
{
|
||||
if (pAd->ApCfg.bPartialScanning == TRUE)
|
||||
{
|
||||
scan_channel = FindPartialScanChannel(pAd);
|
||||
return scan_channel;
|
||||
}
|
||||
}
|
||||
#endif /* AP_PARTIAL_SCAN_SUPPORT */
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
if (LastScanChannel == 0)
|
||||
scan_channel = FirstChannel(pAd);
|
||||
else
|
||||
scan_channel = NextChannel(pAd, LastScanChannel);
|
||||
|
||||
return scan_channel;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
This routine is for Cisco Compatible Extensions 2.X
|
||||
Spec31. AP Control of Client Transmit Power
|
||||
Return:
|
||||
None
|
||||
Note:
|
||||
Required by Aironet dBm(mW)
|
||||
0dBm(1mW), 1dBm(5mW), 13dBm(20mW), 15dBm(30mW),
|
||||
17dBm(50mw), 20dBm(100mW)
|
||||
|
||||
We supported
|
||||
3dBm(Lowest), 6dBm(10%), 9dBm(25%), 12dBm(50%),
|
||||
14dBm(75%), 15dBm(100%)
|
||||
|
||||
The client station's actual transmit power shall be within +/- 5dB of
|
||||
the minimum value or next lower value.
|
||||
==========================================================================
|
||||
*/
|
||||
VOID ChangeToCellPowerLimit(RTMP_ADAPTER *pAd, UCHAR AironetCellPowerLimit)
|
||||
{
|
||||
/*
|
||||
valud 0xFF means that hasn't found power limit information
|
||||
from the AP's Beacon/Probe response
|
||||
*/
|
||||
if (AironetCellPowerLimit == 0xFF)
|
||||
return;
|
||||
|
||||
if (AironetCellPowerLimit < 6) /*Used Lowest Power Percentage.*/
|
||||
pAd->CommonCfg.TxPowerPercentage = 6;
|
||||
else if (AironetCellPowerLimit < 9)
|
||||
pAd->CommonCfg.TxPowerPercentage = 10;
|
||||
else if (AironetCellPowerLimit < 12)
|
||||
pAd->CommonCfg.TxPowerPercentage = 25;
|
||||
else if (AironetCellPowerLimit < 14)
|
||||
pAd->CommonCfg.TxPowerPercentage = 50;
|
||||
else if (AironetCellPowerLimit < 15)
|
||||
pAd->CommonCfg.TxPowerPercentage = 75;
|
||||
else
|
||||
pAd->CommonCfg.TxPowerPercentage = 100; /*else used maximum*/
|
||||
|
||||
if (pAd->CommonCfg.TxPowerPercentage > pAd->CommonCfg.TxPowerDefault)
|
||||
pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;
|
||||
|
||||
}
|
||||
|
||||
|
||||
CHAR ConvertToRssi(RTMP_ADAPTER *pAd, struct raw_rssi_info *rssi_info, UCHAR rssi_idx)
|
||||
{
|
||||
UCHAR RssiOffset, LNAGain;
|
||||
CHAR BaseVal;
|
||||
CHAR rssi;
|
||||
|
||||
/* Rssi equals to zero or rssi_idx larger than 3 should be an invalid value*/
|
||||
if (rssi_idx >= 3)
|
||||
return -99;
|
||||
|
||||
rssi = rssi_info->raw_rssi[rssi_idx];
|
||||
|
||||
if (rssi == 0)
|
||||
return -99;
|
||||
|
||||
LNAGain = pAd->hw_cfg.lan_gain;
|
||||
|
||||
if (pAd->LatchRfRegs.Channel > 14)
|
||||
RssiOffset = pAd->ARssiOffset[rssi_idx];
|
||||
else
|
||||
RssiOffset = pAd->BGRssiOffset[rssi_idx];
|
||||
|
||||
BaseVal = -12;
|
||||
|
||||
#if defined (MT7603) || defined (MT7628)
|
||||
if (IS_MT7603(pAd) || IS_MT7628(pAd))
|
||||
return (rssi + (CHAR)RssiOffset - (CHAR)LNAGain);
|
||||
#endif
|
||||
|
||||
|
||||
return (BaseVal - RssiOffset - LNAGain - rssi);
|
||||
}
|
||||
|
||||
|
||||
CHAR ConvertToSnr(RTMP_ADAPTER *pAd, UCHAR Snr)
|
||||
{
|
||||
if (pAd->chipCap.SnrFormula == SNR_FORMULA2)
|
||||
return (Snr * 3 + 8) >> 4;
|
||||
else if (pAd->chipCap.SnrFormula == SNR_FORMULA3)
|
||||
return (Snr * 3 / 16 ); /* * 0.1881 */
|
||||
else
|
||||
return ((0xeb - Snr) * 3) / 16 ;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
#ifdef DOT11_N_SUPPORT
|
||||
extern int DetectOverlappingPeriodicRound;
|
||||
|
||||
VOID Handle_BSS_Width_Trigger_Events(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
ULONG Now32;
|
||||
#ifdef WH_EZ_SETUP
|
||||
UCHAR i;
|
||||
#endif
|
||||
#ifdef DOT11N_DRAFT3
|
||||
if (pAd->CommonCfg.bBssCoexEnable == FALSE)
|
||||
return;
|
||||
#endif /* DOT11N_DRAFT3 */
|
||||
|
||||
if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) &&
|
||||
(pAd->CommonCfg.Channel <=14))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Rcv BSS Width Trigger Event: 40Mhz --> 20Mhz \n"));
|
||||
NdisGetSystemUpTime(&Now32);
|
||||
pAd->CommonCfg.LastRcvBSSWidthTriggerEventsTime = Now32;
|
||||
pAd->CommonCfg.bRcvBSSWidthTriggerEvents = TRUE;
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = 0;
|
||||
#ifdef WH_EZ_SETUP
|
||||
for(i=0;i<WDEV_NUM_MAX;i++)
|
||||
{
|
||||
struct wifi_dev *wdev;
|
||||
|
||||
wdev = pAd->wdev_list[i];
|
||||
if(!wdev /*|| (wdev->channel != pAd->CommonCfg.Channel)*/) // Arvind : assume only one wdev
|
||||
continue;
|
||||
|
||||
#if defined(EZ_NETWORK_MERGE_SUPPORT)
|
||||
if (IS_EZ_SETUP_ENABLED(wdev) && (wdev->wdev_type == WDEV_TYPE_AP)){
|
||||
EZ_DEBUG(DBG_CAT_MLME, DBG_SUBCAT_ALL, DBG_LVL_ERROR,("\nHandle_BSS_Width_Trigger_Events: do fallback ****\n"));
|
||||
ez_set_ap_fallback_context(wdev,TRUE, pAd->CommonCfg.Channel);
|
||||
}
|
||||
#endif /* WH_EZ_SETUP */
|
||||
|
||||
}
|
||||
#endif /* WH_EZ_SETUP */
|
||||
|
||||
DetectOverlappingPeriodicRound = 31;
|
||||
}
|
||||
}
|
||||
#endif /* DOT11_N_SUPPORT */
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
|
||||
@ -0,0 +1,929 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_tkip.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Paul Wu 02-25-02 Initial
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
/* Rotation functions on 32 bit values */
|
||||
#define ROL32( A, n ) \
|
||||
( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) )
|
||||
#define ROR32( A, n ) ROL32( (A), 32-(n) )
|
||||
|
||||
UINT Tkip_Sbox_Lower[256] =
|
||||
{
|
||||
0xA5,0x84,0x99,0x8D,0x0D,0xBD,0xB1,0x54,
|
||||
0x50,0x03,0xA9,0x7D,0x19,0x62,0xE6,0x9A,
|
||||
0x45,0x9D,0x40,0x87,0x15,0xEB,0xC9,0x0B,
|
||||
0xEC,0x67,0xFD,0xEA,0xBF,0xF7,0x96,0x5B,
|
||||
0xC2,0x1C,0xAE,0x6A,0x5A,0x41,0x02,0x4F,
|
||||
0x5C,0xF4,0x34,0x08,0x93,0x73,0x53,0x3F,
|
||||
0x0C,0x52,0x65,0x5E,0x28,0xA1,0x0F,0xB5,
|
||||
0x09,0x36,0x9B,0x3D,0x26,0x69,0xCD,0x9F,
|
||||
0x1B,0x9E,0x74,0x2E,0x2D,0xB2,0xEE,0xFB,
|
||||
0xF6,0x4D,0x61,0xCE,0x7B,0x3E,0x71,0x97,
|
||||
0xF5,0x68,0x00,0x2C,0x60,0x1F,0xC8,0xED,
|
||||
0xBE,0x46,0xD9,0x4B,0xDE,0xD4,0xE8,0x4A,
|
||||
0x6B,0x2A,0xE5,0x16,0xC5,0xD7,0x55,0x94,
|
||||
0xCF,0x10,0x06,0x81,0xF0,0x44,0xBA,0xE3,
|
||||
0xF3,0xFE,0xC0,0x8A,0xAD,0xBC,0x48,0x04,
|
||||
0xDF,0xC1,0x75,0x63,0x30,0x1A,0x0E,0x6D,
|
||||
0x4C,0x14,0x35,0x2F,0xE1,0xA2,0xCC,0x39,
|
||||
0x57,0xF2,0x82,0x47,0xAC,0xE7,0x2B,0x95,
|
||||
0xA0,0x98,0xD1,0x7F,0x66,0x7E,0xAB,0x83,
|
||||
0xCA,0x29,0xD3,0x3C,0x79,0xE2,0x1D,0x76,
|
||||
0x3B,0x56,0x4E,0x1E,0xDB,0x0A,0x6C,0xE4,
|
||||
0x5D,0x6E,0xEF,0xA6,0xA8,0xA4,0x37,0x8B,
|
||||
0x32,0x43,0x59,0xB7,0x8C,0x64,0xD2,0xE0,
|
||||
0xB4,0xFA,0x07,0x25,0xAF,0x8E,0xE9,0x18,
|
||||
0xD5,0x88,0x6F,0x72,0x24,0xF1,0xC7,0x51,
|
||||
0x23,0x7C,0x9C,0x21,0xDD,0xDC,0x86,0x85,
|
||||
0x90,0x42,0xC4,0xAA,0xD8,0x05,0x01,0x12,
|
||||
0xA3,0x5F,0xF9,0xD0,0x91,0x58,0x27,0xB9,
|
||||
0x38,0x13,0xB3,0x33,0xBB,0x70,0x89,0xA7,
|
||||
0xB6,0x22,0x92,0x20,0x49,0xFF,0x78,0x7A,
|
||||
0x8F,0xF8,0x80,0x17,0xDA,0x31,0xC6,0xB8,
|
||||
0xC3,0xB0,0x77,0x11,0xCB,0xFC,0xD6,0x3A
|
||||
};
|
||||
|
||||
UINT Tkip_Sbox_Upper[256] =
|
||||
{
|
||||
0xC6,0xF8,0xEE,0xF6,0xFF,0xD6,0xDE,0x91,
|
||||
0x60,0x02,0xCE,0x56,0xE7,0xB5,0x4D,0xEC,
|
||||
0x8F,0x1F,0x89,0xFA,0xEF,0xB2,0x8E,0xFB,
|
||||
0x41,0xB3,0x5F,0x45,0x23,0x53,0xE4,0x9B,
|
||||
0x75,0xE1,0x3D,0x4C,0x6C,0x7E,0xF5,0x83,
|
||||
0x68,0x51,0xD1,0xF9,0xE2,0xAB,0x62,0x2A,
|
||||
0x08,0x95,0x46,0x9D,0x30,0x37,0x0A,0x2F,
|
||||
0x0E,0x24,0x1B,0xDF,0xCD,0x4E,0x7F,0xEA,
|
||||
0x12,0x1D,0x58,0x34,0x36,0xDC,0xB4,0x5B,
|
||||
0xA4,0x76,0xB7,0x7D,0x52,0xDD,0x5E,0x13,
|
||||
0xA6,0xB9,0x00,0xC1,0x40,0xE3,0x79,0xB6,
|
||||
0xD4,0x8D,0x67,0x72,0x94,0x98,0xB0,0x85,
|
||||
0xBB,0xC5,0x4F,0xED,0x86,0x9A,0x66,0x11,
|
||||
0x8A,0xE9,0x04,0xFE,0xA0,0x78,0x25,0x4B,
|
||||
0xA2,0x5D,0x80,0x05,0x3F,0x21,0x70,0xF1,
|
||||
0x63,0x77,0xAF,0x42,0x20,0xE5,0xFD,0xBF,
|
||||
0x81,0x18,0x26,0xC3,0xBE,0x35,0x88,0x2E,
|
||||
0x93,0x55,0xFC,0x7A,0xC8,0xBA,0x32,0xE6,
|
||||
0xC0,0x19,0x9E,0xA3,0x44,0x54,0x3B,0x0B,
|
||||
0x8C,0xC7,0x6B,0x28,0xA7,0xBC,0x16,0xAD,
|
||||
0xDB,0x64,0x74,0x14,0x92,0x0C,0x48,0xB8,
|
||||
0x9F,0xBD,0x43,0xC4,0x39,0x31,0xD3,0xF2,
|
||||
0xD5,0x8B,0x6E,0xDA,0x01,0xB1,0x9C,0x49,
|
||||
0xD8,0xAC,0xF3,0xCF,0xCA,0xF4,0x47,0x10,
|
||||
0x6F,0xF0,0x4A,0x5C,0x38,0x57,0x73,0x97,
|
||||
0xCB,0xA1,0xE8,0x3E,0x96,0x61,0x0D,0x0F,
|
||||
0xE0,0x7C,0x71,0xCC,0x90,0x06,0xF7,0x1C,
|
||||
0xC2,0x6A,0xAE,0x69,0x17,0x99,0x3A,0x27,
|
||||
0xD9,0xEB,0x2B,0x22,0xD2,0xA9,0x07,0x33,
|
||||
0x2D,0x3C,0x15,0xC9,0x87,0xAA,0x50,0xA5,
|
||||
0x03,0x59,0x09,0x1A,0x65,0xD7,0x84,0xD0,
|
||||
0x82,0x29,0x5A,0x1E,0x7B,0xA8,0x6D,0x2C
|
||||
};
|
||||
|
||||
|
||||
/* Expanded IV for TKIP function.*/
|
||||
|
||||
typedef struct GNU_PACKED _IV_CONTROL_
|
||||
{
|
||||
union GNU_PACKED
|
||||
{
|
||||
struct GNU_PACKED
|
||||
{
|
||||
UCHAR rc0;
|
||||
UCHAR rc1;
|
||||
UCHAR rc2;
|
||||
|
||||
union GNU_PACKED
|
||||
{
|
||||
struct GNU_PACKED
|
||||
{
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
UCHAR KeyID:2;
|
||||
UCHAR ExtIV:1;
|
||||
UCHAR Rsvd:5;
|
||||
#else
|
||||
UCHAR Rsvd:5;
|
||||
UCHAR ExtIV:1;
|
||||
UCHAR KeyID:2;
|
||||
#endif
|
||||
} field;
|
||||
UCHAR Byte;
|
||||
} CONTROL;
|
||||
} field;
|
||||
|
||||
ULONG word;
|
||||
} IV16;
|
||||
|
||||
ULONG IV32;
|
||||
} TKIP_IV, *PTKIP_IV;
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Convert from UCHAR[] to ULONG in a portable way
|
||||
|
||||
Arguments:
|
||||
pMICKey pointer to MIC Key
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
ULONG RTMPTkipGetUInt32(
|
||||
IN PUCHAR pMICKey)
|
||||
{
|
||||
ULONG res = 0;
|
||||
INT i;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
res |= (*pMICKey++) << (8 * i);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Convert from ULONG to UCHAR[] in a portable way
|
||||
|
||||
Arguments:
|
||||
pDst pointer to destination for convert ULONG to UCHAR[]
|
||||
val the value for convert
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPTkipPutUInt32(
|
||||
IN OUT PUCHAR pDst,
|
||||
IN ULONG val)
|
||||
{
|
||||
INT i;
|
||||
|
||||
for(i = 0; i < 4; i++)
|
||||
{
|
||||
*pDst++ = (UCHAR) (val & 0xff);
|
||||
val >>= 8;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Set the MIC Key.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
pMICKey pointer to MIC Key
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPTkipSetMICKey(
|
||||
IN PTKIP_KEY_INFO pTkip,
|
||||
IN PUCHAR pMICKey)
|
||||
{
|
||||
/* Set the key */
|
||||
pTkip->K0 = RTMPTkipGetUInt32(pMICKey);
|
||||
pTkip->K1 = RTMPTkipGetUInt32(pMICKey + 4);
|
||||
/* and reset the message */
|
||||
pTkip->L = pTkip->K0;
|
||||
pTkip->R = pTkip->K1;
|
||||
pTkip->nBytesInM = 0;
|
||||
pTkip->M = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Calculate the MIC Value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
uChar Append this uChar
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPTkipAppendByte(
|
||||
IN PTKIP_KEY_INFO pTkip,
|
||||
IN UCHAR uChar)
|
||||
{
|
||||
/* Append the byte to our word-sized buffer */
|
||||
pTkip->M |= (uChar << (8* pTkip->nBytesInM));
|
||||
pTkip->nBytesInM++;
|
||||
/* Process the word if it is full. */
|
||||
if( pTkip->nBytesInM >= 4 )
|
||||
{
|
||||
pTkip->L ^= pTkip->M;
|
||||
pTkip->R ^= ROL32( pTkip->L, 17 );
|
||||
pTkip->L += pTkip->R;
|
||||
pTkip->R ^= ((pTkip->L & 0xff00ff00) >> 8) | ((pTkip->L & 0x00ff00ff) << 8);
|
||||
pTkip->L += pTkip->R;
|
||||
pTkip->R ^= ROL32( pTkip->L, 3 );
|
||||
pTkip->L += pTkip->R;
|
||||
pTkip->R ^= ROR32( pTkip->L, 2 );
|
||||
pTkip->L += pTkip->R;
|
||||
/* Clear the buffer */
|
||||
pTkip->M = 0;
|
||||
pTkip->nBytesInM = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Calculate the MIC Value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
pSrc Pointer to source data for Calculate MIC Value
|
||||
Len Indicate the length of the source data
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPTkipAppend(
|
||||
IN PTKIP_KEY_INFO pTkip,
|
||||
IN PUCHAR pSrc,
|
||||
IN UINT nBytes)
|
||||
{
|
||||
/* This is simple */
|
||||
while(nBytes > 0)
|
||||
{
|
||||
RTMPTkipAppendByte(pTkip, *pSrc++);
|
||||
nBytes--;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Get the MIC Value.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
the MIC Value is store in pAd->PrivateInfo.MIC
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPTkipGetMIC(
|
||||
IN PTKIP_KEY_INFO pTkip)
|
||||
{
|
||||
/* Append the minimum padding*/
|
||||
RTMPTkipAppendByte(pTkip, 0x5a );
|
||||
RTMPTkipAppendByte(pTkip, 0 );
|
||||
RTMPTkipAppendByte(pTkip, 0 );
|
||||
RTMPTkipAppendByte(pTkip, 0 );
|
||||
RTMPTkipAppendByte(pTkip, 0 );
|
||||
/* and then zeroes until the length is a multiple of 4 */
|
||||
while( pTkip->nBytesInM != 0 )
|
||||
{
|
||||
RTMPTkipAppendByte(pTkip, 0 );
|
||||
}
|
||||
/* The appendByte function has already computed the result. */
|
||||
RTMPTkipPutUInt32(pTkip->MIC, pTkip->L);
|
||||
RTMPTkipPutUInt32(pTkip->MIC + 4, pTkip->R);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Init MIC Value calculation function which include set MIC key &
|
||||
calculate first 16 bytes (DA + SA + priority + 0)
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
pTKey Pointer to the Temporal Key (TK), TK shall be 128bits.
|
||||
pDA Pointer to DA address
|
||||
pSA Pointer to SA address
|
||||
pMICKey pointer to MIC Key
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPInitMICEngine(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pKey,
|
||||
IN PUCHAR pDA,
|
||||
IN PUCHAR pSA,
|
||||
IN UCHAR UserPriority,
|
||||
IN PUCHAR pMICKey)
|
||||
{
|
||||
ULONG Priority = UserPriority;
|
||||
|
||||
/* Init MIC value calculation*/
|
||||
RTMPTkipSetMICKey(&pAd->PrivateInfo.Tx, pMICKey);
|
||||
/* DA*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, pDA, MAC_ADDR_LEN);
|
||||
/* SA*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSA, MAC_ADDR_LEN);
|
||||
/* Priority + 3 bytes of 0*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, (PUCHAR)&Priority, 4);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Compare MIC value of received MSDU
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
pSrc Pointer to the received Plain text data
|
||||
pDA Pointer to DA address
|
||||
pSA Pointer to SA address
|
||||
pMICKey pointer to MIC Key
|
||||
Len the length of the received plain text data exclude MIC value
|
||||
|
||||
Return Value:
|
||||
TRUE MIC value matched
|
||||
FALSE MIC value mismatched
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RTMPTkipCompareMICValue(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pSrc,
|
||||
IN PUCHAR pDA,
|
||||
IN PUCHAR pSA,
|
||||
IN PUCHAR pMICKey,
|
||||
IN UCHAR UserPriority,
|
||||
IN UINT Len)
|
||||
{
|
||||
UCHAR OldMic[8];
|
||||
ULONG Priority = UserPriority;
|
||||
|
||||
/* Init MIC value calculation*/
|
||||
RTMPTkipSetMICKey(&pAd->PrivateInfo.Rx, pMICKey);
|
||||
/* DA*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, pDA, MAC_ADDR_LEN);
|
||||
/* SA*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSA, MAC_ADDR_LEN);
|
||||
/* Priority + 3 bytes of 0*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, (PUCHAR)&Priority, 4);
|
||||
|
||||
/* Calculate MIC value from plain text data*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSrc, Len);
|
||||
|
||||
/* Get MIC valude from received frame*/
|
||||
NdisMoveMemory(OldMic, pSrc + Len, 8);
|
||||
|
||||
/* Get MIC value from decrypted plain data*/
|
||||
RTMPTkipGetMIC(&pAd->PrivateInfo.Rx);
|
||||
|
||||
/* Move MIC value from MSDU, this steps should move to data path.*/
|
||||
/* Since the MIC value might cross MPDUs.*/
|
||||
if(!NdisEqualMemory(pAd->PrivateInfo.Rx.MIC, OldMic, 8))
|
||||
{
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTMPTkipCompareMICValue(): TKIP MIC Error !\n")); /*MIC error.*/
|
||||
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Copy frame from waiting queue into relative ring buffer and set
|
||||
appropriate ASIC register to kick hardware transmit function
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
PNDIS_PACKET Pointer to Ndis Packet for MIC calculation
|
||||
pEncap Pointer to LLC encap data
|
||||
LenEncap Total encap length, might be 0 which indicates no encap
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPCalculateMICValue(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PNDIS_PACKET pPacket,
|
||||
IN PUCHAR pEncap,
|
||||
IN PCIPHER_KEY pKey,
|
||||
IN UCHAR apidx)
|
||||
{
|
||||
PACKET_INFO PacketInfo;
|
||||
PUCHAR pSrcBufVA;
|
||||
UINT SrcBufLen;
|
||||
PUCHAR pSrc;
|
||||
UCHAR UserPriority;
|
||||
UCHAR vlan_offset = 0;
|
||||
|
||||
RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);
|
||||
|
||||
UserPriority = RTMP_GET_PACKET_UP(pPacket);
|
||||
pSrc = pSrcBufVA;
|
||||
|
||||
/* determine if this is a vlan packet */
|
||||
if (((*(pSrc + 12) << 8) + *(pSrc + 13)) == 0x8100)
|
||||
vlan_offset = 4;
|
||||
|
||||
#ifdef CONFIG_AP_SUPPORT
|
||||
#ifdef APCLI_SUPPORT
|
||||
/* Start Calculate MIC Value*/
|
||||
if (apidx >= MIN_NET_DEVICE_FOR_APCLI && ((apidx - MIN_NET_DEVICE_FOR_APCLI) < MAX_APCLI_NUM) && (pAd->OpMode == OPMODE_AP))
|
||||
{ /* For packet which need to do MATConvert, we need to use the CurrentAddress of specific ApCli interface.*/
|
||||
RTMPInitMICEngine(
|
||||
pAd,
|
||||
pKey->Key,
|
||||
pSrc,
|
||||
pAd->ApCfg.ApCliTab[apidx-MIN_NET_DEVICE_FOR_APCLI].wdev.if_addr,
|
||||
UserPriority,
|
||||
pKey->TxMic);
|
||||
}
|
||||
else
|
||||
#endif /* APCLI_SUPPORT */
|
||||
#ifdef IGMP_SNOOP_SUPPORT
|
||||
if ((RTMP_GET_PACKET_WCID(pPacket) != MCAST_WCID) && (*pSrc & 0x01) && (pAd->OpMode == OPMODE_AP))
|
||||
{
|
||||
UCHAR wcid = RTMP_GET_PACKET_WCID(pPacket);
|
||||
RTMPInitMICEngine(
|
||||
pAd,
|
||||
pKey->Key,
|
||||
pAd->MacTab.Content[wcid].Addr,
|
||||
pSrc + 6,
|
||||
UserPriority,
|
||||
pKey->TxMic);
|
||||
}
|
||||
else
|
||||
#endif /* IGMP_SNOOP_SUPPORT */
|
||||
#endif /* CONFIG_AP_SUPPORT */
|
||||
{
|
||||
RTMPInitMICEngine(
|
||||
pAd,
|
||||
pKey->Key,
|
||||
pSrc,
|
||||
pSrc + 6,
|
||||
UserPriority,
|
||||
pKey->TxMic);
|
||||
}
|
||||
|
||||
|
||||
if (pEncap != NULL)
|
||||
{
|
||||
/* LLC encapsulation*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, pEncap, 6);
|
||||
/* Protocol Type*/
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc + 12 + vlan_offset, 2);
|
||||
}
|
||||
SrcBufLen -= (14 + vlan_offset);
|
||||
pSrc += (14 + vlan_offset);
|
||||
do
|
||||
{
|
||||
if (SrcBufLen > 0)
|
||||
{
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc, SrcBufLen);
|
||||
}
|
||||
|
||||
break; /* No need handle next packet */
|
||||
|
||||
} while (TRUE);
|
||||
|
||||
/* Compute the final MIC Value*/
|
||||
RTMPTkipGetMIC(&pAd->PrivateInfo.Tx);
|
||||
}
|
||||
|
||||
|
||||
/************************************************************/
|
||||
/* tkip_sbox() */
|
||||
/* Returns a 16 bit value from a 64K entry table. The Table */
|
||||
/* is synthesized from two 256 entry byte wide tables. */
|
||||
/************************************************************/
|
||||
|
||||
UINT tkip_sbox(UINT index)
|
||||
{
|
||||
UINT index_low;
|
||||
UINT index_high;
|
||||
UINT left, right;
|
||||
|
||||
index_low = (index % 256);
|
||||
index_high = ((index >> 8) % 256);
|
||||
|
||||
left = Tkip_Sbox_Lower[index_low] + (Tkip_Sbox_Upper[index_low] * 256);
|
||||
right = Tkip_Sbox_Upper[index_high] + (Tkip_Sbox_Lower[index_high] * 256);
|
||||
|
||||
return (left ^ right);
|
||||
}
|
||||
|
||||
UINT rotr1(UINT a)
|
||||
{
|
||||
unsigned int b;
|
||||
|
||||
if ((a & 0x01) == 0x01)
|
||||
{
|
||||
b = (a >> 1) | 0x8000;
|
||||
}
|
||||
else
|
||||
{
|
||||
b = (a >> 1) & 0x7fff;
|
||||
}
|
||||
b = b % 65536;
|
||||
return b;
|
||||
}
|
||||
|
||||
VOID RTMPTkipMixKey(
|
||||
UCHAR *key,
|
||||
UCHAR *ta,
|
||||
ULONG pnl, /* Least significant 16 bits of PN */
|
||||
ULONG pnh, /* Most significant 32 bits of PN */
|
||||
UCHAR *rc4key,
|
||||
UINT *p1k)
|
||||
{
|
||||
|
||||
UINT tsc0;
|
||||
UINT tsc1;
|
||||
UINT tsc2;
|
||||
|
||||
UINT ppk0;
|
||||
UINT ppk1;
|
||||
UINT ppk2;
|
||||
UINT ppk3;
|
||||
UINT ppk4;
|
||||
UINT ppk5;
|
||||
|
||||
INT i;
|
||||
INT j;
|
||||
|
||||
tsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */
|
||||
tsc1 = (unsigned int)(pnh % 65536);
|
||||
tsc2 = (unsigned int)(pnl % 65536); /* lsb */
|
||||
|
||||
/* Phase 1, step 1 */
|
||||
p1k[0] = tsc1;
|
||||
p1k[1] = tsc0;
|
||||
p1k[2] = (UINT)(ta[0] + (ta[1]*256));
|
||||
p1k[3] = (UINT)(ta[2] + (ta[3]*256));
|
||||
p1k[4] = (UINT)(ta[4] + (ta[5]*256));
|
||||
|
||||
/* Phase 1, step 2 */
|
||||
for (i=0; i<8; i++)
|
||||
{
|
||||
j = 2*(i & 1);
|
||||
p1k[0] = (p1k[0] + tkip_sbox( (p1k[4] ^ ((256*key[1+j]) + key[j])) % 65536 )) % 65536;
|
||||
p1k[1] = (p1k[1] + tkip_sbox( (p1k[0] ^ ((256*key[5+j]) + key[4+j])) % 65536 )) % 65536;
|
||||
p1k[2] = (p1k[2] + tkip_sbox( (p1k[1] ^ ((256*key[9+j]) + key[8+j])) % 65536 )) % 65536;
|
||||
p1k[3] = (p1k[3] + tkip_sbox( (p1k[2] ^ ((256*key[13+j]) + key[12+j])) % 65536 )) % 65536;
|
||||
p1k[4] = (p1k[4] + tkip_sbox( (p1k[3] ^ (((256*key[1+j]) + key[j]))) % 65536 )) % 65536;
|
||||
p1k[4] = (p1k[4] + i) % 65536;
|
||||
}
|
||||
|
||||
/* Phase 2, Step 1 */
|
||||
ppk0 = p1k[0];
|
||||
ppk1 = p1k[1];
|
||||
ppk2 = p1k[2];
|
||||
ppk3 = p1k[3];
|
||||
ppk4 = p1k[4];
|
||||
ppk5 = (p1k[4] + tsc2) % 65536;
|
||||
|
||||
/* Phase2, Step 2 */
|
||||
ppk0 = ppk0 + tkip_sbox( (ppk5 ^ ((256*key[1]) + key[0])) % 65536);
|
||||
ppk1 = ppk1 + tkip_sbox( (ppk0 ^ ((256*key[3]) + key[2])) % 65536);
|
||||
ppk2 = ppk2 + tkip_sbox( (ppk1 ^ ((256*key[5]) + key[4])) % 65536);
|
||||
ppk3 = ppk3 + tkip_sbox( (ppk2 ^ ((256*key[7]) + key[6])) % 65536);
|
||||
ppk4 = ppk4 + tkip_sbox( (ppk3 ^ ((256*key[9]) + key[8])) % 65536);
|
||||
ppk5 = ppk5 + tkip_sbox( (ppk4 ^ ((256*key[11]) + key[10])) % 65536);
|
||||
|
||||
ppk0 = ppk0 + rotr1(ppk5 ^ ((256*key[13]) + key[12]));
|
||||
ppk1 = ppk1 + rotr1(ppk0 ^ ((256*key[15]) + key[14]));
|
||||
ppk2 = ppk2 + rotr1(ppk1);
|
||||
ppk3 = ppk3 + rotr1(ppk2);
|
||||
ppk4 = ppk4 + rotr1(ppk3);
|
||||
ppk5 = ppk5 + rotr1(ppk4);
|
||||
|
||||
/* Phase 2, Step 3 */
|
||||
/* Phase 2, Step 3 */
|
||||
|
||||
tsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */
|
||||
tsc1 = (unsigned int)(pnh % 65536);
|
||||
tsc2 = (unsigned int)(pnl % 65536); /* lsb */
|
||||
|
||||
rc4key[0] = (tsc2 >> 8) % 256;
|
||||
rc4key[1] = (((tsc2 >> 8) % 256) | 0x20) & 0x7f;
|
||||
rc4key[2] = tsc2 % 256;
|
||||
rc4key[3] = ((ppk5 ^ ((256*key[1]) + key[0])) >> 1) % 256;
|
||||
|
||||
rc4key[4] = ppk0 % 256;
|
||||
rc4key[5] = (ppk0 >> 8) % 256;
|
||||
|
||||
rc4key[6] = ppk1 % 256;
|
||||
rc4key[7] = (ppk1 >> 8) % 256;
|
||||
|
||||
rc4key[8] = ppk2 % 256;
|
||||
rc4key[9] = (ppk2 >> 8) % 256;
|
||||
|
||||
rc4key[10] = ppk3 % 256;
|
||||
rc4key[11] = (ppk3 >> 8) % 256;
|
||||
|
||||
rc4key[12] = ppk4 % 256;
|
||||
rc4key[13] = (ppk4 >> 8) % 256;
|
||||
|
||||
rc4key[14] = ppk5 % 256;
|
||||
rc4key[15] = (ppk5 >> 8) % 256;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
TRUE: Success!
|
||||
FALSE: Decrypt Error!
|
||||
*/
|
||||
BOOLEAN RTMPSoftDecryptTKIP(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pHdr,
|
||||
IN UCHAR UserPriority,
|
||||
IN PCIPHER_KEY pKey,
|
||||
INOUT PUCHAR pData,
|
||||
IN UINT16 *DataByteCnt)
|
||||
{
|
||||
PHEADER_802_11 pFrame;
|
||||
//UINT8 frame_type;
|
||||
//UINT8 frame_subtype;
|
||||
UINT8 from_ds;
|
||||
UINT8 to_ds;
|
||||
//UINT8 a4_exists;
|
||||
//UINT8 qc_exists;
|
||||
UCHAR TA[MAC_ADDR_LEN];
|
||||
UCHAR DA[MAC_ADDR_LEN];
|
||||
UCHAR SA[MAC_ADDR_LEN];
|
||||
UCHAR RC4Key[16];
|
||||
UINT p1k[5]; /*for mix_key;*/
|
||||
ULONG pnl;/* Least significant 16 bits of PN */
|
||||
ULONG pnh;/* Most significant 32 bits of PN */
|
||||
ARC4_CTX_STRUC ARC4_CTX;
|
||||
PUCHAR plaintext_ptr;
|
||||
UINT32 plaintext_len;
|
||||
PUCHAR ciphertext_ptr;
|
||||
UINT32 ciphertext_len;
|
||||
UINT crc32 = 0;
|
||||
UINT trailfcs = 0;
|
||||
UCHAR MIC[8];
|
||||
UCHAR TrailMIC[8];
|
||||
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
RTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE);
|
||||
#endif
|
||||
|
||||
if (pKey->KeyLen == 0)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : the key is empty)\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Indicate type and subtype of Frame Control field */
|
||||
//frame_type = (((*pHdr) >> 2) & 0x03);
|
||||
//frame_subtype = (((*pHdr) >> 4) & 0x0f);
|
||||
|
||||
/* Indicate the fromDS and ToDS */
|
||||
from_ds = ((*(pHdr + 1)) & 0x2) >> 1;
|
||||
to_ds = ((*(pHdr + 1)) & 0x1);
|
||||
|
||||
/* decide if the Address 4 exist or QoS exist */
|
||||
//a4_exists = (from_ds & to_ds);
|
||||
//qc_exists = ((frame_subtype == SUBTYPE_QDATA) ||
|
||||
// (frame_subtype == SUBTYPE_QDATA_CFACK) ||
|
||||
// (frame_subtype == SUBTYPE_QDATA_CFPOLL) ||
|
||||
// (frame_subtype == SUBTYPE_QDATA_CFACK_CFPOLL));
|
||||
|
||||
|
||||
/* pointer to 802.11 header */
|
||||
pFrame = (PHEADER_802_11)pHdr;
|
||||
|
||||
/* Assign DA, SA and TA for TKIP calculation */
|
||||
if (to_ds == 0 && from_ds == 1)
|
||||
{
|
||||
NdisMoveMemory(DA, pFrame->Addr1, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN); /*BSSID */
|
||||
NdisMoveMemory(SA, pFrame->Addr3, MAC_ADDR_LEN);
|
||||
}
|
||||
else if (to_ds == 0 && from_ds == 0 )
|
||||
{
|
||||
NdisMoveMemory(DA, pFrame->Addr1, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(SA, pFrame->Addr2, MAC_ADDR_LEN);
|
||||
}
|
||||
else if (to_ds == 1 && from_ds == 0)
|
||||
{
|
||||
NdisMoveMemory(SA, pFrame->Addr2, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(DA, pFrame->Addr3, MAC_ADDR_LEN);
|
||||
}
|
||||
else if (to_ds == 1 && from_ds == 1)
|
||||
{
|
||||
NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(DA, pFrame->Addr3, MAC_ADDR_LEN);
|
||||
NdisMoveMemory(SA, pFrame->Octet, MAC_ADDR_LEN);
|
||||
}
|
||||
|
||||
pnl = (*(pData)) << 8 | (*(pData + 2));
|
||||
pnh = *((PULONG)(pData + 4));
|
||||
pnh = cpu2le32(pnh);
|
||||
RTMPTkipMixKey(pKey->Key, TA, pnl, pnh, RC4Key, p1k);
|
||||
|
||||
/* skip 8-bytes TKIP IV/EIV header */
|
||||
ciphertext_ptr = pData + LEN_TKIP_IV_HDR;
|
||||
ciphertext_len = *DataByteCnt - LEN_TKIP_IV_HDR;
|
||||
|
||||
/* skip payload length is zero*/
|
||||
if ((*DataByteCnt) <= LEN_TKIP_IV_HDR)
|
||||
return FALSE;
|
||||
|
||||
/* WEP Decapsulation */
|
||||
/* Generate an RC4 key stream */
|
||||
ARC4_INIT(&ARC4_CTX, &RC4Key[0], 16);
|
||||
|
||||
/* Decrypt the TKIP MPDU by ARC4.
|
||||
It shall include plaintext, MIC and ICV.
|
||||
The result output would overwrite the original TKIP IV/EIV header position */
|
||||
ARC4_Compute(&ARC4_CTX, ciphertext_ptr, ciphertext_len, pData);
|
||||
|
||||
/* Point to the decrypted data frame and its length shall exclude ICV length */
|
||||
plaintext_ptr = pData;
|
||||
plaintext_len = ciphertext_len - LEN_ICV;
|
||||
|
||||
/* Extract peer's ICV */
|
||||
NdisMoveMemory(&trailfcs, plaintext_ptr + plaintext_len, LEN_ICV);
|
||||
|
||||
/* Re-computes the ICV and
|
||||
bit-wise compares with the peer's ICV. */
|
||||
crc32 = RTMP_CALC_FCS32(PPPINITFCS32, plaintext_ptr, plaintext_len);
|
||||
crc32 ^= 0xffffffff; /* complement */
|
||||
|
||||
if(crc32 != cpu2le32(trailfcs))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("! WEP Data CRC Error !\n")); /*CRC error.*/
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Extract peer's MIC and subtract MIC length from total data length */
|
||||
plaintext_len -= LEN_TKIP_MIC;
|
||||
NdisMoveMemory(TrailMIC, plaintext_ptr + plaintext_len, LEN_TKIP_MIC);
|
||||
RTMPInitMICEngine(pAd, pKey->Key, DA, SA, UserPriority, pKey->RxMic);
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Tx, plaintext_ptr, plaintext_len);
|
||||
RTMPTkipGetMIC(&pAd->PrivateInfo.Tx);
|
||||
NdisMoveMemory(MIC, pAd->PrivateInfo.Tx.MIC, LEN_TKIP_MIC);
|
||||
|
||||
if (!NdisEqualMemory(MIC, TrailMIC, LEN_TKIP_MIC))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("! TKIP MIC Error !\n")); /*MIC error.*/
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Update the total data length */
|
||||
*DataByteCnt = plaintext_len;
|
||||
|
||||
#ifdef RT_BIG_ENDIAN
|
||||
RTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE);
|
||||
#endif
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Use RC4 to protect the Key Data field of EAPoL frame.
|
||||
It's defined in IEEE 802.11i-2004 p.84
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID TKIP_GTK_KEY_WRAP(
|
||||
IN UCHAR *key,
|
||||
IN UCHAR *iv,
|
||||
IN UCHAR *input_text,
|
||||
IN UINT32 input_len,
|
||||
OUT UCHAR *output_text)
|
||||
{
|
||||
UCHAR ekey[LEN_KEY_DESC_IV + LEN_PTK_KEK];
|
||||
/* ARC4_CTX_STRUC ARC4_CTX;*/
|
||||
ARC4_CTX_STRUC *pARC4_CTX = NULL;
|
||||
|
||||
|
||||
/* allocate memory */
|
||||
os_alloc_mem(NULL, (UCHAR **)&pARC4_CTX, sizeof(ARC4_CTX_STRUC));
|
||||
if (pARC4_CTX == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
/* The encryption key is generated by concatenating the
|
||||
EAPOL-Key IV field and the KEK. */
|
||||
NdisMoveMemory(ekey, iv, LEN_KEY_DESC_IV);
|
||||
NdisMoveMemory(&ekey[LEN_KEY_DESC_IV], key, LEN_PTK_KEK);
|
||||
|
||||
/* RC4 stream cipher initialization with the KEK */
|
||||
ARC4_INIT(pARC4_CTX, &ekey[0], LEN_KEY_DESC_IV + LEN_PTK_KEK);
|
||||
|
||||
/* The first 256 octets of the RC4 key stream shall be discarded */
|
||||
ARC4_Discard_KeyLength(pARC4_CTX, 256);
|
||||
|
||||
/* encryption begins using the 257th key stream octet */
|
||||
ARC4_Compute(pARC4_CTX, input_text, input_len, output_text);
|
||||
|
||||
if (pARC4_CTX != NULL)
|
||||
os_free_mem(NULL, pARC4_CTX);
|
||||
}
|
||||
|
||||
VOID TKIP_GTK_KEY_UNWRAP(
|
||||
IN UCHAR *key,
|
||||
IN UCHAR *iv,
|
||||
IN UCHAR *input_text,
|
||||
IN UINT32 input_len,
|
||||
OUT UCHAR *output_text)
|
||||
{
|
||||
TKIP_GTK_KEY_WRAP(key, iv, input_text, input_len, output_text);
|
||||
}
|
||||
|
||||
1197
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_usb_io.c
Normal file
1197
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_usb_io.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,168 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_video.c
|
||||
|
||||
Abstract:
|
||||
Ralink WiFi Driver video mode related subroutines
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
--------- ---------- ----------------------------------------------
|
||||
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
#ifdef VIDEO_TURBINE_SUPPORT
|
||||
|
||||
|
||||
|
||||
BOOLEAN UpdateFromGlobal = FALSE;
|
||||
|
||||
void VideoTurbineUpdate(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if (UpdateFromGlobal == TRUE)
|
||||
{
|
||||
pAd->VideoTurbine.Enable = GLOBAL_AP_VIDEO_CONFIG.Enable;
|
||||
pAd->VideoTurbine.ClassifierEnable = GLOBAL_AP_VIDEO_CONFIG.ClassifierEnable;
|
||||
pAd->VideoTurbine.HighTxMode = GLOBAL_AP_VIDEO_CONFIG.HighTxMode;
|
||||
pAd->VideoTurbine.TxPwr = GLOBAL_AP_VIDEO_CONFIG.TxPwr;
|
||||
pAd->VideoTurbine.VideoMCSEnable = GLOBAL_AP_VIDEO_CONFIG.VideoMCSEnable;
|
||||
pAd->VideoTurbine.VideoMCS = GLOBAL_AP_VIDEO_CONFIG.VideoMCS;
|
||||
pAd->VideoTurbine.TxBASize = GLOBAL_AP_VIDEO_CONFIG.TxBASize;
|
||||
pAd->VideoTurbine.TxLifeTimeMode = GLOBAL_AP_VIDEO_CONFIG.TxLifeTimeMode;
|
||||
pAd->VideoTurbine.TxLifeTime = GLOBAL_AP_VIDEO_CONFIG.TxLifeTime;
|
||||
pAd->VideoTurbine.TxRetryLimit = GLOBAL_AP_VIDEO_CONFIG.TxRetryLimit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID TxSwQDepthAdjust(IN RTMP_ADAPTER *pAd, IN UINT32 qLen)
|
||||
{
|
||||
ULONG IrqFlags;
|
||||
INT qIdx;
|
||||
QUEUE_HEADER *pTxQ, *pEntry;
|
||||
PNDIS_PACKET pPacket;
|
||||
|
||||
RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
|
||||
pAd->TxSwQMaxLen = qLen;
|
||||
for (qIdx = 0; qIdx < NUM_OF_TX_RING; qIdx++)
|
||||
{
|
||||
pTxQ = &pAd->TxSwQueue[qIdx];
|
||||
while(pTxQ->Number >= pAd->TxSwQMaxLen)
|
||||
{
|
||||
pEntry = RemoveHeadQueue(pTxQ);
|
||||
if (pEntry)
|
||||
{
|
||||
pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
|
||||
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%s():Set TxSwQMaxLen as %d\n",
|
||||
__FUNCTION__, pAd->TxSwQMaxLen));
|
||||
}
|
||||
|
||||
|
||||
VOID VideoTurbineDynamicTune(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
if (pAd->VideoTurbine.Enable == TRUE)
|
||||
{
|
||||
UINT32 MacReg = 0;
|
||||
|
||||
{
|
||||
/* Tx retry limit = 2F,1F */
|
||||
RTMP_IO_READ32(pAd, TX_RTY_CFG, &MacReg);
|
||||
MacReg &= 0xFFFF0000;
|
||||
MacReg |= GetAsicVideoRetry(pAd);
|
||||
RTMP_IO_WRITE32(pAd, TX_RTY_CFG, MacReg);
|
||||
}
|
||||
|
||||
pAd->VideoTurbine.TxBASize = GetAsicVideoTxBA(pAd);
|
||||
|
||||
Set_RateAdaptInterval(pAd, "100:50");
|
||||
TxSwQDepthAdjust(pAd, 1024);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT32 MacReg = 0;
|
||||
|
||||
|
||||
/* Default Tx retry limit = 1F,0F */
|
||||
RTMP_IO_READ32(pAd, TX_RTY_CFG, &MacReg);
|
||||
MacReg &= 0xFFFF0000;
|
||||
MacReg |= GetAsicDefaultRetry(pAd);
|
||||
RTMP_IO_WRITE32(pAd, TX_RTY_CFG, MacReg);
|
||||
|
||||
pAd->VideoTurbine.TxBASize = GetAsicDefaultTxBA(pAd);
|
||||
|
||||
/* reset to default rate adaptation simping interval */
|
||||
if ((pAd->ra_interval != DEF_RA_TIME_INTRVAL) ||
|
||||
(pAd->ra_fast_interval != DEF_QUICK_RA_TIME_INTERVAL))
|
||||
Set_RateAdaptInterval(pAd, "500:100");
|
||||
|
||||
TxSwQDepthAdjust(pAd, MAX_PACKETS_IN_QUEUE);
|
||||
}
|
||||
}
|
||||
|
||||
UINT32 GetAsicDefaultRetry(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UINT32 RetryLimit;
|
||||
|
||||
RetryLimit = 0x1F0F;
|
||||
|
||||
return RetryLimit;
|
||||
}
|
||||
|
||||
UCHAR GetAsicDefaultTxBA(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
return pAd->CommonCfg.TxBASize;
|
||||
}
|
||||
|
||||
UINT32 GetAsicVideoRetry(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
return pAd->VideoTurbine.TxRetryLimit;
|
||||
}
|
||||
|
||||
UCHAR GetAsicVideoTxBA(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
return pAd->VideoTurbine.TxBASize;
|
||||
}
|
||||
|
||||
VOID VideoConfigInit(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
pAd->VideoTurbine.Enable = FALSE;
|
||||
pAd->VideoTurbine.TxRetryLimit = 0x2F1F;
|
||||
pAd->VideoTurbine.TxBASize = pAd->CommonCfg.TxBASize;
|
||||
}
|
||||
|
||||
#endif /* VIDEO_TURBINE_SUPPORT */
|
||||
|
||||
|
||||
370
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_wep.c
Normal file
370
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_wep.c
Normal file
@ -0,0 +1,370 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 4F, No. 2 Technology 5th Rd.
|
||||
* Science-based Industrial Park
|
||||
* Hsin-chu, Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2004, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtmp_wep.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Paul Wu 10-28-02 Initial
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
UINT FCSTAB_32[256] =
|
||||
{
|
||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
|
||||
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
|
||||
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
||||
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
|
||||
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
|
||||
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
|
||||
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
|
||||
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
|
||||
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
|
||||
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
|
||||
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
|
||||
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
|
||||
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
|
||||
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
|
||||
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
|
||||
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
|
||||
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
|
||||
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
|
||||
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
|
||||
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
|
||||
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
|
||||
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
|
||||
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
|
||||
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
|
||||
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
|
||||
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
|
||||
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
|
||||
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
|
||||
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
|
||||
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
|
||||
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
|
||||
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
|
||||
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
|
||||
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
|
||||
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
|
||||
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
|
||||
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
|
||||
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
|
||||
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
|
||||
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
|
||||
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
|
||||
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
|
||||
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
|
||||
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
|
||||
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
|
||||
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
|
||||
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
|
||||
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
|
||||
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
|
||||
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
|
||||
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
|
||||
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
|
||||
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
|
||||
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
|
||||
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
|
||||
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
|
||||
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
|
||||
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
|
||||
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
|
||||
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
|
||||
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
|
||||
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
|
||||
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
|
||||
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
|
||||
};
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Calculate a new FCS given the current FCS and the new data.
|
||||
|
||||
Arguments:
|
||||
Fcs the original FCS value
|
||||
Cp pointer to the data which will be calculate the FCS
|
||||
Len the length of the data
|
||||
|
||||
Return Value:
|
||||
UINT - FCS 32 bits
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
UINT RTMP_CALC_FCS32(
|
||||
IN UINT Fcs,
|
||||
IN PUCHAR Cp,
|
||||
IN INT Len)
|
||||
{
|
||||
while (Len--)
|
||||
Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]);
|
||||
|
||||
return (Fcs);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Init WEP function.
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
pKey Pointer to the WEP KEY
|
||||
KeyId WEP Key ID
|
||||
KeyLen the length of WEP KEY
|
||||
pDest Pointer to the destination which Encryption data will store in.
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPInitWepEngine(
|
||||
IN PUCHAR pIv,
|
||||
IN PUCHAR pKey,
|
||||
IN UCHAR KeyLen,
|
||||
OUT ARC4_CTX_STRUC *pARC4_CTX)
|
||||
{
|
||||
PUCHAR seed = NULL;
|
||||
UINT8 seed_len;
|
||||
|
||||
os_alloc_mem(NULL, (UCHAR **)&seed, sizeof(UCHAR)*16);
|
||||
if (seed == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: seed Allocate memory fail!!!\n", __FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
/* WEP seed construction */
|
||||
NdisZeroMemory(seed, 16);
|
||||
NdisMoveMemory(seed, pIv, 3);
|
||||
NdisMoveMemory(&seed[3], pKey, KeyLen);
|
||||
seed_len = 3 + KeyLen;
|
||||
|
||||
/* RC4 uses a pseudo-random number generator (PRNG)
|
||||
to generate a key stream */
|
||||
ARC4_INIT(pARC4_CTX, &seed[0], seed_len);
|
||||
|
||||
os_free_mem(NULL, seed);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Construct WEP IV header.
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
|
||||
Note:
|
||||
It's a 4-octets header.
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPConstructWEPIVHdr(
|
||||
IN UINT8 key_idx,
|
||||
IN UCHAR *pn,
|
||||
OUT UCHAR *iv_hdr)
|
||||
{
|
||||
NdisZeroMemory(iv_hdr, LEN_WEP_IV_HDR);
|
||||
|
||||
NdisMoveMemory(iv_hdr, pn, LEN_WEP_TSC);
|
||||
|
||||
/* Append key index */
|
||||
iv_hdr[3] = (key_idx << 6);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
WEP MPDU cryptographic encapsulation
|
||||
|
||||
Arguments:
|
||||
pAdapter Pointer to our adapter
|
||||
pSrc Pointer to the received data
|
||||
Len the length of the received data
|
||||
|
||||
Return Value:
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RTMPSoftEncryptWEP(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pIvHdr,
|
||||
IN PCIPHER_KEY pKey,
|
||||
INOUT PUCHAR pData,
|
||||
IN ULONG DataByteCnt)
|
||||
{
|
||||
ARC4_CTX_STRUC *ARC4_CTX = NULL;
|
||||
UINT FCSCRC32;
|
||||
|
||||
os_alloc_mem(NULL, (UCHAR **)&ARC4_CTX, sizeof(ARC4_CTX_STRUC));
|
||||
if (ARC4_CTX == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ARC4_CTX Allocate memory fail!!!\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (pKey->KeyLen == 0)
|
||||
{
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : The key is empty !\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Initialize WEP key stream */
|
||||
RTMPInitWepEngine(pIvHdr,
|
||||
pKey->Key,
|
||||
pKey->KeyLen,
|
||||
ARC4_CTX);
|
||||
|
||||
/* WEP computes the ICV over the plaintext data */
|
||||
FCSCRC32 = RTMP_CALC_FCS32(PPPINITFCS32, pData, DataByteCnt);
|
||||
FCSCRC32 ^= 0xffffffff; /* complement */
|
||||
FCSCRC32 = cpu2le32(FCSCRC32);
|
||||
|
||||
/* Append 4-bytes ICV after the MPDU data */
|
||||
NdisMoveMemory(pData + DataByteCnt, (PUCHAR)&FCSCRC32, LEN_ICV);
|
||||
|
||||
/* Encrypt the MPDU plaintext data and ICV using ARC4 with a seed */
|
||||
ARC4_Compute(ARC4_CTX, pData, DataByteCnt + LEN_ICV, pData);
|
||||
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Decrypt received WEP data
|
||||
|
||||
Arguments:
|
||||
pAdapter Pointer to our adapter
|
||||
pSrc Pointer to the received data
|
||||
Len the length of the received data
|
||||
|
||||
Return Value:
|
||||
TRUE Decrypt WEP data success
|
||||
FALSE Decrypt WEP data failed
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RTMPSoftDecryptWEP(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PCIPHER_KEY pKey,
|
||||
INOUT PUCHAR pData,
|
||||
INOUT UINT16 *DataByteCnt)
|
||||
{
|
||||
/*ARC4_CTX_STRUC ARC4_CTX;*/
|
||||
ARC4_CTX_STRUC *ARC4_CTX = NULL;
|
||||
PUCHAR plaintext_ptr;
|
||||
UINT16 plaintext_len;
|
||||
PUCHAR ciphertext_ptr;
|
||||
UINT16 ciphertext_len;
|
||||
UINT trailfcs;
|
||||
UINT crc32;
|
||||
|
||||
os_alloc_mem(NULL, (UCHAR **)&ARC4_CTX, sizeof(ARC4_CTX_STRUC));
|
||||
if (ARC4_CTX == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: ARC4_CTX Allocate memory fail!!!\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (pKey->KeyLen == 0)
|
||||
{
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s : The key is not available !\n", __FUNCTION__));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Initialize WEP key stream */
|
||||
RTMPInitWepEngine(pData,
|
||||
pKey->Key,
|
||||
pKey->KeyLen,
|
||||
ARC4_CTX);
|
||||
|
||||
/* Skip the WEP IV header (4-bytes) */
|
||||
ciphertext_ptr = pData + LEN_WEP_IV_HDR;
|
||||
ciphertext_len = *DataByteCnt - LEN_WEP_IV_HDR;
|
||||
|
||||
/*skip payload length is zero*/
|
||||
if ((*DataByteCnt) <= LEN_WEP_IV_HDR) {
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Decrypt the WEP MPDU. It shall include plaintext and ICV.
|
||||
The result output would overwrite the original WEP IV header position */
|
||||
ARC4_Compute(ARC4_CTX,
|
||||
ciphertext_ptr,
|
||||
ciphertext_len,
|
||||
pData);
|
||||
|
||||
/* Point to the decrypted data frame and its length shall exclude ICV length */
|
||||
plaintext_ptr = pData;
|
||||
plaintext_len = ciphertext_len - LEN_ICV;
|
||||
|
||||
/* Extract peer's the ICV */
|
||||
NdisMoveMemory(&trailfcs, plaintext_ptr + plaintext_len, LEN_ICV);
|
||||
|
||||
/* WEP recomputes the ICV and
|
||||
bit-wise compares it with the decrypted ICV from the MPDU. */
|
||||
crc32 = RTMP_CALC_FCS32(PPPINITFCS32, plaintext_ptr, plaintext_len);
|
||||
crc32 ^= 0xffffffff; /* complement */
|
||||
|
||||
if(crc32 != cpu2le32(trailfcs))
|
||||
{
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("! WEP Data CRC Error !\n")); /*CRC error.*/
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Update the total data length */
|
||||
*DataByteCnt = plaintext_len;
|
||||
|
||||
os_free_mem(NULL, ARC4_CTX);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
7025
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_wpa.c
Normal file
7025
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/cmm_wpa.c
Normal file
File diff suppressed because it is too large
Load Diff
1599
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/crypt_aes.c
Normal file
1599
package/lean/mt-drivers/mt7603e/src/mt7603_wifi/common/crypt_aes.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,139 @@
|
||||
/****************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||||
*
|
||||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Ralink Technology, Inc. is obtained.
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
Module Name:
|
||||
RC4
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ------------------------------------------
|
||||
Eddy 2009/05/13 ARC4
|
||||
***************************************************************************/
|
||||
|
||||
#include "crypt_arc4.h"
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
ARC4 initialize the key block
|
||||
|
||||
Arguments:
|
||||
pARC4_CTX Pointer to ARC4 CONTEXT
|
||||
Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits)
|
||||
KeyLength The length of cipher key in bytes
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID ARC4_INIT (
|
||||
IN ARC4_CTX_STRUC *pARC4_CTX,
|
||||
IN PUCHAR pKey,
|
||||
IN UINT KeyLength)
|
||||
{
|
||||
UINT BlockIndex = 0, SWAPIndex = 0, KeyIndex = 0;
|
||||
UINT8 TempValue = 0;
|
||||
|
||||
/*Initialize the block value*/
|
||||
pARC4_CTX->BlockIndex1 = 0;
|
||||
pARC4_CTX->BlockIndex2 = 0;
|
||||
for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++)
|
||||
pARC4_CTX->KeyBlock[BlockIndex] = (UINT8) BlockIndex;
|
||||
|
||||
/*Key schedule*/
|
||||
for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++)
|
||||
{
|
||||
TempValue = pARC4_CTX->KeyBlock[BlockIndex];
|
||||
KeyIndex = BlockIndex % KeyLength;
|
||||
SWAPIndex = (SWAPIndex + TempValue + pKey[KeyIndex]) & 0xff;
|
||||
pARC4_CTX->KeyBlock[BlockIndex] = pARC4_CTX->KeyBlock[SWAPIndex];
|
||||
pARC4_CTX->KeyBlock[SWAPIndex] = TempValue;
|
||||
} /* End of for */
|
||||
|
||||
} /* End of ARC4_INIT */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
ARC4 encryption/decryption
|
||||
|
||||
Arguments:
|
||||
pARC4_CTX Pointer to ARC4 CONTEXT
|
||||
InputText Input text
|
||||
InputTextLength The length of input text in bytes
|
||||
|
||||
Return Value:
|
||||
OutputBlock Return output text
|
||||
========================================================================
|
||||
*/
|
||||
VOID ARC4_Compute (
|
||||
IN ARC4_CTX_STRUC *pARC4_CTX,
|
||||
IN UINT8 InputBlock[],
|
||||
IN UINT InputBlockSize,
|
||||
OUT UINT8 OutputBlock[])
|
||||
{
|
||||
UINT InputIndex = 0;
|
||||
UINT8 TempValue = 0;
|
||||
|
||||
for (InputIndex = 0; InputIndex < InputBlockSize; InputIndex++)
|
||||
{
|
||||
pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff;
|
||||
TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1];
|
||||
pARC4_CTX->BlockIndex2 = (pARC4_CTX->BlockIndex2 + TempValue) & 0xff;
|
||||
|
||||
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2];
|
||||
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue;
|
||||
|
||||
TempValue = (TempValue + pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1]) & 0xff;
|
||||
OutputBlock[InputIndex] = InputBlock[InputIndex]^pARC4_CTX->KeyBlock[TempValue];
|
||||
|
||||
} /* End of for */
|
||||
} /* End of ARC4_Compute */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Discard the key length
|
||||
|
||||
Arguments:
|
||||
pARC4_CTX Pointer to ARC4 CONTEXT
|
||||
Length Discard the key length
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID ARC4_Discard_KeyLength (
|
||||
IN ARC4_CTX_STRUC *pARC4_CTX,
|
||||
IN UINT Length)
|
||||
{
|
||||
UINT Index = 0;
|
||||
UINT8 TempValue = 0;
|
||||
|
||||
for (Index = 0; Index < Length; Index++)
|
||||
{
|
||||
pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff;
|
||||
TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1];
|
||||
pARC4_CTX->BlockIndex2 = (pARC4_CTX->BlockIndex2 + TempValue) & 0xff;
|
||||
|
||||
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2];
|
||||
pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue;
|
||||
} /* End of for */
|
||||
|
||||
} /* End of ARC4_Discard_KeyLength */
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,551 @@
|
||||
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2018 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgment:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgment:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
* Mediatek Inc.
|
||||
* 5F., No.5, Taiyuan 1st St., Zhubei City,
|
||||
* Hsinchu County 302, Taiwan, R.O.C.
|
||||
* (c) Copyright 2014, Mediatek, Inc.
|
||||
*
|
||||
* All rights reserved. Mediatek's source code is an unpublished work and the
|
||||
* use of a copyright notice does not imply otherwise. This source code
|
||||
* contains confidential trade secret material of Mediatek. Any attemp
|
||||
* or participation in deciphering, decoding, reverse engineering or in any
|
||||
* way altering the source code is stricitly prohibited, unless the prior
|
||||
* written consent of Mediatek, Inc. is obtained.
|
||||
****************************************************************************
|
||||
|
||||
Module Name:
|
||||
crypt_bignum.c
|
||||
|
||||
Abstract:
|
||||
BN wrepper for reference OPENSSL funcitons
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ---------------------------------------------
|
||||
Ellis 2018.3.1 Initial version
|
||||
*/
|
||||
#ifdef DOT11_SAE_OPENSSL_BN
|
||||
#include "crypt_bignum.h"
|
||||
#include "rt_config.h"
|
||||
#include <linux/time.h>
|
||||
|
||||
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#define DEBUGPRINT(fmt, args...) printk(fmt, ## args)
|
||||
#else
|
||||
#define DEBUGPRINT(fmt, args...) printf(fmt, ## args)
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
VOID Bignum_Print (
|
||||
IN BIGNUM *pBI)
|
||||
{
|
||||
UINT32 i, j = 0;
|
||||
|
||||
DEBUGPRINT("dmax = %d, top = %d\n", pBI->dmax, pBI->top);
|
||||
|
||||
for (i = pBI->dmax - 1; j < pBI->dmax; i--, j++) {
|
||||
if (j/4 > 0 && j % 4 == 0)
|
||||
DEBUGPRINT("\n");
|
||||
DEBUGPRINT("%02x %02x %02x %02x ", (pBI->d[i] & 0xff000000) >> 24,
|
||||
(pBI->d[i] & 0xff0000) >> 16, (pBI->d[i] & 0xff00) >> 8, (pBI->d[i] & 0xff)) ;
|
||||
}
|
||||
|
||||
DEBUGPRINT("\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID Bignum_Init(
|
||||
INOUT BIGNUM **pBI)
|
||||
{
|
||||
if (*pBI == NULL) {
|
||||
*pBI = BN_new();
|
||||
}
|
||||
}
|
||||
|
||||
VOID Bignum_Free(
|
||||
IN BIGNUM **pBI)
|
||||
{
|
||||
if (*pBI != NULL)
|
||||
BN_free(*pBI);
|
||||
*pBI = NULL;
|
||||
}
|
||||
|
||||
UINT32 Bignum_getlen(
|
||||
IN BIGNUM *pBI)
|
||||
{
|
||||
return pBI->top * 4;
|
||||
}
|
||||
|
||||
INT Bignum_Get_rand_range(IN BIGNUM * range, INOUT BIGNUM * r)
|
||||
{
|
||||
return BN_rand_range(r, (const BIGNUM *)range);
|
||||
}
|
||||
|
||||
VOID Bignum_BI2Bin(
|
||||
IN BIGNUM *pBI,
|
||||
OUT UINT8 *pValue,
|
||||
OUT UINT *Length)
|
||||
{
|
||||
*Length = BN_num_bytes(pBI);
|
||||
BN_bn2bin(pBI, pValue);
|
||||
} /* End of Bignum_BI2Bin */
|
||||
|
||||
|
||||
VOID Bignum_BI2Bin_with_pad(
|
||||
IN BIGNUM *pBI,
|
||||
OUT UINT8 *pValue,
|
||||
IN UINT *Length,
|
||||
IN UINT32 PadLen)
|
||||
{
|
||||
UINT32 num_bytes, offset;
|
||||
|
||||
num_bytes = BN_num_bytes((const BIGNUM *) pBI);
|
||||
|
||||
if (PadLen > num_bytes)
|
||||
offset = PadLen - num_bytes;
|
||||
else
|
||||
offset = 0;
|
||||
|
||||
NdisZeroMemory(pValue, offset);
|
||||
Bignum_BI2Bin(pBI, pValue + offset, Length);
|
||||
*Length += offset;
|
||||
}
|
||||
|
||||
|
||||
VOID Bignum_Bin2BI(
|
||||
IN UINT8 *pValue,
|
||||
IN UINT Length,
|
||||
OUT BIGNUM **pBI)
|
||||
{
|
||||
if (*pBI)
|
||||
BN_free(*pBI);
|
||||
*pBI = BN_bin2bn(pValue, Length, NULL);
|
||||
} /* End of Bignum_Bin2BI */
|
||||
|
||||
|
||||
VOID Bignum_Copy(
|
||||
IN BIGNUM *pBI_Copied,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
if (*pBI_Result)
|
||||
BN_free(*pBI_Result);
|
||||
*pBI_Result = BN_dup(pBI_Copied);
|
||||
} /* End of Bignum_Copy */
|
||||
|
||||
|
||||
INT Bignum_UnsignedCompare(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand)
|
||||
{
|
||||
return BN_ucmp(pFirstOperand, pSecondOperand);
|
||||
} /* End of Bignum_Compare */
|
||||
|
||||
|
||||
VOID Bignum_Add(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
BN_add(*pBI_Result, pFirstOperand, pSecondOperand);
|
||||
} /* End of Bignum_Add */
|
||||
|
||||
|
||||
VOID Bignum_Sub(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
BN_sub(*pBI_Result, pFirstOperand, pSecondOperand);
|
||||
} /* End of Bignum_Sub */
|
||||
|
||||
VOID Bignum_Mod(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
OUT BIGNUM **pBI_Remainder)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Remainder == NULL)
|
||||
*pBI_Remainder = BN_new();
|
||||
|
||||
BN_mod(*pBI_Remainder, pFirstOperand, pSecondOperand, bnctx);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Mul(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_mul(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P, bnctx);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
|
||||
UCHAR Bignum_is_zero(
|
||||
IN BIGNUM *pBI)
|
||||
{
|
||||
return (UCHAR)BN_is_zero(pBI);
|
||||
}
|
||||
|
||||
UCHAR Bignum_is_one(
|
||||
IN BIGNUM *pBI)
|
||||
{
|
||||
return (UCHAR)BN_is_one(pBI);
|
||||
}
|
||||
|
||||
UCHAR Bignum_is_odd(
|
||||
IN BIGNUM *pBI)
|
||||
{
|
||||
return (UCHAR)BN_is_odd(pBI);
|
||||
}
|
||||
|
||||
|
||||
VOID Bignum_Mod_Square(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_sqr(*pBI_Result, pFirstOperand, pBI_P, bnctx);
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Add(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_add(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P, bnctx);
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
|
||||
VOID Bignum_Mod_Sub(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_sub(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P, bnctx);
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Add_quick(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_add_quick(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P);
|
||||
}
|
||||
|
||||
|
||||
VOID Bignum_Mod_Sub_quick(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_sub_quick(*pBI_Result, pFirstOperand, pSecondOperand, pBI_P);
|
||||
}
|
||||
|
||||
|
||||
VOID Bignum_Mod_Div(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pSecondOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BIGNUM *tmp = NULL;
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
|
||||
tmp = BN_CTX_get(bnctx);
|
||||
|
||||
BN_mod_inverse(tmp, pSecondOperand, pBI_P, bnctx);
|
||||
|
||||
Bignum_Mod_Mul(pFirstOperand, tmp, pBI_P, pBI_Result);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Tonelli¡VShanks algorithm*/
|
||||
/* reference: https://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm */
|
||||
/* pBI_P must be prime */
|
||||
VOID Bignum_Mod_Sqrt(
|
||||
IN BIGNUM *pFirstOperand,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_sqrt(*pBI_Result, pFirstOperand, pBI_P, bnctx);
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
VOID Bignum_Shift_Right1(
|
||||
IN BIGNUM *pBI,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_copy(*pBI_Result, pBI);
|
||||
BN_div_word(*pBI_Result, 2);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Shift_Left1(
|
||||
IN BIGNUM *pBI,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_mod_lshift1_quick(*pBI_Result, pBI, pBI_P);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Shift_Left(
|
||||
IN BIGNUM *pBI,
|
||||
IN UCHAR bit,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_mod_lshift_quick(*pBI_Result, pBI, bit, pBI_P);
|
||||
}
|
||||
|
||||
|
||||
/* an integer q is called a quadratic residue modulo n if it is congruent to a perfect square modulo n */
|
||||
UCHAR Bignum_is_quadratic_residue(
|
||||
IN BIGNUM *q,
|
||||
IN BIGNUM *prime)
|
||||
{
|
||||
BIGNUM *p = NULL;
|
||||
BIGNUM *res = NULL;
|
||||
UCHAR ret;
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
res = BN_CTX_get(bnctx);
|
||||
|
||||
Bignum_Copy(prime, &p);
|
||||
BN_sub_word(p, 1);
|
||||
Bignum_Shift_Right1(p, &p);
|
||||
BN_mod_exp_mont(res, q, p, prime, bnctx, NULL);
|
||||
ret = Bignum_is_one(res);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
BN_free(p);
|
||||
return ret;
|
||||
}
|
||||
|
||||
VOID Bignum_Add_DW(
|
||||
INOUT BIGNUM *pBI,
|
||||
IN UINT32 value)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_DW(
|
||||
INOUT BIGNUM *pBI,
|
||||
IN UINT32 value,
|
||||
OUT UINT32 *rem)
|
||||
{
|
||||
*rem = pBI->d[0] & (value - 1);
|
||||
pBI->d[0] &= ~(value - 1);
|
||||
}
|
||||
|
||||
VOID Bignum_Montgomery_ExpMod(
|
||||
IN BIGNUM *pBI_G,
|
||||
IN BIGNUM *pBI_E,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_exp_mont(*pBI_Result, pBI_G, pBI_E, pBI_P, bnctx, NULL);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
VOID Bignum_Mod_Mul_Inverse(
|
||||
IN BIGNUM *pBI,
|
||||
IN BIGNUM *pBI_P,
|
||||
OUT BIGNUM **pBI_Result)
|
||||
{
|
||||
BN_CTX *bnctx;
|
||||
|
||||
bnctx = BN_CTX_new();
|
||||
|
||||
if (*pBI_Result == NULL)
|
||||
*pBI_Result = BN_new();
|
||||
|
||||
BN_mod_inverse(*pBI_Result, pBI, pBI_P, bnctx);
|
||||
|
||||
BN_CTX_free(bnctx);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* End of crypt_Bignum.c */
|
||||
|
||||
#endif /* DOT11_SAE_OPENSSL_BN */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user