Merge branch 'upstream-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

+29 -105
+21 -16
drivers/net/8139cp.c
··· 1118 1118 return -ENOMEM; 1119 1119 } 1120 1120 1121 + static void cp_init_rings_index (struct cp_private *cp) 1122 + { 1123 + cp->rx_tail = 0; 1124 + cp->tx_head = cp->tx_tail = 0; 1125 + } 1126 + 1121 1127 static int cp_init_rings (struct cp_private *cp) 1122 1128 { 1123 1129 memset(cp->tx_ring, 0, sizeof(struct cp_desc) * CP_TX_RING_SIZE); 1124 1130 cp->tx_ring[CP_TX_RING_SIZE - 1].opts1 = cpu_to_le32(RingEnd); 1125 1131 1126 - cp->rx_tail = 0; 1127 - cp->tx_head = cp->tx_tail = 0; 1132 + cp_init_rings_index(cp); 1128 1133 1129 1134 return cp_refill_rx (cp); 1130 1135 } ··· 1891 1886 1892 1887 spin_unlock_irqrestore (&cp->lock, flags); 1893 1888 1894 - if (cp->pdev && cp->wol_enabled) { 1895 - pci_save_state (cp->pdev); 1896 - cp_set_d3_state (cp); 1897 - } 1889 + pci_save_state(pdev); 1890 + pci_enable_wake(pdev, pci_choose_state(pdev, state), cp->wol_enabled); 1891 + pci_set_power_state(pdev, pci_choose_state(pdev, state)); 1898 1892 1899 1893 return 0; 1900 1894 } 1901 1895 1902 1896 static int cp_resume (struct pci_dev *pdev) 1903 1897 { 1904 - struct net_device *dev; 1905 - struct cp_private *cp; 1898 + struct net_device *dev = pci_get_drvdata (pdev); 1899 + struct cp_private *cp = netdev_priv(dev); 1906 1900 unsigned long flags; 1907 1901 1908 - dev = pci_get_drvdata (pdev); 1909 - cp = netdev_priv(dev); 1902 + if (!netif_running(dev)) 1903 + return 0; 1910 1904 1911 1905 netif_device_attach (dev); 1912 - 1913 - if (cp->pdev && cp->wol_enabled) { 1914 - pci_set_power_state (cp->pdev, PCI_D0); 1915 - pci_restore_state (cp->pdev); 1916 - } 1917 - 1906 + 1907 + pci_set_power_state(pdev, PCI_D0); 1908 + pci_restore_state(pdev); 1909 + pci_enable_wake(pdev, PCI_D0, 0); 1910 + 1911 + /* FIXME: sh*t may happen if the Rx ring buffer is depleted */ 1912 + cp_init_rings_index (cp); 1918 1913 cp_init_hw (cp); 1919 1914 netif_start_queue (dev); 1920 1915
-77
drivers/net/sky2.c
··· 96 96 module_param(copybreak, int, 0); 97 97 MODULE_PARM_DESC(copybreak, "Receive copy threshold"); 98 98 99 - static int disable_msi = 0; 100 - module_param(disable_msi, int, 0); 101 - MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)"); 102 - 103 99 static const struct pci_device_id sky2_id_table[] = { 104 100 { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) }, 105 101 { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) }, ··· 3122 3126 dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]); 3123 3127 } 3124 3128 3125 - /* Handle software interrupt used during MSI test */ 3126 - static irqreturn_t __devinit sky2_test_intr(int irq, void *dev_id, 3127 - struct pt_regs *regs) 3128 - { 3129 - struct sky2_hw *hw = dev_id; 3130 - u32 status = sky2_read32(hw, B0_Y2_SP_ISRC2); 3131 - 3132 - if (status == 0) 3133 - return IRQ_NONE; 3134 - 3135 - if (status & Y2_IS_IRQ_SW) { 3136 - sky2_write8(hw, B0_CTST, CS_CL_SW_IRQ); 3137 - hw->msi = 1; 3138 - } 3139 - sky2_write32(hw, B0_Y2_SP_ICR, 2); 3140 - 3141 - sky2_read32(hw, B0_IMSK); 3142 - return IRQ_HANDLED; 3143 - } 3144 - 3145 - /* Test interrupt path by forcing a a software IRQ */ 3146 - static int __devinit sky2_test_msi(struct sky2_hw *hw) 3147 - { 3148 - struct pci_dev *pdev = hw->pdev; 3149 - int i, err; 3150 - 3151 - sky2_write32(hw, B0_IMSK, Y2_IS_IRQ_SW); 3152 - 3153 - err = request_irq(pdev->irq, sky2_test_intr, SA_SHIRQ, DRV_NAME, hw); 3154 - if (err) { 3155 - printk(KERN_ERR PFX "%s: cannot assign irq %d\n", 3156 - pci_name(pdev), pdev->irq); 3157 - return err; 3158 - } 3159 - 3160 - sky2_write8(hw, B0_CTST, CS_ST_SW_IRQ); 3161 - wmb(); 3162 - 3163 - for (i = 0; i < 10; i++) { 3164 - barrier(); 3165 - if (hw->msi) 3166 - goto found; 3167 - mdelay(1); 3168 - } 3169 - 3170 - err = -EOPNOTSUPP; 3171 - sky2_write8(hw, B0_CTST, CS_CL_SW_IRQ); 3172 - found: 3173 - sky2_write32(hw, B0_IMSK, 0); 3174 - 3175 - free_irq(pdev->irq, hw); 3176 - 3177 - return err; 3178 - } 3179 - 3180 3129 static int __devinit sky2_probe(struct pci_dev *pdev, 3181 3130 const struct pci_device_id *ent) 3182 3131 { ··· 3243 3302 } 3244 3303 } 3245 3304 3246 - if (!disable_msi && pci_enable_msi(pdev) == 0) { 3247 - err = sky2_test_msi(hw); 3248 - if (err == -EOPNOTSUPP) { 3249 - /* MSI test failed, go back to INTx mode */ 3250 - printk(KERN_WARNING PFX "%s: No interrupt was generated using MSI, " 3251 - "switching to INTx mode. Please report this failure to " 3252 - "the PCI maintainer and include system chipset information.\n", 3253 - pci_name(pdev)); 3254 - pci_disable_msi(pdev); 3255 - } 3256 - else if (err) 3257 - goto err_out_unregister; 3258 - } 3259 - 3260 3305 err = request_irq(pdev->irq, sky2_intr, SA_SHIRQ | SA_SAMPLE_RANDOM, 3261 3306 DRV_NAME, hw); 3262 3307 if (err) { ··· 3259 3332 return 0; 3260 3333 3261 3334 err_out_unregister: 3262 - if (hw->msi) 3263 - pci_disable_msi(pdev); 3264 3335 if (dev1) { 3265 3336 unregister_netdev(dev1); 3266 3337 free_netdev(dev1); ··· 3301 3376 sky2_read8(hw, B0_CTST); 3302 3377 3303 3378 free_irq(pdev->irq, hw); 3304 - if (hw->msi) 3305 - pci_disable_msi(pdev); 3306 3379 pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma); 3307 3380 pci_release_regions(pdev); 3308 3381 pci_disable_device(pdev);
-1
drivers/net/sky2.h
··· 1881 1881 u32 intr_mask; 1882 1882 1883 1883 int pm_cap; 1884 - int msi; 1885 1884 u8 chip_id; 1886 1885 u8 chip_rev; 1887 1886 u8 copper;
+3
drivers/net/via-velocity.c
··· 1106 1106 1107 1107 for (i = 0; i < vptr->options.numrx; i++) { 1108 1108 struct velocity_rd_info *rd_info = &(vptr->rd_info[i]); 1109 + struct rx_desc *rd = vptr->rd_ring + i; 1110 + 1111 + memset(rd, 0, sizeof(*rd)); 1109 1112 1110 1113 if (!rd_info->skb) 1111 1114 continue;
+5 -11
net/ieee80211/ieee80211_rx.c
··· 1301 1301 /* dst->last_associate is not overwritten */ 1302 1302 } 1303 1303 1304 - static inline int is_beacon(int fc) 1304 + static inline int is_beacon(__le16 fc) 1305 1305 { 1306 1306 return (WLAN_FC_GET_STYPE(le16_to_cpu(fc)) == IEEE80211_STYPE_BEACON); 1307 1307 } ··· 1348 1348 escape_essid(info_element->data, 1349 1349 info_element->len), 1350 1350 MAC_ARG(beacon->header.addr3), 1351 - is_beacon(le16_to_cpu 1352 - (beacon->header. 1353 - frame_ctl)) ? 1351 + is_beacon(beacon->header.frame_ctl) ? 1354 1352 "BEACON" : "PROBE RESPONSE"); 1355 1353 return; 1356 1354 } ··· 1398 1400 escape_essid(network.ssid, 1399 1401 network.ssid_len), 1400 1402 MAC_ARG(network.bssid), 1401 - is_beacon(le16_to_cpu 1402 - (beacon->header. 1403 - frame_ctl)) ? 1403 + is_beacon(beacon->header.frame_ctl) ? 1404 1404 "BEACON" : "PROBE RESPONSE"); 1405 1405 #endif 1406 1406 memcpy(target, &network, sizeof(*target)); ··· 1408 1412 escape_essid(target->ssid, 1409 1413 target->ssid_len), 1410 1414 MAC_ARG(target->bssid), 1411 - is_beacon(le16_to_cpu 1412 - (beacon->header. 1413 - frame_ctl)) ? 1415 + is_beacon(beacon->header.frame_ctl) ? 1414 1416 "BEACON" : "PROBE RESPONSE"); 1415 1417 update_network(target, &network); 1416 1418 } 1417 1419 1418 1420 spin_unlock_irqrestore(&ieee->lock, flags); 1419 1421 1420 - if (is_beacon(le16_to_cpu(beacon->header.frame_ctl))) { 1422 + if (is_beacon(beacon->header.frame_ctl)) { 1421 1423 if (ieee->handle_beacon != NULL) 1422 1424 ieee->handle_beacon(dev, beacon, &network); 1423 1425 } else {