diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index dcce354..359ca25 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c @@ -2279,6 +2279,8 @@ static int ipw_send_adapter_address(struct ipw_priv *priv, u8 * mac) static void ipw_adapter_restart(void *adapter) { struct ipw_priv *priv = adapter; + struct pci_dev *pdev = priv->pci_dev; + int val; if (priv->status & STATUS_RF_KILL_MASK) return; @@ -2289,6 +2291,18 @@ static void ipw_adapter_restart(void *adapter) (priv->assoc_network->capability & WLAN_CAPABILITY_IBSS)) ipw_remove_current_network(priv); + /* Fucking PoS */ + + pci_save_state(pdev); + pci_disable_device(pdev); + pci_set_power_state(pdev, PCI_D3hot); + pci_set_power_state(pdev, PCI_D0); + pci_enable_device(pdev); + pci_restore_state(pdev); + pci_read_config_dword(pdev, 0x40, &val); + if ((val & 0x0000ff00) != 0) + pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); + if (ipw_up(priv)) { IPW_ERROR("Failed to up device\n"); return;