diff options
Diffstat (limited to 'drivers/net/pcnet32.c')
-rw-r--r-- | drivers/net/pcnet32.c | 87 |
1 files changed, 60 insertions, 27 deletions
diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c index 70fe81a89df9..be319229f543 100644 --- a/drivers/net/pcnet32.c +++ b/drivers/net/pcnet32.c | |||
@@ -22,8 +22,8 @@ | |||
22 | *************************************************************************/ | 22 | *************************************************************************/ |
23 | 23 | ||
24 | #define DRV_NAME "pcnet32" | 24 | #define DRV_NAME "pcnet32" |
25 | #define DRV_VERSION "1.31a" | 25 | #define DRV_VERSION "1.31c" |
26 | #define DRV_RELDATE "12.Sep.2005" | 26 | #define DRV_RELDATE "01.Nov.2005" |
27 | #define PFX DRV_NAME ": " | 27 | #define PFX DRV_NAME ": " |
28 | 28 | ||
29 | static const char *version = | 29 | static const char *version = |
@@ -260,6 +260,11 @@ static int homepna[MAX_UNITS]; | |||
260 | * v1.31 02 Sep 2005 Hubert WS Lin <wslin@tw.ibm.c0m> added set_ringparam(). | 260 | * v1.31 02 Sep 2005 Hubert WS Lin <wslin@tw.ibm.c0m> added set_ringparam(). |
261 | * v1.31a 12 Sep 2005 Hubert WS Lin <wslin@tw.ibm.c0m> set min ring size to 4 | 261 | * v1.31a 12 Sep 2005 Hubert WS Lin <wslin@tw.ibm.c0m> set min ring size to 4 |
262 | * to allow loopback test to work unchanged. | 262 | * to allow loopback test to work unchanged. |
263 | * v1.31b 06 Oct 2005 Don Fry changed alloc_ring to show name of device | ||
264 | * if allocation fails | ||
265 | * v1.31c 01 Nov 2005 Don Fry Allied Telesyn 2700/2701 FX are 100Mbit only. | ||
266 | * Force 100Mbit FD if Auto (ASEL) is selected. | ||
267 | * See Bugzilla 2669 and 4551. | ||
263 | */ | 268 | */ |
264 | 269 | ||
265 | 270 | ||
@@ -408,7 +413,7 @@ static int pcnet32_get_regs_len(struct net_device *dev); | |||
408 | static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, | 413 | static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, |
409 | void *ptr); | 414 | void *ptr); |
410 | static void pcnet32_purge_tx_ring(struct net_device *dev); | 415 | static void pcnet32_purge_tx_ring(struct net_device *dev); |
411 | static int pcnet32_alloc_ring(struct net_device *dev); | 416 | static int pcnet32_alloc_ring(struct net_device *dev, char *name); |
412 | static void pcnet32_free_ring(struct net_device *dev); | 417 | static void pcnet32_free_ring(struct net_device *dev); |
413 | 418 | ||
414 | 419 | ||
@@ -669,15 +674,17 @@ static int pcnet32_set_ringparam(struct net_device *dev, struct ethtool_ringpara | |||
669 | lp->rx_mod_mask = lp->rx_ring_size - 1; | 674 | lp->rx_mod_mask = lp->rx_ring_size - 1; |
670 | lp->rx_len_bits = (i << 4); | 675 | lp->rx_len_bits = (i << 4); |
671 | 676 | ||
672 | if (pcnet32_alloc_ring(dev)) { | 677 | if (pcnet32_alloc_ring(dev, dev->name)) { |
673 | pcnet32_free_ring(dev); | 678 | pcnet32_free_ring(dev); |
679 | spin_unlock_irqrestore(&lp->lock, flags); | ||
674 | return -ENOMEM; | 680 | return -ENOMEM; |
675 | } | 681 | } |
676 | 682 | ||
677 | spin_unlock_irqrestore(&lp->lock, flags); | 683 | spin_unlock_irqrestore(&lp->lock, flags); |
678 | 684 | ||
679 | if (pcnet32_debug & NETIF_MSG_DRV) | 685 | if (pcnet32_debug & NETIF_MSG_DRV) |
680 | printk(KERN_INFO PFX "Ring Param Settings: RX: %d, TX: %d\n", lp->rx_ring_size, lp->tx_ring_size); | 686 | printk(KERN_INFO PFX "%s: Ring Param Settings: RX: %d, TX: %d\n", |
687 | dev->name, lp->rx_ring_size, lp->tx_ring_size); | ||
681 | 688 | ||
682 | if (netif_running(dev)) | 689 | if (netif_running(dev)) |
683 | pcnet32_open(dev); | 690 | pcnet32_open(dev); |
@@ -981,7 +988,11 @@ static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, | |||
981 | *buff++ = a->read_csr(ioaddr, 114); | 988 | *buff++ = a->read_csr(ioaddr, 114); |
982 | 989 | ||
983 | /* read bus configuration registers */ | 990 | /* read bus configuration registers */ |
984 | for (i=0; i<36; i++) { | 991 | for (i=0; i<30; i++) { |
992 | *buff++ = a->read_bcr(ioaddr, i); | ||
993 | } | ||
994 | *buff++ = 0; /* skip bcr30 so as not to hang 79C976 */ | ||
995 | for (i=31; i<36; i++) { | ||
985 | *buff++ = a->read_bcr(ioaddr, i); | 996 | *buff++ = a->read_bcr(ioaddr, i); |
986 | } | 997 | } |
987 | 998 | ||
@@ -1340,7 +1351,8 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
1340 | } | 1351 | } |
1341 | lp->a = *a; | 1352 | lp->a = *a; |
1342 | 1353 | ||
1343 | if (pcnet32_alloc_ring(dev)) { | 1354 | /* prior to register_netdev, dev->name is not yet correct */ |
1355 | if (pcnet32_alloc_ring(dev, pci_name(lp->pci_dev))) { | ||
1344 | ret = -ENOMEM; | 1356 | ret = -ENOMEM; |
1345 | goto err_free_ring; | 1357 | goto err_free_ring; |
1346 | } | 1358 | } |
@@ -1448,48 +1460,63 @@ err_release_region: | |||
1448 | } | 1460 | } |
1449 | 1461 | ||
1450 | 1462 | ||
1451 | static int pcnet32_alloc_ring(struct net_device *dev) | 1463 | /* if any allocation fails, caller must also call pcnet32_free_ring */ |
1464 | static int pcnet32_alloc_ring(struct net_device *dev, char *name) | ||
1452 | { | 1465 | { |
1453 | struct pcnet32_private *lp = dev->priv; | 1466 | struct pcnet32_private *lp = dev->priv; |
1454 | 1467 | ||
1455 | if ((lp->tx_ring = pci_alloc_consistent(lp->pci_dev, sizeof(struct pcnet32_tx_head) * lp->tx_ring_size, | 1468 | lp->tx_ring = pci_alloc_consistent(lp->pci_dev, |
1456 | &lp->tx_ring_dma_addr)) == NULL) { | 1469 | sizeof(struct pcnet32_tx_head) * lp->tx_ring_size, |
1470 | &lp->tx_ring_dma_addr); | ||
1471 | if (lp->tx_ring == NULL) { | ||
1457 | if (pcnet32_debug & NETIF_MSG_DRV) | 1472 | if (pcnet32_debug & NETIF_MSG_DRV) |
1458 | printk(KERN_ERR PFX "Consistent memory allocation failed.\n"); | 1473 | printk("\n" KERN_ERR PFX "%s: Consistent memory allocation failed.\n", |
1474 | name); | ||
1459 | return -ENOMEM; | 1475 | return -ENOMEM; |
1460 | } | 1476 | } |
1461 | 1477 | ||
1462 | if ((lp->rx_ring = pci_alloc_consistent(lp->pci_dev, sizeof(struct pcnet32_rx_head) * lp->rx_ring_size, | 1478 | lp->rx_ring = pci_alloc_consistent(lp->pci_dev, |
1463 | &lp->rx_ring_dma_addr)) == NULL) { | 1479 | sizeof(struct pcnet32_rx_head) * lp->rx_ring_size, |
1480 | &lp->rx_ring_dma_addr); | ||
1481 | if (lp->rx_ring == NULL) { | ||
1464 | if (pcnet32_debug & NETIF_MSG_DRV) | 1482 | if (pcnet32_debug & NETIF_MSG_DRV) |
1465 | printk(KERN_ERR PFX "Consistent memory allocation failed.\n"); | 1483 | printk("\n" KERN_ERR PFX "%s: Consistent memory allocation failed.\n", |
1484 | name); | ||
1466 | return -ENOMEM; | 1485 | return -ENOMEM; |
1467 | } | 1486 | } |
1468 | 1487 | ||
1469 | if (!(lp->tx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->tx_ring_size, GFP_ATOMIC))) { | 1488 | lp->tx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->tx_ring_size, |
1489 | GFP_ATOMIC); | ||
1490 | if (!lp->tx_dma_addr) { | ||
1470 | if (pcnet32_debug & NETIF_MSG_DRV) | 1491 | if (pcnet32_debug & NETIF_MSG_DRV) |
1471 | printk(KERN_ERR PFX "Memory allocation failed.\n"); | 1492 | printk("\n" KERN_ERR PFX "%s: Memory allocation failed.\n", name); |
1472 | return -ENOMEM; | 1493 | return -ENOMEM; |
1473 | } | 1494 | } |
1474 | memset(lp->tx_dma_addr, 0, sizeof(dma_addr_t) * lp->tx_ring_size); | 1495 | memset(lp->tx_dma_addr, 0, sizeof(dma_addr_t) * lp->tx_ring_size); |
1475 | 1496 | ||
1476 | if (!(lp->rx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->rx_ring_size, GFP_ATOMIC))) { | 1497 | lp->rx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->rx_ring_size, |
1498 | GFP_ATOMIC); | ||
1499 | if (!lp->rx_dma_addr) { | ||
1477 | if (pcnet32_debug & NETIF_MSG_DRV) | 1500 | if (pcnet32_debug & NETIF_MSG_DRV) |
1478 | printk(KERN_ERR PFX "Memory allocation failed.\n"); | 1501 | printk("\n" KERN_ERR PFX "%s: Memory allocation failed.\n", name); |
1479 | return -ENOMEM; | 1502 | return -ENOMEM; |
1480 | } | 1503 | } |
1481 | memset(lp->rx_dma_addr, 0, sizeof(dma_addr_t) * lp->rx_ring_size); | 1504 | memset(lp->rx_dma_addr, 0, sizeof(dma_addr_t) * lp->rx_ring_size); |
1482 | 1505 | ||
1483 | if (!(lp->tx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->tx_ring_size, GFP_ATOMIC))) { | 1506 | lp->tx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->tx_ring_size, |
1507 | GFP_ATOMIC); | ||
1508 | if (!lp->tx_skbuff) { | ||
1484 | if (pcnet32_debug & NETIF_MSG_DRV) | 1509 | if (pcnet32_debug & NETIF_MSG_DRV) |
1485 | printk(KERN_ERR PFX "Memory allocation failed.\n"); | 1510 | printk("\n" KERN_ERR PFX "%s: Memory allocation failed.\n", name); |
1486 | return -ENOMEM; | 1511 | return -ENOMEM; |
1487 | } | 1512 | } |
1488 | memset(lp->tx_skbuff, 0, sizeof(struct sk_buff *) * lp->tx_ring_size); | 1513 | memset(lp->tx_skbuff, 0, sizeof(struct sk_buff *) * lp->tx_ring_size); |
1489 | 1514 | ||
1490 | if (!(lp->rx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->rx_ring_size, GFP_ATOMIC))) { | 1515 | lp->rx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->rx_ring_size, |
1516 | GFP_ATOMIC); | ||
1517 | if (!lp->rx_skbuff) { | ||
1491 | if (pcnet32_debug & NETIF_MSG_DRV) | 1518 | if (pcnet32_debug & NETIF_MSG_DRV) |
1492 | printk(KERN_ERR PFX "Memory allocation failed.\n"); | 1519 | printk("\n" KERN_ERR PFX "%s: Memory allocation failed.\n", name); |
1493 | return -ENOMEM; | 1520 | return -ENOMEM; |
1494 | } | 1521 | } |
1495 | memset(lp->rx_skbuff, 0, sizeof(struct sk_buff *) * lp->rx_ring_size); | 1522 | memset(lp->rx_skbuff, 0, sizeof(struct sk_buff *) * lp->rx_ring_size); |
@@ -1592,12 +1619,18 @@ pcnet32_open(struct net_device *dev) | |||
1592 | val |= 0x10; | 1619 | val |= 0x10; |
1593 | lp->a.write_csr (ioaddr, 124, val); | 1620 | lp->a.write_csr (ioaddr, 124, val); |
1594 | 1621 | ||
1595 | /* Allied Telesyn AT 2700/2701 FX looses the link, so skip that */ | 1622 | /* Allied Telesyn AT 2700/2701 FX are 100Mbit only and do not negotiate */ |
1596 | if (lp->pci_dev->subsystem_vendor == PCI_VENDOR_ID_AT && | 1623 | if (lp->pci_dev->subsystem_vendor == PCI_VENDOR_ID_AT && |
1597 | (lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2700FX || | 1624 | (lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2700FX || |
1598 | lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2701FX)) { | 1625 | lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2701FX)) { |
1599 | printk(KERN_DEBUG "%s: Skipping PHY selection.\n", dev->name); | 1626 | if (lp->options & PCNET32_PORT_ASEL) { |
1600 | } else { | 1627 | lp->options = PCNET32_PORT_FD | PCNET32_PORT_100; |
1628 | if (netif_msg_link(lp)) | ||
1629 | printk(KERN_DEBUG "%s: Setting 100Mb-Full Duplex.\n", | ||
1630 | dev->name); | ||
1631 | } | ||
1632 | } | ||
1633 | { | ||
1601 | /* | 1634 | /* |
1602 | * 24 Jun 2004 according AMD, in order to change the PHY, | 1635 | * 24 Jun 2004 according AMD, in order to change the PHY, |
1603 | * DANAS (or DISPM for 79C976) must be set; then select the speed, | 1636 | * DANAS (or DISPM for 79C976) must be set; then select the speed, |