diff options
author | Bruce Allan <bruce.w.allan@intel.com> | 2008-08-26 21:37:06 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-09-03 10:08:13 -0400 |
commit | 4662e82b2cb41c60826e50474dd86dd5c6372b0c (patch) | |
tree | 75a99d62d28ad8ff5d9557f4665bae177218bb2a /drivers/net/e1000e/netdev.c | |
parent | f4187b56e1f8a05dd110875d5094b21b51ebd79b (diff) |
e1000e: add support for new 82574L part
This new part has the same feature set as previous parts with the addition
of MSI-X support.
Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/net/e1000e/netdev.c')
-rw-r--r-- | drivers/net/e1000e/netdev.c | 409 |
1 files changed, 363 insertions, 46 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 2d9bcb02d093..0925204cd2d8 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -55,6 +55,7 @@ static const struct e1000_info *e1000_info_tbl[] = { | |||
55 | [board_82571] = &e1000_82571_info, | 55 | [board_82571] = &e1000_82571_info, |
56 | [board_82572] = &e1000_82572_info, | 56 | [board_82572] = &e1000_82572_info, |
57 | [board_82573] = &e1000_82573_info, | 57 | [board_82573] = &e1000_82573_info, |
58 | [board_82574] = &e1000_82574_info, | ||
58 | [board_80003es2lan] = &e1000_es2_info, | 59 | [board_80003es2lan] = &e1000_es2_info, |
59 | [board_ich8lan] = &e1000_ich8_info, | 60 | [board_ich8lan] = &e1000_ich8_info, |
60 | [board_ich9lan] = &e1000_ich9_info, | 61 | [board_ich9lan] = &e1000_ich9_info, |
@@ -1180,8 +1181,8 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
1180 | struct net_device *netdev = data; | 1181 | struct net_device *netdev = data; |
1181 | struct e1000_adapter *adapter = netdev_priv(netdev); | 1182 | struct e1000_adapter *adapter = netdev_priv(netdev); |
1182 | struct e1000_hw *hw = &adapter->hw; | 1183 | struct e1000_hw *hw = &adapter->hw; |
1183 | |||
1184 | u32 rctl, icr = er32(ICR); | 1184 | u32 rctl, icr = er32(ICR); |
1185 | |||
1185 | if (!icr) | 1186 | if (!icr) |
1186 | return IRQ_NONE; /* Not our interrupt */ | 1187 | return IRQ_NONE; /* Not our interrupt */ |
1187 | 1188 | ||
@@ -1237,6 +1238,263 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
1237 | return IRQ_HANDLED; | 1238 | return IRQ_HANDLED; |
1238 | } | 1239 | } |
1239 | 1240 | ||
1241 | static irqreturn_t e1000_msix_other(int irq, void *data) | ||
1242 | { | ||
1243 | struct net_device *netdev = data; | ||
1244 | struct e1000_adapter *adapter = netdev_priv(netdev); | ||
1245 | struct e1000_hw *hw = &adapter->hw; | ||
1246 | u32 icr = er32(ICR); | ||
1247 | |||
1248 | if (!(icr & E1000_ICR_INT_ASSERTED)) { | ||
1249 | ew32(IMS, E1000_IMS_OTHER); | ||
1250 | return IRQ_NONE; | ||
1251 | } | ||
1252 | |||
1253 | if (icr & adapter->eiac_mask) | ||
1254 | ew32(ICS, (icr & adapter->eiac_mask)); | ||
1255 | |||
1256 | if (icr & E1000_ICR_OTHER) { | ||
1257 | if (!(icr & E1000_ICR_LSC)) | ||
1258 | goto no_link_interrupt; | ||
1259 | hw->mac.get_link_status = 1; | ||
1260 | /* guard against interrupt when we're going down */ | ||
1261 | if (!test_bit(__E1000_DOWN, &adapter->state)) | ||
1262 | mod_timer(&adapter->watchdog_timer, jiffies + 1); | ||
1263 | } | ||
1264 | |||
1265 | no_link_interrupt: | ||
1266 | ew32(IMS, E1000_IMS_LSC | E1000_IMS_OTHER); | ||
1267 | |||
1268 | return IRQ_HANDLED; | ||
1269 | } | ||
1270 | |||
1271 | |||
1272 | static irqreturn_t e1000_intr_msix_tx(int irq, void *data) | ||
1273 | { | ||
1274 | struct net_device *netdev = data; | ||
1275 | struct e1000_adapter *adapter = netdev_priv(netdev); | ||
1276 | struct e1000_hw *hw = &adapter->hw; | ||
1277 | struct e1000_ring *tx_ring = adapter->tx_ring; | ||
1278 | |||
1279 | |||
1280 | adapter->total_tx_bytes = 0; | ||
1281 | adapter->total_tx_packets = 0; | ||
1282 | |||
1283 | if (!e1000_clean_tx_irq(adapter)) | ||
1284 | /* Ring was not completely cleaned, so fire another interrupt */ | ||
1285 | ew32(ICS, tx_ring->ims_val); | ||
1286 | |||
1287 | return IRQ_HANDLED; | ||
1288 | } | ||
1289 | |||
1290 | static irqreturn_t e1000_intr_msix_rx(int irq, void *data) | ||
1291 | { | ||
1292 | struct net_device *netdev = data; | ||
1293 | struct e1000_adapter *adapter = netdev_priv(netdev); | ||
1294 | |||
1295 | /* Write the ITR value calculated at the end of the | ||
1296 | * previous interrupt. | ||
1297 | */ | ||
1298 | if (adapter->rx_ring->set_itr) { | ||
1299 | writel(1000000000 / (adapter->rx_ring->itr_val * 256), | ||
1300 | adapter->hw.hw_addr + adapter->rx_ring->itr_register); | ||
1301 | adapter->rx_ring->set_itr = 0; | ||
1302 | } | ||
1303 | |||
1304 | if (netif_rx_schedule_prep(netdev, &adapter->napi)) { | ||
1305 | adapter->total_rx_bytes = 0; | ||
1306 | adapter->total_rx_packets = 0; | ||
1307 | __netif_rx_schedule(netdev, &adapter->napi); | ||
1308 | } | ||
1309 | return IRQ_HANDLED; | ||
1310 | } | ||
1311 | |||
1312 | /** | ||
1313 | * e1000_configure_msix - Configure MSI-X hardware | ||
1314 | * | ||
1315 | * e1000_configure_msix sets up the hardware to properly | ||
1316 | * generate MSI-X interrupts. | ||
1317 | **/ | ||
1318 | static void e1000_configure_msix(struct e1000_adapter *adapter) | ||
1319 | { | ||
1320 | struct e1000_hw *hw = &adapter->hw; | ||
1321 | struct e1000_ring *rx_ring = adapter->rx_ring; | ||
1322 | struct e1000_ring *tx_ring = adapter->tx_ring; | ||
1323 | int vector = 0; | ||
1324 | u32 ctrl_ext, ivar = 0; | ||
1325 | |||
1326 | adapter->eiac_mask = 0; | ||
1327 | |||
1328 | /* Workaround issue with spurious interrupts on 82574 in MSI-X mode */ | ||
1329 | if (hw->mac.type == e1000_82574) { | ||
1330 | u32 rfctl = er32(RFCTL); | ||
1331 | rfctl |= E1000_RFCTL_ACK_DIS; | ||
1332 | ew32(RFCTL, rfctl); | ||
1333 | } | ||
1334 | |||
1335 | #define E1000_IVAR_INT_ALLOC_VALID 0x8 | ||
1336 | /* Configure Rx vector */ | ||
1337 | rx_ring->ims_val = E1000_IMS_RXQ0; | ||
1338 | adapter->eiac_mask |= rx_ring->ims_val; | ||
1339 | if (rx_ring->itr_val) | ||
1340 | writel(1000000000 / (rx_ring->itr_val * 256), | ||
1341 | hw->hw_addr + rx_ring->itr_register); | ||
1342 | else | ||
1343 | writel(1, hw->hw_addr + rx_ring->itr_register); | ||
1344 | ivar = E1000_IVAR_INT_ALLOC_VALID | vector; | ||
1345 | |||
1346 | /* Configure Tx vector */ | ||
1347 | tx_ring->ims_val = E1000_IMS_TXQ0; | ||
1348 | vector++; | ||
1349 | if (tx_ring->itr_val) | ||
1350 | writel(1000000000 / (tx_ring->itr_val * 256), | ||
1351 | hw->hw_addr + tx_ring->itr_register); | ||
1352 | else | ||
1353 | writel(1, hw->hw_addr + tx_ring->itr_register); | ||
1354 | adapter->eiac_mask |= tx_ring->ims_val; | ||
1355 | ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 8); | ||
1356 | |||
1357 | /* set vector for Other Causes, e.g. link changes */ | ||
1358 | vector++; | ||
1359 | ivar |= ((E1000_IVAR_INT_ALLOC_VALID | vector) << 16); | ||
1360 | if (rx_ring->itr_val) | ||
1361 | writel(1000000000 / (rx_ring->itr_val * 256), | ||
1362 | hw->hw_addr + E1000_EITR_82574(vector)); | ||
1363 | else | ||
1364 | writel(1, hw->hw_addr + E1000_EITR_82574(vector)); | ||
1365 | |||
1366 | /* Cause Tx interrupts on every write back */ | ||
1367 | ivar |= (1 << 31); | ||
1368 | |||
1369 | ew32(IVAR, ivar); | ||
1370 | |||
1371 | /* enable MSI-X PBA support */ | ||
1372 | ctrl_ext = er32(CTRL_EXT); | ||
1373 | ctrl_ext |= E1000_CTRL_EXT_PBA_CLR; | ||
1374 | |||
1375 | /* Auto-Mask Other interrupts upon ICR read */ | ||
1376 | #define E1000_EIAC_MASK_82574 0x01F00000 | ||
1377 | ew32(IAM, ~E1000_EIAC_MASK_82574 | E1000_IMS_OTHER); | ||
1378 | ctrl_ext |= E1000_CTRL_EXT_EIAME; | ||
1379 | ew32(CTRL_EXT, ctrl_ext); | ||
1380 | e1e_flush(); | ||
1381 | } | ||
1382 | |||
1383 | void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter) | ||
1384 | { | ||
1385 | if (adapter->msix_entries) { | ||
1386 | pci_disable_msix(adapter->pdev); | ||
1387 | kfree(adapter->msix_entries); | ||
1388 | adapter->msix_entries = NULL; | ||
1389 | } else if (adapter->flags & FLAG_MSI_ENABLED) { | ||
1390 | pci_disable_msi(adapter->pdev); | ||
1391 | adapter->flags &= ~FLAG_MSI_ENABLED; | ||
1392 | } | ||
1393 | |||
1394 | return; | ||
1395 | } | ||
1396 | |||
1397 | /** | ||
1398 | * e1000e_set_interrupt_capability - set MSI or MSI-X if supported | ||
1399 | * | ||
1400 | * Attempt to configure interrupts using the best available | ||
1401 | * capabilities of the hardware and kernel. | ||
1402 | **/ | ||
1403 | void e1000e_set_interrupt_capability(struct e1000_adapter *adapter) | ||
1404 | { | ||
1405 | int err; | ||
1406 | int numvecs, i; | ||
1407 | |||
1408 | |||
1409 | switch (adapter->int_mode) { | ||
1410 | case E1000E_INT_MODE_MSIX: | ||
1411 | if (adapter->flags & FLAG_HAS_MSIX) { | ||
1412 | numvecs = 3; /* RxQ0, TxQ0 and other */ | ||
1413 | adapter->msix_entries = kcalloc(numvecs, | ||
1414 | sizeof(struct msix_entry), | ||
1415 | GFP_KERNEL); | ||
1416 | if (adapter->msix_entries) { | ||
1417 | for (i = 0; i < numvecs; i++) | ||
1418 | adapter->msix_entries[i].entry = i; | ||
1419 | |||
1420 | err = pci_enable_msix(adapter->pdev, | ||
1421 | adapter->msix_entries, | ||
1422 | numvecs); | ||
1423 | if (err == 0) | ||
1424 | return; | ||
1425 | } | ||
1426 | /* MSI-X failed, so fall through and try MSI */ | ||
1427 | e_err("Failed to initialize MSI-X interrupts. " | ||
1428 | "Falling back to MSI interrupts.\n"); | ||
1429 | e1000e_reset_interrupt_capability(adapter); | ||
1430 | } | ||
1431 | adapter->int_mode = E1000E_INT_MODE_MSI; | ||
1432 | /* Fall through */ | ||
1433 | case E1000E_INT_MODE_MSI: | ||
1434 | if (!pci_enable_msi(adapter->pdev)) { | ||
1435 | adapter->flags |= FLAG_MSI_ENABLED; | ||
1436 | } else { | ||
1437 | adapter->int_mode = E1000E_INT_MODE_LEGACY; | ||
1438 | e_err("Failed to initialize MSI interrupts. Falling " | ||
1439 | "back to legacy interrupts.\n"); | ||
1440 | } | ||
1441 | /* Fall through */ | ||
1442 | case E1000E_INT_MODE_LEGACY: | ||
1443 | /* Don't do anything; this is the system default */ | ||
1444 | break; | ||
1445 | } | ||
1446 | |||
1447 | return; | ||
1448 | } | ||
1449 | |||
1450 | /** | ||
1451 | * e1000_request_msix - Initialize MSI-X interrupts | ||
1452 | * | ||
1453 | * e1000_request_msix allocates MSI-X vectors and requests interrupts from the | ||
1454 | * kernel. | ||
1455 | **/ | ||
1456 | static int e1000_request_msix(struct e1000_adapter *adapter) | ||
1457 | { | ||
1458 | struct net_device *netdev = adapter->netdev; | ||
1459 | int err = 0, vector = 0; | ||
1460 | |||
1461 | if (strlen(netdev->name) < (IFNAMSIZ - 5)) | ||
1462 | sprintf(adapter->rx_ring->name, "%s-rx0", netdev->name); | ||
1463 | else | ||
1464 | memcpy(adapter->rx_ring->name, netdev->name, IFNAMSIZ); | ||
1465 | err = request_irq(adapter->msix_entries[vector].vector, | ||
1466 | &e1000_intr_msix_rx, 0, adapter->rx_ring->name, | ||
1467 | netdev); | ||
1468 | if (err) | ||
1469 | goto out; | ||
1470 | adapter->rx_ring->itr_register = E1000_EITR_82574(vector); | ||
1471 | adapter->rx_ring->itr_val = adapter->itr; | ||
1472 | vector++; | ||
1473 | |||
1474 | if (strlen(netdev->name) < (IFNAMSIZ - 5)) | ||
1475 | sprintf(adapter->tx_ring->name, "%s-tx0", netdev->name); | ||
1476 | else | ||
1477 | memcpy(adapter->tx_ring->name, netdev->name, IFNAMSIZ); | ||
1478 | err = request_irq(adapter->msix_entries[vector].vector, | ||
1479 | &e1000_intr_msix_tx, 0, adapter->tx_ring->name, | ||
1480 | netdev); | ||
1481 | if (err) | ||
1482 | goto out; | ||
1483 | adapter->tx_ring->itr_register = E1000_EITR_82574(vector); | ||
1484 | adapter->tx_ring->itr_val = adapter->itr; | ||
1485 | vector++; | ||
1486 | |||
1487 | err = request_irq(adapter->msix_entries[vector].vector, | ||
1488 | &e1000_msix_other, 0, netdev->name, netdev); | ||
1489 | if (err) | ||
1490 | goto out; | ||
1491 | |||
1492 | e1000_configure_msix(adapter); | ||
1493 | return 0; | ||
1494 | out: | ||
1495 | return err; | ||
1496 | } | ||
1497 | |||
1240 | /** | 1498 | /** |
1241 | * e1000_request_irq - initialize interrupts | 1499 | * e1000_request_irq - initialize interrupts |
1242 | * | 1500 | * |
@@ -1246,29 +1504,33 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
1246 | static int e1000_request_irq(struct e1000_adapter *adapter) | 1504 | static int e1000_request_irq(struct e1000_adapter *adapter) |
1247 | { | 1505 | { |
1248 | struct net_device *netdev = adapter->netdev; | 1506 | struct net_device *netdev = adapter->netdev; |
1249 | int irq_flags = IRQF_SHARED; | ||
1250 | int err; | 1507 | int err; |
1251 | 1508 | ||
1252 | if (!(adapter->flags & FLAG_MSI_TEST_FAILED)) { | 1509 | if (adapter->msix_entries) { |
1253 | err = pci_enable_msi(adapter->pdev); | 1510 | err = e1000_request_msix(adapter); |
1254 | if (!err) { | 1511 | if (!err) |
1255 | adapter->flags |= FLAG_MSI_ENABLED; | 1512 | return err; |
1256 | irq_flags = 0; | 1513 | /* fall back to MSI */ |
1257 | } | 1514 | e1000e_reset_interrupt_capability(adapter); |
1515 | adapter->int_mode = E1000E_INT_MODE_MSI; | ||
1516 | e1000e_set_interrupt_capability(adapter); | ||
1258 | } | 1517 | } |
1518 | if (adapter->flags & FLAG_MSI_ENABLED) { | ||
1519 | err = request_irq(adapter->pdev->irq, &e1000_intr_msi, 0, | ||
1520 | netdev->name, netdev); | ||
1521 | if (!err) | ||
1522 | return err; | ||
1259 | 1523 | ||
1260 | err = request_irq(adapter->pdev->irq, | 1524 | /* fall back to legacy interrupt */ |
1261 | ((adapter->flags & FLAG_MSI_ENABLED) ? | 1525 | e1000e_reset_interrupt_capability(adapter); |
1262 | &e1000_intr_msi : &e1000_intr), | 1526 | adapter->int_mode = E1000E_INT_MODE_LEGACY; |
1263 | irq_flags, netdev->name, netdev); | ||
1264 | if (err) { | ||
1265 | if (adapter->flags & FLAG_MSI_ENABLED) { | ||
1266 | pci_disable_msi(adapter->pdev); | ||
1267 | adapter->flags &= ~FLAG_MSI_ENABLED; | ||
1268 | } | ||
1269 | e_err("Unable to allocate interrupt, Error: %d\n", err); | ||
1270 | } | 1527 | } |
1271 | 1528 | ||
1529 | err = request_irq(adapter->pdev->irq, &e1000_intr, IRQF_SHARED, | ||
1530 | netdev->name, netdev); | ||
1531 | if (err) | ||
1532 | e_err("Unable to allocate interrupt, Error: %d\n", err); | ||
1533 | |||
1272 | return err; | 1534 | return err; |
1273 | } | 1535 | } |
1274 | 1536 | ||
@@ -1276,11 +1538,21 @@ static void e1000_free_irq(struct e1000_adapter *adapter) | |||
1276 | { | 1538 | { |
1277 | struct net_device *netdev = adapter->netdev; | 1539 | struct net_device *netdev = adapter->netdev; |
1278 | 1540 | ||
1279 | free_irq(adapter->pdev->irq, netdev); | 1541 | if (adapter->msix_entries) { |
1280 | if (adapter->flags & FLAG_MSI_ENABLED) { | 1542 | int vector = 0; |
1281 | pci_disable_msi(adapter->pdev); | 1543 | |
1282 | adapter->flags &= ~FLAG_MSI_ENABLED; | 1544 | free_irq(adapter->msix_entries[vector].vector, netdev); |
1545 | vector++; | ||
1546 | |||
1547 | free_irq(adapter->msix_entries[vector].vector, netdev); | ||
1548 | vector++; | ||
1549 | |||
1550 | /* Other Causes interrupt vector */ | ||
1551 | free_irq(adapter->msix_entries[vector].vector, netdev); | ||
1552 | return; | ||
1283 | } | 1553 | } |
1554 | |||
1555 | free_irq(adapter->pdev->irq, netdev); | ||
1284 | } | 1556 | } |
1285 | 1557 | ||
1286 | /** | 1558 | /** |
@@ -1291,6 +1563,8 @@ static void e1000_irq_disable(struct e1000_adapter *adapter) | |||
1291 | struct e1000_hw *hw = &adapter->hw; | 1563 | struct e1000_hw *hw = &adapter->hw; |
1292 | 1564 | ||
1293 | ew32(IMC, ~0); | 1565 | ew32(IMC, ~0); |
1566 | if (adapter->msix_entries) | ||
1567 | ew32(EIAC_82574, 0); | ||
1294 | e1e_flush(); | 1568 | e1e_flush(); |
1295 | synchronize_irq(adapter->pdev->irq); | 1569 | synchronize_irq(adapter->pdev->irq); |
1296 | } | 1570 | } |
@@ -1302,7 +1576,12 @@ static void e1000_irq_enable(struct e1000_adapter *adapter) | |||
1302 | { | 1576 | { |
1303 | struct e1000_hw *hw = &adapter->hw; | 1577 | struct e1000_hw *hw = &adapter->hw; |
1304 | 1578 | ||
1305 | ew32(IMS, IMS_ENABLE_MASK); | 1579 | if (adapter->msix_entries) { |
1580 | ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574); | ||
1581 | ew32(IMS, adapter->eiac_mask | E1000_IMS_OTHER | E1000_IMS_LSC); | ||
1582 | } else { | ||
1583 | ew32(IMS, IMS_ENABLE_MASK); | ||
1584 | } | ||
1306 | e1e_flush(); | 1585 | e1e_flush(); |
1307 | } | 1586 | } |
1308 | 1587 | ||
@@ -1552,9 +1831,8 @@ void e1000e_free_rx_resources(struct e1000_adapter *adapter) | |||
1552 | * traffic pattern. Constants in this function were computed | 1831 | * traffic pattern. Constants in this function were computed |
1553 | * based on theoretical maximum wire speed and thresholds were set based | 1832 | * based on theoretical maximum wire speed and thresholds were set based |
1554 | * on testing data as well as attempting to minimize response time | 1833 | * on testing data as well as attempting to minimize response time |
1555 | * while increasing bulk throughput. | 1834 | * while increasing bulk throughput. This functionality is controlled |
1556 | * this functionality is controlled by the InterruptThrottleRate module | 1835 | * by the InterruptThrottleRate module parameter. |
1557 | * parameter (see e1000_param.c) | ||
1558 | **/ | 1836 | **/ |
1559 | static unsigned int e1000_update_itr(struct e1000_adapter *adapter, | 1837 | static unsigned int e1000_update_itr(struct e1000_adapter *adapter, |
1560 | u16 itr_setting, int packets, | 1838 | u16 itr_setting, int packets, |
@@ -1662,11 +1940,37 @@ set_itr_now: | |||
1662 | min(adapter->itr + (new_itr >> 2), new_itr) : | 1940 | min(adapter->itr + (new_itr >> 2), new_itr) : |
1663 | new_itr; | 1941 | new_itr; |
1664 | adapter->itr = new_itr; | 1942 | adapter->itr = new_itr; |
1665 | ew32(ITR, 1000000000 / (new_itr * 256)); | 1943 | adapter->rx_ring->itr_val = new_itr; |
1944 | if (adapter->msix_entries) | ||
1945 | adapter->rx_ring->set_itr = 1; | ||
1946 | else | ||
1947 | ew32(ITR, 1000000000 / (new_itr * 256)); | ||
1666 | } | 1948 | } |
1667 | } | 1949 | } |
1668 | 1950 | ||
1669 | /** | 1951 | /** |
1952 | * e1000_alloc_queues - Allocate memory for all rings | ||
1953 | * @adapter: board private structure to initialize | ||
1954 | **/ | ||
1955 | static int __devinit e1000_alloc_queues(struct e1000_adapter *adapter) | ||
1956 | { | ||
1957 | adapter->tx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL); | ||
1958 | if (!adapter->tx_ring) | ||
1959 | goto err; | ||
1960 | |||
1961 | adapter->rx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL); | ||
1962 | if (!adapter->rx_ring) | ||
1963 | goto err; | ||
1964 | |||
1965 | return 0; | ||
1966 | err: | ||
1967 | e_err("Unable to allocate memory for queues\n"); | ||
1968 | kfree(adapter->rx_ring); | ||
1969 | kfree(adapter->tx_ring); | ||
1970 | return -ENOMEM; | ||
1971 | } | ||
1972 | |||
1973 | /** | ||
1670 | * e1000_clean - NAPI Rx polling callback | 1974 | * e1000_clean - NAPI Rx polling callback |
1671 | * @napi: struct associated with this polling callback | 1975 | * @napi: struct associated with this polling callback |
1672 | * @budget: amount of packets driver is allowed to process this poll | 1976 | * @budget: amount of packets driver is allowed to process this poll |
@@ -1674,12 +1978,17 @@ set_itr_now: | |||
1674 | static int e1000_clean(struct napi_struct *napi, int budget) | 1978 | static int e1000_clean(struct napi_struct *napi, int budget) |
1675 | { | 1979 | { |
1676 | struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); | 1980 | struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); |
1981 | struct e1000_hw *hw = &adapter->hw; | ||
1677 | struct net_device *poll_dev = adapter->netdev; | 1982 | struct net_device *poll_dev = adapter->netdev; |
1678 | int tx_cleaned = 0, work_done = 0; | 1983 | int tx_cleaned = 0, work_done = 0; |
1679 | 1984 | ||
1680 | /* Must NOT use netdev_priv macro here. */ | 1985 | /* Must NOT use netdev_priv macro here. */ |
1681 | adapter = poll_dev->priv; | 1986 | adapter = poll_dev->priv; |
1682 | 1987 | ||
1988 | if (adapter->msix_entries && | ||
1989 | !(adapter->rx_ring->ims_val & adapter->tx_ring->ims_val)) | ||
1990 | goto clean_rx; | ||
1991 | |||
1683 | /* | 1992 | /* |
1684 | * e1000_clean is called per-cpu. This lock protects | 1993 | * e1000_clean is called per-cpu. This lock protects |
1685 | * tx_ring from being cleaned by multiple cpus | 1994 | * tx_ring from being cleaned by multiple cpus |
@@ -1691,6 +2000,7 @@ static int e1000_clean(struct napi_struct *napi, int budget) | |||
1691 | spin_unlock(&adapter->tx_queue_lock); | 2000 | spin_unlock(&adapter->tx_queue_lock); |
1692 | } | 2001 | } |
1693 | 2002 | ||
2003 | clean_rx: | ||
1694 | adapter->clean_rx(adapter, &work_done, budget); | 2004 | adapter->clean_rx(adapter, &work_done, budget); |
1695 | 2005 | ||
1696 | if (tx_cleaned) | 2006 | if (tx_cleaned) |
@@ -1701,7 +2011,10 @@ static int e1000_clean(struct napi_struct *napi, int budget) | |||
1701 | if (adapter->itr_setting & 3) | 2011 | if (adapter->itr_setting & 3) |
1702 | e1000_set_itr(adapter); | 2012 | e1000_set_itr(adapter); |
1703 | netif_rx_complete(poll_dev, napi); | 2013 | netif_rx_complete(poll_dev, napi); |
1704 | e1000_irq_enable(adapter); | 2014 | if (adapter->msix_entries) |
2015 | ew32(IMS, adapter->rx_ring->ims_val); | ||
2016 | else | ||
2017 | e1000_irq_enable(adapter); | ||
1705 | } | 2018 | } |
1706 | 2019 | ||
1707 | return work_done; | 2020 | return work_done; |
@@ -2497,6 +2810,8 @@ int e1000e_up(struct e1000_adapter *adapter) | |||
2497 | clear_bit(__E1000_DOWN, &adapter->state); | 2810 | clear_bit(__E1000_DOWN, &adapter->state); |
2498 | 2811 | ||
2499 | napi_enable(&adapter->napi); | 2812 | napi_enable(&adapter->napi); |
2813 | if (adapter->msix_entries) | ||
2814 | e1000_configure_msix(adapter); | ||
2500 | e1000_irq_enable(adapter); | 2815 | e1000_irq_enable(adapter); |
2501 | 2816 | ||
2502 | /* fire a link change interrupt to start the watchdog */ | 2817 | /* fire a link change interrupt to start the watchdog */ |
@@ -2580,13 +2895,10 @@ static int __devinit e1000_sw_init(struct e1000_adapter *adapter) | |||
2580 | adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; | 2895 | adapter->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; |
2581 | adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN; | 2896 | adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN; |
2582 | 2897 | ||
2583 | adapter->tx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL); | 2898 | e1000e_set_interrupt_capability(adapter); |
2584 | if (!adapter->tx_ring) | ||
2585 | goto err; | ||
2586 | 2899 | ||
2587 | adapter->rx_ring = kzalloc(sizeof(struct e1000_ring), GFP_KERNEL); | 2900 | if (e1000_alloc_queues(adapter)) |
2588 | if (!adapter->rx_ring) | 2901 | return -ENOMEM; |
2589 | goto err; | ||
2590 | 2902 | ||
2591 | spin_lock_init(&adapter->tx_queue_lock); | 2903 | spin_lock_init(&adapter->tx_queue_lock); |
2592 | 2904 | ||
@@ -2597,12 +2909,6 @@ static int __devinit e1000_sw_init(struct e1000_adapter *adapter) | |||
2597 | 2909 | ||
2598 | set_bit(__E1000_DOWN, &adapter->state); | 2910 | set_bit(__E1000_DOWN, &adapter->state); |
2599 | return 0; | 2911 | return 0; |
2600 | |||
2601 | err: | ||
2602 | e_err("Unable to allocate memory for queues\n"); | ||
2603 | kfree(adapter->rx_ring); | ||
2604 | kfree(adapter->tx_ring); | ||
2605 | return -ENOMEM; | ||
2606 | } | 2912 | } |
2607 | 2913 | ||
2608 | /** | 2914 | /** |
@@ -2644,6 +2950,7 @@ static int e1000_test_msi_interrupt(struct e1000_adapter *adapter) | |||
2644 | 2950 | ||
2645 | /* free the real vector and request a test handler */ | 2951 | /* free the real vector and request a test handler */ |
2646 | e1000_free_irq(adapter); | 2952 | e1000_free_irq(adapter); |
2953 | e1000e_reset_interrupt_capability(adapter); | ||
2647 | 2954 | ||
2648 | /* Assume that the test fails, if it succeeds then the test | 2955 | /* Assume that the test fails, if it succeeds then the test |
2649 | * MSI irq handler will unset this flag */ | 2956 | * MSI irq handler will unset this flag */ |
@@ -2674,6 +2981,7 @@ static int e1000_test_msi_interrupt(struct e1000_adapter *adapter) | |||
2674 | rmb(); | 2981 | rmb(); |
2675 | 2982 | ||
2676 | if (adapter->flags & FLAG_MSI_TEST_FAILED) { | 2983 | if (adapter->flags & FLAG_MSI_TEST_FAILED) { |
2984 | adapter->int_mode = E1000E_INT_MODE_LEGACY; | ||
2677 | err = -EIO; | 2985 | err = -EIO; |
2678 | e_info("MSI interrupt test failed!\n"); | 2986 | e_info("MSI interrupt test failed!\n"); |
2679 | } | 2987 | } |
@@ -2687,7 +2995,7 @@ static int e1000_test_msi_interrupt(struct e1000_adapter *adapter) | |||
2687 | /* okay so the test worked, restore settings */ | 2995 | /* okay so the test worked, restore settings */ |
2688 | e_dbg("%s: MSI interrupt test succeeded!\n", netdev->name); | 2996 | e_dbg("%s: MSI interrupt test succeeded!\n", netdev->name); |
2689 | msi_test_failed: | 2997 | msi_test_failed: |
2690 | /* restore the original vector, even if it failed */ | 2998 | e1000e_set_interrupt_capability(adapter); |
2691 | e1000_request_irq(adapter); | 2999 | e1000_request_irq(adapter); |
2692 | return err; | 3000 | return err; |
2693 | } | 3001 | } |
@@ -2797,7 +3105,7 @@ static int e1000_open(struct net_device *netdev) | |||
2797 | * ignore e1000e MSI messages, which means we need to test our MSI | 3105 | * ignore e1000e MSI messages, which means we need to test our MSI |
2798 | * interrupt now | 3106 | * interrupt now |
2799 | */ | 3107 | */ |
2800 | { | 3108 | if (adapter->int_mode != E1000E_INT_MODE_LEGACY) { |
2801 | err = e1000_test_msi(adapter); | 3109 | err = e1000_test_msi(adapter); |
2802 | if (err) { | 3110 | if (err) { |
2803 | e_err("Interrupt allocation failed\n"); | 3111 | e_err("Interrupt allocation failed\n"); |
@@ -2989,7 +3297,8 @@ void e1000e_update_stats(struct e1000_adapter *adapter) | |||
2989 | 3297 | ||
2990 | adapter->stats.algnerrc += er32(ALGNERRC); | 3298 | adapter->stats.algnerrc += er32(ALGNERRC); |
2991 | adapter->stats.rxerrc += er32(RXERRC); | 3299 | adapter->stats.rxerrc += er32(RXERRC); |
2992 | adapter->stats.tncrs += er32(TNCRS); | 3300 | if (hw->mac.type != e1000_82574) |
3301 | adapter->stats.tncrs += er32(TNCRS); | ||
2993 | adapter->stats.cexterr += er32(CEXTERR); | 3302 | adapter->stats.cexterr += er32(CEXTERR); |
2994 | adapter->stats.tsctc += er32(TSCTC); | 3303 | adapter->stats.tsctc += er32(TSCTC); |
2995 | adapter->stats.tsctfc += er32(TSCTFC); | 3304 | adapter->stats.tsctfc += er32(TSCTFC); |
@@ -3337,7 +3646,10 @@ link_up: | |||
3337 | } | 3646 | } |
3338 | 3647 | ||
3339 | /* Cause software interrupt to ensure Rx ring is cleaned */ | 3648 | /* Cause software interrupt to ensure Rx ring is cleaned */ |
3340 | ew32(ICS, E1000_ICS_RXDMT0); | 3649 | if (adapter->msix_entries) |
3650 | ew32(ICS, adapter->rx_ring->ims_val); | ||
3651 | else | ||
3652 | ew32(ICS, E1000_ICS_RXDMT0); | ||
3341 | 3653 | ||
3342 | /* Force detection of hung controller every watchdog period */ | 3654 | /* Force detection of hung controller every watchdog period */ |
3343 | adapter->detect_tx_hung = 1; | 3655 | adapter->detect_tx_hung = 1; |
@@ -4054,6 +4366,7 @@ static int e1000_suspend(struct pci_dev *pdev, pm_message_t state) | |||
4054 | e1000e_down(adapter); | 4366 | e1000e_down(adapter); |
4055 | e1000_free_irq(adapter); | 4367 | e1000_free_irq(adapter); |
4056 | } | 4368 | } |
4369 | e1000e_reset_interrupt_capability(adapter); | ||
4057 | 4370 | ||
4058 | retval = pci_save_state(pdev); | 4371 | retval = pci_save_state(pdev); |
4059 | if (retval) | 4372 | if (retval) |
@@ -4180,6 +4493,7 @@ static int e1000_resume(struct pci_dev *pdev) | |||
4180 | pci_enable_wake(pdev, PCI_D3hot, 0); | 4493 | pci_enable_wake(pdev, PCI_D3hot, 0); |
4181 | pci_enable_wake(pdev, PCI_D3cold, 0); | 4494 | pci_enable_wake(pdev, PCI_D3cold, 0); |
4182 | 4495 | ||
4496 | e1000e_set_interrupt_capability(adapter); | ||
4183 | if (netif_running(netdev)) { | 4497 | if (netif_running(netdev)) { |
4184 | err = e1000_request_irq(adapter); | 4498 | err = e1000_request_irq(adapter); |
4185 | if (err) | 4499 | if (err) |
@@ -4489,6 +4803,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4489 | 4803 | ||
4490 | adapter->bd_number = cards_found++; | 4804 | adapter->bd_number = cards_found++; |
4491 | 4805 | ||
4806 | e1000e_check_options(adapter); | ||
4807 | |||
4492 | /* setup adapter struct */ | 4808 | /* setup adapter struct */ |
4493 | err = e1000_sw_init(adapter); | 4809 | err = e1000_sw_init(adapter); |
4494 | if (err) | 4810 | if (err) |
@@ -4595,8 +4911,6 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4595 | INIT_WORK(&adapter->reset_task, e1000_reset_task); | 4911 | INIT_WORK(&adapter->reset_task, e1000_reset_task); |
4596 | INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); | 4912 | INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); |
4597 | 4913 | ||
4598 | e1000e_check_options(adapter); | ||
4599 | |||
4600 | /* Initialize link parameters. User can change them with ethtool */ | 4914 | /* Initialize link parameters. User can change them with ethtool */ |
4601 | adapter->hw.mac.autoneg = 1; | 4915 | adapter->hw.mac.autoneg = 1; |
4602 | adapter->fc_autoneg = 1; | 4916 | adapter->fc_autoneg = 1; |
@@ -4726,6 +5040,7 @@ static void __devexit e1000_remove(struct pci_dev *pdev) | |||
4726 | if (!e1000_check_reset_block(&adapter->hw)) | 5040 | if (!e1000_check_reset_block(&adapter->hw)) |
4727 | e1000_phy_hw_reset(&adapter->hw); | 5041 | e1000_phy_hw_reset(&adapter->hw); |
4728 | 5042 | ||
5043 | e1000e_reset_interrupt_capability(adapter); | ||
4729 | kfree(adapter->tx_ring); | 5044 | kfree(adapter->tx_ring); |
4730 | kfree(adapter->rx_ring); | 5045 | kfree(adapter->rx_ring); |
4731 | 5046 | ||
@@ -4767,6 +5082,8 @@ static struct pci_device_id e1000_pci_tbl[] = { | |||
4767 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_82573E_IAMT), board_82573 }, | 5082 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_82573E_IAMT), board_82573 }, |
4768 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_82573L), board_82573 }, | 5083 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_82573L), board_82573 }, |
4769 | 5084 | ||
5085 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_82574L), board_82574 }, | ||
5086 | |||
4770 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_DPT), | 5087 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_DPT), |
4771 | board_80003es2lan }, | 5088 | board_80003es2lan }, |
4772 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_SPT), | 5089 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_SPT), |