netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 1/6] bnx2: Add bnx2_shutdown_chip().
@ 2008-10-09 17:16 Michael Chan
  2008-10-09 17:16 ` [PATCH net-next 2/6] bnx2: Check netif_running() in all ethtool operations Michael Chan
                   ` (5 more replies)
  0 siblings, 6 replies; 14+ messages in thread
From: Michael Chan @ 2008-10-09 17:16 UTC (permalink / raw)
  To: davem; +Cc: netdev, Michael Chan, Benjamin Li, Matt Carlson

This logic is used in bnx2_close() and bnx2_suspend() and
so should be separated out into a separate function.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: Benjamin Li <benli@broadcom.com>
Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
---
 drivers/net/bnx2.c |   33 +++++++++++++++++----------------
 1 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index 883e0a7..b35f440 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -5073,6 +5073,21 @@ bnx2_init_nic(struct bnx2 *bp, int reset_phy)
 }
 
 static int
+bnx2_shutdown_chip(struct bnx2 *bp)
+{
+	u32 reset_code;
+
+	if (bp->flags & BNX2_FLAG_NO_WOL)
+		reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN;
+	else if (bp->wol)
+		reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
+	else
+		reset_code = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
+
+	return bnx2_reset_chip(bp, reset_code);
+}
+
+static int
 bnx2_test_registers(struct bnx2 *bp)
 {
 	int ret;
@@ -6095,20 +6110,13 @@ static int
 bnx2_close(struct net_device *dev)
 {
 	struct bnx2 *bp = netdev_priv(dev);
-	u32 reset_code;
 
 	cancel_work_sync(&bp->reset_task);
 
 	bnx2_disable_int_sync(bp);
 	bnx2_napi_disable(bp);
 	del_timer_sync(&bp->timer);
-	if (bp->flags & BNX2_FLAG_NO_WOL)
-		reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN;
-	else if (bp->wol)
-		reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
-	else
-		reset_code = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
-	bnx2_reset_chip(bp, reset_code);
+	bnx2_shutdown_chip(bp);
 	bnx2_free_irq(bp);
 	bnx2_free_skbs(bp);
 	bnx2_free_mem(bp);
@@ -7777,7 +7785,6 @@ bnx2_suspend(struct pci_dev *pdev, pm_message_t state)
 {
 	struct net_device *dev = pci_get_drvdata(pdev);
 	struct bnx2 *bp = netdev_priv(dev);
-	u32 reset_code;
 
 	/* PCI register 4 needs to be saved whether netif_running() or not.
 	 * MSI address and data need to be saved if using MSI and
@@ -7791,13 +7798,7 @@ bnx2_suspend(struct pci_dev *pdev, pm_message_t state)
 	bnx2_netif_stop(bp);
 	netif_device_detach(dev);
 	del_timer_sync(&bp->timer);
-	if (bp->flags & BNX2_FLAG_NO_WOL)
-		reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN;
-	else if (bp->wol)
-		reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL;
-	else
-		reset_code = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL;
-	bnx2_reset_chip(bp, reset_code);
+	bnx2_shutdown_chip(bp);
 	bnx2_free_skbs(bp);
 	bnx2_set_power_state(bp, pci_choose_state(pdev, state));
 	return 0;
-- 
1.5.6.GIT



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH net-next 2/6] bnx2: Check netif_running() in all ethtool operations.
  2008-10-09 17:16 [PATCH net-next 1/6] bnx2: Add bnx2_shutdown_chip() Michael Chan
@ 2008-10-09 17:16 ` Michael Chan
  2008-10-09 19:22   ` David Miller
  2008-10-09 17:16 ` [PATCH net-next 4/6] bnx2: Eliminate TSO header modifications Michael Chan
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Michael Chan @ 2008-10-09 17:16 UTC (permalink / raw)
  To: davem; +Cc: netdev, Michael Chan, Benjamin Li, Matt Carlson

We need to check netif_running() state in most ethtool operations
and properly handle the !netif_running() state where the chip is
in an uninitailzed state or low power state that may not accept
any MMIO.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: Benjamin Li <benli@broadcom.com>
Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
---
 drivers/net/bnx2.c |   40 ++++++++++++++++++++++++++++++++--------
 1 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index b35f440..21711c7 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -3248,6 +3248,9 @@ bnx2_set_rx_mode(struct net_device *dev)
 	struct dev_addr_list *uc_ptr;
 	int i;
 
+	if (!netif_running(dev))
+		return;
+
 	spin_lock_bh(&bp->phy_lock);
 
 	rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS |
@@ -5521,6 +5524,9 @@ bnx2_test_link(struct bnx2 *bp)
 {
 	u32 bmsr;
 
+	if (!netif_running(bp->dev))
+		return -ENODEV;
+
 	if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) {
 		if (bp->link_up)
 			return 0;
@@ -6485,6 +6491,9 @@ bnx2_nway_reset(struct net_device *dev)
 	struct bnx2 *bp = netdev_priv(dev);
 	u32 bmcr;
 
+	if (!netif_running(dev))
+		return -EAGAIN;
+
 	if (!(bp->autoneg & AUTONEG_SPEED)) {
 		return -EINVAL;
 	}
@@ -6540,6 +6549,9 @@ bnx2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
 	struct bnx2 *bp = netdev_priv(dev);
 	int rc;
 
+	if (!netif_running(dev))
+		return -EAGAIN;
+
 	/* parameters already validated in ethtool_get_eeprom */
 
 	rc = bnx2_nvram_read(bp, eeprom->offset, eebuf, eeprom->len);
@@ -6554,6 +6566,9 @@ bnx2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
 	struct bnx2 *bp = netdev_priv(dev);
 	int rc;
 
+	if (!netif_running(dev))
+		return -EAGAIN;
+
 	/* parameters already validated in ethtool_set_eeprom */
 
 	rc = bnx2_nvram_write(bp, eeprom->offset, eebuf, eeprom->len);
@@ -6718,11 +6733,11 @@ bnx2_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
 		bp->autoneg &= ~AUTONEG_FLOW_CTRL;
 	}
 
-	spin_lock_bh(&bp->phy_lock);
-
-	bnx2_setup_phy(bp, bp->phy_port);
-
-	spin_unlock_bh(&bp->phy_lock);
+	if (netif_running(dev)) {
+		spin_lock_bh(&bp->phy_lock);
+		bnx2_setup_phy(bp, bp->phy_port);
+		spin_unlock_bh(&bp->phy_lock);
+	}
 
 	return 0;
 }
@@ -6913,6 +6928,8 @@ bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf)
 {
 	struct bnx2 *bp = netdev_priv(dev);
 
+	bnx2_set_power_state(bp, PCI_D0);
+
 	memset(buf, 0, sizeof(u64) * BNX2_NUM_TESTS);
 	if (etest->flags & ETH_TEST_FL_OFFLINE) {
 		int i;
@@ -6932,9 +6949,8 @@ bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf)
 		if ((buf[2] = bnx2_test_loopback(bp)) != 0)
 			etest->flags |= ETH_TEST_FL_FAILED;
 
-		if (!netif_running(bp->dev)) {
-			bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET);
-		}
+		if (!netif_running(bp->dev))
+			bnx2_shutdown_chip(bp);
 		else {
 			bnx2_init_nic(bp, 1);
 			bnx2_netif_start(bp);
@@ -6962,6 +6978,8 @@ bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf)
 		etest->flags |= ETH_TEST_FL_FAILED;
 
 	}
