* [PATCH 0/4] enic: review updates and bug fixes
@ 2008-09-24 18:23 Scott Feldman
2008-09-24 18:23 ` [PATCH 1/4] enic: Don't indicate IPv6 pkts using soft-LRO Scott Feldman
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Scott Feldman @ 2008-09-24 18:23 UTC (permalink / raw)
To: jgarzik; +Cc: netdev
Jeff,
The following series implements...
- don't indicate IPv6 pkts using soft-LRO
- fixes for review items from Ben Hutchings
- bug fix: Free MSI intr with correct data handle
- bug fix: don't set netdev->name too early
Signed-off-by: Scott Feldman <scofeldm@cisco.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/4] enic: Don't indicate IPv6 pkts using soft-LRO
2008-09-24 18:23 [PATCH 0/4] enic: review updates and bug fixes Scott Feldman
@ 2008-09-24 18:23 ` Scott Feldman
2008-09-24 18:23 ` [PATCH 2/4] enic: fixes for review items from Ben Hutchings Scott Feldman
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Scott Feldman @ 2008-09-24 18:23 UTC (permalink / raw)
To: jgarzik; +Cc: netdev
enic: Don't indicate IPv6 pkts using soft-LRO
LRO is only applied to IPv4 pkts, so don't use the LRO indication functions
for anything other IPv4 pkts. Every non-IPv4 pkt is indicated using non-
LRO functions.
Signed-off-by: Scott Feldman <scofeldm@cisco.com>
---
drivers/net/enic/enic_main.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index 2592e52..6284594 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -942,7 +942,7 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq,
if (enic->vlan_group && vlan_stripped) {
- if (ENIC_SETTING(enic, LRO))
+ if (ENIC_SETTING(enic, LRO) && ipv4)
lro_vlan_hwaccel_receive_skb(&enic->lro_mgr,
skb, enic->vlan_group,
vlan, cq_desc);
@@ -952,7 +952,7 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq,
} else {
- if (ENIC_SETTING(enic, LRO))
+ if (ENIC_SETTING(enic, LRO) && ipv4)
lro_receive_skb(&enic->lro_mgr, skb, cq_desc);
else
netif_receive_skb(skb);
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/4] enic: fixes for review items from Ben Hutchings
2008-09-24 18:23 [PATCH 0/4] enic: review updates and bug fixes Scott Feldman
2008-09-24 18:23 ` [PATCH 1/4] enic: Don't indicate IPv6 pkts using soft-LRO Scott Feldman
@ 2008-09-24 18:23 ` Scott Feldman
2008-09-24 18:23 ` [PATCH 3/4] enic: Bug fix: Free MSI intr with correct data handle Scott Feldman
2008-09-24 18:23 ` [PATCH 4/4] enic: bug fix: don't set netdev->name too early Scott Feldman
3 siblings, 0 replies; 6+ messages in thread
From: Scott Feldman @ 2008-09-24 18:23 UTC (permalink / raw)
To: jgarzik; +Cc: netdev
enic: fixes for review items from Ben Hutchings
Fixes for review items from Ben Hutchings:
- use netdev->net_stats rather than private net_stats
- use ethtool op .get_sset_count rather than .get_stats_count
- err out if setting Tx/Rx csum or TSO using ethtool and setting is
not enabled for device.
- pass in jiffies + constant to round_jiffies
- return err if new MTU is out-of-bounds
Signed-off-by: Scott Feldman <scofeldm@cisco.com>
---
drivers/net/enic/enic.h | 1 -
drivers/net/enic/enic_main.c | 62 +++++++++++++++++++++++++-----------------
2 files changed, 37 insertions(+), 26 deletions(-)
diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h
index fb83c92..9e0d484 100644
--- a/drivers/net/enic/enic.h
+++ b/drivers/net/enic/enic.h
@@ -75,7 +75,6 @@ struct enic {
struct vnic_enet_config config;
struct vnic_dev_bar bar0;
struct vnic_dev *vdev;
- struct net_device_stats net_stats;
struct timer_list notify_timer;
struct work_struct reset;
struct msix_entry msix_entry[ENIC_MSIX_MAX];
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index 6284594..c741bbf 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -44,7 +44,6 @@
#include "enic.h"
#define ENIC_NOTIFY_TIMER_PERIOD (2 * HZ)
-#define ENIC_JUMBO_FIRST_BUF_SIZE 256
/* Supported devices */
static struct pci_device_id enic_id_table[] = {
@@ -168,9 +167,14 @@ static void enic_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
}
}
-static int enic_get_stats_count(struct net_device *netdev)
+static int enic_get_sset_count(struct net_device *netdev, int sset)
{
- return enic_n_tx_stats + enic_n_rx_stats;
+ switch (sset) {
+ case ETH_SS_STATS:
+ return enic_n_tx_stats + enic_n_rx_stats;
+ default:
+ return -EOPNOTSUPP;
+ }
}
static void enic_get_ethtool_stats(struct net_device *netdev,
@@ -200,8 +204,10 @@ static int enic_set_rx_csum(struct net_device *netdev, u32 data)
{
struct enic *enic = netdev_priv(netdev);
- enic->csum_rx_enabled =
- (data && ENIC_SETTING(enic, RXCSUM)) ? 1 : 0;
+ if (data && !ENIC_SETTING(enic, RXCSUM))
+ return -EINVAL;
+
+ enic->csum_rx_enabled = !!data;
return 0;
}
@@ -210,7 +216,10 @@ static int enic_set_tx_csum(struct net_device *netdev, u32 data)
{
struct enic *enic = netdev_priv(netdev);
- if (data && ENIC_SETTING(enic, TXCSUM))
+ if (data && !ENIC_SETTING(enic, TXCSUM))
+ return -EINVAL;
+
+ if (data)
netdev->features |= NETIF_F_HW_CSUM;
else
netdev->features &= ~NETIF_F_HW_CSUM;
@@ -222,7 +231,10 @@ static int enic_set_tso(struct net_device *netdev, u32 data)
{
struct enic *enic = netdev_priv(netdev);
- if (data && ENIC_SETTING(enic, TSO))
+ if (data && !ENIC_SETTING(enic, TSO))
+ return -EINVAL;
+
+ if (data)
netdev->features |=
NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_TSO_ECN;
else
@@ -251,7 +263,7 @@ static struct ethtool_ops enic_ethtool_ops = {
.set_msglevel = enic_set_msglevel,
.get_link = ethtool_op_get_link,
.get_strings = enic_get_strings,
- .get_stats_count = enic_get_stats_count,
+ .get_sset_count = enic_get_sset_count,
.get_ethtool_stats = enic_get_ethtool_stats,
.get_rx_csum = enic_get_rx_csum,
.set_rx_csum = enic_set_rx_csum,
@@ -653,25 +665,26 @@ static int enic_hard_start_xmit(struct sk_buff *skb, struct net_device *netdev)
static struct net_device_stats *enic_get_stats(struct net_device *netdev)
{
struct enic *enic = netdev_priv(netdev);
+ struct net_device_stats *net_stats = &netdev->stats;
struct vnic_stats *stats;
spin_lock(&enic->devcmd_lock);
vnic_dev_stats_dump(enic->vdev, &stats);
spin_unlock(&enic->devcmd_lock);
- enic->net_stats.tx_packets = stats->tx.tx_frames_ok;
- enic->net_stats.tx_bytes = stats->tx.tx_bytes_ok;
- enic->net_stats.tx_errors = stats->tx.tx_errors;
- enic->net_stats.tx_dropped = stats->tx.tx_drops;
+ net_stats->tx_packets = stats->tx.tx_frames_ok;
+ net_stats->tx_bytes = stats->tx.tx_bytes_ok;
+ net_stats->tx_errors = stats->tx.tx_errors;
+ net_stats->tx_dropped = stats->tx.tx_drops;
- enic->net_stats.rx_packets = stats->rx.rx_frames_ok;
- enic->net_stats.rx_bytes = stats->rx.rx_bytes_ok;
- enic->net_stats.rx_errors = stats->rx.rx_errors;
- enic->net_stats.multicast = stats->rx.rx_multicast_frames_ok;
- enic->net_stats.rx_crc_errors = stats->rx.rx_crc_errors;
- enic->net_stats.rx_dropped = stats->rx.rx_no_bufs;
+ net_stats->rx_packets = stats->rx.rx_frames_ok;
+ net_stats->rx_bytes = stats->rx.rx_bytes_ok;
+ net_stats->rx_errors = stats->rx.rx_errors;
+ net_stats->multicast = stats->rx.rx_multicast_frames_ok;
+ net_stats->rx_crc_errors = stats->rx.rx_crc_errors;
+ net_stats->rx_dropped = stats->rx.rx_no_bufs;
- return &enic->net_stats;
+ return net_stats;
}
static void enic_reset_mcaddrs(struct enic *enic)
@@ -1110,7 +1123,8 @@ static void enic_notify_timer(unsigned long data)
enic_notify_check(enic);
- mod_timer(&enic->notify_timer, round_jiffies(ENIC_NOTIFY_TIMER_PERIOD));
+ mod_timer(&enic->notify_timer,
+ round_jiffies(jiffies + ENIC_NOTIFY_TIMER_PERIOD));
}
static void enic_free_intr(struct enic *enic)
@@ -1314,14 +1328,12 @@ static int enic_change_mtu(struct net_device *netdev, int new_mtu)
struct enic *enic = netdev_priv(netdev);
int running = netif_running(netdev);
+ if (new_mtu < ENIC_MIN_MTU || new_mtu > ENIC_MAX_MTU)
+ return -EINVAL;
+
if (running)
enic_stop(netdev);
- if (new_mtu < ENIC_MIN_MTU)
- new_mtu = ENIC_MIN_MTU;
- if (new_mtu > ENIC_MAX_MTU)
- new_mtu = ENIC_MAX_MTU;
-
netdev->mtu = new_mtu;
if (netdev->mtu > enic->port_mtu)
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/4] enic: Bug fix: Free MSI intr with correct data handle
2008-09-24 18:23 [PATCH 0/4] enic: review updates and bug fixes Scott Feldman
2008-09-24 18:23 ` [PATCH 1/4] enic: Don't indicate IPv6 pkts using soft-LRO Scott Feldman
2008-09-24 18:23 ` [PATCH 2/4] enic: fixes for review items from Ben Hutchings Scott Feldman
@ 2008-09-24 18:23 ` Scott Feldman
2008-09-24 18:23 ` [PATCH 4/4] enic: bug fix: don't set netdev->name too early Scott Feldman
3 siblings, 0 replies; 6+ messages in thread
From: Scott Feldman @ 2008-09-24 18:23 UTC (permalink / raw)
To: jgarzik; +Cc: netdev
enic: Bug fix: Free MSI intr with correct data handle
Bug fix: Free MSI intr with correct data handle
Use davem proposed naming for MSI-X tx/rx vectors (ethX-tx-0, ethX-rx-0)
Signed-off-by: Scott Feldman <scofeldm@cisco.com>
---
drivers/net/enic/enic_main.c | 8 +++++---
1 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index c741bbf..14e59a7 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -1134,9 +1134,11 @@ static void enic_free_intr(struct enic *enic)
switch (vnic_dev_get_intr_mode(enic->vdev)) {
case VNIC_DEV_INTR_MODE_INTX:
- case VNIC_DEV_INTR_MODE_MSI:
free_irq(enic->pdev->irq, netdev);
break;
+ case VNIC_DEV_INTR_MODE_MSI:
+ free_irq(enic->pdev->irq, enic);
+ break;
case VNIC_DEV_INTR_MODE_MSIX:
for (i = 0; i < ARRAY_SIZE(enic->msix); i++)
if (enic->msix[i].requested)
@@ -1171,12 +1173,12 @@ static int enic_request_intr(struct enic *enic)
case VNIC_DEV_INTR_MODE_MSIX:
sprintf(enic->msix[ENIC_MSIX_RQ].devname,
- "%.11s-rx", netdev->name);
+ "%.11s-rx-0", netdev->name);
enic->msix[ENIC_MSIX_RQ].isr = enic_isr_msix_rq;
enic->msix[ENIC_MSIX_RQ].devid = enic;
sprintf(enic->msix[ENIC_MSIX_WQ].devname,
- "%.11s-tx", netdev->name);
+ "%.11s-tx-0", netdev->name);
enic->msix[ENIC_MSIX_WQ].isr = enic_isr_msix_wq;
enic->msix[ENIC_MSIX_WQ].devid = enic;
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 4/4] enic: bug fix: don't set netdev->name too early
2008-09-24 18:23 [PATCH 0/4] enic: review updates and bug fixes Scott Feldman
` (2 preceding siblings ...)
2008-09-24 18:23 ` [PATCH 3/4] enic: Bug fix: Free MSI intr with correct data handle Scott Feldman
@ 2008-09-24 18:23 ` Scott Feldman
2008-09-25 0:51 ` Jeff Garzik
3 siblings, 1 reply; 6+ messages in thread
From: Scott Feldman @ 2008-09-24 18:23 UTC (permalink / raw)
To: jgarzik; +Cc: netdev
enic: bug fix: don't set netdev->name too early
Bug fix: don't set netdev->name early before netdev registration. Setting
netdev->name early with dev_alloc_name() would occasionally cause netdev
registration to fail returning error that device was already registered.
Since we're using netdev->name to name MSI-X vectors, we now need to
move the request_irq after netdev registartion, so move it to ->open.
Signed-off-by: Scott Feldman <scofeldm@cisco.com>
---
drivers/net/enic/enic.h | 2 -
drivers/net/enic/enic_main.c | 121 ++++++++++++++++--------------------------
2 files changed, 47 insertions(+), 76 deletions(-)
diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h
index 9e0d484..7f677e8 100644
--- a/drivers/net/enic/enic.h
+++ b/drivers/net/enic/enic.h
@@ -33,7 +33,7 @@
#define DRV_NAME "enic"
#define DRV_DESCRIPTION "Cisco 10G Ethernet Driver"
-#define DRV_VERSION "0.0.1.18163.472"
+#define DRV_VERSION "0.0.1-18163.472-k1"
#define DRV_COPYRIGHT "Copyright 2008 Cisco Systems, Inc"
#define PFX DRV_NAME ": "
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index 14e59a7..180e968 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -1251,13 +1251,28 @@ static int enic_open(struct net_device *netdev)
unsigned int i;
int err;
+ err = enic_request_intr(enic);
+ if (err) {
+ printk(KERN_ERR PFX "%s: Unable to request irq.\n",
+ netdev->name);
+ return err;
+ }
+
+ err = enic_notify_set(enic);
+ if (err) {
+ printk(KERN_ERR PFX
+ "%s: Failed to alloc notify buffer, aborting.\n",
+ netdev->name);
+ goto err_out_free_intr;
+ }
+
for (i = 0; i < enic->rq_count; i++) {
err = vnic_rq_fill(&enic->rq[i], enic_rq_alloc_buf);
if (err) {
printk(KERN_ERR PFX
"%s: Unable to alloc receive buffers.\n",
netdev->name);
- return err;
+ goto err_out_notify_unset;
}
}
@@ -1279,6 +1294,13 @@ static int enic_open(struct net_device *netdev)
enic_notify_timer_start(enic);
return 0;
+
+err_out_notify_unset:
+ vnic_dev_notify_unset(enic->vdev);
+err_out_free_intr:
+ enic_free_intr(enic);
+
+ return err;
}
/* rtnl lock is held, process context */
@@ -1308,6 +1330,9 @@ static int enic_stop(struct net_device *netdev)
return err;
}
+ vnic_dev_notify_unset(enic->vdev);
+ enic_free_intr(enic);
+
(void)vnic_cq_service(&enic->cq[ENIC_CQ_RQ],
-1, enic_rq_service_drop, NULL);
(void)vnic_cq_service(&enic->cq[ENIC_CQ_WQ],
@@ -1593,18 +1618,6 @@ static int __devinit enic_probe(struct pci_dev *pdev,
return -ENOMEM;
}
- /* Set the netdev name early so intr vectors are properly
- * named and any error msgs can include netdev->name
- */
-
- rtnl_lock();
- err = dev_alloc_name(netdev, netdev->name);
- rtnl_unlock();
- if (err < 0) {
- printk(KERN_ERR PFX "Unable to allocate netdev name.\n");
- goto err_out_free_netdev;
- }
-
pci_set_drvdata(pdev, netdev);
SET_NETDEV_DEV(netdev, &pdev->dev);
@@ -1619,16 +1632,14 @@ static int __devinit enic_probe(struct pci_dev *pdev,
err = pci_enable_device(pdev);
if (err) {
printk(KERN_ERR PFX
- "%s: Cannot enable PCI device, aborting.\n",
- netdev->name);
+ "Cannot enable PCI device, aborting.\n");
goto err_out_free_netdev;
}
err = pci_request_regions(pdev, DRV_NAME);
if (err) {
printk(KERN_ERR PFX
- "%s: Cannot request PCI regions, aborting.\n",
- netdev->name);
+ "Cannot request PCI regions, aborting.\n");
goto err_out_disable_device;
}
@@ -1644,25 +1655,22 @@ static int __devinit enic_probe(struct pci_dev *pdev,
err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
if (err) {
printk(KERN_ERR PFX
- "%s: No usable DMA configuration, aborting.\n",
- netdev->name);
+ "No usable DMA configuration, aborting.\n");
goto err_out_release_regions;
}
err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
if (err) {
printk(KERN_ERR PFX
- "%s: Unable to obtain 32-bit DMA "
- "for consistent allocations, aborting.\n",
- netdev->name);
+ "Unable to obtain 32-bit DMA "
+ "for consistent allocations, aborting.\n");
goto err_out_release_regions;
}
} else {
err = pci_set_consistent_dma_mask(pdev, DMA_40BIT_MASK);
if (err) {
printk(KERN_ERR PFX
- "%s: Unable to obtain 40-bit DMA "
- "for consistent allocations, aborting.\n",
- netdev->name);
+ "Unable to obtain 40-bit DMA "
+ "for consistent allocations, aborting.\n");
goto err_out_release_regions;
}
using_dac = 1;
@@ -1673,8 +1681,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
printk(KERN_ERR PFX
- "%s: BAR0 not memory-map'able, aborting.\n",
- netdev->name);
+ "BAR0 not memory-map'able, aborting.\n");
err = -ENODEV;
goto err_out_release_regions;
}
@@ -1685,8 +1692,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
if (!enic->bar0.vaddr) {
printk(KERN_ERR PFX
- "%s: Cannot memory-map BAR0 res hdr, aborting.\n",
- netdev->name);
+ "Cannot memory-map BAR0 res hdr, aborting.\n");
err = -ENODEV;
goto err_out_release_regions;
}
@@ -1697,8 +1703,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
enic->vdev = vnic_dev_register(NULL, enic, pdev, &enic->bar0);
if (!enic->vdev) {
printk(KERN_ERR PFX
- "%s: vNIC registration failed, aborting.\n",
- netdev->name);
+ "vNIC registration failed, aborting.\n");
err = -ENODEV;
goto err_out_iounmap;
}
@@ -1709,8 +1714,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
err = enic_dev_open(enic);
if (err) {
printk(KERN_ERR PFX
- "%s: vNIC dev open failed, aborting.\n",
- netdev->name);
+ "vNIC dev open failed, aborting.\n");
goto err_out_vnic_unregister;
}
@@ -1727,8 +1731,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
err = vnic_dev_init(enic->vdev, 0);
if (err) {
printk(KERN_ERR PFX
- "%s: vNIC dev init failed, aborting.\n",
- netdev->name);
+ "vNIC dev init failed, aborting.\n");
goto err_out_dev_close;
}
@@ -1738,8 +1741,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
err = enic_get_vnic_config(enic);
if (err) {
printk(KERN_ERR PFX
- "%s: Get vNIC configuration failed, aborting.\n",
- netdev->name);
+ "Get vNIC configuration failed, aborting.\n");
goto err_out_dev_close;
}
@@ -1755,18 +1757,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
err = enic_set_intr_mode(enic);
if (err) {
printk(KERN_ERR PFX
- "%s: Failed to set intr mode, aborting.\n",
- netdev->name);
- goto err_out_dev_close;
- }
-
- /* Request interrupt vector(s)
- */
-
- err = enic_request_intr(enic);
- if (err) {
- printk(KERN_ERR PFX "%s: Unable to request irq.\n",
- netdev->name);
+ "Failed to set intr mode, aborting.\n");
goto err_out_dev_close;
}
@@ -1776,8 +1767,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
err = enic_alloc_vnic_resources(enic);
if (err) {
printk(KERN_ERR PFX
- "%s: Failed to alloc vNIC resources, aborting.\n",
- netdev->name);
+ "Failed to alloc vNIC resources, aborting.\n");
goto err_out_free_vnic_resources;
}
@@ -1793,19 +1783,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
ig_vlan_strip_en);
if (err) {
printk(KERN_ERR PFX
- "%s: Failed to config nic, aborting.\n",
- netdev->name);
- goto err_out_free_vnic_resources;
- }
-
- /* Setup notification buffer area
- */
-
- err = enic_notify_set(enic);
- if (err) {
- printk(KERN_ERR PFX
- "%s: Failed to alloc notify buffer, aborting.\n",
- netdev->name);
+ "Failed to config nic, aborting.\n");
goto err_out_free_vnic_resources;
}
@@ -1832,9 +1810,8 @@ static int __devinit enic_probe(struct pci_dev *pdev,
err = enic_set_mac_addr(netdev, enic->mac_addr);
if (err) {
printk(KERN_ERR PFX
- "%s: Invalid MAC address, aborting.\n",
- netdev->name);
- goto err_out_notify_unset;
+ "Invalid MAC address, aborting.\n");
+ goto err_out_free_vnic_resources;
}
netdev->open = enic_open;
@@ -1888,18 +1865,14 @@ static int __devinit enic_probe(struct pci_dev *pdev,
err = register_netdev(netdev);
if (err) {
printk(KERN_ERR PFX
- "%s: Cannot register net device, aborting.\n",
- netdev->name);
- goto err_out_notify_unset;
+ "Cannot register net device, aborting.\n");
+ goto err_out_free_vnic_resources;
}
return 0;
-err_out_notify_unset:
- vnic_dev_notify_unset(enic->vdev);
err_out_free_vnic_resources:
enic_free_vnic_resources(enic);
- enic_free_intr(enic);
err_out_dev_close:
vnic_dev_close(enic->vdev);
err_out_vnic_unregister:
@@ -1927,9 +1900,7 @@ static void __devexit enic_remove(struct pci_dev *pdev)
flush_scheduled_work();
unregister_netdev(netdev);
- vnic_dev_notify_unset(enic->vdev);
enic_free_vnic_resources(enic);
- enic_free_intr(enic);
vnic_dev_close(enic->vdev);
enic_clear_intr_mode(enic);
vnic_dev_unregister(enic->vdev);
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 4/4] enic: bug fix: don't set netdev->name too early
2008-09-24 18:23 ` [PATCH 4/4] enic: bug fix: don't set netdev->name too early Scott Feldman
@ 2008-09-25 0:51 ` Jeff Garzik
0 siblings, 0 replies; 6+ messages in thread
From: Jeff Garzik @ 2008-09-25 0:51 UTC (permalink / raw)
To: Scott Feldman; +Cc: netdev
Scott Feldman wrote:
> enic: bug fix: don't set netdev->name too early
>
> Bug fix: don't set netdev->name early before netdev registration. Setting
> netdev->name early with dev_alloc_name() would occasionally cause netdev
> registration to fail returning error that device was already registered.
> Since we're using netdev->name to name MSI-X vectors, we now need to
> move the request_irq after netdev registartion, so move it to ->open.
>
> Signed-off-by: Scott Feldman <scofeldm@cisco.com>
> ---
> drivers/net/enic/enic.h | 2 -
> drivers/net/enic/enic_main.c | 121 ++++++++++++++++--------------------------
> 2 files changed, 47 insertions(+), 76 deletions(-)
>
> diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h
> index 9e0d484..7f677e8 100644
> --- a/drivers/net/enic/enic.h
> +++ b/drivers/net/enic/enic.h
> @@ -33,7 +33,7 @@
>
> #define DRV_NAME "enic"
> #define DRV_DESCRIPTION "Cisco 10G Ethernet Driver"
> -#define DRV_VERSION "0.0.1.18163.472"
> +#define DRV_VERSION "0.0.1-18163.472-k1"
> #define DRV_COPYRIGHT "Copyright 2008 Cisco Systems, Inc"
> #define PFX DRV_NAME ": "
>
> diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
> index 14e59a7..180e968 100644
> --- a/drivers/net/enic/enic_main.c
> +++ b/drivers/net/enic/enic_main.c
> @@ -1251,13 +1251,28 @@ static int enic_open(struct net_device *netdev)
> unsigned int i;
> int err;
>
> + err = enic_request_intr(enic);
> + if (err) {
> + printk(KERN_ERR PFX "%s: Unable to request irq.\n",
> + netdev->name);
> + return err;
> + }
> +
> + err = enic_notify_set(enic);
> + if (err) {
> + printk(KERN_ERR PFX
> + "%s: Failed to alloc notify buffer, aborting.\n",
> + netdev->name);
> + goto err_out_free_intr;
> + }
> +
> for (i = 0; i < enic->rq_count; i++) {
> err = vnic_rq_fill(&enic->rq[i], enic_rq_alloc_buf);
> if (err) {
> printk(KERN_ERR PFX
> "%s: Unable to alloc receive buffers.\n",
> netdev->name);
> - return err;
> + goto err_out_notify_unset;
> }
> }
>
> @@ -1279,6 +1294,13 @@ static int enic_open(struct net_device *netdev)
> enic_notify_timer_start(enic);
>
> return 0;
> +
> +err_out_notify_unset:
> + vnic_dev_notify_unset(enic->vdev);
> +err_out_free_intr:
> + enic_free_intr(enic);
> +
> + return err;
> }
>
> /* rtnl lock is held, process context */
> @@ -1308,6 +1330,9 @@ static int enic_stop(struct net_device *netdev)
> return err;
> }
>
> + vnic_dev_notify_unset(enic->vdev);
> + enic_free_intr(enic);
> +
> (void)vnic_cq_service(&enic->cq[ENIC_CQ_RQ],
> -1, enic_rq_service_drop, NULL);
> (void)vnic_cq_service(&enic->cq[ENIC_CQ_WQ],
> @@ -1593,18 +1618,6 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> return -ENOMEM;
> }
>
> - /* Set the netdev name early so intr vectors are properly
> - * named and any error msgs can include netdev->name
> - */
> -
> - rtnl_lock();
> - err = dev_alloc_name(netdev, netdev->name);
> - rtnl_unlock();
> - if (err < 0) {
> - printk(KERN_ERR PFX "Unable to allocate netdev name.\n");
> - goto err_out_free_netdev;
> - }
> -
> pci_set_drvdata(pdev, netdev);
>
> SET_NETDEV_DEV(netdev, &pdev->dev);
> @@ -1619,16 +1632,14 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> err = pci_enable_device(pdev);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: Cannot enable PCI device, aborting.\n",
> - netdev->name);
> + "Cannot enable PCI device, aborting.\n");
> goto err_out_free_netdev;
> }
>
> err = pci_request_regions(pdev, DRV_NAME);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: Cannot request PCI regions, aborting.\n",
> - netdev->name);
> + "Cannot request PCI regions, aborting.\n");
> goto err_out_disable_device;
> }
>
> @@ -1644,25 +1655,22 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: No usable DMA configuration, aborting.\n",
> - netdev->name);
> + "No usable DMA configuration, aborting.\n");
> goto err_out_release_regions;
> }
> err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: Unable to obtain 32-bit DMA "
> - "for consistent allocations, aborting.\n",
> - netdev->name);
> + "Unable to obtain 32-bit DMA "
> + "for consistent allocations, aborting.\n");
> goto err_out_release_regions;
> }
> } else {
> err = pci_set_consistent_dma_mask(pdev, DMA_40BIT_MASK);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: Unable to obtain 40-bit DMA "
> - "for consistent allocations, aborting.\n",
> - netdev->name);
> + "Unable to obtain 40-bit DMA "
> + "for consistent allocations, aborting.\n");
> goto err_out_release_regions;
> }
> using_dac = 1;
> @@ -1673,8 +1681,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
>
> if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
> printk(KERN_ERR PFX
> - "%s: BAR0 not memory-map'able, aborting.\n",
> - netdev->name);
> + "BAR0 not memory-map'able, aborting.\n");
> err = -ENODEV;
> goto err_out_release_regions;
> }
> @@ -1685,8 +1692,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
>
> if (!enic->bar0.vaddr) {
> printk(KERN_ERR PFX
> - "%s: Cannot memory-map BAR0 res hdr, aborting.\n",
> - netdev->name);
> + "Cannot memory-map BAR0 res hdr, aborting.\n");
> err = -ENODEV;
> goto err_out_release_regions;
> }
> @@ -1697,8 +1703,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> enic->vdev = vnic_dev_register(NULL, enic, pdev, &enic->bar0);
> if (!enic->vdev) {
> printk(KERN_ERR PFX
> - "%s: vNIC registration failed, aborting.\n",
> - netdev->name);
> + "vNIC registration failed, aborting.\n");
> err = -ENODEV;
> goto err_out_iounmap;
> }
> @@ -1709,8 +1714,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> err = enic_dev_open(enic);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: vNIC dev open failed, aborting.\n",
> - netdev->name);
> + "vNIC dev open failed, aborting.\n");
> goto err_out_vnic_unregister;
> }
>
> @@ -1727,8 +1731,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> err = vnic_dev_init(enic->vdev, 0);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: vNIC dev init failed, aborting.\n",
> - netdev->name);
> + "vNIC dev init failed, aborting.\n");
> goto err_out_dev_close;
> }
>
> @@ -1738,8 +1741,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> err = enic_get_vnic_config(enic);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: Get vNIC configuration failed, aborting.\n",
> - netdev->name);
> + "Get vNIC configuration failed, aborting.\n");
> goto err_out_dev_close;
> }
>
> @@ -1755,18 +1757,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> err = enic_set_intr_mode(enic);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: Failed to set intr mode, aborting.\n",
> - netdev->name);
> - goto err_out_dev_close;
> - }
> -
> - /* Request interrupt vector(s)
> - */
> -
> - err = enic_request_intr(enic);
> - if (err) {
> - printk(KERN_ERR PFX "%s: Unable to request irq.\n",
> - netdev->name);
> + "Failed to set intr mode, aborting.\n");
> goto err_out_dev_close;
> }
>
> @@ -1776,8 +1767,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> err = enic_alloc_vnic_resources(enic);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: Failed to alloc vNIC resources, aborting.\n",
> - netdev->name);
> + "Failed to alloc vNIC resources, aborting.\n");
> goto err_out_free_vnic_resources;
> }
>
> @@ -1793,19 +1783,7 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> ig_vlan_strip_en);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: Failed to config nic, aborting.\n",
> - netdev->name);
> - goto err_out_free_vnic_resources;
> - }
> -
> - /* Setup notification buffer area
> - */
> -
> - err = enic_notify_set(enic);
> - if (err) {
> - printk(KERN_ERR PFX
> - "%s: Failed to alloc notify buffer, aborting.\n",
> - netdev->name);
> + "Failed to config nic, aborting.\n");
> goto err_out_free_vnic_resources;
> }
>
> @@ -1832,9 +1810,8 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> err = enic_set_mac_addr(netdev, enic->mac_addr);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: Invalid MAC address, aborting.\n",
> - netdev->name);
> - goto err_out_notify_unset;
> + "Invalid MAC address, aborting.\n");
> + goto err_out_free_vnic_resources;
> }
>
> netdev->open = enic_open;
> @@ -1888,18 +1865,14 @@ static int __devinit enic_probe(struct pci_dev *pdev,
> err = register_netdev(netdev);
> if (err) {
> printk(KERN_ERR PFX
> - "%s: Cannot register net device, aborting.\n",
> - netdev->name);
> - goto err_out_notify_unset;
> + "Cannot register net device, aborting.\n");
> + goto err_out_free_vnic_resources;
> }
>
> return 0;
>
> -err_out_notify_unset:
> - vnic_dev_notify_unset(enic->vdev);
> err_out_free_vnic_resources:
> enic_free_vnic_resources(enic);
> - enic_free_intr(enic);
> err_out_dev_close:
> vnic_dev_close(enic->vdev);
> err_out_vnic_unregister:
> @@ -1927,9 +1900,7 @@ static void __devexit enic_remove(struct pci_dev *pdev)
>
applied 1-4
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2008-09-25 0:51 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-24 18:23 [PATCH 0/4] enic: review updates and bug fixes Scott Feldman
2008-09-24 18:23 ` [PATCH 1/4] enic: Don't indicate IPv6 pkts using soft-LRO Scott Feldman
2008-09-24 18:23 ` [PATCH 2/4] enic: fixes for review items from Ben Hutchings Scott Feldman
2008-09-24 18:23 ` [PATCH 3/4] enic: Bug fix: Free MSI intr with correct data handle Scott Feldman
2008-09-24 18:23 ` [PATCH 4/4] enic: bug fix: don't set netdev->name too early Scott Feldman
2008-09-25 0:51 ` Jeff Garzik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).