Skip to content

Commit

Permalink
ks8842: Add platform data for setting mac address
Browse files Browse the repository at this point in the history
This patch adds platform data to the ks8842 driver.

Via the platform data a MAC address, to be used by the controller,
can be passed.

To ensure this MAC address is used, the MAC address is written
after each hardware reset.

Signed-off-by: Richard Röjfors <richard.rojfors@pelagicore.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Richard Röjfors authored and David S. Miller committed Apr 21, 2010
1 parent 6846ad2 commit a1aa882
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 11 deletions.
53 changes: 42 additions & 11 deletions drivers/net/ks8842.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* ks8842_main.c timberdale KS8842 ethernet driver
* ks8842.c timberdale KS8842 ethernet driver
* Copyright (c) 2009 Intel Corporation
*
* This program is free software; you can redistribute it and/or modify
Expand Down Expand Up @@ -28,6 +28,7 @@
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/ethtool.h>
#include <linux/ks8842.h>

#define DRV_NAME "ks8842"

Expand Down Expand Up @@ -304,6 +305,20 @@ static void ks8842_read_mac_addr(struct ks8842_adapter *adapter, u8 *dest)
ks8842_write16(adapter, 39, mac, REG_MACAR3);
}

static void ks8842_write_mac_addr(struct ks8842_adapter *adapter, u8 *mac)
{
unsigned long flags;
unsigned i;

spin_lock_irqsave(&adapter->lock, flags);
for (i = 0; i < ETH_ALEN; i++) {
ks8842_write8(adapter, 2, mac[ETH_ALEN - i - 1], REG_MARL + i);
ks8842_write8(adapter, 39, mac[ETH_ALEN - i - 1],
REG_MACAR1 + i);
}
spin_unlock_irqrestore(&adapter->lock, flags);
}

static inline u16 ks8842_tx_fifo_space(struct ks8842_adapter *adapter)
{
return ks8842_read16(adapter, 16, REG_TXMIR) & 0x1fff;
Expand Down Expand Up @@ -522,6 +537,8 @@ static int ks8842_open(struct net_device *netdev)
/* reset the HW */
ks8842_reset_hw(adapter);

ks8842_write_mac_addr(adapter, netdev->dev_addr);

ks8842_update_link_status(netdev, adapter);

err = request_irq(adapter->irq, ks8842_irq, IRQF_SHARED, DRV_NAME,
Expand Down Expand Up @@ -568,10 +585,8 @@ static netdev_tx_t ks8842_xmit_frame(struct sk_buff *skb,
static int ks8842_set_mac(struct net_device *netdev, void *p)
{
struct ks8842_adapter *adapter = netdev_priv(netdev);
unsigned long flags;
struct sockaddr *addr = p;
char *mac = (u8 *)addr->sa_data;
int i;

dev_dbg(&adapter->pdev->dev, "%s: entry\n", __func__);

Expand All @@ -580,13 +595,7 @@ static int ks8842_set_mac(struct net_device *netdev, void *p)

memcpy(netdev->dev_addr, mac, netdev->addr_len);

spin_lock_irqsave(&adapter->lock, flags);
for (i = 0; i < ETH_ALEN; i++) {
ks8842_write8(adapter, 2, mac[ETH_ALEN - i - 1], REG_MARL + i);
ks8842_write8(adapter, 39, mac[ETH_ALEN - i - 1],
REG_MACAR1 + i);
}
spin_unlock_irqrestore(&adapter->lock, flags);
ks8842_write_mac_addr(adapter, mac);
return 0;
}

Expand All @@ -605,6 +614,8 @@ static void ks8842_tx_timeout(struct net_device *netdev)

ks8842_reset_hw(adapter);

ks8842_write_mac_addr(adapter, netdev->dev_addr);

ks8842_update_link_status(netdev, adapter);
}

Expand All @@ -627,7 +638,9 @@ static int __devinit ks8842_probe(struct platform_device *pdev)
struct resource *iomem;
struct net_device *netdev;
struct ks8842_adapter *adapter;
struct ks8842_platform_data *pdata = pdev->dev.platform_data;
u16 id;
unsigned i;

iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!request_mem_region(iomem->start, resource_size(iomem), DRV_NAME))
Expand Down Expand Up @@ -658,7 +671,25 @@ static int __devinit ks8842_probe(struct platform_device *pdev)
netdev->netdev_ops = &ks8842_netdev_ops;
netdev->ethtool_ops = &ks8842_ethtool_ops;

ks8842_read_mac_addr(adapter, netdev->dev_addr);
/* Check if a mac address was given */
i = netdev->addr_len;
if (pdata) {
for (i = 0; i < netdev->addr_len; i++)
if (pdata->macaddr[i] != 0)
break;

if (i < netdev->addr_len)
/* an address was passed, use it */
memcpy(netdev->dev_addr, pdata->macaddr,
netdev->addr_len);
}

if (i == netdev->addr_len) {
ks8842_read_mac_addr(adapter, netdev->dev_addr);

if (!is_valid_ether_addr(netdev->dev_addr))
random_ether_addr(netdev->dev_addr);
}

id = ks8842_read16(adapter, 32, REG_SW_ID_AND_ENABLE);

Expand Down
34 changes: 34 additions & 0 deletions include/linux/ks8842.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* ks8842.h KS8842 platform data struct definition
* Copyright (c) 2010 Intel Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#ifndef _LINUX_KS8842_H
#define _LINUX_KS8842_H

#include <linux/if_ether.h>

/**
* struct ks8842_platform_data - Platform data of the KS8842 network driver
* @macaddr: The MAC address of the device, set to all 0:s to use the on in
* the chip.
*
*/
struct ks8842_platform_data {
u8 macaddr[ETH_ALEN];
};

#endif

0 comments on commit a1aa882

Please sign in to comment.