+	if (!netif_running(bp->dev))
+		bnx2_set_power_state(bp, PCI_D3hot);
 }
 
 static void
@@ -7027,6 +7045,8 @@ bnx2_phys_id(struct net_device *dev, u32 data)
 	int i;
 	u32 save;
 
+	bnx2_set_power_state(bp, PCI_D0);
+
 	if (data == 0)
 		data = 2;
 
@@ -7051,6 +7071,10 @@ bnx2_phys_id(struct net_device *dev, u32 data)
 	}
 	REG_WR(bp, BNX2_EMAC_LED, 0);
 	REG_WR(bp, BNX2_MISC_CFG, save);
+
+	if (!netif_running(dev))
+		bnx2_set_power_state(bp, PCI_D3hot);
+
 	return 0;
 }
 
-- 
1.5.6.GIT



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH net-next 4/6] bnx2: Eliminate TSO header modifications.
  2008-10-09 17:16 [PATCH net-next 1/6] bnx2: Add bnx2_shutdown_chip() Michael Chan
  2008-10-09 17:16 ` [PATCH net-next 2/6] bnx2: Check netif_running() in all ethtool operations Michael Chan
@ 2008-10-09 17:16 ` Michael Chan
  2008-10-09 19:25   ` David Miller
  2008-10-09 17:16 ` [PATCH net-next 5/6] bnx2: Handle DMA mapping errors Michael Chan
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Michael Chan @ 2008-10-09 17:16 UTC (permalink / raw)
  To: davem; +Cc: netdev, Michael Chan

This is now possible with updated firmware.

