diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/s2io.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index b991fb2ff83f..44bb2395af84 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -84,7 +84,7 @@ | |||
84 | #include "s2io.h" | 84 | #include "s2io.h" |
85 | #include "s2io-regs.h" | 85 | #include "s2io-regs.h" |
86 | 86 | ||
87 | #define DRV_VERSION "2.0.16.1" | 87 | #define DRV_VERSION "2.0.17.1" |
88 | 88 | ||
89 | /* S2io Driver name & version. */ | 89 | /* S2io Driver name & version. */ |
90 | static char s2io_driver_name[] = "Neterion"; | 90 | static char s2io_driver_name[] = "Neterion"; |
@@ -3394,6 +3394,9 @@ new_way: | |||
3394 | writeq(val64, &bar0->pcc_err_reg); | 3394 | writeq(val64, &bar0->pcc_err_reg); |
3395 | } | 3395 | } |
3396 | 3396 | ||
3397 | /* restore the previously assigned mac address */ | ||
3398 | s2io_set_mac_addr(sp->dev, (u8 *)&sp->def_mac_addr[0].mac_addr); | ||
3399 | |||
3397 | sp->device_enabled_once = FALSE; | 3400 | sp->device_enabled_once = FALSE; |
3398 | } | 3401 | } |
3399 | 3402 | ||
@@ -4512,6 +4515,7 @@ static int s2io_set_mac_addr(struct net_device *dev, u8 * addr) | |||
4512 | struct XENA_dev_config __iomem *bar0 = sp->bar0; | 4515 | struct XENA_dev_config __iomem *bar0 = sp->bar0; |
4513 | register u64 val64, mac_addr = 0; | 4516 | register u64 val64, mac_addr = 0; |
4514 | int i; | 4517 | int i; |
4518 | u64 old_mac_addr = 0; | ||
4515 | 4519 | ||
4516 | /* | 4520 | /* |
4517 | * Set the new MAC address as the new unicast filter and reflect this | 4521 | * Set the new MAC address as the new unicast filter and reflect this |
@@ -4521,6 +4525,22 @@ static int s2io_set_mac_addr(struct net_device *dev, u8 * addr) | |||
4521 | for (i = 0; i < ETH_ALEN; i++) { | 4525 | for (i = 0; i < ETH_ALEN; i++) { |
4522 | mac_addr <<= 8; | 4526 | mac_addr <<= 8; |
4523 | mac_addr |= addr[i]; | 4527 | mac_addr |= addr[i]; |
4528 | old_mac_addr <<= 8; | ||
4529 | old_mac_addr |= sp->def_mac_addr[0].mac_addr[i]; | ||
4530 | } | ||
4531 | |||
4532 | if(0 == mac_addr) | ||
4533 | return SUCCESS; | ||
4534 | |||
4535 | /* Update the internal structure with this new mac address */ | ||
4536 | if(mac_addr != old_mac_addr) { | ||
4537 | memset(sp->def_mac_addr[0].mac_addr, 0, sizeof(ETH_ALEN)); | ||
4538 | sp->def_mac_addr[0].mac_addr[5] = (u8) (mac_addr); | ||
4539 | sp->def_mac_addr[0].mac_addr[4] = (u8) (mac_addr >> 8); | ||
4540 | sp->def_mac_addr[0].mac_addr[3] = (u8) (mac_addr >> 16); | ||
4541 | sp->def_mac_addr[0].mac_addr[2] = (u8) (mac_addr >> 24); | ||
4542 | sp->def_mac_addr[0].mac_addr[1] = (u8) (mac_addr >> 32); | ||
4543 | sp->def_mac_addr[0].mac_addr[0] = (u8) (mac_addr >> 40); | ||
4524 | } | 4544 | } |
4525 | 4545 | ||
4526 | writeq(RMAC_ADDR_DATA0_MEM_ADDR(mac_addr), | 4546 | writeq(RMAC_ADDR_DATA0_MEM_ADDR(mac_addr), |
@@ -6022,7 +6042,7 @@ static void s2io_set_link(struct work_struct *work) | |||
6022 | clear_bit(0, &(nic->link_state)); | 6042 | clear_bit(0, &(nic->link_state)); |
6023 | 6043 | ||
6024 | out_unlock: | 6044 | out_unlock: |
6025 | rtnl_lock(); | 6045 | rtnl_unlock(); |
6026 | } | 6046 | } |
6027 | 6047 | ||
6028 | static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp, | 6048 | static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp, |
@@ -7182,8 +7202,6 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
7182 | mac_down = (u32) tmp64; | 7202 | mac_down = (u32) tmp64; |
7183 | mac_up = (u32) (tmp64 >> 32); | 7203 | mac_up = (u32) (tmp64 >> 32); |
7184 | 7204 | ||
7185 | memset(sp->def_mac_addr[0].mac_addr, 0, sizeof(ETH_ALEN)); | ||
7186 | |||
7187 | sp->def_mac_addr[0].mac_addr[3] = (u8) (mac_up); | 7205 | sp->def_mac_addr[0].mac_addr[3] = (u8) (mac_up); |
7188 | sp->def_mac_addr[0].mac_addr[2] = (u8) (mac_up >> 8); | 7206 | sp->def_mac_addr[0].mac_addr[2] = (u8) (mac_up >> 8); |
7189 | sp->def_mac_addr[0].mac_addr[1] = (u8) (mac_up >> 16); | 7207 | sp->def_mac_addr[0].mac_addr[1] = (u8) (mac_up >> 16); |