Skip to content

Commit

Permalink
net/eth/ibmveth: Fixup retrieval of MAC address
Browse files Browse the repository at this point in the history
Some ancient pHyp versions used to create a 8 bytes local-mac-address
property in the device-tree instead of a 6 bytes one for veth.

The Linux driver code to deal with that is an insane hack which also
happens to break with some choices of MAC addresses in qemu by testing
for a bit in the address rather than just looking at the size of the
property.

Sanitize this by doing the latter instead.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
CC: <stable@vger.kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Benjamin Herrenschmidt authored and David S. Miller committed May 5, 2013
1 parent 77d21f2 commit 13f8520
Showing 1 changed file with 10 additions and 13 deletions.
23 changes: 10 additions & 13 deletions drivers/net/ethernet/ibm/ibmveth.c
Original file line number Diff line number Diff line change
Expand Up @@ -1322,7 +1322,7 @@ static const struct net_device_ops ibmveth_netdev_ops = {

static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id)
{
int rc, i;
int rc, i, mac_len;
struct net_device *netdev;
struct ibmveth_adapter *adapter;
unsigned char *mac_addr_p;
Expand All @@ -1332,11 +1332,19 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id)
dev->unit_address);

mac_addr_p = (unsigned char *)vio_get_attribute(dev, VETH_MAC_ADDR,
NULL);
&mac_len);
if (!mac_addr_p) {
dev_err(&dev->dev, "Can't find VETH_MAC_ADDR attribute\n");
return -EINVAL;
}
/* Workaround for old/broken pHyp */
if (mac_len == 8)
mac_addr_p += 2;
else if (mac_len != 6) {
dev_err(&dev->dev, "VETH_MAC_ADDR attribute wrong len %d\n",
mac_len);
return -EINVAL;
}

mcastFilterSize_p = (unsigned int *)vio_get_attribute(dev,
VETH_MCAST_FILTER_SIZE, NULL);
Expand All @@ -1361,17 +1369,6 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id)

netif_napi_add(netdev, &adapter->napi, ibmveth_poll, 16);

/*
* Some older boxes running PHYP non-natively have an OF that returns
* a 8-byte local-mac-address field (and the first 2 bytes have to be
* ignored) while newer boxes' OF return a 6-byte field. Note that
* IEEE 1275 specifies that local-mac-address must be a 6-byte field.
* The RPA doc specifies that the first byte must be 10b, so we'll
* just look for it to solve this 8 vs. 6 byte field issue
*/
if ((*mac_addr_p & 0x3) != 0x02)
mac_addr_p += 2;

adapter->mac_addr = 0;
memcpy(&adapter->mac_addr, mac_addr_p, 6);

Expand Down

0 comments on commit 13f8520

Please sign in to comment.