Signed-off-by: Michael Chan <mchan@broadcom.com>
---
 drivers/net/bnx2.c |   16 +---------------
 1 files changed, 1 insertions(+), 15 deletions(-)

diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index 21711c7..f147204 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -6008,7 +6008,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	}
 #endif
 	if ((mss = skb_shinfo(skb)->gso_size)) {
-		u32 tcp_opt_len, ip_tcp_len;
+		u32 tcp_opt_len;
 		struct iphdr *iph;
 
 		vlan_tag_flags |= TX_BD_FLAGS_SW_LSO;
@@ -6032,21 +6032,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
 				mss |= (tcp_off & 0xc) << TX_BD_TCP6_OFF2_SHL;
 			}
 		} else {
-			if (skb_header_cloned(skb) &&
-			    pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
-				dev_kfree_skb(skb);
-				return NETDEV_TX_OK;
-			}
-
-			ip_tcp_len = ip_hdrlen(skb) + sizeof(struct tcphdr);
-
 			iph = ip_hdr(skb);
-			iph->check = 0;
-			iph->tot_len = htons(mss + ip_tcp_len + tcp_opt_len);
-			tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr,
-								 iph->daddr, 0,
-								 IPPROTO_TCP,
-								 0);
 			if (tcp_opt_len || (iph->ihl > 5)) {
 				vlan_tag_flags |= ((iph->ihl - 5) +
 						   (tcp_opt_len >> 2)) << 8;
-- 
1.5.6.GIT



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH net-next 5/6] bnx2: Handle DMA mapping errors.
  2008-10-09 17:16 [PATCH net-next 1/6] bnx2: Add bnx2_shutdown_chip() Michael Chan
  2008-10-09 17:16 ` [PATCH net-next 2/6] bnx2: Check netif_running() in all ethtool operations Michael Chan
  2008-10-09 17:16 ` [PATCH net-next 4/6] bnx2: Eliminate TSO header modifications Michael Chan
