diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-10-10 13:30:08 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-10-10 13:30:08 -0400 |
| commit | 3dd392a407d15250a501fa109cc1f93fee95ef85 (patch) | |
| tree | c1faca3fa8bd0f7c8790b3e0887229b4a5a90e8b /drivers/net | |
| parent | b27a43c1e90582facad44de67d02bc9e9f900289 (diff) | |
| parent | d403a6484f0341bf0624d17ece46f24f741b6a92 (diff) | |
Merge branch 'linus' into x86/pat2
Conflicts:
arch/x86/mm/init_64.c
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/bnx2.h | 2 | ||||
| -rw-r--r-- | drivers/net/e100.c | 4 | ||||
| -rw-r--r-- | drivers/net/e1000/e1000_hw.c | 23 | ||||
| -rw-r--r-- | drivers/net/e1000e/e1000.h | 5 | ||||
| -rw-r--r-- | drivers/net/e1000e/ethtool.c | 9 | ||||
| -rw-r--r-- | drivers/net/e1000e/ich8lan.c | 78 | ||||
| -rw-r--r-- | drivers/net/e1000e/netdev.c | 72 | ||||
| -rw-r--r-- | drivers/net/e1000e/param.c | 30 | ||||
| -rw-r--r-- | drivers/net/forcedeth.c | 16 | ||||
| -rw-r--r-- | drivers/net/hp-plus.c | 8 | ||||
| -rw-r--r-- | drivers/net/mlx4/mr.c | 10 | ||||
| -rw-r--r-- | drivers/net/niu.c | 56 | ||||
| -rw-r--r-- | drivers/net/wireless/ath9k/beacon.c | 13 | ||||
| -rw-r--r-- | drivers/net/wireless/ath9k/core.c | 11 | ||||
| -rw-r--r-- | drivers/net/wireless/ath9k/core.h | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/ath9k/main.c | 26 | ||||
| -rw-r--r-- | drivers/net/wireless/ath9k/xmit.c | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/rfkill.c | 18 | ||||
| -rw-r--r-- | drivers/net/wireless/b43legacy/rfkill.c | 18 | ||||
| -rw-r--r-- | drivers/net/wireless/zd1211rw/zd_usb.c | 1 |
20 files changed, 308 insertions, 100 deletions
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index c3c579f98ed0..dfacd31f7ed0 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h | |||
| @@ -6597,7 +6597,7 @@ struct flash_spec { | |||
| 6597 | 6597 | ||
| 6598 | struct bnx2_irq { | 6598 | struct bnx2_irq { |
| 6599 | irq_handler_t handler; | 6599 | irq_handler_t handler; |
| 6600 | u16 vector; | 6600 | unsigned int vector; |
| 6601 | u8 requested; | 6601 | u8 requested; |
| 6602 | char name[16]; | 6602 | char name[16]; |
| 6603 | }; | 6603 | }; |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 453115acaad2..5cf78d612c45 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
| @@ -2738,9 +2738,7 @@ static int __devinit e100_probe(struct pci_dev *pdev, | |||
| 2738 | nic->flags |= wol_magic; | 2738 | nic->flags |= wol_magic; |
| 2739 | 2739 | ||
| 2740 | /* ack any pending wake events, disable PME */ | 2740 | /* ack any pending wake events, disable PME */ |
| 2741 | err = pci_enable_wake(pdev, 0, 0); | 2741 | pci_pme_active(pdev, false); |
| 2742 | if (err) | ||
| 2743 | DPRINTK(PROBE, ERR, "Error clearing wake event\n"); | ||
| 2744 | 2742 | ||
| 2745 | strcpy(netdev->name, "eth%d"); | 2743 | strcpy(netdev->name, "eth%d"); |
| 2746 | if((err = register_netdev(netdev))) { | 2744 | if((err = register_netdev(netdev))) { |
diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c index 9d6edf3e73f9..d04eef53571e 100644 --- a/drivers/net/e1000/e1000_hw.c +++ b/drivers/net/e1000/e1000_hw.c | |||
| @@ -144,6 +144,8 @@ static s32 e1000_host_if_read_cookie(struct e1000_hw *hw, u8 *buffer); | |||
| 144 | static u8 e1000_calculate_mng_checksum(char *buffer, u32 length); | 144 | static u8 e1000_calculate_mng_checksum(char *buffer, u32 length); |
| 145 | static s32 e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, u16 duplex); | 145 | static s32 e1000_configure_kmrn_for_10_100(struct e1000_hw *hw, u16 duplex); |
| 146 | static s32 e1000_configure_kmrn_for_1000(struct e1000_hw *hw); | 146 | static s32 e1000_configure_kmrn_for_1000(struct e1000_hw *hw); |
| 147 | static s32 e1000_do_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); | ||
| 148 | static s32 e1000_do_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data); | ||
| 147 | 149 | ||
| 148 | /* IGP cable length table */ | 150 | /* IGP cable length table */ |
| 149 | static const | 151 | static const |
| @@ -168,6 +170,8 @@ u16 e1000_igp_2_cable_length_table[IGP02E1000_AGC_LENGTH_TABLE_SIZE] = | |||
| 168 | 83, 89, 95, 100, 105, 109, 113, 116, 119, 122, 124, | 170 | 83, 89, 95, 100, 105, 109, 113, 116, 119, 122, 124, |
| 169 | 104, 109, 114, 118, 121, 124}; | 171 | 104, 109, 114, 118, 121, 124}; |
| 170 | 172 | ||
| 173 | static DEFINE_SPINLOCK(e1000_eeprom_lock); | ||
| 174 | |||
| 171 | /****************************************************************************** | 175 | /****************************************************************************** |
| 172 | * Set the phy type member in the hw struct. | 176 | * Set the phy type member in the hw struct. |
| 173 | * | 177 | * |
| @@ -4904,6 +4908,15 @@ static s32 e1000_spi_eeprom_ready(struct e1000_hw *hw) | |||
| 4904 | *****************************************************************************/ | 4908 | *****************************************************************************/ |
| 4905 | s32 e1000_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) | 4909 | s32 e1000_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) |
| 4906 | { | 4910 | { |
| 4911 | s32 ret; | ||
| 4912 | spin_lock(&e1000_eeprom_lock); | ||
| 4913 | ret = e1000_do_read_eeprom(hw, offset, words, data); | ||
| 4914 | spin_unlock(&e1000_eeprom_lock); | ||
| 4915 | return ret; | ||
| 4916 | } | ||
| 4917 | |||
| 4918 | static s32 e1000_do_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) | ||
| 4919 | { | ||
| 4907 | struct e1000_eeprom_info *eeprom = &hw->eeprom; | 4920 | struct e1000_eeprom_info *eeprom = &hw->eeprom; |
| 4908 | u32 i = 0; | 4921 | u32 i = 0; |
| 4909 | 4922 | ||
| @@ -5236,6 +5249,16 @@ s32 e1000_update_eeprom_checksum(struct e1000_hw *hw) | |||
| 5236 | *****************************************************************************/ | 5249 | *****************************************************************************/ |
| 5237 | s32 e1000_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) | 5250 | s32 e1000_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) |
| 5238 | { | 5251 | { |
| 5252 | s32 ret; | ||
| 5253 | spin_lock(&e1000_eeprom_lock); | ||
| 5254 | ret = e1000_do_write_eeprom(hw, offset, words, data); | ||
| 5255 | spin_unlock(&e1000_eeprom_lock); | ||
| 5256 | return ret; | ||
| 5257 | } | ||
| 5258 | |||
| 5259 | |||
| 5260 | static s32 e1000_do_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words, u16 *data) | ||
| 5261 | { | ||
| 5239 | struct e1000_eeprom_info *eeprom = &hw->eeprom; | 5262 | struct e1000_eeprom_info *eeprom = &hw->eeprom; |
| 5240 | s32 status = 0; | 5263 | s32 status = 0; |
| 5241 | 5264 | ||
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h index ac4e506b4f88..5ea6b60fa377 100644 --- a/drivers/net/e1000e/e1000.h +++ b/drivers/net/e1000e/e1000.h | |||
| @@ -257,7 +257,6 @@ struct e1000_adapter { | |||
| 257 | struct net_device *netdev; | 257 | struct net_device *netdev; |
| 258 | struct pci_dev *pdev; | 258 | struct pci_dev *pdev; |
| 259 | struct net_device_stats net_stats; | 259 | struct net_device_stats net_stats; |
| 260 | spinlock_t stats_lock; /* prevent concurrent stats updates */ | ||
| 261 | 260 | ||
| 262 | /* structs defined in e1000_hw.h */ | 261 | /* structs defined in e1000_hw.h */ |
| 263 | struct e1000_hw hw; | 262 | struct e1000_hw hw; |
| @@ -284,6 +283,8 @@ struct e1000_adapter { | |||
| 284 | unsigned long led_status; | 283 | unsigned long led_status; |
| 285 | 284 | ||
| 286 | unsigned int flags; | 285 | unsigned int flags; |
| 286 | struct work_struct downshift_task; | ||
| 287 | struct work_struct update_phy_task; | ||
| 287 | }; | 288 | }; |
| 288 | 289 | ||
| 289 | struct e1000_info { | 290 | struct e1000_info { |
| @@ -305,6 +306,7 @@ struct e1000_info { | |||
| 305 | #define FLAG_HAS_CTRLEXT_ON_LOAD (1 << 5) | 306 | #define FLAG_HAS_CTRLEXT_ON_LOAD (1 << 5) |
| 306 | #define FLAG_HAS_SWSM_ON_LOAD (1 << 6) | 307 | #define FLAG_HAS_SWSM_ON_LOAD (1 << 6) |
| 307 | #define FLAG_HAS_JUMBO_FRAMES (1 << 7) | 308 | #define FLAG_HAS_JUMBO_FRAMES (1 << 7) |
| 309 | #define FLAG_READ_ONLY_NVM (1 << 8) | ||
| 308 | #define FLAG_IS_ICH (1 << 9) | 310 | #define FLAG_IS_ICH (1 << 9) |
| 309 | #define FLAG_HAS_SMART_POWER_DOWN (1 << 11) | 311 | #define FLAG_HAS_SMART_POWER_DOWN (1 << 11) |
| 310 | #define FLAG_IS_QUAD_PORT_A (1 << 12) | 312 | #define FLAG_IS_QUAD_PORT_A (1 << 12) |
| @@ -385,6 +387,7 @@ extern bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw); | |||
| 385 | extern bool e1000e_get_laa_state_82571(struct e1000_hw *hw); | 387 | extern bool e1000e_get_laa_state_82571(struct e1000_hw *hw); |
| 386 | extern void e1000e_set_laa_state_82571(struct e1000_hw *hw, bool state); | 388 | extern void e1000e_set_laa_state_82571(struct e1000_hw *hw, bool state); |
| 387 | 389 | ||
| 390 | extern void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw); | ||
| 388 | extern void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, | 391 | extern void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, |
| 389 | bool state); | 392 | bool state); |
| 390 | extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); | 393 | extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); |
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index e21c9e0f3738..33a3ff17b5d0 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
| @@ -432,6 +432,10 @@ static void e1000_get_regs(struct net_device *netdev, | |||
| 432 | regs_buff[11] = er32(TIDV); | 432 | regs_buff[11] = er32(TIDV); |
| 433 | 433 | ||
| 434 | regs_buff[12] = adapter->hw.phy.type; /* PHY type (IGP=1, M88=0) */ | 434 | regs_buff[12] = adapter->hw.phy.type; /* PHY type (IGP=1, M88=0) */ |
| 435 | |||
| 436 | /* ethtool doesn't use anything past this point, so all this | ||
| 437 | * code is likely legacy junk for apps that may or may not | ||
| 438 | * exist */ | ||
| 435 | if (hw->phy.type == e1000_phy_m88) { | 439 | if (hw->phy.type == e1000_phy_m88) { |
| 436 | e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); | 440 | e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); |
| 437 | regs_buff[13] = (u32)phy_data; /* cable length */ | 441 | regs_buff[13] = (u32)phy_data; /* cable length */ |
| @@ -447,7 +451,7 @@ static void e1000_get_regs(struct net_device *netdev, | |||
| 447 | regs_buff[22] = adapter->phy_stats.receive_errors; | 451 | regs_buff[22] = adapter->phy_stats.receive_errors; |
| 448 | regs_buff[23] = regs_buff[13]; /* mdix mode */ | 452 | regs_buff[23] = regs_buff[13]; /* mdix mode */ |
| 449 | } | 453 | } |
| 450 | regs_buff[21] = adapter->phy_stats.idle_errors; /* phy idle errors */ | 454 | regs_buff[21] = 0; /* was idle_errors */ |
| 451 | e1e_rphy(hw, PHY_1000T_STATUS, &phy_data); | 455 | e1e_rphy(hw, PHY_1000T_STATUS, &phy_data); |
| 452 | regs_buff[24] = (u32)phy_data; /* phy local receiver status */ | 456 | regs_buff[24] = (u32)phy_data; /* phy local receiver status */ |
| 453 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ | 457 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ |
| @@ -529,6 +533,9 @@ static int e1000_set_eeprom(struct net_device *netdev, | |||
| 529 | if (eeprom->magic != (adapter->pdev->vendor | (adapter->pdev->device << 16))) | 533 | if (eeprom->magic != (adapter->pdev->vendor | (adapter->pdev->device << 16))) |
| 530 | return -EFAULT; | 534 | return -EFAULT; |
| 531 | 535 | ||
| 536 | if (adapter->flags & FLAG_READ_ONLY_NVM) | ||
| 537 | return -EINVAL; | ||
| 538 | |||
| 532 | max_len = hw->nvm.word_size * 2; | 539 | max_len = hw->nvm.word_size * 2; |
| 533 | 540 | ||
| 534 | first_word = eeprom->offset >> 1; | 541 | first_word = eeprom->offset >> 1; |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 9e38452a738c..bcd2bc477af2 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
| @@ -58,6 +58,7 @@ | |||
| 58 | #define ICH_FLASH_HSFCTL 0x0006 | 58 | #define ICH_FLASH_HSFCTL 0x0006 |
| 59 | #define ICH_FLASH_FADDR 0x0008 | 59 | #define ICH_FLASH_FADDR 0x0008 |
| 60 | #define ICH_FLASH_FDATA0 0x0010 | 60 | #define ICH_FLASH_FDATA0 0x0010 |
| 61 | #define ICH_FLASH_PR0 0x0074 | ||
| 61 | 62 | ||
| 62 | #define ICH_FLASH_READ_COMMAND_TIMEOUT 500 | 63 | #define ICH_FLASH_READ_COMMAND_TIMEOUT 500 |
| 63 | #define ICH_FLASH_WRITE_COMMAND_TIMEOUT 500 | 64 | #define ICH_FLASH_WRITE_COMMAND_TIMEOUT 500 |
| @@ -150,6 +151,19 @@ union ich8_hws_flash_regacc { | |||
| 150 | u16 regval; | 151 | u16 regval; |
| 151 | }; | 152 | }; |
| 152 | 153 | ||
| 154 | /* ICH Flash Protected Region */ | ||
| 155 | union ich8_flash_protected_range { | ||
| 156 | struct ich8_pr { | ||
| 157 | u32 base:13; /* 0:12 Protected Range Base */ | ||
| 158 | u32 reserved1:2; /* 13:14 Reserved */ | ||
| 159 | u32 rpe:1; /* 15 Read Protection Enable */ | ||
| 160 | u32 limit:13; /* 16:28 Protected Range Limit */ | ||
| 161 | u32 reserved2:2; /* 29:30 Reserved */ | ||
| 162 | u32 wpe:1; /* 31 Write Protection Enable */ | ||
| 163 | } range; | ||
| 164 | u32 regval; | ||
| 165 | }; | ||
| 166 | |||
| 153 | static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw); | 167 | static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw); |
| 154 | static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw); | 168 | static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw); |
| 155 | static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw); | 169 | static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw); |
| @@ -366,6 +380,9 @@ static s32 e1000_get_variants_ich8lan(struct e1000_adapter *adapter) | |||
| 366 | return 0; | 380 | return 0; |
| 367 | } | 381 | } |
| 368 | 382 | ||
| 383 | static DEFINE_MUTEX(nvm_mutex); | ||
| 384 | static pid_t nvm_owner = -1; | ||
| 385 | |||
| 369 | /** | 386 | /** |
| 370 | * e1000_acquire_swflag_ich8lan - Acquire software control flag | 387 | * e1000_acquire_swflag_ich8lan - Acquire software control flag |
| 371 | * @hw: pointer to the HW structure | 388 | * @hw: pointer to the HW structure |
| @@ -379,6 +396,15 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
| 379 | u32 extcnf_ctrl; | 396 | u32 extcnf_ctrl; |
| 380 | u32 timeout = PHY_CFG_TIMEOUT; | 397 | u32 timeout = PHY_CFG_TIMEOUT; |
| 381 | 398 | ||
| 399 | might_sleep(); | ||
| 400 | |||
| 401 | if (!mutex_trylock(&nvm_mutex)) { | ||
| 402 | WARN(1, KERN_ERR "e1000e mutex contention. Owned by pid %d\n", | ||
| 403 | nvm_owner); | ||
| 404 | mutex_lock(&nvm_mutex); | ||
| 405 | } | ||
| 406 | nvm_owner = current->pid; | ||
| 407 | |||
| 382 | while (timeout) { | 408 | while (timeout) { |
| 383 | extcnf_ctrl = er32(EXTCNF_CTRL); | 409 | extcnf_ctrl = er32(EXTCNF_CTRL); |
| 384 | extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; | 410 | extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; |
| @@ -393,6 +419,8 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
| 393 | 419 | ||
| 394 | if (!timeout) { | 420 | if (!timeout) { |
| 395 | hw_dbg(hw, "FW or HW has locked the resource for too long.\n"); | 421 | hw_dbg(hw, "FW or HW has locked the resource for too long.\n"); |
| 422 | nvm_owner = -1; | ||
| 423 | mutex_unlock(&nvm_mutex); | ||
| 396 | return -E1000_ERR_CONFIG; | 424 | return -E1000_ERR_CONFIG; |
| 397 | } | 425 | } |
| 398 | 426 | ||
| @@ -414,6 +442,9 @@ static void e1000_release_swflag_ich8lan(struct e1000_hw *hw) | |||
| 414 | extcnf_ctrl = er32(EXTCNF_CTRL); | 442 | extcnf_ctrl = er32(EXTCNF_CTRL); |
| 415 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; | 443 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; |
| 416 | ew32(EXTCNF_CTRL, extcnf_ctrl); | 444 | ew32(EXTCNF_CTRL, extcnf_ctrl); |
| 445 | |||
| 446 | nvm_owner = -1; | ||
| 447 | mutex_unlock(&nvm_mutex); | ||
| 417 | } | 448 | } |
| 418 | 449 | ||
| 419 | /** | 450 | /** |
| @@ -1284,6 +1315,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
| 1284 | * programming failed. | 1315 | * programming failed. |
| 1285 | */ | 1316 | */ |
| 1286 | if (ret_val) { | 1317 | if (ret_val) { |
| 1318 | /* Possibly read-only, see e1000e_write_protect_nvm_ich8lan() */ | ||
| 1287 | hw_dbg(hw, "Flash commit failed.\n"); | 1319 | hw_dbg(hw, "Flash commit failed.\n"); |
| 1288 | e1000_release_swflag_ich8lan(hw); | 1320 | e1000_release_swflag_ich8lan(hw); |
| 1289 | return ret_val; | 1321 | return ret_val; |
| @@ -1374,6 +1406,49 @@ static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
| 1374 | } | 1406 | } |
| 1375 | 1407 | ||
| 1376 | /** | 1408 | /** |
| 1409 | * e1000e_write_protect_nvm_ich8lan - Make the NVM read-only | ||
| 1410 | * @hw: pointer to the HW structure | ||
| 1411 | * | ||
| 1412 | * To prevent malicious write/erase of the NVM, set it to be read-only | ||
| 1413 | * so that the hardware ignores all write/erase cycles of the NVM via | ||
| 1414 | * the flash control registers. The shadow-ram copy of the NVM will | ||
| 1415 | * still be updated, however any updates to this copy will not stick | ||
| 1416 | * across driver reloads. | ||
| 1417 | **/ | ||
| 1418 | void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw) | ||
| 1419 | { | ||
| 1420 | union ich8_flash_protected_range pr0; | ||
| 1421 | union ich8_hws_flash_status hsfsts; | ||
| 1422 | u32 gfpreg; | ||
| 1423 | s32 ret_val; | ||
| 1424 | |||
| 1425 | ret_val = e1000_acquire_swflag_ich8lan(hw); | ||
| 1426 | if (ret_val) | ||
| 1427 | return; | ||
| 1428 | |||
| 1429 | gfpreg = er32flash(ICH_FLASH_GFPREG); | ||
| 1430 | |||
| 1431 | /* Write-protect GbE Sector of NVM */ | ||
| 1432 | pr0.regval = er32flash(ICH_FLASH_PR0); | ||
| 1433 | pr0.range.base = gfpreg & FLASH_GFPREG_BASE_MASK; | ||
| 1434 | pr0.range.limit = ((gfpreg >> 16) & FLASH_GFPREG_BASE_MASK); | ||
| 1435 | pr0.range.wpe = true; | ||
| 1436 | ew32flash(ICH_FLASH_PR0, pr0.regval); | ||
| 1437 | |||
| 1438 | /* | ||
| 1439 | * Lock down a subset of GbE Flash Control Registers, e.g. | ||
| 1440 | * PR0 to prevent the write-protection from being lifted. | ||
| 1441 | * Once FLOCKDN is set, the registers protected by it cannot | ||
| 1442 | * be written until FLOCKDN is cleared by a hardware reset. | ||
| 1443 | */ | ||
| 1444 | hsfsts.regval = er16flash(ICH_FLASH_HSFSTS); | ||
| 1445 | hsfsts.hsf_status.flockdn = true; | ||
| 1446 | ew32flash(ICH_FLASH_HSFSTS, hsfsts.regval); | ||
| 1447 | |||
| 1448 | e1000_release_swflag_ich8lan(hw); | ||
| 1449 | } | ||
| 1450 | |||
| 1451 | /** | ||
| 1377 | * e1000_write_flash_data_ich8lan - Writes bytes to the NVM | 1452 | * e1000_write_flash_data_ich8lan - Writes bytes to the NVM |
| 1378 | * @hw: pointer to the HW structure | 1453 | * @hw: pointer to the HW structure |
| 1379 | * @offset: The offset (in bytes) of the byte/word to read. | 1454 | * @offset: The offset (in bytes) of the byte/word to read. |
| @@ -1720,6 +1795,9 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
| 1720 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); | 1795 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); |
| 1721 | msleep(20); | 1796 | msleep(20); |
| 1722 | 1797 | ||
| 1798 | /* release the swflag because it is not reset by hardware reset */ | ||
| 1799 | e1000_release_swflag_ich8lan(hw); | ||
| 1800 | |||
| 1723 | ret_val = e1000e_get_auto_rd_done(hw); | 1801 | ret_val = e1000e_get_auto_rd_done(hw); |
| 1724 | if (ret_val) { | 1802 | if (ret_val) { |
| 1725 | /* | 1803 | /* |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index d266510c8a94..b81c4237b5d3 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -47,7 +47,7 @@ | |||
| 47 | 47 | ||
| 48 | #include "e1000.h" | 48 | #include "e1000.h" |
| 49 | 49 | ||
| 50 | #define DRV_VERSION "0.3.3.3-k2" | 50 | #define DRV_VERSION "0.3.3.3-k6" |
| 51 | char e1000e_driver_name[] = "e1000e"; | 51 | char e1000e_driver_name[] = "e1000e"; |
| 52 | const char e1000e_driver_version[] = DRV_VERSION; | 52 | const char e1000e_driver_version[] = DRV_VERSION; |
| 53 | 53 | ||
| @@ -1115,6 +1115,14 @@ static void e1000_clean_rx_ring(struct e1000_adapter *adapter) | |||
| 1115 | writel(0, adapter->hw.hw_addr + rx_ring->tail); | 1115 | writel(0, adapter->hw.hw_addr + rx_ring->tail); |
| 1116 | } | 1116 | } |
| 1117 | 1117 | ||
| 1118 | static void e1000e_downshift_workaround(struct work_struct *work) | ||
| 1119 | { | ||
| 1120 | struct e1000_adapter *adapter = container_of(work, | ||
| 1121 | struct e1000_adapter, downshift_task); | ||
| 1122 | |||
| 1123 | e1000e_gig_downshift_workaround_ich8lan(&adapter->hw); | ||
| 1124 | } | ||
| 1125 | |||
| 1118 | /** | 1126 | /** |
| 1119 | * e1000_intr_msi - Interrupt Handler | 1127 | * e1000_intr_msi - Interrupt Handler |
| 1120 | * @irq: interrupt number | 1128 | * @irq: interrupt number |
| @@ -1139,7 +1147,7 @@ static irqreturn_t e1000_intr_msi(int irq, void *data) | |||
| 1139 | */ | 1147 | */ |
| 1140 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && | 1148 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && |
| 1141 | (!(er32(STATUS) & E1000_STATUS_LU))) | 1149 | (!(er32(STATUS) & E1000_STATUS_LU))) |
| 1142 | e1000e_gig_downshift_workaround_ich8lan(hw); | 1150 | schedule_work(&adapter->downshift_task); |
| 1143 | 1151 | ||
| 1144 | /* | 1152 | /* |
| 1145 | * 80003ES2LAN workaround-- For packet buffer work-around on | 1153 | * 80003ES2LAN workaround-- For packet buffer work-around on |
| @@ -1205,7 +1213,7 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
| 1205 | */ | 1213 | */ |
| 1206 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && | 1214 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && |
| 1207 | (!(er32(STATUS) & E1000_STATUS_LU))) | 1215 | (!(er32(STATUS) & E1000_STATUS_LU))) |
| 1208 | e1000e_gig_downshift_workaround_ich8lan(hw); | 1216 | schedule_work(&adapter->downshift_task); |
| 1209 | 1217 | ||
| 1210 | /* | 1218 | /* |
| 1211 | * 80003ES2LAN workaround-- | 1219 | * 80003ES2LAN workaround-- |
| @@ -2592,8 +2600,6 @@ static int __devinit e1000_sw_init(struct e1000_adapter *adapter) | |||
| 2592 | /* Explicitly disable IRQ since the NIC can be in any state. */ | 2600 | /* Explicitly disable IRQ since the NIC can be in any state. */ |
| 2593 | e1000_irq_disable(adapter); | 2601 | e1000_irq_disable(adapter); |
| 2594 | 2602 | ||
| 2595 | spin_lock_init(&adapter->stats_lock); | ||
| 2596 | |||
| 2597 | set_bit(__E1000_DOWN, &adapter->state); | 2603 | set_bit(__E1000_DOWN, &adapter->state); |
| 2598 | return 0; | 2604 | return 0; |
| 2599 | 2605 | ||
| @@ -2912,6 +2918,21 @@ static int e1000_set_mac(struct net_device *netdev, void *p) | |||
| 2912 | return 0; | 2918 | return 0; |
| 2913 | } | 2919 | } |
| 2914 | 2920 | ||
| 2921 | /** | ||
| 2922 | * e1000e_update_phy_task - work thread to update phy | ||
| 2923 | * @work: pointer to our work struct | ||
| 2924 | * | ||
| 2925 | * this worker thread exists because we must acquire a | ||
| 2926 | * semaphore to read the phy, which we could msleep while | ||
| 2927 | * waiting for it, and we can't msleep in a timer. | ||
| 2928 | **/ | ||
| 2929 | static void e1000e_update_phy_task(struct work_struct *work) | ||
| 2930 | { | ||
| 2931 | struct e1000_adapter *adapter = container_of(work, | ||
| 2932 | struct e1000_adapter, update_phy_task); | ||
| 2933 | e1000_get_phy_info(&adapter->hw); | ||
| 2934 | } | ||
| 2935 | |||
| 2915 | /* | 2936 | /* |
| 2916 | * Need to wait a few seconds after link up to get diagnostic information from | 2937 | * Need to wait a few seconds after link up to get diagnostic information from |
| 2917 | * the phy | 2938 | * the phy |
| @@ -2919,7 +2940,7 @@ static int e1000_set_mac(struct net_device *netdev, void *p) | |||
| 2919 | static void e1000_update_phy_info(unsigned long data) | 2940 | static void e1000_update_phy_info(unsigned long data) |
| 2920 | { | 2941 | { |
| 2921 | struct e1000_adapter *adapter = (struct e1000_adapter *) data; | 2942 | struct e1000_adapter *adapter = (struct e1000_adapter *) data; |
| 2922 | e1000_get_phy_info(&adapter->hw); | 2943 | schedule_work(&adapter->update_phy_task); |
| 2923 | } | 2944 | } |
| 2924 | 2945 | ||
| 2925 | /** | 2946 | /** |
| @@ -2930,10 +2951,6 @@ void e1000e_update_stats(struct e1000_adapter *adapter) | |||
| 2930 | { | 2951 | { |
| 2931 | struct e1000_hw *hw = &adapter->hw; | 2952 | struct e1000_hw *hw = &adapter->hw; |
| 2932 | struct pci_dev *pdev = adapter->pdev; | 2953 | struct pci_dev *pdev = adapter->pdev; |
| 2933 | unsigned long irq_flags; | ||
| 2934 | u16 phy_tmp; | ||
| 2935 | |||
| 2936 | #define PHY_IDLE_ERROR_COUNT_MASK 0x00FF | ||
| 2937 | 2954 | ||
| 2938 | /* | 2955 | /* |
| 2939 | * Prevent stats update while adapter is being reset, or if the pci | 2956 | * Prevent stats update while adapter is being reset, or if the pci |
| @@ -2944,14 +2961,6 @@ void e1000e_update_stats(struct e1000_adapter *adapter) | |||
| 2944 | if (pci_channel_offline(pdev)) | 2961 | if (pci_channel_offline(pdev)) |
| 2945 | return; | 2962 | return; |
| 2946 | 2963 | ||
| 2947 | spin_lock_irqsave(&adapter->stats_lock, irq_flags); | ||
| 2948 | |||
| 2949 | /* | ||
| 2950 | * these counters are modified from e1000_adjust_tbi_stats, | ||
| 2951 | * called from the interrupt context, so they must only | ||
| 2952 | * be written while holding adapter->stats_lock | ||
| 2953 | */ | ||
| 2954 | |||
| 2955 | adapter->stats.crcerrs += er32(CRCERRS); | 2964 | adapter->stats.crcerrs += er32(CRCERRS); |
| 2956 | adapter->stats.gprc += er32(GPRC); | 2965 | adapter->stats.gprc += er32(GPRC); |
| 2957 | adapter->stats.gorc += er32(GORCL); | 2966 | adapter->stats.gorc += er32(GORCL); |
| @@ -3022,21 +3031,10 @@ void e1000e_update_stats(struct e1000_adapter *adapter) | |||
| 3022 | 3031 | ||
| 3023 | /* Tx Dropped needs to be maintained elsewhere */ | 3032 | /* Tx Dropped needs to be maintained elsewhere */ |
| 3024 | 3033 | ||
| 3025 | /* Phy Stats */ | ||
| 3026 | if (hw->phy.media_type == e1000_media_type_copper) { | ||
| 3027 | if ((adapter->link_speed == SPEED_1000) && | ||
| 3028 | (!e1e_rphy(hw, PHY_1000T_STATUS, &phy_tmp))) { | ||
| 3029 | phy_tmp &= PHY_IDLE_ERROR_COUNT_MASK; | ||
| 3030 | adapter->phy_stats.idle_errors += phy_tmp; | ||
| 3031 | } | ||
| 3032 | } | ||
| 3033 | |||
| 3034 | /* Management Stats */ | 3034 | /* Management Stats */ |
| 3035 | adapter->stats.mgptc += er32(MGTPTC); | 3035 | adapter->stats.mgptc += er32(MGTPTC); |
| 3036 | adapter->stats.mgprc += er32(MGTPRC); | 3036 | adapter->stats.mgprc += er32(MGTPRC); |
| 3037 | adapter->stats.mgpdc += er32(MGTPDC); | 3037 | adapter->stats.mgpdc += er32(MGTPDC); |
| 3038 | |||
| 3039 | spin_unlock_irqrestore(&adapter->stats_lock, irq_flags); | ||
| 3040 | } | 3038 | } |
| 3041 | 3039 | ||
| 3042 | /** | 3040 | /** |
| @@ -3048,10 +3046,6 @@ static void e1000_phy_read_status(struct e1000_adapter *adapter) | |||
| 3048 | struct e1000_hw *hw = &adapter->hw; | 3046 | struct e1000_hw *hw = &adapter->hw; |
| 3049 | struct e1000_phy_regs *phy = &adapter->phy_regs; | 3047 | struct e1000_phy_regs *phy = &adapter->phy_regs; |
| 3050 | int ret_val; | 3048 | int ret_val; |
| 3051 | unsigned long irq_flags; | ||
| 3052 | |||
| 3053 | |||
| 3054 | spin_lock_irqsave(&adapter->stats_lock, irq_flags); | ||
| 3055 | 3049 | ||
| 3056 | if ((er32(STATUS) & E1000_STATUS_LU) && | 3050 | if ((er32(STATUS) & E1000_STATUS_LU) && |
| 3057 | (adapter->hw.phy.media_type == e1000_media_type_copper)) { | 3051 | (adapter->hw.phy.media_type == e1000_media_type_copper)) { |
| @@ -3082,8 +3076,6 @@ static void e1000_phy_read_status(struct e1000_adapter *adapter) | |||
| 3082 | phy->stat1000 = 0; | 3076 | phy->stat1000 = 0; |
| 3083 | phy->estatus = (ESTATUS_1000_TFULL | ESTATUS_1000_THALF); | 3077 | phy->estatus = (ESTATUS_1000_TFULL | ESTATUS_1000_THALF); |
| 3084 | } | 3078 | } |
| 3085 | |||
| 3086 | spin_unlock_irqrestore(&adapter->stats_lock, irq_flags); | ||
| 3087 | } | 3079 | } |
| 3088 | 3080 | ||
| 3089 | static void e1000_print_link_info(struct e1000_adapter *adapter) | 3081 | static void e1000_print_link_info(struct e1000_adapter *adapter) |
| @@ -4467,6 +4459,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 4467 | 4459 | ||
| 4468 | adapter->bd_number = cards_found++; | 4460 | adapter->bd_number = cards_found++; |
| 4469 | 4461 | ||
| 4462 | e1000e_check_options(adapter); | ||
| 4463 | |||
| 4470 | /* setup adapter struct */ | 4464 | /* setup adapter struct */ |
| 4471 | err = e1000_sw_init(adapter); | 4465 | err = e1000_sw_init(adapter); |
| 4472 | if (err) | 4466 | if (err) |
| @@ -4482,6 +4476,10 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 4482 | if (err) | 4476 | if (err) |
| 4483 | goto err_hw_init; | 4477 | goto err_hw_init; |
| 4484 | 4478 | ||
| 4479 | if ((adapter->flags & FLAG_IS_ICH) && | ||
| 4480 | (adapter->flags & FLAG_READ_ONLY_NVM)) | ||
| 4481 | e1000e_write_protect_nvm_ich8lan(&adapter->hw); | ||
| 4482 | |||
| 4485 | hw->mac.ops.get_bus_info(&adapter->hw); | 4483 | hw->mac.ops.get_bus_info(&adapter->hw); |
| 4486 | 4484 | ||
| 4487 | adapter->hw.phy.autoneg_wait_to_complete = 0; | 4485 | adapter->hw.phy.autoneg_wait_to_complete = 0; |
| @@ -4572,8 +4570,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 4572 | 4570 | ||
| 4573 | INIT_WORK(&adapter->reset_task, e1000_reset_task); | 4571 | INIT_WORK(&adapter->reset_task, e1000_reset_task); |
| 4574 | INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); | 4572 | INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); |
| 4575 | 4573 | INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround); | |
| 4576 | e1000e_check_options(adapter); | 4574 | INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task); |
| 4577 | 4575 | ||
| 4578 | /* Initialize link parameters. User can change them with ethtool */ | 4576 | /* Initialize link parameters. User can change them with ethtool */ |
| 4579 | adapter->hw.mac.autoneg = 1; | 4577 | adapter->hw.mac.autoneg = 1; |
diff --git a/drivers/net/e1000e/param.c b/drivers/net/e1000e/param.c index ed912e023a72..d91dbf7ba434 100644 --- a/drivers/net/e1000e/param.c +++ b/drivers/net/e1000e/param.c | |||
| @@ -133,6 +133,15 @@ E1000_PARAM(SmartPowerDownEnable, "Enable PHY smart power down"); | |||
| 133 | */ | 133 | */ |
| 134 | E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround"); | 134 | E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround"); |
| 135 | 135 | ||
| 136 | /* | ||
| 137 | * Write Protect NVM | ||
| 138 | * | ||
| 139 | * Valid Range: 0, 1 | ||
| 140 | * | ||
| 141 | * Default Value: 1 (enabled) | ||
| 142 | */ | ||
| 143 | E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]"); | ||
| 144 | |||
| 136 | struct e1000_option { | 145 | struct e1000_option { |
| 137 | enum { enable_option, range_option, list_option } type; | 146 | enum { enable_option, range_option, list_option } type; |
| 138 | const char *name; | 147 | const char *name; |
| @@ -388,4 +397,25 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter) | |||
| 388 | opt.def); | 397 | opt.def); |
| 389 | } | 398 | } |
| 390 | } | 399 | } |
| 400 | { /* Write-protect NVM */ | ||
| 401 | const struct e1000_option opt = { | ||
| 402 | .type = enable_option, | ||
| 403 | .name = "Write-protect NVM", | ||
| 404 | .err = "defaulting to Enabled", | ||
| 405 | .def = OPTION_ENABLED | ||
| 406 | }; | ||
| 407 | |||
| 408 | if (adapter->flags & FLAG_IS_ICH) { | ||
| 409 | if (num_WriteProtectNVM > bd) { | ||
| 410 | unsigned int write_protect_nvm = WriteProtectNVM[bd]; | ||
| 411 | e1000_validate_option(&write_protect_nvm, &opt, | ||
| 412 | adapter); | ||
| 413 | if (write_protect_nvm) | ||
| 414 | adapter->flags |= FLAG_READ_ONLY_NVM; | ||
| 415 | } else { | ||
| 416 | if (opt.def) | ||
| 417 | adapter->flags |= FLAG_READ_ONLY_NVM; | ||
| 418 | } | ||
| 419 | } | ||
| 420 | } | ||
| 391 | } | 421 | } |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 0b6ecef9a849..eeb55ed2152d 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
| @@ -5643,6 +5643,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
| 5643 | dev->dev_addr[4] = (np->orig_mac[0] >> 8) & 0xff; | 5643 | dev->dev_addr[4] = (np->orig_mac[0] >> 8) & 0xff; |
| 5644 | dev->dev_addr[5] = (np->orig_mac[0] >> 0) & 0xff; | 5644 | dev->dev_addr[5] = (np->orig_mac[0] >> 0) & 0xff; |
| 5645 | writel(txreg|NVREG_TRANSMITPOLL_MAC_ADDR_REV, base + NvRegTransmitPoll); | 5645 | writel(txreg|NVREG_TRANSMITPOLL_MAC_ADDR_REV, base + NvRegTransmitPoll); |
| 5646 | printk(KERN_DEBUG "nv_probe: set workaround bit for reversed mac addr\n"); | ||
| 5646 | } | 5647 | } |
| 5647 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | 5648 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); |
| 5648 | 5649 | ||
| @@ -5890,14 +5891,12 @@ static void nv_restore_phy(struct net_device *dev) | |||
| 5890 | } | 5891 | } |
| 5891 | } | 5892 | } |
| 5892 | 5893 | ||
| 5893 | static void __devexit nv_remove(struct pci_dev *pci_dev) | 5894 | static void nv_restore_mac_addr(struct pci_dev *pci_dev) |
| 5894 | { | 5895 | { |
| 5895 | struct net_device *dev = pci_get_drvdata(pci_dev); | 5896 | struct net_device *dev = pci_get_drvdata(pci_dev); |
| 5896 | struct fe_priv *np = netdev_priv(dev); | 5897 | struct fe_priv *np = netdev_priv(dev); |
| 5897 | u8 __iomem *base = get_hwbase(dev); | 5898 | u8 __iomem *base = get_hwbase(dev); |
| 5898 | 5899 | ||
| 5899 | unregister_netdev(dev); | ||
| 5900 | |||
| 5901 | /* special op: write back the misordered MAC address - otherwise | 5900 | /* special op: write back the misordered MAC address - otherwise |
| 5902 | * the next nv_probe would see a wrong address. | 5901 | * the next nv_probe would see a wrong address. |
| 5903 | */ | 5902 | */ |
| @@ -5905,6 +5904,15 @@ static void __devexit nv_remove(struct pci_dev *pci_dev) | |||
| 5905 | writel(np->orig_mac[1], base + NvRegMacAddrB); | 5904 | writel(np->orig_mac[1], base + NvRegMacAddrB); |
| 5906 | writel(readl(base + NvRegTransmitPoll) & ~NVREG_TRANSMITPOLL_MAC_ADDR_REV, | 5905 | writel(readl(base + NvRegTransmitPoll) & ~NVREG_TRANSMITPOLL_MAC_ADDR_REV, |
| 5907 | base + NvRegTransmitPoll); | 5906 | base + NvRegTransmitPoll); |
| 5907 | } | ||
| 5908 | |||
| 5909 | static void __devexit nv_remove(struct pci_dev *pci_dev) | ||
| 5910 | { | ||
| 5911 | struct net_device *dev = pci_get_drvdata(pci_dev); | ||
| 5912 | |||
| 5913 | unregister_netdev(dev); | ||
| 5914 | |||
| 5915 | nv_restore_mac_addr(pci_dev); | ||
| 5908 | 5916 | ||
| 5909 | /* restore any phy related changes */ | 5917 | /* restore any phy related changes */ |
| 5910 | nv_restore_phy(dev); | 5918 | nv_restore_phy(dev); |
| @@ -5975,6 +5983,8 @@ static void nv_shutdown(struct pci_dev *pdev) | |||
| 5975 | if (netif_running(dev)) | 5983 | if (netif_running(dev)) |
| 5976 | nv_close(dev); | 5984 | nv_close(dev); |
| 5977 | 5985 | ||
| 5986 | nv_restore_mac_addr(pdev); | ||
| 5987 | |||
| 5978 | pci_disable_device(pdev); | 5988 | pci_disable_device(pdev); |
| 5979 | if (system_state == SYSTEM_POWER_OFF) { | 5989 | if (system_state == SYSTEM_POWER_OFF) { |
| 5980 | if (pci_enable_wake(pdev, PCI_D3cold, np->wolenabled)) | 5990 | if (pci_enable_wake(pdev, PCI_D3cold, np->wolenabled)) |
diff --git a/drivers/net/hp-plus.c b/drivers/net/hp-plus.c index 8239939554bc..fbbd3e660c27 100644 --- a/drivers/net/hp-plus.c +++ b/drivers/net/hp-plus.c | |||
| @@ -139,7 +139,7 @@ static int __init do_hpp_probe(struct net_device *dev) | |||
| 139 | #ifndef MODULE | 139 | #ifndef MODULE |
| 140 | struct net_device * __init hp_plus_probe(int unit) | 140 | struct net_device * __init hp_plus_probe(int unit) |
| 141 | { | 141 | { |
| 142 | struct net_device *dev = alloc_ei_netdev(); | 142 | struct net_device *dev = alloc_eip_netdev(); |
| 143 | int err; | 143 | int err; |
| 144 | 144 | ||
| 145 | if (!dev) | 145 | if (!dev) |
| @@ -284,7 +284,7 @@ hpp_open(struct net_device *dev) | |||
| 284 | int option_reg; | 284 | int option_reg; |
| 285 | int retval; | 285 | int retval; |
| 286 | 286 | ||
| 287 | if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) { | 287 | if ((retval = request_irq(dev->irq, eip_interrupt, 0, dev->name, dev))) { |
| 288 | return retval; | 288 | return retval; |
| 289 | } | 289 | } |
| 290 | 290 | ||
| @@ -302,7 +302,7 @@ hpp_open(struct net_device *dev) | |||
| 302 | /* Select the operational page. */ | 302 | /* Select the operational page. */ |
| 303 | outw(Perf_Page, ioaddr + HP_PAGING); | 303 | outw(Perf_Page, ioaddr + HP_PAGING); |
| 304 | 304 | ||
| 305 | ei_open(dev); | 305 | eip_open(dev); |
| 306 | return 0; | 306 | return 0; |
| 307 | } | 307 | } |
| 308 | 308 | ||
| @@ -313,7 +313,7 @@ hpp_close(struct net_device *dev) | |||
| 313 | int option_reg = inw(ioaddr + HPP_OPTION); | 313 | int option_reg = inw(ioaddr + HPP_OPTION); |
| 314 | 314 | ||
| 315 | free_irq(dev->irq, dev); | 315 | free_irq(dev->irq, dev); |
| 316 | ei_close(dev); | 316 | eip_close(dev); |
| 317 | outw((option_reg & ~EnableIRQ) | MemDisable | NICReset | ChipReset, | 317 | outw((option_reg & ~EnableIRQ) | MemDisable | NICReset | ChipReset, |
| 318 | ioaddr + HPP_OPTION); | 318 | ioaddr + HPP_OPTION); |
| 319 | 319 | ||
diff --git a/drivers/net/mlx4/mr.c b/drivers/net/mlx4/mr.c index 62071d9c4a55..d1dd5b48dbd1 100644 --- a/drivers/net/mlx4/mr.c +++ b/drivers/net/mlx4/mr.c | |||
| @@ -67,11 +67,10 @@ struct mlx4_mpt_entry { | |||
| 67 | #define MLX4_MPT_FLAG_PHYSICAL (1 << 9) | 67 | #define MLX4_MPT_FLAG_PHYSICAL (1 << 9) |
| 68 | #define MLX4_MPT_FLAG_REGION (1 << 8) | 68 | #define MLX4_MPT_FLAG_REGION (1 << 8) |
| 69 | 69 | ||
| 70 | #define MLX4_MPT_PD_FLAG_FAST_REG (1 << 26) | 70 | #define MLX4_MPT_PD_FLAG_FAST_REG (1 << 27) |
| 71 | #define MLX4_MPT_PD_FLAG_RAE (1 << 28) | ||
| 71 | #define MLX4_MPT_PD_FLAG_EN_INV (3 << 24) | 72 | #define MLX4_MPT_PD_FLAG_EN_INV (3 << 24) |
| 72 | 73 | ||
| 73 | #define MLX4_MTT_FLAG_PRESENT 1 | ||
| 74 | |||
| 75 | #define MLX4_MPT_STATUS_SW 0xF0 | 74 | #define MLX4_MPT_STATUS_SW 0xF0 |
| 76 | #define MLX4_MPT_STATUS_HW 0x00 | 75 | #define MLX4_MPT_STATUS_HW 0x00 |
| 77 | 76 | ||
| @@ -348,7 +347,10 @@ int mlx4_mr_enable(struct mlx4_dev *dev, struct mlx4_mr *mr) | |||
| 348 | if (mr->mtt.order >= 0 && mr->mtt.page_shift == 0) { | 347 | if (mr->mtt.order >= 0 && mr->mtt.page_shift == 0) { |
| 349 | /* fast register MR in free state */ | 348 | /* fast register MR in free state */ |
| 350 | mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_FREE); | 349 | mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_FREE); |
| 351 | mpt_entry->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG); | 350 | mpt_entry->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG | |
| 351 | MLX4_MPT_PD_FLAG_RAE); | ||
| 352 | mpt_entry->mtt_sz = cpu_to_be32((1 << mr->mtt.order) * | ||
| 353 | MLX4_MTT_ENTRY_PER_SEG); | ||
| 352 | } else { | 354 | } else { |
| 353 | mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_SW_OWNS); | 355 | mpt_entry->flags |= cpu_to_be32(MLX4_MPT_FLAG_SW_OWNS); |
| 354 | } | 356 | } |
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index e4765b713aba..e3be81eba8a4 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
| @@ -5984,6 +5984,56 @@ static void niu_netif_start(struct niu *np) | |||
| 5984 | niu_enable_interrupts(np, 1); | 5984 | niu_enable_interrupts(np, 1); |
| 5985 | } | 5985 | } |
| 5986 | 5986 | ||
| 5987 | static void niu_reset_buffers(struct niu *np) | ||
| 5988 | { | ||
| 5989 | int i, j, k, err; | ||
| 5990 | |||
| 5991 | if (np->rx_rings) { | ||
| 5992 | for (i = 0; i < np->num_rx_rings; i++) { | ||
| 5993 | struct rx_ring_info *rp = &np->rx_rings[i]; | ||
| 5994 | |||
| 5995 | for (j = 0, k = 0; j < MAX_RBR_RING_SIZE; j++) { | ||
| 5996 | struct page *page; | ||
| 5997 | |||
| 5998 | page = rp->rxhash[j]; | ||
| 5999 | while (page) { | ||
| 6000 | struct page *next = | ||
| 6001 | (struct page *) page->mapping; | ||
| 6002 | u64 base = page->index; | ||
| 6003 | base = base >> RBR_DESCR_ADDR_SHIFT; | ||
| 6004 | rp->rbr[k++] = cpu_to_le32(base); | ||
| 6005 | page = next; | ||
| 6006 | } | ||
| 6007 | } | ||
| 6008 | for (; k < MAX_RBR_RING_SIZE; k++) { | ||
| 6009 | err = niu_rbr_add_page(np, rp, GFP_ATOMIC, k); | ||
| 6010 | if (unlikely(err)) | ||
| 6011 | break; | ||
| 6012 | } | ||
| 6013 | |||
| 6014 | rp->rbr_index = rp->rbr_table_size - 1; | ||
| 6015 | rp->rcr_index = 0; | ||
| 6016 | rp->rbr_pending = 0; | ||
| 6017 | rp->rbr_refill_pending = 0; | ||
| 6018 | } | ||
| 6019 | } | ||
| 6020 | if (np->tx_rings) { | ||
| 6021 | for (i = 0; i < np->num_tx_rings; i++) { | ||
| 6022 | struct tx_ring_info *rp = &np->tx_rings[i]; | ||
| 6023 | |||
| 6024 | for (j = 0; j < MAX_TX_RING_SIZE; j++) { | ||
| 6025 | if (rp->tx_buffs[j].skb) | ||
| 6026 | (void) release_tx_packet(np, rp, j); | ||
| 6027 | } | ||
| 6028 | |||
| 6029 | rp->pending = MAX_TX_RING_SIZE; | ||
| 6030 | rp->prod = 0; | ||
| 6031 | rp->cons = 0; | ||
| 6032 | rp->wrap_bit = 0; | ||
| 6033 | } | ||
| 6034 | } | ||
| 6035 | } | ||
| 6036 | |||
| 5987 | static void niu_reset_task(struct work_struct *work) | 6037 | static void niu_reset_task(struct work_struct *work) |
| 5988 | { | 6038 | { |
| 5989 | struct niu *np = container_of(work, struct niu, reset_task); | 6039 | struct niu *np = container_of(work, struct niu, reset_task); |
| @@ -6006,6 +6056,12 @@ static void niu_reset_task(struct work_struct *work) | |||
| 6006 | 6056 | ||
| 6007 | niu_stop_hw(np); | 6057 | niu_stop_hw(np); |
| 6008 | 6058 | ||
| 6059 | spin_unlock_irqrestore(&np->lock, flags); | ||
| 6060 | |||
| 6061 | niu_reset_buffers(np); | ||
| 6062 | |||
| 6063 | spin_lock_irqsave(&np->lock, flags); | ||
| 6064 | |||
| 6009 | err = niu_init_hw(np); | 6065 | err = niu_init_hw(np); |
| 6010 | if (!err) { | 6066 | if (!err) { |
| 6011 | np->timer.expires = jiffies + HZ; | 6067 | np->timer.expires = jiffies + HZ; |
diff --git a/drivers/net/wireless/ath9k/beacon.c b/drivers/net/wireless/ath9k/beacon.c index caf569401a34..00a0eaa08866 100644 --- a/drivers/net/wireless/ath9k/beacon.c +++ b/drivers/net/wireless/ath9k/beacon.c | |||
| @@ -209,6 +209,7 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id) | |||
| 209 | unsigned int curlen; | 209 | unsigned int curlen; |
| 210 | struct ath_txq *cabq; | 210 | struct ath_txq *cabq; |
| 211 | struct ath_txq *mcastq; | 211 | struct ath_txq *mcastq; |
| 212 | struct ieee80211_tx_info *info; | ||
| 212 | avp = sc->sc_vaps[if_id]; | 213 | avp = sc->sc_vaps[if_id]; |
| 213 | 214 | ||
| 214 | mcastq = &avp->av_mcastq; | 215 | mcastq = &avp->av_mcastq; |
| @@ -232,6 +233,18 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id) | |||
| 232 | */ | 233 | */ |
| 233 | curlen = skb->len; | 234 | curlen = skb->len; |
| 234 | 235 | ||
| 236 | info = IEEE80211_SKB_CB(skb); | ||
| 237 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { | ||
| 238 | /* | ||
| 239 | * TODO: make sure the seq# gets assigned properly (vs. other | ||
| 240 | * TX frames) | ||
| 241 | */ | ||
| 242 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
| 243 | sc->seq_no += 0x10; | ||
| 244 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | ||
| 245 | hdr->seq_ctrl |= cpu_to_le16(sc->seq_no); | ||
| 246 | } | ||
| 247 | |||
| 235 | /* XXX: spin_lock_bh should not be used here, but sparse bitches | 248 | /* XXX: spin_lock_bh should not be used here, but sparse bitches |
| 236 | * otherwise. We should fix sparse :) */ | 249 | * otherwise. We should fix sparse :) */ |
| 237 | spin_lock_bh(&mcastq->axq_lock); | 250 | spin_lock_bh(&mcastq->axq_lock); |
diff --git a/drivers/net/wireless/ath9k/core.c b/drivers/net/wireless/ath9k/core.c index f6c45288d0e7..87e37bc39145 100644 --- a/drivers/net/wireless/ath9k/core.c +++ b/drivers/net/wireless/ath9k/core.c | |||
| @@ -294,8 +294,6 @@ static int ath_stop(struct ath_softc *sc) | |||
| 294 | * hardware is gone (invalid). | 294 | * hardware is gone (invalid). |
| 295 | */ | 295 | */ |
| 296 | 296 | ||
| 297 | if (!sc->sc_invalid) | ||
| 298 | ath9k_hw_set_interrupts(ah, 0); | ||
| 299 | ath_draintxq(sc, false); | 297 | ath_draintxq(sc, false); |
| 300 | if (!sc->sc_invalid) { | 298 | if (!sc->sc_invalid) { |
| 301 | ath_stoprecv(sc); | 299 | ath_stoprecv(sc); |
| @@ -797,6 +795,12 @@ int ath_open(struct ath_softc *sc, struct ath9k_channel *initial_chan) | |||
| 797 | if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) | 795 | if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) |
| 798 | sc->sc_imask |= ATH9K_INT_CST; | 796 | sc->sc_imask |= ATH9K_INT_CST; |
| 799 | 797 | ||
| 798 | /* Note: We disable MIB interrupts for now as we don't yet | ||
| 799 | * handle processing ANI, otherwise you will get an interrupt | ||
| 800 | * storm after about 7 hours of usage making the system unusable | ||
| 801 | * with huge latency. Once we do have ANI processing included | ||
| 802 | * we can re-enable this interrupt. */ | ||
| 803 | #if 0 | ||
| 800 | /* | 804 | /* |
| 801 | * Enable MIB interrupts when there are hardware phy counters. | 805 | * Enable MIB interrupts when there are hardware phy counters. |
| 802 | * Note we only do this (at the moment) for station mode. | 806 | * Note we only do this (at the moment) for station mode. |
| @@ -804,6 +808,7 @@ int ath_open(struct ath_softc *sc, struct ath9k_channel *initial_chan) | |||
| 804 | if (ath9k_hw_phycounters(ah) && | 808 | if (ath9k_hw_phycounters(ah) && |
| 805 | ((sc->sc_opmode == ATH9K_M_STA) || (sc->sc_opmode == ATH9K_M_IBSS))) | 809 | ((sc->sc_opmode == ATH9K_M_STA) || (sc->sc_opmode == ATH9K_M_IBSS))) |
| 806 | sc->sc_imask |= ATH9K_INT_MIB; | 810 | sc->sc_imask |= ATH9K_INT_MIB; |
| 811 | #endif | ||
| 807 | /* | 812 | /* |
| 808 | * Some hardware processes the TIM IE and fires an | 813 | * Some hardware processes the TIM IE and fires an |
| 809 | * interrupt when the TIM bit is set. For hardware | 814 | * interrupt when the TIM bit is set. For hardware |
| @@ -1336,6 +1341,8 @@ void ath_deinit(struct ath_softc *sc) | |||
| 1336 | 1341 | ||
| 1337 | DPRINTF(sc, ATH_DBG_CONFIG, "%s\n", __func__); | 1342 | DPRINTF(sc, ATH_DBG_CONFIG, "%s\n", __func__); |
| 1338 | 1343 | ||
| 1344 | tasklet_kill(&sc->intr_tq); | ||
| 1345 | tasklet_kill(&sc->bcon_tasklet); | ||
| 1339 | ath_stop(sc); | 1346 | ath_stop(sc); |
| 1340 | if (!sc->sc_invalid) | 1347 | if (!sc->sc_invalid) |
| 1341 | ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE); | 1348 | ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE); |
diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h index 673b3d81133a..2f84093331ee 100644 --- a/drivers/net/wireless/ath9k/core.h +++ b/drivers/net/wireless/ath9k/core.h | |||
| @@ -974,7 +974,6 @@ struct ath_softc { | |||
| 974 | u32 sc_keymax; /* size of key cache */ | 974 | u32 sc_keymax; /* size of key cache */ |
| 975 | DECLARE_BITMAP(sc_keymap, ATH_KEYMAX); /* key use bit map */ | 975 | DECLARE_BITMAP(sc_keymap, ATH_KEYMAX); /* key use bit map */ |
| 976 | u8 sc_splitmic; /* split TKIP MIC keys */ | 976 | u8 sc_splitmic; /* split TKIP MIC keys */ |
| 977 | int sc_keytype; | ||
| 978 | 977 | ||
| 979 | /* RX */ | 978 | /* RX */ |
| 980 | struct list_head sc_rxbuf; | 979 | struct list_head sc_rxbuf; |
| @@ -992,6 +991,7 @@ struct ath_softc { | |||
| 992 | u32 sc_txintrperiod; /* tx interrupt batching */ | 991 | u32 sc_txintrperiod; /* tx interrupt batching */ |
| 993 | int sc_haltype2q[ATH9K_WME_AC_VO+1]; /* HAL WME AC -> h/w qnum */ | 992 | int sc_haltype2q[ATH9K_WME_AC_VO+1]; /* HAL WME AC -> h/w qnum */ |
| 994 | u32 sc_ant_tx[8]; /* recent tx frames/antenna */ | 993 | u32 sc_ant_tx[8]; /* recent tx frames/antenna */ |
| 994 | u16 seq_no; /* TX sequence number */ | ||
| 995 | 995 | ||
| 996 | /* Beacon */ | 996 | /* Beacon */ |
| 997 | struct ath9k_tx_queue_info sc_beacon_qi; | 997 | struct ath9k_tx_queue_info sc_beacon_qi; |
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c index c5107f269f24..acebdf1d20a8 100644 --- a/drivers/net/wireless/ath9k/main.c +++ b/drivers/net/wireless/ath9k/main.c | |||
| @@ -206,8 +206,6 @@ static int ath_key_config(struct ath_softc *sc, | |||
| 206 | if (!ret) | 206 | if (!ret) |
| 207 | return -EIO; | 207 | return -EIO; |
| 208 | 208 | ||
| 209 | if (mac) | ||
| 210 | sc->sc_keytype = hk.kv_type; | ||
| 211 | return 0; | 209 | return 0; |
| 212 | } | 210 | } |
| 213 | 211 | ||
| @@ -369,6 +367,20 @@ static int ath9k_tx(struct ieee80211_hw *hw, | |||
| 369 | { | 367 | { |
| 370 | struct ath_softc *sc = hw->priv; | 368 | struct ath_softc *sc = hw->priv; |
| 371 | int hdrlen, padsize; | 369 | int hdrlen, padsize; |
| 370 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
| 371 | |||
| 372 | /* | ||
| 373 | * As a temporary workaround, assign seq# here; this will likely need | ||
| 374 | * to be cleaned up to work better with Beacon transmission and virtual | ||
| 375 | * BSSes. | ||
| 376 | */ | ||
| 377 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { | ||
| 378 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
| 379 | if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) | ||
| 380 | sc->seq_no += 0x10; | ||
| 381 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | ||
| 382 | hdr->seq_ctrl |= cpu_to_le16(sc->seq_no); | ||
| 383 | } | ||
| 372 | 384 | ||
| 373 | /* Add the padding after the header if this is not already done */ | 385 | /* Add the padding after the header if this is not already done */ |
| 374 | hdrlen = ieee80211_get_hdrlen_from_skb(skb); | 386 | hdrlen = ieee80211_get_hdrlen_from_skb(skb); |
| @@ -764,7 +776,6 @@ static int ath9k_set_key(struct ieee80211_hw *hw, | |||
| 764 | case DISABLE_KEY: | 776 | case DISABLE_KEY: |
| 765 | ath_key_delete(sc, key); | 777 | ath_key_delete(sc, key); |
| 766 | clear_bit(key->keyidx, sc->sc_keymap); | 778 | clear_bit(key->keyidx, sc->sc_keymap); |
| 767 | sc->sc_keytype = ATH9K_CIPHER_CLR; | ||
| 768 | break; | 779 | break; |
| 769 | default: | 780 | default: |
| 770 | ret = -EINVAL; | 781 | ret = -EINVAL; |
| @@ -1400,10 +1411,17 @@ static void ath_pci_remove(struct pci_dev *pdev) | |||
| 1400 | { | 1411 | { |
| 1401 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); | 1412 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); |
| 1402 | struct ath_softc *sc = hw->priv; | 1413 | struct ath_softc *sc = hw->priv; |
| 1414 | enum ath9k_int status; | ||
| 1403 | 1415 | ||
| 1404 | if (pdev->irq) | 1416 | if (pdev->irq) { |
| 1417 | ath9k_hw_set_interrupts(sc->sc_ah, 0); | ||
| 1418 | /* clear the ISR */ | ||
| 1419 | ath9k_hw_getisr(sc->sc_ah, &status); | ||
| 1420 | sc->sc_invalid = 1; | ||
| 1405 | free_irq(pdev->irq, sc); | 1421 | free_irq(pdev->irq, sc); |
| 1422 | } | ||
| 1406 | ath_detach(sc); | 1423 | ath_detach(sc); |
| 1424 | |||
| 1407 | pci_iounmap(pdev, sc->mem); | 1425 | pci_iounmap(pdev, sc->mem); |
| 1408 | pci_release_region(pdev, 0); | 1426 | pci_release_region(pdev, 0); |
| 1409 | pci_disable_device(pdev); | 1427 | pci_disable_device(pdev); |
diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c index 550129f717e2..8b332e11a656 100644 --- a/drivers/net/wireless/ath9k/xmit.c +++ b/drivers/net/wireless/ath9k/xmit.c | |||
| @@ -315,11 +315,11 @@ static int ath_tx_prepare(struct ath_softc *sc, | |||
| 315 | txctl->keyix = tx_info->control.hw_key->hw_key_idx; | 315 | txctl->keyix = tx_info->control.hw_key->hw_key_idx; |
| 316 | txctl->frmlen += tx_info->control.icv_len; | 316 | txctl->frmlen += tx_info->control.icv_len; |
| 317 | 317 | ||
| 318 | if (sc->sc_keytype == ATH9K_CIPHER_WEP) | 318 | if (tx_info->control.hw_key->alg == ALG_WEP) |
| 319 | txctl->keytype = ATH9K_KEY_TYPE_WEP; | 319 | txctl->keytype = ATH9K_KEY_TYPE_WEP; |
| 320 | else if (sc->sc_keytype == ATH9K_CIPHER_TKIP) | 320 | else if (tx_info->control.hw_key->alg == ALG_TKIP) |
| 321 | txctl->keytype = ATH9K_KEY_TYPE_TKIP; | 321 | txctl->keytype = ATH9K_KEY_TYPE_TKIP; |
| 322 | else if (sc->sc_keytype == ATH9K_CIPHER_AES_CCM) | 322 | else if (tx_info->control.hw_key->alg == ALG_CCMP) |
| 323 | txctl->keytype = ATH9K_KEY_TYPE_AES; | 323 | txctl->keytype = ATH9K_KEY_TYPE_AES; |
| 324 | } | 324 | } |
| 325 | 325 | ||
diff --git a/drivers/net/wireless/b43/rfkill.c b/drivers/net/wireless/b43/rfkill.c index fec5645944a4..34ae125d5384 100644 --- a/drivers/net/wireless/b43/rfkill.c +++ b/drivers/net/wireless/b43/rfkill.c | |||
| @@ -43,23 +43,6 @@ static bool b43_is_hw_radio_enabled(struct b43_wldev *dev) | |||
| 43 | return 0; | 43 | return 0; |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | /* Update the rfkill state */ | ||
| 47 | static void b43_rfkill_update_state(struct b43_wldev *dev) | ||
| 48 | { | ||
| 49 | struct b43_rfkill *rfk = &(dev->wl->rfkill); | ||
| 50 | |||
| 51 | if (!dev->radio_hw_enable) { | ||
| 52 | rfk->rfkill->state = RFKILL_STATE_HARD_BLOCKED; | ||
| 53 | return; | ||
| 54 | } | ||
| 55 | |||
| 56 | if (!dev->phy.radio_on) | ||
| 57 | rfk->rfkill->state = RFKILL_STATE_SOFT_BLOCKED; | ||
| 58 | else | ||
| 59 | rfk->rfkill->state = RFKILL_STATE_UNBLOCKED; | ||
| 60 | |||
| 61 | } | ||
| 62 | |||
| 63 | /* The poll callback for the hardware button. */ | 46 | /* The poll callback for the hardware button. */ |
| 64 | static void b43_rfkill_poll(struct input_polled_dev *poll_dev) | 47 | static void b43_rfkill_poll(struct input_polled_dev *poll_dev) |
| 65 | { | 48 | { |
| @@ -77,7 +60,6 @@ static void b43_rfkill_poll(struct input_polled_dev *poll_dev) | |||
| 77 | if (unlikely(enabled != dev->radio_hw_enable)) { | 60 | if (unlikely(enabled != dev->radio_hw_enable)) { |
| 78 | dev->radio_hw_enable = enabled; | 61 | dev->radio_hw_enable = enabled; |
| 79 | report_change = 1; | 62 | report_change = 1; |
| 80 | b43_rfkill_update_state(dev); | ||
| 81 | b43info(wl, "Radio hardware status changed to %s\n", | 63 | b43info(wl, "Radio hardware status changed to %s\n", |
| 82 | enabled ? "ENABLED" : "DISABLED"); | 64 | enabled ? "ENABLED" : "DISABLED"); |
| 83 | } | 65 | } |
diff --git a/drivers/net/wireless/b43legacy/rfkill.c b/drivers/net/wireless/b43legacy/rfkill.c index 476add97e974..b32bf6a94f19 100644 --- a/drivers/net/wireless/b43legacy/rfkill.c +++ b/drivers/net/wireless/b43legacy/rfkill.c | |||
| @@ -44,23 +44,6 @@ static bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev) | |||
| 44 | return 0; | 44 | return 0; |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | /* Update the rfkill state */ | ||
| 48 | static void b43legacy_rfkill_update_state(struct b43legacy_wldev *dev) | ||
| 49 | { | ||
| 50 | struct b43legacy_rfkill *rfk = &(dev->wl->rfkill); | ||
| 51 | |||
| 52 | if (!dev->radio_hw_enable) { | ||
| 53 | rfk->rfkill->state = RFKILL_STATE_HARD_BLOCKED; | ||
| 54 | return; | ||
| 55 | } | ||
| 56 | |||
| 57 | if (!dev->phy.radio_on) | ||
| 58 | rfk->rfkill->state = RFKILL_STATE_SOFT_BLOCKED; | ||
| 59 | else | ||
| 60 | rfk->rfkill->state = RFKILL_STATE_UNBLOCKED; | ||
| 61 | |||
| 62 | } | ||
| 63 | |||
| 64 | /* The poll callback for the hardware button. */ | 47 | /* The poll callback for the hardware button. */ |
| 65 | static void b43legacy_rfkill_poll(struct input_polled_dev *poll_dev) | 48 | static void b43legacy_rfkill_poll(struct input_polled_dev *poll_dev) |
| 66 | { | 49 | { |
| @@ -78,7 +61,6 @@ static void b43legacy_rfkill_poll(struct input_polled_dev *poll_dev) | |||
| 78 | if (unlikely(enabled != dev->radio_hw_enable)) { | 61 | if (unlikely(enabled != dev->radio_hw_enable)) { |
| 79 | dev->radio_hw_enable = enabled; | 62 | dev->radio_hw_enable = enabled; |
| 80 | report_change = 1; | 63 | report_change = 1; |
| 81 | b43legacy_rfkill_update_state(dev); | ||
| 82 | b43legacyinfo(wl, "Radio hardware status changed to %s\n", | 64 | b43legacyinfo(wl, "Radio hardware status changed to %s\n", |
| 83 | enabled ? "ENABLED" : "DISABLED"); | 65 | enabled ? "ENABLED" : "DISABLED"); |
| 84 | } | 66 | } |
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c index da8b7433e3a6..a60ae86bd5c9 100644 --- a/drivers/net/wireless/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | |||
| @@ -58,6 +58,7 @@ static struct usb_device_id usb_ids[] = { | |||
| 58 | { USB_DEVICE(0x0586, 0x3407), .driver_info = DEVICE_ZD1211 }, | 58 | { USB_DEVICE(0x0586, 0x3407), .driver_info = DEVICE_ZD1211 }, |
| 59 | { USB_DEVICE(0x129b, 0x1666), .driver_info = DEVICE_ZD1211 }, | 59 | { USB_DEVICE(0x129b, 0x1666), .driver_info = DEVICE_ZD1211 }, |
| 60 | { USB_DEVICE(0x157e, 0x300a), .driver_info = DEVICE_ZD1211 }, | 60 | { USB_DEVICE(0x157e, 0x300a), .driver_info = DEVICE_ZD1211 }, |
| 61 | { USB_DEVICE(0x0105, 0x145f), .driver_info = DEVICE_ZD1211 }, | ||
| 61 | /* ZD1211B */ | 62 | /* ZD1211B */ |
| 62 | { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B }, | 63 | { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B }, |
| 63 | { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B }, | 64 | { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B }, |
