|
@@ -522,10 +522,21 @@ retry:
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static u64 ibmveth_encode_mac_addr(u8 *mac)
|
|
|
|
+{
|
|
|
|
+ int i;
|
|
|
|
+ u64 encoded = 0;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < ETH_ALEN; i++)
|
|
|
|
+ encoded = (encoded << 8) | mac[i];
|
|
|
|
+
|
|
|
|
+ return encoded;
|
|
|
|
+}
|
|
|
|
+
|
|
static int ibmveth_open(struct net_device *netdev)
|
|
static int ibmveth_open(struct net_device *netdev)
|
|
{
|
|
{
|
|
struct ibmveth_adapter *adapter = netdev_priv(netdev);
|
|
struct ibmveth_adapter *adapter = netdev_priv(netdev);
|
|
- u64 mac_address = 0;
|
|
|
|
|
|
+ u64 mac_address;
|
|
int rxq_entries = 1;
|
|
int rxq_entries = 1;
|
|
unsigned long lpar_rc;
|
|
unsigned long lpar_rc;
|
|
int rc;
|
|
int rc;
|
|
@@ -579,8 +590,7 @@ static int ibmveth_open(struct net_device *netdev)
|
|
adapter->rx_queue.num_slots = rxq_entries;
|
|
adapter->rx_queue.num_slots = rxq_entries;
|
|
adapter->rx_queue.toggle = 1;
|
|
adapter->rx_queue.toggle = 1;
|
|
|
|
|
|
- memcpy(&mac_address, netdev->dev_addr, netdev->addr_len);
|
|
|
|
- mac_address = mac_address >> 16;
|
|
|
|
|
|
+ mac_address = ibmveth_encode_mac_addr(netdev->dev_addr);
|
|
|
|
|
|
rxq_desc.fields.flags_len = IBMVETH_BUF_VALID |
|
|
rxq_desc.fields.flags_len = IBMVETH_BUF_VALID |
|
|
adapter->rx_queue.queue_len;
|
|
adapter->rx_queue.queue_len;
|
|
@@ -1183,8 +1193,8 @@ static void ibmveth_set_multicast_list(struct net_device *netdev)
|
|
/* add the addresses to the filter table */
|
|
/* add the addresses to the filter table */
|
|
netdev_for_each_mc_addr(ha, netdev) {
|
|
netdev_for_each_mc_addr(ha, netdev) {
|
|
/* add the multicast address to the filter table */
|
|
/* add the multicast address to the filter table */
|
|
- unsigned long mcast_addr = 0;
|
|
|
|
- memcpy(((char *)&mcast_addr)+2, ha->addr, ETH_ALEN);
|
|
|
|
|
|
+ u64 mcast_addr;
|
|
|
|
+ mcast_addr = ibmveth_encode_mac_addr(ha->addr);
|
|
lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address,
|
|
lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address,
|
|
IbmVethMcastAddFilter,
|
|
IbmVethMcastAddFilter,
|
|
mcast_addr);
|
|
mcast_addr);
|
|
@@ -1372,9 +1382,6 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id)
|
|
|
|
|
|
netif_napi_add(netdev, &adapter->napi, ibmveth_poll, 16);
|
|
netif_napi_add(netdev, &adapter->napi, ibmveth_poll, 16);
|
|
|
|
|
|
- adapter->mac_addr = 0;
|
|
|
|
- memcpy(&adapter->mac_addr, mac_addr_p, ETH_ALEN);
|
|
|
|
-
|
|
|
|
netdev->irq = dev->irq;
|
|
netdev->irq = dev->irq;
|
|
netdev->netdev_ops = &ibmveth_netdev_ops;
|
|
netdev->netdev_ops = &ibmveth_netdev_ops;
|
|
netdev->ethtool_ops = &netdev_ethtool_ops;
|
|
netdev->ethtool_ops = &netdev_ethtool_ops;
|
|
@@ -1383,7 +1390,7 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id)
|
|
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
|
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
|
|
netdev->features |= netdev->hw_features;
|
|
netdev->features |= netdev->hw_features;
|
|
|
|
|
|
- memcpy(netdev->dev_addr, &adapter->mac_addr, netdev->addr_len);
|
|
|
|
|
|
+ memcpy(netdev->dev_addr, mac_addr_p, ETH_ALEN);
|
|
|
|
|
|
for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) {
|
|
for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) {
|
|
struct kobject *kobj = &adapter->rx_buff_pool[i].kobj;
|
|
struct kobject *kobj = &adapter->rx_buff_pool[i].kobj;
|