@ 2008-10-09 17:16 ` Michael Chan
  2008-10-09 19:26   ` David Miller
  2008-10-09 17:16 ` [PATCH net-next 6/6] bnx2: Update version to 1.8.1 Michael Chan
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Michael Chan @ 2008-10-09 17:16 UTC (permalink / raw)
  To: davem; +Cc: netdev, Michael Chan, Benjamin Li

Before, the driver would not care about the return codes from pci_map_*
functions.  This could be potentially dangerous if a mapping failed.
Now, we will check all pci_map_* calls.  On the transmit side, we switch
to use the new function skb_dma_map().  On the receive side, we add
pci_dma_mapping_error().

Signed-off-by: Benjamin Li <benli@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
---
 drivers/net/bnx2.c |  114 ++++++++++++++++++++++++++++------------------------
 drivers/net/bnx2.h |    8 +++-
 2 files changed, 67 insertions(+), 55 deletions(-)

diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index f147204..a95ca4f 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -2476,6 +2476,11 @@ bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
 		return -ENOMEM;
 	mapping = pci_map_page(bp->pdev, page, 0, PAGE_SIZE,
 			       PCI_DMA_FROMDEVICE);
+	if (pci_dma_mapping_error(bp->pdev, mapping)) {
+		__free_page(page);
+		return -EIO;
+	}
+
 	rx_pg->page = page;
 	pci_unmap_addr_set(rx_pg, mapping, mapping);
 	rxbd->rx_bd_haddr_hi = (u64) mapping >> 32;
@@ -2518,6 +2523,10 @@ bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index)
 
 	mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size,
 		PCI_DMA_FROMDEVICE);
+	if (pci_dma_mapping_error(bp->pdev, mapping)) {
+		dev_kfree_skb(skb);
+		return -EIO;
+	}
 
 	rx_buf->skb = skb;
 	pci_unmap_addr_set(rx_buf, mapping, mapping);
@@ -2592,7 +2601,7 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
 	sw_cons = txr->tx_cons;
 
 	while (sw_cons != hw_cons) {
-		struct sw_bd *tx_buf;
+		struct sw_tx_bd *tx_buf;
 		struct sk_buff *skb;
 		int i, last;
 
@@ -2617,21 +2626,13 @@ bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
 			}
 		}
 
-		pci_unmap_single(bp->pdev, pci_unmap_addr(tx_buf, mapping),
-			skb_headlen(skb), PCI_DMA_TODEVICE);
+		skb_dma_unmap(&bp->pdev->dev, skb, DMA_TO_DEVICE);
 
 		tx_buf->skb = NULL;
 		last = skb_shinfo(skb)->nr_frags;
 
 		for (i = 0; i < last; i++) {
 			sw_cons = NEXT_TX_BD(sw_cons);
-
-			pci_unmap_page(bp->pdev,
-				pci_unmap_addr(
-					&txr->tx_buf_ring[TX_RING_IDX(sw_cons)],
-				       	mapping),
-				skb_shinfo(skb)->frags[i].size,
-				PCI_DMA_TODEVICE);
 		}
 
 		sw_cons = NEXT_TX_BD(sw_cons);
@@ -2672,11 +2673,31 @@ bnx2_reuse_rx_skb_pages(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
 {
 	struct sw_pg *cons_rx_pg, *prod_rx_pg;
 	struct rx_bd *cons_bd, *prod_bd;
-	dma_addr_t mapping;
 	int i;
-	u16 hw_prod = rxr->rx_pg_prod, prod;
+	u16 hw_prod, prod;
 	u16 cons = rxr->rx_pg_cons;
 
+	cons_rx_pg = &rxr->rx_pg_ring[cons];
+
+	/* The caller was unable to allocate a new page to replace the
+	 * last one in the frags array, so we need to recycle that page
+	 * and then free the skb.
+	 */
+	if (skb) {
+		struct page *page;
+		struct skb_shared_info *shinfo;
+
+		shinfo = skb_shinfo(skb);
+		shinfo->nr_frags--;
+		page = shinfo->frags[shinfo->nr_frags].page;
+		shinfo->frags[shinfo->nr_frags].page = NULL;
+
+		cons_rx_pg->page = page;
+		dev_kfree_skb(skb);
+	}
+
+	hw_prod = rxr->rx_pg_prod;
+
 	for (i = 0; i < count; i++) {
 		prod = RX_PG_RING_IDX(hw_prod);
 
@@ -2685,20 +2706,6 @@ bnx2_reuse_rx_skb_pages(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr,
 		cons_bd = &rxr->rx_pg_desc_ring[RX_RING(cons)][RX_IDX(cons)];
 		prod_bd = &rxr->rx_pg_desc_ring[RX_RING(prod)][RX_IDX(prod)];
 
-		if (i == 0 && skb) {
-			struct page *page;
-			struct skb_shared_info *shinfo;
-
-			shinfo = skb_shinfo(skb);
-			shinfo->nr_frags--;
-			page = shinfo->frags[shinfo->nr_frags].page;
-			shinfo->frags[shinfo->nr_frags].page = NULL;
-			mapping = pci_map_page(bp->pdev, page, 0, PAGE_SIZE,
-					       PCI_DMA_FROMDEVICE);
-			cons_rx_pg->page = page;
-			pci_unmap_addr_set(cons_rx_pg, mapping, mapping);
-			dev_kfree_skb(skb);
-		}
 		if (prod != cons) {
 			prod_rx_pg->page = cons_rx_pg->page;
 			cons_rx_pg->page = NULL;
@@ -2784,6 +2791,8 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
 		skb_put(skb, hdr_len);
 
 		for (i = 0; i < pages; i++) {
+			dma_addr_t mapping_old;
+
 			frag_len = min(frag_size, (unsigned int) PAGE_SIZE);
 			if (unlikely(frag_len <= 4)) {
 				unsigned int tail = 4 - frag_len;
@@ -2806,9 +2815,10 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
 			}
 			rx_pg = &rxr->rx_pg_ring[pg_cons];
 
-			pci_unmap_page(bp->pdev, pci_unmap_addr(rx_pg, mapping),
-				       PAGE_SIZE, PCI_DMA_FROMDEVICE);
-
+			/* Don't unmap yet.  If we're unable to allocate a new
+			 * page, we need to recycle the page and the DMA addr.
+			 */
+			mapping_old = pci_unmap_addr(rx_pg, mapping);
 			if (i == pages - 1)
 				frag_len -= 4;
 
@@ -2825,6 +2835,9 @@ bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb,
 				return err;
 			}
 
+			pci_unmap_page(bp->pdev, mapping_old,
+				       PAGE_SIZE, PCI_DMA_FROMDEVICE);
+
 			frag_size -= frag_len;
 			skb->data_len += frag_len;
 			skb->truesize += frag_len;
@@ -4971,31 +4984,20 @@ bnx2_free_tx_skbs(struct bnx2 *bp)
 			continue;
 
 		for (j = 0; j < TX_DESC_CNT; ) {
-			struct sw_bd *tx_buf = &txr->tx_buf_ring[j];
+			struct sw_tx_bd *tx_buf = &txr->tx_buf_ring[j];
 			struct sk_buff *skb = tx_buf->skb;
-			int k, last;
 
 			if (skb == NULL) {
 				j++;
 				continue;
 			}
 
-			pci_unmap_single(bp->pdev,
-					 pci_unmap_addr(tx_buf, mapping),
-			skb_headlen(skb), PCI_DMA_TODEVICE);
+			skb_dma_unmap(&bp->pdev->dev, skb, DMA_TO_DEVICE);
 
 			tx_buf->skb = NULL;
 
-			last = skb_shinfo(skb)->nr_frags;
-			for (k = 0; k < last; k++) {
-				tx_buf = &txr->tx_buf_ring[j + k + 1];
-				pci_unmap_page(bp->pdev,
-					pci_unmap_addr(tx_buf, mapping),
-					skb_shinfo(skb)->frags[j].size,
-					PCI_DMA_TODEVICE);
-			}
+			j += skb_shinfo(skb)->nr_frags + 1;
 			dev_kfree_skb(skb);
-			j += k + 1;
 		}
 	}
 }
@@ -5373,8 +5375,11 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
 	for (i = 14; i < pkt_size; i++)
 		packet[i] = (unsigned char) (i & 0xff);
 
-	map = pci_map_single(bp->pdev, skb->data, pkt_size,
-		PCI_DMA_TODEVICE);
+	if (skb_dma_map(&bp->pdev->dev, skb, DMA_TO_DEVICE)) {
+		dev_kfree_skb(skb);
+		return -EIO;
+	}
+	map = skb_shinfo(skb)->dma_maps[0];
 
 	REG_WR(bp, BNX2_HC_COMMAND,
 	       bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
@@ -5409,7 +5414,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
 
 	udelay(5);
 
-	pci_unmap_single(bp->pdev, map, pkt_size, PCI_DMA_TODEVICE);
+	skb_dma_unmap(&bp->pdev->dev, skb, DMA_TO_DEVICE);
 	dev_kfree_skb(skb);
 
 	if (bnx2_get_hw_tx_cons(tx_napi) != txr->tx_prod)
@@ -5970,13 +5975,14 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	struct bnx2 *bp = netdev_priv(dev);
 	dma_addr_t mapping;
 	struct tx_bd *txbd;
-	struct sw_bd *tx_buf;
+	struct sw_tx_bd *tx_buf;
 	u32 len, vlan_tag_flags, last_frag, mss;
 	u16 prod, ring_prod;
 	int i;
 	struct bnx2_napi *bnapi;
 	struct bnx2_tx_ring_info *txr;
 	struct netdev_queue *txq;
+	struct skb_shared_info *sp;
 
 	/*  Determine which tx ring we will be placed on */
 	i = skb_get_queue_mapping(skb);
@@ -6041,11 +6047,16 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	} else
 		mss = 0;
 
-	mapping = pci_map_single(bp->pdev, skb->data, len, PCI_DMA_TODEVICE);
+	if (skb_dma_map(&bp->pdev->dev, skb, DMA_TO_DEVICE)) {
+		dev_kfree_skb(skb);
+		return NETDEV_TX_OK;
+	}
+
+	sp = skb_shinfo(skb);
+	mapping = sp->dma_maps[0];
 
 	tx_buf = &txr->tx_buf_ring[ring_prod];
 	tx_buf->skb = skb;
-	pci_unmap_addr_set(tx_buf, mapping, mapping);
 
 	txbd = &txr->tx_desc_ring[ring_prod];
 
@@ -6064,10 +6075,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
 		txbd = &txr->tx_desc_ring[ring_prod];
 
 		len = frag->size;
-		mapping = pci_map_page(bp->pdev, frag->page, frag->page_offset,
-			len, PCI_DMA_TODEVICE);
-		pci_unmap_addr_set(&txr->tx_buf_ring[ring_prod],
-				mapping, mapping);
+		mapping = sp->dma_maps[i + 1];
 
 		txbd->tx_bd_haddr_hi = (u64) mapping >> 32;
 		txbd->tx_bd_haddr_lo = (u64) mapping & 0xffffffff;
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h
index edc7774..617d953 100644
--- a/drivers/net/bnx2.h
+++ b/drivers/net/bnx2.h
@@ -6526,10 +6526,14 @@ struct sw_pg {
 	DECLARE_PCI_UNMAP_ADDR(mapping)
 };
 
+struct sw_tx_bd {
+	struct sk_buff		*skb;
+};
+
 #define SW_RXBD_RING_SIZE (sizeof(struct sw_bd) * RX_DESC_CNT)
 #define SW_RXPG_RING_SIZE (sizeof(struct sw_pg) * RX_DESC_CNT)
 #define RXBD_RING_SIZE (sizeof(struct rx_bd) * RX_DESC_CNT)
-#define SW_TXBD_RING_SIZE (sizeof(struct sw_bd) * TX_DESC_CNT)
+#define SW_TXBD_RING_SIZE (sizeof(struct sw_tx_bd) * TX_DESC_CNT)
 #define TXBD_RING_SIZE (sizeof(struct tx_bd) * TX_DESC_CNT)
 
 /* Buffered flash (Atmel: AT45DB011B) specific information */
@@ -6609,7 +6613,7 @@ struct bnx2_tx_ring_info {
 	u32			tx_bseq_addr;
 
 	struct tx_bd		*tx_desc_ring;
-	struct sw_bd		*tx_buf_ring;
+	struct sw_tx_bd		*tx_buf_ring;
 
 	u16			tx_cons;
 	u16			hw_tx_cons;
-- 
1.5.6.GIT



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH net-next 6/6] bnx2: Update version to 1.8.1.
  2008-10-09 17:16 [PATCH net-next 1/6] bnx2: Add bnx2_shutdown_chip() Michael Chan
                   ` (2 preceding siblings ...)
  2008-10-09 17:16 ` [PATCH net-next 5/6] bnx2: Handle DMA mapping errors Michael Chan
@ 2008-10-09 17:16 ` Michael Chan
  2008-10-09 19:27   ` David Miller
  2008-10-09 19:21 ` [PATCH net-next 1/6] bnx2: Add bnx2_shutdown_chip() David Miller
       [not found] ` <1223572568-1298-3-git-send-email-mchan@broadcom.com>
  5 siblings, 1 reply; 14+ messages in thread
From: Michael Chan @ 2008-10-09 17:16 UTC (permalink / raw)
  To: davem; +Cc: netdev, Michael Chan

Signed-off-by: Michael Chan <mchan@broadcom.com>
---
 drivers/net/bnx2.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
index a95ca4f..430d430 100644
--- a/drivers/net/bnx2.c
+++ b/drivers/net/bnx2.c
@@ -57,8 +57,8 @@
 
 #define DRV_MODULE_NAME		"bnx2"
 #define PFX DRV_MODULE_NAME	": "
-#define DRV_MODULE_VERSION	"1.8.0"
-#define DRV_MODULE_RELDATE	"Aug 14, 2008"
+#define DRV_MODULE_VERSION	"1.8.1"
+#define DRV_MODULE_RELDATE	"Oct 7, 2008"
 
 #define RUN_AT(x) (jiffies + (x))
 
-- 
1.5.6.GIT



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH net-next 1/6] bnx2: Add bnx2_shutdown_chip().
  2008-10-09 17:16 [PATCH net-next 1/6] bnx2: Add bnx2_shutdown_chip() Michael Chan
                   ` (3 preceding siblings ...)
  2008-10-09 17:16 ` [PATCH net-next 6/6] bnx2: Update version to 1.8.1 Michael Chan
@ 2008-10-09 19:21 ` David Miller
       [not found] ` <1223572568-1298-3-git-send-email-mchan@broadcom.com>
  5 siblings, 0 replies; 14+ messages in thread
From: David Miller @ 2008-10-09 19:21 UTC (permalink / raw)
  To: mchan; +Cc: netdev, benli, mcarlson

From: "Michael Chan" <mchan@broadcom.com>
Date: Thu,  9 Oct 2008 10:16:03 -0700

> This logic is used in bnx2_close() and bnx2_suspend() and
> so should be separated out into a separate function.
> 
> Signed-off-by: Michael Chan <mchan@broadcom.com>
> Signed-off-by: Benjamin Li <benli@broadcom.com>
> Signed-off-by: Matt Carlson <mcarlson@broadcom.com>

Applied.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH net-next 2/6] bnx2: Check netif_running() in all ethtool operations.
  2008-10-09 17:16 ` [PATCH net-next 2/6] bnx2: Check netif_running() in all ethtool operations Michael Chan
