qlge: Add support for using alternate MAC address.
authorRon Mercer <ron.mercer@qlogic.com>
Tue, 9 Jun 2009 05:39:33 +0000 (05:39 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 10 Jun 2009 08:04:13 +0000 (01:04 -0700)
Extract either manufacturer or Bladecenter Open Fabric
Manager (BOFM) MAC address.  BOFM may indicate an
alternate MAC address.  This patch honors that request
by extracting the MAC address from a different
flash location if a flag is set.

Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlge/qlge_main.c

index 738691ddcc042da8823e8abf0409507d90564cd7..d6517eb5bc1de96772fbd833a8272a18468538c2 100644 (file)
@@ -675,6 +675,7 @@ static int ql_get_8000_flash_params(struct ql_adapter *qdev)
        int status;
        __le32 *p = (__le32 *)&qdev->flash;
        u32 offset;
+       u8 mac_addr[6];
 
        /* Get flash offset for function and adjust
         * for dword access.
@@ -705,14 +706,26 @@ static int ql_get_8000_flash_params(struct ql_adapter *qdev)
                goto exit;
        }
 
-       if (!is_valid_ether_addr(qdev->flash.flash_params_8000.mac_addr)) {
+       /* Extract either manufacturer or BOFM modified
+        * MAC address.
+        */
+       if (qdev->flash.flash_params_8000.data_type1 == 2)
+               memcpy(mac_addr,
+                       qdev->flash.flash_params_8000.mac_addr1,
+                       qdev->ndev->addr_len);
+       else
+               memcpy(mac_addr,
+                       qdev->flash.flash_params_8000.mac_addr,
+                       qdev->ndev->addr_len);
+
+       if (!is_valid_ether_addr(mac_addr)) {
                QPRINTK(qdev, IFUP, ERR, "Invalid MAC address.\n");
                status = -EINVAL;
                goto exit;
        }
 
        memcpy(qdev->ndev->dev_addr,
-               qdev->flash.flash_params_8000.mac_addr,
+               mac_addr,
                qdev->ndev->addr_len);
 
 exit: