diff options
-rw-r--r-- | drivers/net/vmxnet3/vmxnet3_drv.c | 211 | ||||
-rw-r--r-- | drivers/net/vmxnet3/vmxnet3_int.h | 10 |
2 files changed, 138 insertions, 83 deletions
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 55a62cae2cb4..7e2788c488ed 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
@@ -313,10 +313,10 @@ vmxnet3_unmap_tx_buf(struct vmxnet3_tx_buf_info *tbi, | |||
313 | struct pci_dev *pdev) | 313 | struct pci_dev *pdev) |
314 | { | 314 | { |
315 | if (tbi->map_type == VMXNET3_MAP_SINGLE) | 315 | if (tbi->map_type == VMXNET3_MAP_SINGLE) |
316 | pci_unmap_single(pdev, tbi->dma_addr, tbi->len, | 316 | dma_unmap_single(&pdev->dev, tbi->dma_addr, tbi->len, |
317 | PCI_DMA_TODEVICE); | 317 | PCI_DMA_TODEVICE); |
318 | else if (tbi->map_type == VMXNET3_MAP_PAGE) | 318 | else if (tbi->map_type == VMXNET3_MAP_PAGE) |
319 | pci_unmap_page(pdev, tbi->dma_addr, tbi->len, | 319 | dma_unmap_page(&pdev->dev, tbi->dma_addr, tbi->len, |
320 | PCI_DMA_TODEVICE); | 320 | PCI_DMA_TODEVICE); |
321 | else | 321 | else |
322 | BUG_ON(tbi->map_type != VMXNET3_MAP_NONE); | 322 | BUG_ON(tbi->map_type != VMXNET3_MAP_NONE); |
@@ -429,25 +429,29 @@ vmxnet3_tq_destroy(struct vmxnet3_tx_queue *tq, | |||
429 | struct vmxnet3_adapter *adapter) | 429 | struct vmxnet3_adapter *adapter) |
430 | { | 430 | { |
431 | if (tq->tx_ring.base) { | 431 | if (tq->tx_ring.base) { |
432 | pci_free_consistent(adapter->pdev, tq->tx_ring.size * | 432 | dma_free_coherent(&adapter->pdev->dev, tq->tx_ring.size * |
433 | sizeof(struct Vmxnet3_TxDesc), | 433 | sizeof(struct Vmxnet3_TxDesc), |
434 | tq->tx_ring.base, tq->tx_ring.basePA); | 434 | tq->tx_ring.base, tq->tx_ring.basePA); |
435 | tq->tx_ring.base = NULL; | 435 | tq->tx_ring.base = NULL; |
436 | } | 436 | } |
437 | if (tq->data_ring.base) { | 437 | if (tq->data_ring.base) { |
438 | pci_free_consistent(adapter->pdev, tq->data_ring.size * | 438 | dma_free_coherent(&adapter->pdev->dev, tq->data_ring.size * |
439 | sizeof(struct Vmxnet3_TxDataDesc), | 439 | sizeof(struct Vmxnet3_TxDataDesc), |
440 | tq->data_ring.base, tq->data_ring.basePA); | 440 | tq->data_ring.base, tq->data_ring.basePA); |
441 | tq->data_ring.base = NULL; | 441 | tq->data_ring.base = NULL; |
442 | } | 442 | } |
443 | if (tq->comp_ring.base) { | 443 | if (tq->comp_ring.base) { |
444 | pci_free_consistent(adapter->pdev, tq->comp_ring.size * | 444 | dma_free_coherent(&adapter->pdev->dev, tq->comp_ring.size * |
445 | sizeof(struct Vmxnet3_TxCompDesc), | 445 | sizeof(struct Vmxnet3_TxCompDesc), |
446 | tq->comp_ring.base, tq->comp_ring.basePA); | 446 | tq->comp_ring.base, tq->comp_ring.basePA); |
447 | tq->comp_ring.base = NULL; | 447 | tq->comp_ring.base = NULL; |
448 | } | 448 | } |
449 | kfree(tq->buf_info); | 449 | if (tq->buf_info) { |
450 | tq->buf_info = NULL; | 450 | dma_free_coherent(&adapter->pdev->dev, |
451 | tq->tx_ring.size * sizeof(tq->buf_info[0]), | ||
452 | tq->buf_info, tq->buf_info_pa); | ||
453 | tq->buf_info = NULL; | ||
454 | } | ||
451 | } | 455 | } |
452 | 456 | ||
453 | 457 | ||
@@ -496,37 +500,38 @@ static int | |||
496 | vmxnet3_tq_create(struct vmxnet3_tx_queue *tq, | 500 | vmxnet3_tq_create(struct vmxnet3_tx_queue *tq, |
497 | struct vmxnet3_adapter *adapter) | 501 | struct vmxnet3_adapter *adapter) |
498 | { | 502 | { |
503 | size_t sz; | ||
504 | |||
499 | BUG_ON(tq->tx_ring.base || tq->data_ring.base || | 505 | BUG_ON(tq->tx_ring.base || tq->data_ring.base || |
500 | tq->comp_ring.base || tq->buf_info); | 506 | tq->comp_ring.base || tq->buf_info); |
501 | 507 | ||
502 | tq->tx_ring.base = pci_alloc_consistent(adapter->pdev, tq->tx_ring.size | 508 | tq->tx_ring.base = dma_alloc_coherent(&adapter->pdev->dev, |
503 | * sizeof(struct Vmxnet3_TxDesc), | 509 | tq->tx_ring.size * sizeof(struct Vmxnet3_TxDesc), |
504 | &tq->tx_ring.basePA); | 510 | &tq->tx_ring.basePA, GFP_KERNEL); |
505 | if (!tq->tx_ring.base) { | 511 | if (!tq->tx_ring.base) { |
506 | netdev_err(adapter->netdev, "failed to allocate tx ring\n"); | 512 | netdev_err(adapter->netdev, "failed to allocate tx ring\n"); |
507 | goto err; | 513 | goto err; |
508 | } | 514 | } |
509 | 515 | ||
510 | tq->data_ring.base = pci_alloc_consistent(adapter->pdev, | 516 | tq->data_ring.base = dma_alloc_coherent(&adapter->pdev->dev, |
511 | tq->data_ring.size * | 517 | tq->data_ring.size * sizeof(struct Vmxnet3_TxDataDesc), |
512 | sizeof(struct Vmxnet3_TxDataDesc), | 518 | &tq->data_ring.basePA, GFP_KERNEL); |
513 | &tq->data_ring.basePA); | ||
514 | if (!tq->data_ring.base) { | 519 | if (!tq->data_ring.base) { |
515 | netdev_err(adapter->netdev, "failed to allocate data ring\n"); | 520 | netdev_err(adapter->netdev, "failed to allocate data ring\n"); |
516 | goto err; | 521 | goto err; |
517 | } | 522 | } |
518 | 523 | ||
519 | tq->comp_ring.base = pci_alloc_consistent(adapter->pdev, | 524 | tq->comp_ring.base = dma_alloc_coherent(&adapter->pdev->dev, |
520 | tq->comp_ring.size * | 525 | tq->comp_ring.size * sizeof(struct Vmxnet3_TxCompDesc), |
521 | sizeof(struct Vmxnet3_TxCompDesc), | 526 | &tq->comp_ring.basePA, GFP_KERNEL); |
522 | &tq->comp_ring.basePA); | ||
523 | if (!tq->comp_ring.base) { | 527 | if (!tq->comp_ring.base) { |
524 | netdev_err(adapter->netdev, "failed to allocate tx comp ring\n"); | 528 | netdev_err(adapter->netdev, "failed to allocate tx comp ring\n"); |
525 | goto err; | 529 | goto err; |
526 | } | 530 | } |
527 | 531 | ||
528 | tq->buf_info = kcalloc(tq->tx_ring.size, sizeof(tq->buf_info[0]), | 532 | sz = tq->tx_ring.size * sizeof(tq->buf_info[0]); |
529 | GFP_KERNEL); | 533 | tq->buf_info = dma_zalloc_coherent(&adapter->pdev->dev, sz, |
534 | &tq->buf_info_pa, GFP_KERNEL); | ||
530 | if (!tq->buf_info) | 535 | if (!tq->buf_info) |
531 | goto err; | 536 | goto err; |
532 | 537 | ||
@@ -578,7 +583,8 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx, | |||
578 | break; | 583 | break; |
579 | } | 584 | } |
580 | 585 | ||
581 | rbi->dma_addr = pci_map_single(adapter->pdev, | 586 | rbi->dma_addr = dma_map_single( |
587 | &adapter->pdev->dev, | ||
582 | rbi->skb->data, rbi->len, | 588 | rbi->skb->data, rbi->len, |
583 | PCI_DMA_FROMDEVICE); | 589 | PCI_DMA_FROMDEVICE); |
584 | } else { | 590 | } else { |
@@ -595,7 +601,8 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx, | |||
595 | rq->stats.rx_buf_alloc_failure++; | 601 | rq->stats.rx_buf_alloc_failure++; |
596 | break; | 602 | break; |
597 | } | 603 | } |
598 | rbi->dma_addr = pci_map_page(adapter->pdev, | 604 | rbi->dma_addr = dma_map_page( |
605 | &adapter->pdev->dev, | ||
599 | rbi->page, 0, PAGE_SIZE, | 606 | rbi->page, 0, PAGE_SIZE, |
600 | PCI_DMA_FROMDEVICE); | 607 | PCI_DMA_FROMDEVICE); |
601 | } else { | 608 | } else { |
@@ -705,7 +712,7 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx, | |||
705 | 712 | ||
706 | tbi = tq->buf_info + tq->tx_ring.next2fill; | 713 | tbi = tq->buf_info + tq->tx_ring.next2fill; |
707 | tbi->map_type = VMXNET3_MAP_SINGLE; | 714 | tbi->map_type = VMXNET3_MAP_SINGLE; |
708 | tbi->dma_addr = pci_map_single(adapter->pdev, | 715 | tbi->dma_addr = dma_map_single(&adapter->pdev->dev, |
709 | skb->data + buf_offset, buf_size, | 716 | skb->data + buf_offset, buf_size, |
710 | PCI_DMA_TODEVICE); | 717 | PCI_DMA_TODEVICE); |
711 | 718 | ||
@@ -1221,7 +1228,8 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
1221 | goto rcd_done; | 1228 | goto rcd_done; |
1222 | } | 1229 | } |
1223 | 1230 | ||
1224 | pci_unmap_single(adapter->pdev, rbi->dma_addr, rbi->len, | 1231 | dma_unmap_single(&adapter->pdev->dev, rbi->dma_addr, |
1232 | rbi->len, | ||
1225 | PCI_DMA_FROMDEVICE); | 1233 | PCI_DMA_FROMDEVICE); |
1226 | 1234 | ||
1227 | #ifdef VMXNET3_RSS | 1235 | #ifdef VMXNET3_RSS |
@@ -1233,7 +1241,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
1233 | 1241 | ||
1234 | /* Immediate refill */ | 1242 | /* Immediate refill */ |
1235 | rbi->skb = new_skb; | 1243 | rbi->skb = new_skb; |
1236 | rbi->dma_addr = pci_map_single(adapter->pdev, | 1244 | rbi->dma_addr = dma_map_single(&adapter->pdev->dev, |
1237 | rbi->skb->data, rbi->len, | 1245 | rbi->skb->data, rbi->len, |
1238 | PCI_DMA_FROMDEVICE); | 1246 | PCI_DMA_FROMDEVICE); |
1239 | rxd->addr = cpu_to_le64(rbi->dma_addr); | 1247 | rxd->addr = cpu_to_le64(rbi->dma_addr); |
@@ -1267,7 +1275,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
1267 | } | 1275 | } |
1268 | 1276 | ||
1269 | if (rcd->len) { | 1277 | if (rcd->len) { |
1270 | pci_unmap_page(adapter->pdev, | 1278 | dma_unmap_page(&adapter->pdev->dev, |
1271 | rbi->dma_addr, rbi->len, | 1279 | rbi->dma_addr, rbi->len, |
1272 | PCI_DMA_FROMDEVICE); | 1280 | PCI_DMA_FROMDEVICE); |
1273 | 1281 | ||
@@ -1276,7 +1284,8 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
1276 | 1284 | ||
1277 | /* Immediate refill */ | 1285 | /* Immediate refill */ |
1278 | rbi->page = new_page; | 1286 | rbi->page = new_page; |
1279 | rbi->dma_addr = pci_map_page(adapter->pdev, rbi->page, | 1287 | rbi->dma_addr = dma_map_page(&adapter->pdev->dev, |
1288 | rbi->page, | ||
1280 | 0, PAGE_SIZE, | 1289 | 0, PAGE_SIZE, |
1281 | PCI_DMA_FROMDEVICE); | 1290 | PCI_DMA_FROMDEVICE); |
1282 | rxd->addr = cpu_to_le64(rbi->dma_addr); | 1291 | rxd->addr = cpu_to_le64(rbi->dma_addr); |
@@ -1352,13 +1361,13 @@ vmxnet3_rq_cleanup(struct vmxnet3_rx_queue *rq, | |||
1352 | 1361 | ||
1353 | if (rxd->btype == VMXNET3_RXD_BTYPE_HEAD && | 1362 | if (rxd->btype == VMXNET3_RXD_BTYPE_HEAD && |
1354 | rq->buf_info[ring_idx][i].skb) { | 1363 | rq->buf_info[ring_idx][i].skb) { |
1355 | pci_unmap_single(adapter->pdev, rxd->addr, | 1364 | dma_unmap_single(&adapter->pdev->dev, rxd->addr, |
1356 | rxd->len, PCI_DMA_FROMDEVICE); | 1365 | rxd->len, PCI_DMA_FROMDEVICE); |
1357 | dev_kfree_skb(rq->buf_info[ring_idx][i].skb); | 1366 | dev_kfree_skb(rq->buf_info[ring_idx][i].skb); |
1358 | rq->buf_info[ring_idx][i].skb = NULL; | 1367 | rq->buf_info[ring_idx][i].skb = NULL; |
1359 | } else if (rxd->btype == VMXNET3_RXD_BTYPE_BODY && | 1368 | } else if (rxd->btype == VMXNET3_RXD_BTYPE_BODY && |
1360 | rq->buf_info[ring_idx][i].page) { | 1369 | rq->buf_info[ring_idx][i].page) { |
1361 | pci_unmap_page(adapter->pdev, rxd->addr, | 1370 | dma_unmap_page(&adapter->pdev->dev, rxd->addr, |
1362 | rxd->len, PCI_DMA_FROMDEVICE); | 1371 | rxd->len, PCI_DMA_FROMDEVICE); |
1363 | put_page(rq->buf_info[ring_idx][i].page); | 1372 | put_page(rq->buf_info[ring_idx][i].page); |
1364 | rq->buf_info[ring_idx][i].page = NULL; | 1373 | rq->buf_info[ring_idx][i].page = NULL; |
@@ -1400,25 +1409,31 @@ static void vmxnet3_rq_destroy(struct vmxnet3_rx_queue *rq, | |||
1400 | } | 1409 | } |
1401 | 1410 | ||
1402 | 1411 | ||
1403 | kfree(rq->buf_info[0]); | ||
1404 | |||
1405 | for (i = 0; i < 2; i++) { | 1412 | for (i = 0; i < 2; i++) { |
1406 | if (rq->rx_ring[i].base) { | 1413 | if (rq->rx_ring[i].base) { |
1407 | pci_free_consistent(adapter->pdev, rq->rx_ring[i].size | 1414 | dma_free_coherent(&adapter->pdev->dev, |
1408 | * sizeof(struct Vmxnet3_RxDesc), | 1415 | rq->rx_ring[i].size |
1409 | rq->rx_ring[i].base, | 1416 | * sizeof(struct Vmxnet3_RxDesc), |
1410 | rq->rx_ring[i].basePA); | 1417 | rq->rx_ring[i].base, |
1418 | rq->rx_ring[i].basePA); | ||
1411 | rq->rx_ring[i].base = NULL; | 1419 | rq->rx_ring[i].base = NULL; |
1412 | } | 1420 | } |
1413 | rq->buf_info[i] = NULL; | 1421 | rq->buf_info[i] = NULL; |
1414 | } | 1422 | } |
1415 | 1423 | ||
1416 | if (rq->comp_ring.base) { | 1424 | if (rq->comp_ring.base) { |
1417 | pci_free_consistent(adapter->pdev, rq->comp_ring.size * | 1425 | dma_free_coherent(&adapter->pdev->dev, rq->comp_ring.size |
1418 | sizeof(struct Vmxnet3_RxCompDesc), | 1426 | * sizeof(struct Vmxnet3_RxCompDesc), |
1419 | rq->comp_ring.base, rq->comp_ring.basePA); | 1427 | rq->comp_ring.base, rq->comp_ring.basePA); |
1420 | rq->comp_ring.base = NULL; | 1428 | rq->comp_ring.base = NULL; |
1421 | } | 1429 | } |
1430 | |||
1431 | if (rq->buf_info[0]) { | ||
1432 | size_t sz = sizeof(struct vmxnet3_rx_buf_info) * | ||
1433 | (rq->rx_ring[0].size + rq->rx_ring[1].size); | ||
1434 | dma_free_coherent(&adapter->pdev->dev, sz, rq->buf_info[0], | ||
1435 | rq->buf_info_pa); | ||
1436 | } | ||
1422 | } | 1437 | } |
1423 | 1438 | ||
1424 | 1439 | ||
@@ -1503,8 +1518,10 @@ vmxnet3_rq_create(struct vmxnet3_rx_queue *rq, struct vmxnet3_adapter *adapter) | |||
1503 | for (i = 0; i < 2; i++) { | 1518 | for (i = 0; i < 2; i++) { |
1504 | 1519 | ||
1505 | sz = rq->rx_ring[i].size * sizeof(struct Vmxnet3_RxDesc); | 1520 | sz = rq->rx_ring[i].size * sizeof(struct Vmxnet3_RxDesc); |
1506 | rq->rx_ring[i].base = pci_alloc_consistent(adapter->pdev, sz, | 1521 | rq->rx_ring[i].base = dma_alloc_coherent( |
1507 | &rq->rx_ring[i].basePA); | 1522 | &adapter->pdev->dev, sz, |
1523 | &rq->rx_ring[i].basePA, | ||
1524 | GFP_KERNEL); | ||
1508 | if (!rq->rx_ring[i].base) { | 1525 | if (!rq->rx_ring[i].base) { |
1509 | netdev_err(adapter->netdev, | 1526 | netdev_err(adapter->netdev, |
1510 | "failed to allocate rx ring %d\n", i); | 1527 | "failed to allocate rx ring %d\n", i); |
@@ -1513,8 +1530,9 @@ vmxnet3_rq_create(struct vmxnet3_rx_queue *rq, struct vmxnet3_adapter *adapter) | |||
1513 | } | 1530 | } |
1514 | 1531 | ||
1515 | sz = rq->comp_ring.size * sizeof(struct Vmxnet3_RxCompDesc); | 1532 | sz = rq->comp_ring.size * sizeof(struct Vmxnet3_RxCompDesc); |
1516 | rq->comp_ring.base = pci_alloc_consistent(adapter->pdev, sz, | 1533 | rq->comp_ring.base = dma_alloc_coherent(&adapter->pdev->dev, sz, |
1517 | &rq->comp_ring.basePA); | 1534 | &rq->comp_ring.basePA, |
1535 | GFP_KERNEL); | ||
1518 | if (!rq->comp_ring.base) { | 1536 | if (!rq->comp_ring.base) { |
1519 | netdev_err(adapter->netdev, "failed to allocate rx comp ring\n"); | 1537 | netdev_err(adapter->netdev, "failed to allocate rx comp ring\n"); |
1520 | goto err; | 1538 | goto err; |
@@ -1522,7 +1540,8 @@ vmxnet3_rq_create(struct vmxnet3_rx_queue *rq, struct vmxnet3_adapter *adapter) | |||
1522 | 1540 | ||
1523 | sz = sizeof(struct vmxnet3_rx_buf_info) * (rq->rx_ring[0].size + | 1541 | sz = sizeof(struct vmxnet3_rx_buf_info) * (rq->rx_ring[0].size + |
1524 | rq->rx_ring[1].size); | 1542 | rq->rx_ring[1].size); |
1525 | bi = kzalloc(sz, GFP_KERNEL); | 1543 | bi = dma_zalloc_coherent(&adapter->pdev->dev, sz, &rq->buf_info_pa, |
1544 | GFP_KERNEL); | ||
1526 | if (!bi) | 1545 | if (!bi) |
1527 | goto err; | 1546 | goto err; |
1528 | 1547 | ||
@@ -2005,6 +2024,7 @@ vmxnet3_set_mc(struct net_device *netdev) | |||
2005 | struct Vmxnet3_RxFilterConf *rxConf = | 2024 | struct Vmxnet3_RxFilterConf *rxConf = |
2006 | &adapter->shared->devRead.rxFilterConf; | 2025 | &adapter->shared->devRead.rxFilterConf; |
2007 | u8 *new_table = NULL; | 2026 | u8 *new_table = NULL; |
2027 | dma_addr_t new_table_pa = 0; | ||
2008 | u32 new_mode = VMXNET3_RXM_UCAST; | 2028 | u32 new_mode = VMXNET3_RXM_UCAST; |
2009 | 2029 | ||
2010 | if (netdev->flags & IFF_PROMISC) { | 2030 | if (netdev->flags & IFF_PROMISC) { |
@@ -2028,8 +2048,12 @@ vmxnet3_set_mc(struct net_device *netdev) | |||
2028 | new_mode |= VMXNET3_RXM_MCAST; | 2048 | new_mode |= VMXNET3_RXM_MCAST; |
2029 | rxConf->mfTableLen = cpu_to_le16( | 2049 | rxConf->mfTableLen = cpu_to_le16( |
2030 | netdev_mc_count(netdev) * ETH_ALEN); | 2050 | netdev_mc_count(netdev) * ETH_ALEN); |
2031 | rxConf->mfTablePA = cpu_to_le64(virt_to_phys( | 2051 | new_table_pa = dma_map_single( |
2032 | new_table)); | 2052 | &adapter->pdev->dev, |
2053 | new_table, | ||
2054 | rxConf->mfTableLen, | ||
2055 | PCI_DMA_TODEVICE); | ||
2056 | rxConf->mfTablePA = cpu_to_le64(new_table_pa); | ||
2033 | } else { | 2057 | } else { |
2034 | netdev_info(netdev, "failed to copy mcast list" | 2058 | netdev_info(netdev, "failed to copy mcast list" |
2035 | ", setting ALL_MULTI\n"); | 2059 | ", setting ALL_MULTI\n"); |
@@ -2056,7 +2080,11 @@ vmxnet3_set_mc(struct net_device *netdev) | |||
2056 | VMXNET3_CMD_UPDATE_MAC_FILTERS); | 2080 | VMXNET3_CMD_UPDATE_MAC_FILTERS); |
2057 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); | 2081 | spin_unlock_irqrestore(&adapter->cmd_lock, flags); |
2058 | 2082 | ||
2059 | kfree(new_table); | 2083 | if (new_table) { |
2084 | dma_unmap_single(&adapter->pdev->dev, new_table_pa, | ||
2085 | rxConf->mfTableLen, PCI_DMA_TODEVICE); | ||
2086 | kfree(new_table); | ||
2087 | } | ||
2060 | } | 2088 | } |
2061 | 2089 | ||
2062 | void | 2090 | void |
@@ -2096,7 +2124,7 @@ vmxnet3_setup_driver_shared(struct vmxnet3_adapter *adapter) | |||
2096 | devRead->misc.driverInfo.vmxnet3RevSpt = cpu_to_le32(1); | 2124 | devRead->misc.driverInfo.vmxnet3RevSpt = cpu_to_le32(1); |
2097 | devRead->misc.driverInfo.uptVerSpt = cpu_to_le32(1); | 2125 | devRead->misc.driverInfo.uptVerSpt = cpu_to_le32(1); |
2098 | 2126 | ||
2099 | devRead->misc.ddPA = cpu_to_le64(virt_to_phys(adapter)); | 2127 | devRead->misc.ddPA = cpu_to_le64(adapter->adapter_pa); |
2100 | devRead->misc.ddLen = cpu_to_le32(sizeof(struct vmxnet3_adapter)); | 2128 | devRead->misc.ddLen = cpu_to_le32(sizeof(struct vmxnet3_adapter)); |
2101 | 2129 | ||
2102 | /* set up feature flags */ | 2130 | /* set up feature flags */ |
@@ -2125,7 +2153,7 @@ vmxnet3_setup_driver_shared(struct vmxnet3_adapter *adapter) | |||
2125 | tqc->txRingBasePA = cpu_to_le64(tq->tx_ring.basePA); | 2153 | tqc->txRingBasePA = cpu_to_le64(tq->tx_ring.basePA); |
2126 | tqc->dataRingBasePA = cpu_to_le64(tq->data_ring.basePA); | 2154 | tqc->dataRingBasePA = cpu_to_le64(tq->data_ring.basePA); |
2127 | tqc->compRingBasePA = cpu_to_le64(tq->comp_ring.basePA); | 2155 | tqc->compRingBasePA = cpu_to_le64(tq->comp_ring.basePA); |
2128 | tqc->ddPA = cpu_to_le64(virt_to_phys(tq->buf_info)); | 2156 | tqc->ddPA = cpu_to_le64(tq->buf_info_pa); |
2129 | tqc->txRingSize = cpu_to_le32(tq->tx_ring.size); | 2157 | tqc->txRingSize = cpu_to_le32(tq->tx_ring.size); |
2130 | tqc->dataRingSize = cpu_to_le32(tq->data_ring.size); | 2158 | tqc->dataRingSize = cpu_to_le32(tq->data_ring.size); |
2131 | tqc->compRingSize = cpu_to_le32(tq->comp_ring.size); | 2159 | tqc->compRingSize = cpu_to_le32(tq->comp_ring.size); |
@@ -2143,8 +2171,7 @@ vmxnet3_setup_driver_shared(struct vmxnet3_adapter *adapter) | |||
2143 | rqc->rxRingBasePA[0] = cpu_to_le64(rq->rx_ring[0].basePA); | 2171 | rqc->rxRingBasePA[0] = cpu_to_le64(rq->rx_ring[0].basePA); |
2144 | rqc->rxRingBasePA[1] = cpu_to_le64(rq->rx_ring[1].basePA); | 2172 | rqc->rxRingBasePA[1] = cpu_to_le64(rq->rx_ring[1].basePA); |
2145 | rqc->compRingBasePA = cpu_to_le64(rq->comp_ring.basePA); | 2173 | rqc->compRingBasePA = cpu_to_le64(rq->comp_ring.basePA); |
2146 | rqc->ddPA = cpu_to_le64(virt_to_phys( | 2174 | rqc->ddPA = cpu_to_le64(rq->buf_info_pa); |
2147 | rq->buf_info)); | ||
2148 | rqc->rxRingSize[0] = cpu_to_le32(rq->rx_ring[0].size); | 2175 | rqc->rxRingSize[0] = cpu_to_le32(rq->rx_ring[0].size); |
2149 | rqc->rxRingSize[1] = cpu_to_le32(rq->rx_ring[1].size); | 2176 | rqc->rxRingSize[1] = cpu_to_le32(rq->rx_ring[1].size); |
2150 | rqc->compRingSize = cpu_to_le32(rq->comp_ring.size); | 2177 | rqc->compRingSize = cpu_to_le32(rq->comp_ring.size); |
@@ -2184,8 +2211,9 @@ vmxnet3_setup_driver_shared(struct vmxnet3_adapter *adapter) | |||
2184 | i, adapter->num_rx_queues); | 2211 | i, adapter->num_rx_queues); |
2185 | 2212 | ||
2186 | devRead->rssConfDesc.confVer = 1; | 2213 | devRead->rssConfDesc.confVer = 1; |
2187 | devRead->rssConfDesc.confLen = sizeof(*rssConf); | 2214 | devRead->rssConfDesc.confLen = cpu_to_le32(sizeof(*rssConf)); |
2188 | devRead->rssConfDesc.confPA = virt_to_phys(rssConf); | 2215 | devRead->rssConfDesc.confPA = |
2216 | cpu_to_le64(adapter->rss_conf_pa); | ||
2189 | } | 2217 | } |
2190 | 2218 | ||
2191 | #endif /* VMXNET3_RSS */ | 2219 | #endif /* VMXNET3_RSS */ |
@@ -2948,9 +2976,13 @@ vmxnet3_probe_device(struct pci_dev *pdev, | |||
2948 | adapter->pdev = pdev; | 2976 | adapter->pdev = pdev; |
2949 | 2977 | ||
2950 | spin_lock_init(&adapter->cmd_lock); | 2978 | spin_lock_init(&adapter->cmd_lock); |
2951 | adapter->shared = pci_alloc_consistent(adapter->pdev, | 2979 | adapter->adapter_pa = dma_map_single(&adapter->pdev->dev, adapter, |
2952 | sizeof(struct Vmxnet3_DriverShared), | 2980 | sizeof(struct vmxnet3_adapter), |
2953 | &adapter->shared_pa); | 2981 | PCI_DMA_TODEVICE); |
2982 | adapter->shared = dma_alloc_coherent( | ||
2983 | &adapter->pdev->dev, | ||
2984 | sizeof(struct Vmxnet3_DriverShared), | ||
2985 | &adapter->shared_pa, GFP_KERNEL); | ||
2954 | if (!adapter->shared) { | 2986 | if (!adapter->shared) { |
2955 | dev_err(&pdev->dev, "Failed to allocate memory\n"); | 2987 | dev_err(&pdev->dev, "Failed to allocate memory\n"); |
2956 | err = -ENOMEM; | 2988 | err = -ENOMEM; |
@@ -2963,8 +2995,9 @@ vmxnet3_probe_device(struct pci_dev *pdev, | |||
2963 | 2995 | ||
2964 | size = sizeof(struct Vmxnet3_TxQueueDesc) * adapter->num_tx_queues; | 2996 | size = sizeof(struct Vmxnet3_TxQueueDesc) * adapter->num_tx_queues; |
2965 | size += sizeof(struct Vmxnet3_RxQueueDesc) * adapter->num_rx_queues; | 2997 | size += sizeof(struct Vmxnet3_RxQueueDesc) * adapter->num_rx_queues; |
2966 | adapter->tqd_start = pci_alloc_consistent(adapter->pdev, size, | 2998 | adapter->tqd_start = dma_alloc_coherent(&adapter->pdev->dev, size, |
2967 | &adapter->queue_desc_pa); | 2999 | &adapter->queue_desc_pa, |
3000 | GFP_KERNEL); | ||
2968 | 3001 | ||
2969 | if (!adapter->tqd_start) { | 3002 | if (!adapter->tqd_start) { |
2970 | dev_err(&pdev->dev, "Failed to allocate memory\n"); | 3003 | dev_err(&pdev->dev, "Failed to allocate memory\n"); |
@@ -2974,7 +3007,10 @@ vmxnet3_probe_device(struct pci_dev *pdev, | |||
2974 | adapter->rqd_start = (struct Vmxnet3_RxQueueDesc *)(adapter->tqd_start + | 3007 | adapter->rqd_start = (struct Vmxnet3_RxQueueDesc *)(adapter->tqd_start + |
2975 | adapter->num_tx_queues); | 3008 | adapter->num_tx_queues); |
2976 | 3009 | ||
2977 | adapter->pm_conf = kmalloc(sizeof(struct Vmxnet3_PMConf), GFP_KERNEL); | 3010 | adapter->pm_conf = dma_alloc_coherent(&adapter->pdev->dev, |
3011 | sizeof(struct Vmxnet3_PMConf), | ||
3012 | &adapter->pm_conf_pa, | ||
3013 | GFP_KERNEL); | ||
2978 | if (adapter->pm_conf == NULL) { | 3014 | if (adapter->pm_conf == NULL) { |
2979 | err = -ENOMEM; | 3015 | err = -ENOMEM; |
2980 | goto err_alloc_pm; | 3016 | goto err_alloc_pm; |
@@ -2982,7 +3018,10 @@ vmxnet3_probe_device(struct pci_dev *pdev, | |||
2982 | 3018 | ||
2983 | #ifdef VMXNET3_RSS | 3019 | #ifdef VMXNET3_RSS |
2984 | 3020 | ||
2985 | adapter->rss_conf = kmalloc(sizeof(struct UPT1_RSSConf), GFP_KERNEL); | 3021 | adapter->rss_conf = dma_alloc_coherent(&adapter->pdev->dev, |
3022 | sizeof(struct UPT1_RSSConf), | ||
3023 | &adapter->rss_conf_pa, | ||
3024 | GFP_KERNEL); | ||
2986 | if (adapter->rss_conf == NULL) { | 3025 | if (adapter->rss_conf == NULL) { |
2987 | err = -ENOMEM; | 3026 | err = -ENOMEM; |
2988 | goto err_alloc_rss; | 3027 | goto err_alloc_rss; |
@@ -3077,17 +3116,22 @@ err_ver: | |||
3077 | vmxnet3_free_pci_resources(adapter); | 3116 | vmxnet3_free_pci_resources(adapter); |
3078 | err_alloc_pci: | 3117 | err_alloc_pci: |
3079 | #ifdef VMXNET3_RSS | 3118 | #ifdef VMXNET3_RSS |
3080 | kfree(adapter->rss_conf); | 3119 | dma_free_coherent(&adapter->pdev->dev, sizeof(struct UPT1_RSSConf), |
3120 | adapter->rss_conf, adapter->rss_conf_pa); | ||
3081 | err_alloc_rss: | 3121 | err_alloc_rss: |
3082 | #endif | 3122 | #endif |
3083 | kfree(adapter->pm_conf); | 3123 | dma_free_coherent(&adapter->pdev->dev, sizeof(struct Vmxnet3_PMConf), |
3124 | adapter->pm_conf, adapter->pm_conf_pa); | ||
3084 | err_alloc_pm: | 3125 | err_alloc_pm: |
3085 | pci_free_consistent(adapter->pdev, size, adapter->tqd_start, | 3126 | dma_free_coherent(&adapter->pdev->dev, size, adapter->tqd_start, |
3086 | adapter->queue_desc_pa); | 3127 | adapter->queue_desc_pa); |
3087 | err_alloc_queue_desc: | 3128 | err_alloc_queue_desc: |
3088 | pci_free_consistent(adapter->pdev, sizeof(struct Vmxnet3_DriverShared), | 3129 | dma_free_coherent(&adapter->pdev->dev, |
3089 | adapter->shared, adapter->shared_pa); | 3130 | sizeof(struct Vmxnet3_DriverShared), |
3131 | adapter->shared, adapter->shared_pa); | ||
3090 | err_alloc_shared: | 3132 | err_alloc_shared: |
3133 | dma_unmap_single(&adapter->pdev->dev, adapter->adapter_pa, | ||
3134 | sizeof(struct vmxnet3_adapter), PCI_DMA_TODEVICE); | ||
3091 | pci_set_drvdata(pdev, NULL); | 3135 | pci_set_drvdata(pdev, NULL); |
3092 | free_netdev(netdev); | 3136 | free_netdev(netdev); |
3093 | return err; | 3137 | return err; |
@@ -3118,16 +3162,21 @@ vmxnet3_remove_device(struct pci_dev *pdev) | |||
3118 | vmxnet3_free_intr_resources(adapter); | 3162 | vmxnet3_free_intr_resources(adapter); |
3119 | vmxnet3_free_pci_resources(adapter); | 3163 | vmxnet3_free_pci_resources(adapter); |
3120 | #ifdef VMXNET3_RSS | 3164 | #ifdef VMXNET3_RSS |
3121 | kfree(adapter->rss_conf); | 3165 | dma_free_coherent(&adapter->pdev->dev, sizeof(struct UPT1_RSSConf), |
3166 | adapter->rss_conf, adapter->rss_conf_pa); | ||
3122 | #endif | 3167 | #endif |
3123 | kfree(adapter->pm_conf); | 3168 | dma_free_coherent(&adapter->pdev->dev, sizeof(struct Vmxnet3_PMConf), |
3169 | adapter->pm_conf, adapter->pm_conf_pa); | ||
3124 | 3170 | ||
3125 | size = sizeof(struct Vmxnet3_TxQueueDesc) * adapter->num_tx_queues; | 3171 | size = sizeof(struct Vmxnet3_TxQueueDesc) * adapter->num_tx_queues; |
3126 | size += sizeof(struct Vmxnet3_RxQueueDesc) * num_rx_queues; | 3172 | size += sizeof(struct Vmxnet3_RxQueueDesc) * num_rx_queues; |
3127 | pci_free_consistent(adapter->pdev, size, adapter->tqd_start, | 3173 | dma_free_coherent(&adapter->pdev->dev, size, adapter->tqd_start, |
3128 | adapter->queue_desc_pa); | 3174 | adapter->queue_desc_pa); |
3129 | pci_free_consistent(adapter->pdev, sizeof(struct Vmxnet3_DriverShared), | 3175 | dma_free_coherent(&adapter->pdev->dev, |
3130 | adapter->shared, adapter->shared_pa); | 3176 | sizeof(struct Vmxnet3_DriverShared), |
3177 | adapter->shared, adapter->shared_pa); | ||
3178 | dma_unmap_single(&adapter->pdev->dev, adapter->adapter_pa, | ||
3179 | sizeof(struct vmxnet3_adapter), PCI_DMA_TODEVICE); | ||
3131 | free_netdev(netdev); | 3180 | free_netdev(netdev); |
3132 | } | 3181 | } |
3133 | 3182 | ||
@@ -3227,8 +3276,8 @@ skip_arp: | |||
3227 | adapter->shared->devRead.pmConfDesc.confVer = cpu_to_le32(1); | 3276 | adapter->shared->devRead.pmConfDesc.confVer = cpu_to_le32(1); |
3228 | adapter->shared->devRead.pmConfDesc.confLen = cpu_to_le32(sizeof( | 3277 | adapter->shared->devRead.pmConfDesc.confLen = cpu_to_le32(sizeof( |
3229 | *pmConf)); | 3278 | *pmConf)); |
3230 | adapter->shared->devRead.pmConfDesc.confPA = cpu_to_le64(virt_to_phys( | 3279 | adapter->shared->devRead.pmConfDesc.confPA = |
3231 | pmConf)); | 3280 | cpu_to_le64(adapter->pm_conf_pa); |
3232 | 3281 | ||
3233 | spin_lock_irqsave(&adapter->cmd_lock, flags); | 3282 | spin_lock_irqsave(&adapter->cmd_lock, flags); |
3234 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, | 3283 | VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, |
@@ -3265,8 +3314,8 @@ vmxnet3_resume(struct device *device) | |||
3265 | adapter->shared->devRead.pmConfDesc.confVer = cpu_to_le32(1); | 3314 | adapter->shared->devRead.pmConfDesc.confVer = cpu_to_le32(1); |
3266 | adapter->shared->devRead.pmConfDesc.confLen = cpu_to_le32(sizeof( | 3315 | adapter->shared->devRead.pmConfDesc.confLen = cpu_to_le32(sizeof( |
3267 | *pmConf)); | 3316 | *pmConf)); |
3268 | adapter->shared->devRead.pmConfDesc.confPA = cpu_to_le64(virt_to_phys( | 3317 | adapter->shared->devRead.pmConfDesc.confPA = |
3269 | pmConf)); | 3318 | cpu_to_le64(adapter->pm_conf_pa); |
3270 | 3319 | ||
3271 | netif_device_attach(netdev); | 3320 | netif_device_attach(netdev); |
3272 | pci_set_power_state(pdev, PCI_D0); | 3321 | pci_set_power_state(pdev, PCI_D0); |
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index 35418146fa17..a03f358fd58b 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h | |||
@@ -70,10 +70,10 @@ | |||
70 | /* | 70 | /* |
71 | * Version numbers | 71 | * Version numbers |
72 | */ | 72 | */ |
73 | #define VMXNET3_DRIVER_VERSION_STRING "1.1.30.0-k" | 73 | #define VMXNET3_DRIVER_VERSION_STRING "1.2.0.0-k" |
74 | 74 | ||
75 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ | 75 | /* a 32-bit int, each byte encode a verion number in VMXNET3_DRIVER_VERSION */ |
76 | #define VMXNET3_DRIVER_VERSION_NUM 0x01011E00 | 76 | #define VMXNET3_DRIVER_VERSION_NUM 0x01020000 |
77 | 77 | ||
78 | #if defined(CONFIG_PCI_MSI) | 78 | #if defined(CONFIG_PCI_MSI) |
79 | /* RSS only makes sense if MSI-X is supported. */ | 79 | /* RSS only makes sense if MSI-X is supported. */ |
@@ -229,6 +229,7 @@ struct vmxnet3_tx_queue { | |||
229 | spinlock_t tx_lock; | 229 | spinlock_t tx_lock; |
230 | struct vmxnet3_cmd_ring tx_ring; | 230 | struct vmxnet3_cmd_ring tx_ring; |
231 | struct vmxnet3_tx_buf_info *buf_info; | 231 | struct vmxnet3_tx_buf_info *buf_info; |
232 | dma_addr_t buf_info_pa; | ||
232 | struct vmxnet3_tx_data_ring data_ring; | 233 | struct vmxnet3_tx_data_ring data_ring; |
233 | struct vmxnet3_comp_ring comp_ring; | 234 | struct vmxnet3_comp_ring comp_ring; |
234 | struct Vmxnet3_TxQueueCtrl *shared; | 235 | struct Vmxnet3_TxQueueCtrl *shared; |
@@ -277,6 +278,7 @@ struct vmxnet3_rx_queue { | |||
277 | u32 qid; /* rqID in RCD for buffer from 1st ring */ | 278 | u32 qid; /* rqID in RCD for buffer from 1st ring */ |
278 | u32 qid2; /* rqID in RCD for buffer from 2nd ring */ | 279 | u32 qid2; /* rqID in RCD for buffer from 2nd ring */ |
279 | struct vmxnet3_rx_buf_info *buf_info[2]; | 280 | struct vmxnet3_rx_buf_info *buf_info[2]; |
281 | dma_addr_t buf_info_pa; | ||
280 | struct Vmxnet3_RxQueueCtrl *shared; | 282 | struct Vmxnet3_RxQueueCtrl *shared; |
281 | struct vmxnet3_rq_driver_stats stats; | 283 | struct vmxnet3_rq_driver_stats stats; |
282 | } __attribute__((__aligned__(SMP_CACHE_BYTES))); | 284 | } __attribute__((__aligned__(SMP_CACHE_BYTES))); |
@@ -353,6 +355,10 @@ struct vmxnet3_adapter { | |||
353 | unsigned long state; /* VMXNET3_STATE_BIT_xxx */ | 355 | unsigned long state; /* VMXNET3_STATE_BIT_xxx */ |
354 | 356 | ||
355 | int share_intr; | 357 | int share_intr; |
358 | |||
359 | dma_addr_t adapter_pa; | ||
360 | dma_addr_t pm_conf_pa; | ||
361 | dma_addr_t rss_conf_pa; | ||
356 | }; | 362 | }; |
357 | 363 | ||
358 | #define VMXNET3_WRITE_BAR0_REG(adapter, reg, val) \ | 364 | #define VMXNET3_WRITE_BAR0_REG(adapter, reg, val) \ |