@ 2008-10-09 19:22   ` David Miller
  2008-10-09 20:59     ` Michael Chan
  0 siblings, 1 reply; 14+ messages in thread
From: David Miller @ 2008-10-09 19:22 UTC (permalink / raw)
  To: mchan; +Cc: netdev, benli, mcarlson

From: "Michael Chan" <mchan@broadcom.com>
Date: Thu,  9 Oct 2008 10:16:04 -0700

> We need to check netif_running() state in most ethtool operations
> and properly handle the !netif_running() state where the chip is
> in an uninitailzed state or low power state that may not accept
> any MMIO.
> 
> Signed-off-by: Michael Chan <mchan@broadcom.com>
> Signed-off-by: Benjamin Li <benli@broadcom.com>
> Signed-off-by: Matt Carlson <mcarlson@broadcom.com>

Applied, but I wonder if this will trip people up who invoke
ethtool to set a specific link setting before bringing the
device up?

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH net-next 3/6] bnx2: Update 5706/5708 firmware.
       [not found] ` <1223572568-1298-3-git-send-email-mchan@broadcom.com>
@ 2008-10-09 19:23   ` David Miller
  0 siblings, 0 replies; 14+ messages in thread
From: David Miller @ 2008-10-09 19:23 UTC (permalink / raw)
  To: mchan; +Cc: netdev

