0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #include <linux/etherdevice.h>
0018
0019 #include "desc.h"
0020 #include "mac.h"
0021 #include "usbpipe.h"
0022
0023 int vnt_mac_set_filter(struct vnt_private *priv, u64 mc_filter)
0024 {
0025 __le64 le_mc = cpu_to_le64(mc_filter);
0026
0027 return vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_MAR0,
0028 MESSAGE_REQUEST_MACREG, sizeof(le_mc),
0029 (u8 *)&le_mc);
0030 }
0031
0032 int vnt_mac_shutdown(struct vnt_private *priv)
0033 {
0034 return vnt_control_out(priv, MESSAGE_TYPE_MACSHUTDOWN, 0, 0, 0, NULL);
0035 }
0036
0037 int vnt_mac_set_bb_type(struct vnt_private *priv, u8 type)
0038 {
0039 u8 data[2];
0040
0041 data[0] = type;
0042 data[1] = EN_CFG_BB_TYPE_MASK;
0043
0044 return vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, MAC_REG_ENCFG0,
0045 MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data),
0046 data);
0047 }
0048
0049 int vnt_mac_disable_keyentry(struct vnt_private *priv, u8 entry_idx)
0050 {
0051 return vnt_control_out(priv, MESSAGE_TYPE_CLRKEYENTRY, 0, 0,
0052 sizeof(entry_idx), &entry_idx);
0053 }
0054
0055 int vnt_mac_set_keyentry(struct vnt_private *priv, u16 key_ctl, u32 entry_idx,
0056 u32 key_idx, u8 *addr, u8 *key)
0057 {
0058 struct vnt_mac_set_key set_key;
0059 u16 offset;
0060
0061 offset = MISCFIFO_KEYETRY0;
0062 offset += entry_idx * MISCFIFO_KEYENTRYSIZE;
0063
0064 set_key.u.write.key_ctl = cpu_to_le16(key_ctl);
0065 ether_addr_copy(set_key.u.write.addr, addr);
0066
0067
0068 swap(set_key.u.swap[0], set_key.u.swap[1]);
0069
0070 memcpy(set_key.key, key, WLAN_KEY_LEN_CCMP);
0071
0072 dev_dbg(&priv->usb->dev, "offset %d key ctl %d set key %24ph\n",
0073 offset, key_ctl, (u8 *)&set_key);
0074
0075 return vnt_control_out(priv, MESSAGE_TYPE_SETKEY, offset,
0076 (u16)key_idx, sizeof(struct vnt_mac_set_key),
0077 (u8 *)&set_key);
0078 }
0079
0080 int vnt_mac_reg_bits_off(struct vnt_private *priv, u8 reg_ofs, u8 bits)
0081 {
0082 u8 data[2];
0083
0084 data[0] = 0;
0085 data[1] = bits;
0086
0087 return vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, reg_ofs,
0088 MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
0089 }
0090
0091 int vnt_mac_reg_bits_on(struct vnt_private *priv, u8 reg_ofs, u8 bits)
0092 {
0093 u8 data[2];
0094
0095 data[0] = bits;
0096 data[1] = bits;
0097
0098 return vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, reg_ofs,
0099 MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
0100 }
0101
0102 int vnt_mac_write_word(struct vnt_private *priv, u8 reg_ofs, u16 word)
0103 {
0104 u8 data[2];
0105
0106 data[0] = (u8)(word & 0xff);
0107 data[1] = (u8)(word >> 8);
0108
0109 return vnt_control_out(priv, MESSAGE_TYPE_WRITE, reg_ofs,
0110 MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
0111 }
0112
0113 int vnt_mac_set_bssid_addr(struct vnt_private *priv, u8 *addr)
0114 {
0115 return vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_BSSID0,
0116 MESSAGE_REQUEST_MACREG, ETH_ALEN, addr);
0117 }
0118
0119 int vnt_mac_enable_protect_mode(struct vnt_private *priv)
0120 {
0121 u8 data[2];
0122
0123 data[0] = EN_CFG_PROTECT_MD;
0124 data[1] = EN_CFG_PROTECT_MD;
0125
0126 return vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, MAC_REG_ENCFG0,
0127 MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
0128 }
0129
0130 int vnt_mac_disable_protect_mode(struct vnt_private *priv)
0131 {
0132 u8 data[2];
0133
0134 data[0] = 0;
0135 data[1] = EN_CFG_PROTECT_MD;
0136
0137 return vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, MAC_REG_ENCFG0,
0138 MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
0139 }
0140
0141 int vnt_mac_enable_barker_preamble_mode(struct vnt_private *priv)
0142 {
0143 u8 data[2];
0144
0145 data[0] = EN_CFG_BARKER_PREAM;
0146 data[1] = EN_CFG_BARKER_PREAM;
0147
0148 return vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, MAC_REG_ENCFG2,
0149 MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
0150 }
0151
0152 int vnt_mac_disable_barker_preamble_mode(struct vnt_private *priv)
0153 {
0154 u8 data[2];
0155
0156 data[0] = 0;
0157 data[1] = EN_CFG_BARKER_PREAM;
0158
0159 return vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, MAC_REG_ENCFG2,
0160 MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
0161 }
0162
0163 int vnt_mac_set_beacon_interval(struct vnt_private *priv, u16 interval)
0164 {
0165 u8 data[2];
0166
0167 data[0] = (u8)(interval & 0xff);
0168 data[1] = (u8)(interval >> 8);
0169
0170 return vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_BI,
0171 MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
0172 }
0173
0174 int vnt_mac_set_led(struct vnt_private *priv, u8 state, u8 led)
0175 {
0176 u8 data[2];
0177
0178 data[0] = led;
0179 data[1] = state;
0180
0181 return vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, MAC_REG_PAPEDELAY,
0182 MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
0183 }