Commit 4abee4bb authored by Ivo van Doorn's avatar Ivo van Doorn Committed by David S. Miller
Browse files

[PATCH] rt2x00: Remove duplicate code in MAC & BSSID handling



The various drivers contained duplicate code to handle the
MAC and BSSID initialization correctly. This moves the
address copy to little endian variables to rt2x00config.

Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c1098103
Loading
Loading
Loading
Loading
+8 −22
Original line number Diff line number Diff line
@@ -249,32 +249,18 @@ static int rt2400pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
/*
 * Configuration handlers.
 */
static void rt2400pci_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
static void rt2400pci_config_mac_addr(struct rt2x00_dev *rt2x00dev,
				      __le32 *mac)
{
	__le32 reg[2];

	memset(&reg, 0, sizeof(reg));
	memcpy(&reg, addr, ETH_ALEN);

	/*
	 * The MAC address is passed to us as an array of bytes,
	 * that array is little endian, so no need for byte ordering.
	 */
	rt2x00pci_register_multiwrite(rt2x00dev, CSR3, &reg, sizeof(reg));
	rt2x00pci_register_multiwrite(rt2x00dev, CSR3, mac,
				      (2 * sizeof(__le32)));
}

static void rt2400pci_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
static void rt2400pci_config_bssid(struct rt2x00_dev *rt2x00dev,
				   __le32 *bssid)
{
	__le32 reg[2];

	memset(&reg, 0, sizeof(reg));
	memcpy(&reg, bssid, ETH_ALEN);

	/*
	 * The BSSID is passed to us as an array of bytes,
	 * that array is little endian, so no need for byte ordering.
	 */
	rt2x00pci_register_multiwrite(rt2x00dev, CSR5, &reg, sizeof(reg));
	rt2x00pci_register_multiwrite(rt2x00dev, CSR5, bssid,
				      (2 * sizeof(__le32)));
}

static void rt2400pci_config_type(struct rt2x00_dev *rt2x00dev, int type)
+8 −22
Original line number Diff line number Diff line
@@ -249,32 +249,18 @@ static int rt2500pci_rfkill_poll(struct rt2x00_dev *rt2x00dev)
/*
 * Configuration handlers.
 */
static void rt2500pci_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
static void rt2500pci_config_mac_addr(struct rt2x00_dev *rt2x00dev,
				      __le32 *mac)
{
	__le32 reg[2];

	memset(&reg, 0, sizeof(reg));
	memcpy(&reg, addr, ETH_ALEN);

	/*
	 * The MAC address is passed to us as an array of bytes,
	 * that array is little endian, so no need for byte ordering.
	 */
	rt2x00pci_register_multiwrite(rt2x00dev, CSR3, &reg, sizeof(reg));
	rt2x00pci_register_multiwrite(rt2x00dev, CSR3, mac,
				      (2 * sizeof(__le32)));
}

static void rt2500pci_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
static void rt2500pci_config_bssid(struct rt2x00_dev *rt2x00dev,
				   __le32 *bssid)
{
	__le32 reg[2];

	memset(&reg, 0, sizeof(reg));
	memcpy(&reg, bssid, ETH_ALEN);

	/*
	 * The BSSID is passed to us as an array of bytes,
	 * that array is little endian, so no need for byte ordering.
	 */
	rt2x00pci_register_multiwrite(rt2x00dev, CSR5, &reg, sizeof(reg));
	rt2x00pci_register_multiwrite(rt2x00dev, CSR5, bssid,
				      (2 * sizeof(__le32)));
}

static void rt2500pci_config_type(struct rt2x00_dev *rt2x00dev, const int type)
+8 −22
Original line number Diff line number Diff line
@@ -254,32 +254,18 @@ static const struct rt2x00debug rt2500usb_rt2x00debug = {
/*
 * Configuration handlers.
 */
static void rt2500usb_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *addr)
static void rt2500usb_config_mac_addr(struct rt2x00_dev *rt2x00dev,
				      __le32 *mac)
{
	__le16 reg[3];

	memset(&reg, 0, sizeof(reg));
	memcpy(&reg, addr, ETH_ALEN);

	/*
	 * The MAC address is passed to us as an array of bytes,
	 * that array is little endian, so no need for byte ordering.
	 */
	rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR2, &reg, sizeof(reg));
	rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR2, &mac,
				      (3 * sizeof(__le16)));
}

static void rt2500usb_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
static void rt2500usb_config_bssid(struct rt2x00_dev *rt2x00dev,
				   __le32 *bssid)
{
	__le16 reg[3];

	memset(&reg, 0, sizeof(reg));
	memcpy(&reg, bssid, ETH_ALEN);

	/*
	 * The BSSID is passed to us as an array of bytes,
	 * that array is little endian, so no need for byte ordering.
	 */
	rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR5, &reg, sizeof(reg));
	rt2500usb_register_multiwrite(rt2x00dev, MAC_CSR5, bssid,
				      (3 * sizeof(__le16)));
}

static void rt2500usb_config_type(struct rt2x00_dev *rt2x00dev, const int type)
+2 −2
Original line number Diff line number Diff line
@@ -408,8 +408,8 @@ struct rt2x00lib_ops {
	/*
	 * Configuration handlers.
	 */
	void (*config_mac_addr) (struct rt2x00_dev *rt2x00dev, u8 *mac);
	void (*config_bssid) (struct rt2x00_dev *rt2x00dev, u8 *bssid);
	void (*config_mac_addr) (struct rt2x00_dev *rt2x00dev, __le32 *mac);
	void (*config_bssid) (struct rt2x00_dev *rt2x00dev, __le32 *bssid);
	void (*config_packet_filter) (struct rt2x00_dev *rt2x00dev,
				      const unsigned int filter);
	void (*config_type) (struct rt2x00_dev *rt2x00dev, const int type);
+30 −2
Original line number Diff line number Diff line
@@ -34,16 +34,44 @@
#include "rt2x00.h"
#include "rt2x00lib.h"


/*
 * The MAC and BSSID addressess are simple array of bytes,
 * these arrays are little endian, so when sending the addressess
 * to the drivers, copy the it into a endian-signed variable.
 *
 * Note that all devices (except rt2500usb) have 32 bits
 * register word sizes. This means that whatever variable we
 * pass _must_ be a multiple of 32 bits. Otherwise the device
 * might not accept what we are sending to it.
 * This will also make it easier for the driver to write
 * the data to the device.
 *
 * Also note that when NULL is passed as address the
 * we will send 00:00:00:00:00 to the device to clear the address.
 * This will prevent the device being confused when it wants
 * to ACK frames or consideres itself associated.
 */
void rt2x00lib_config_mac_addr(struct rt2x00_dev *rt2x00dev, u8 *mac)
{
	__le32 reg[2];

	memset(&reg, 0, sizeof(reg));
	if (mac)
		rt2x00dev->ops->lib->config_mac_addr(rt2x00dev, mac);
		memcpy(&reg, mac, ETH_ALEN);

	rt2x00dev->ops->lib->config_mac_addr(rt2x00dev, &reg[0]);
}

void rt2x00lib_config_bssid(struct rt2x00_dev *rt2x00dev, u8 *bssid)
{
	__le32 reg[2];

	memset(&reg, 0, sizeof(reg));
	if (bssid)
		rt2x00dev->ops->lib->config_bssid(rt2x00dev, bssid);
		memcpy(&reg, bssid, ETH_ALEN);

	rt2x00dev->ops->lib->config_bssid(rt2x00dev, &reg[0]);
}

void rt2x00lib_config_type(struct rt2x00_dev *rt2x00dev, int type)
Loading