From: "Michael Chan" <mchan@broadcom.com>
Date: Thu,  9 Oct 2008 10:16:05 -0700

> With this new firmware, the driver no longer has to modify the
> TCP/IP header fields when transmitting TSO packets.
> 
> Signed-off-by: Michael Chan <mchan@broadcom.com>

Applied.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH net-next 4/6] bnx2: Eliminate TSO header modifications.
  2008-10-09 17:16 ` [PATCH net-next 4/6] bnx2: Eliminate TSO header modifications Michael Chan
@ 2008-10-09 19:25   ` David Miller
  2008-10-09 20:56     ` Michael Chan
  0 siblings, 1 reply; 14+ messages in thread
From: David Miller @ 2008-10-09 19:25 UTC (permalink / raw)
  To: mchan; +Cc: netdev

From: "Michael Chan" <mchan@broadcom.com>
Date: Thu,  9 Oct 2008 10:16:06 -0700

> This is now possible with updated firmware.
> 
> Signed-off-by: Michael Chan <mchan@broadcom.com>

Nice, applied.

Quick question, in the intermediate step where we have the
new firmware (patch #3) but not this change applied (patch
#4) does TSO still work properly?

If TSO is bolixed after patch #3 but before patch #4 please
don't create those kinds of non-bisectable situations in
the future.  I'd rather you do the firmware update and the
TSO logic changes all in one go to keep it all working.

Thanks!

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH net-next 5/6] bnx2: Handle DMA mapping errors.
  2008-10-09 17:16 ` [PATCH net-next 5/6] bnx2: Handle DMA mapping errors Michael Chan
