Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 /*
0003  * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
0004  * All rights reserved.
0005  *
0006  * Purpose:  MAC routines
0007  *
0008  * Author: Tevin Chen
0009  *
0010  * Date: May 21, 1996
0011  *
0012  * Functions:
0013  *
0014  * Revision History:
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     /* swap over swap[0] and swap[1] to get correct write order */
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 }