@ 2008-10-09 19:26   ` David Miller
  0 siblings, 0 replies; 14+ messages in thread
From: David Miller @ 2008-10-09 19:26 UTC (permalink / raw)
  To: mchan; +Cc: netdev, benli

From: "Michael Chan" <mchan@broadcom.com>
Date: Thu,  9 Oct 2008 10:16:07 -0700

> Before, the driver would not care about the return codes from pci_map_*
> functions.  This could be potentially dangerous if a mapping failed.
> Now, we will check all pci_map_* calls.  On the transmit side, we switch
> to use the new function skb_dma_map().  On the receive side, we add
> pci_dma_mapping_error().
> 
> Signed-off-by: Benjamin Li <benli@broadcom.com>
> Signed-off-by: Michael Chan <mchan@broadcom.com>

Applied, thanks.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH net-next 6/6] bnx2: Update version to 1.8.1.
  2008-10-09 17:16 ` [PATCH net-next 6/6] bnx2: Update version to 1.8.1 Michael Chan
@ 2008-10-09 19:27   ` David Miller
  0 siblings, 0 replies; 14+ messages in thread
From: David Miller @ 2008-10-09 19:27 UTC (permalink / raw)
  To: mchan; +Cc: netdev

From: "Michael Chan" <mchan@broadcom.com>
Date: Thu,  9 Oct 2008 10:16:08 -0700

> Signed-off-by: Michael Chan <mchan@broadcom.com>

Also applied, thanks a lot.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH net-next 4/6] bnx2: Eliminate TSO header modifications.
  2008-10-09 19:25   ` David Miller
@ 2008-10-09 20:56     ` Michael Chan
  0 siblings, 0 replies; 14+ messages in thread
From: Michael Chan @ 2008-10-09 20:56 UTC (permalink / raw)
  To: David Miller; +Cc: netdev@vger.kernel.org


On Thu, 2008-10-09 at 12:25 -0700, David Miller wrote:
> From: "Michael Chan" <mchan@broadcom.com>
> Date: Thu,  9 Oct 2008 10:16:06 -0700
> 
> > This is now possible with updated firmware.
> >
> > Signed-off-by: Michael Chan <mchan@broadcom.com>
> 
> Nice, applied.
> 
> Quick question, in the intermediate step where we have the
> new firmware (patch #3) but not this change applied (patch
> #4) does TSO still work properly?

It will still work.  The firmware will overwrite the header fields
modified (unnecessarily) by the driver.

> 
> If TSO is bolixed after patch #3 but before patch #4 please
> don't create those kinds of non-bisectable situations in
> the future.  I'd rather you do the firmware update and the
> TSO logic changes all in one go to keep it all working.
> 
> Thanks!
> 



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH net-next 2/6] bnx2: Check netif_running() in all ethtool operations.
  2008-10-09 19:22   ` David Miller
@ 2008-10-09 20:59     ` Michael Chan
  2008-10-09 21:26       ` David Miller
  0 siblings, 1 reply; 14+ messages in thread
From: Michael Chan @ 2008-10-09 20:59 UTC (permalink / raw)
  To: David Miller; +Cc: netdev@vger.kernel.org, Benjamin Li, Matthew Carlson


On Thu, 2008-10-09 at 12:22 -0700, David Miller wrote:
> From: "Michael Chan" <mchan@broadcom.com>
> Date: Thu,  9 Oct 2008 10:16:04 -0700
> 
> > We need to check netif_running() state in most ethtool operations
> > and properly handle the !netif_running() state where the chip is
> > in an uninitailzed state or low power state that may not accept
> > any MMIO.
> >
> > Signed-off-by: Michael Chan <mchan@broadcom.com>
> > Signed-off-by: Benjamin Li <benli@broadcom.com>
> > Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
> 
> Applied, but I wonder if this will trip people up who invoke
> ethtool to set a specific link setting before bringing the
> device up?
> 

ethtool -s is not affected by the patch and will continue to work
whether the device is up or down.  The patch affects operations such as
reading/writing NVRAM, restart autoneg, etc, that require the device to
be up.

Thanks.



^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH net-next 2/6] bnx2: Check netif_running() in all ethtool operations.
  2008-10-09 20:59     ` Michael Chan
@ 2008-10-09 21:26       ` David Miller
  0 siblings, 0 replies; 14+ messages in thread
From: David Miller @ 2008-10-09 21:26 UTC (permalink / raw)
  To: mchan; +Cc: netdev, benli, mcarlson

From: "Michael Chan" <mchan@broadcom.com>
Date: Thu, 09 Oct 2008 13:59:00 -0700

> 
> On Thu, 2008-10-09 at 12:22 -0700, David Miller wrote:
> > From: "Michael Chan" <mchan@broadcom.com>
> > Date: Thu,  9 Oct 2008 10:16:04 -0700
> > 
> > > We need to check netif_running() state in most ethtool operations
> > > and properly handle the !netif_running() state where the chip is
> > > in an uninitailzed state or low power state that may not accept
> > > any MMIO.
> > >
> > > Signed-off-by: Michael Chan <mchan@broadcom.com>
> > > Signed-off-by: Benjamin Li <benli@broadcom.com>
> > > Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
> > 
> > Applied, but I wonder if this will trip people up who invoke
> > ethtool to set a specific link setting before bringing the
> > device up?
> > 
> 
> ethtool -s is not affected by the patch and will continue to work
> whether the device is up or down.  The patch affects operations such as
> reading/writing NVRAM, restart autoneg, etc, that require the device to
> be up.

Thanks for the clarification.

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2008-10-09 21:26 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-09 17:16 [PATCH net-next 1/6] bnx2: Add bnx2_shutdown_chip() Michael Chan
2008-10-09 17:16 ` [PATCH net-next 2/6] bnx2: Check netif_running() in all ethtool operations Michael Chan
2008-10-09 19:22   ` David Miller
2008-10-09 20:59     ` Michael Chan
2008-10-09 21:26       ` David Miller
2008-10-09 17:16 ` [PATCH net-next 4/6] bnx2: Eliminate TSO header modifications Michael Chan
2008-10-09 19:25   ` David Miller
2008-10-09 20:56     ` Michael Chan
2008-10-09 17:16 ` [PATCH net-next 5/6] bnx2: Handle DMA mapping errors Michael Chan
2008-10-09 19:26   ` David Miller
2008-10-09 17:16 ` [PATCH net-next 6/6] bnx2: Update version to 1.8.1 Michael Chan
2008-10-09 19:27   ` David Miller
2008-10-09 19:21 ` [PATCH net-next 1/6] bnx2: Add bnx2_shutdown_chip() David Miller
     [not found] ` <1223572568-1298-3-git-send-email-mchan@broadcom.com>
2008-10-09 19:23   ` [PATCH net-next 3/6] bnx2: Update 5706/5708 firmware David Miller

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).