* [net-next PATCH0/12] qlge: More features and cleanup.
@ 2009-03-09 20:59 Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 01/12] qlge: Move reset logic into asic_reset_worker func Ron Mercer
` (11 more replies)
0 siblings, 12 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
Attached are more qlge patches for adding features such as multi TXQ and
LRO.
I've also included 4 bug fixes, 3 of which I will also post to net-2.6
in a separate series tomorrow.
Thanks,
Ron Mercer
^ permalink raw reply [flat|nested] 15+ messages in thread
* [net-next PATCH 01/12] qlge: Move reset logic into asic_reset_worker func.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 02/12] qlge: Remove debug junk from asic reset logic Ron Mercer
` (10 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
Get rid of extraneous ql_cycle_adapter. It's only called from the one
place.
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge_main.c | 41 ++++++++++++++++++-----------------------
1 files changed, 18 insertions(+), 23 deletions(-)
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index d800ff4..ed7138d 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -3263,28 +3263,6 @@ err_init:
return err;
}
-static int ql_cycle_adapter(struct ql_adapter *qdev)
-{
- int status;
-
- status = ql_adapter_down(qdev);
- if (status)
- goto error;
-
- status = ql_adapter_up(qdev);
- if (status)
- goto error;
-
- return status;
-error:
- QPRINTK(qdev, IFUP, ALERT,
- "Driver up/down cycle failed, closing device\n");
- rtnl_lock();
- dev_close(qdev->ndev);
- rtnl_unlock();
- return status;
-}
-
static void ql_release_adapter_resources(struct ql_adapter *qdev)
{
ql_free_mem_resources(qdev);
@@ -3617,7 +3595,24 @@ static void ql_asic_reset_work(struct work_struct *work)
{
struct ql_adapter *qdev =
container_of(work, struct ql_adapter, asic_reset_work.work);
- ql_cycle_adapter(qdev);
+ int status;
+
+ status = ql_adapter_down(qdev);
+ if (status)
+ goto error;
+
+ status = ql_adapter_up(qdev);
+ if (status)
+ goto error;
+
+ return;
+error:
+ QPRINTK(qdev, IFUP, ALERT,
+ "Driver up/down cycle failed, closing device\n");
+ rtnl_lock();
+ set_bit(QL_ADAPTER_UP, &qdev->flags);
+ dev_close(qdev->ndev);
+ rtnl_unlock();
}
static struct nic_operations qla8012_nic_ops = {
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [net-next PATCH 02/12] qlge: Remove debug junk from asic reset logic.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 01/12] qlge: Move reset logic into asic_reset_worker func Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 03/12] qlge: Increase filtering for inbound csum settings Ron Mercer
` (9 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge_main.c | 25 ++++++-------------------
1 files changed, 6 insertions(+), 19 deletions(-)
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index ed7138d..bc04aeb 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -3129,36 +3129,23 @@ static int ql_adapter_initialize(struct ql_adapter *qdev)
static int ql_adapter_reset(struct ql_adapter *qdev)
{
u32 value;
- int max_wait_time;
int status = 0;
- int resetCnt = 0;
+ unsigned long end_jiffies = jiffies +
+ max((unsigned long)1, usecs_to_jiffies(30));
-#define MAX_RESET_CNT 1
-issueReset:
- resetCnt++;
- QPRINTK(qdev, IFDOWN, DEBUG, "Issue soft reset to chip.\n");
ql_write32(qdev, RST_FO, (RST_FO_FR << 16) | RST_FO_FR);
- /* Wait for reset to complete. */
- max_wait_time = 3;
- QPRINTK(qdev, IFDOWN, DEBUG, "Wait %d seconds for reset to complete.\n",
- max_wait_time);
+
do {
value = ql_read32(qdev, RST_FO);
if ((value & RST_FO_FR) == 0)
break;
+ cpu_relax();
+ } while (time_before(jiffies, end_jiffies));
- ssleep(1);
- } while ((--max_wait_time));
if (value & RST_FO_FR) {
QPRINTK(qdev, IFDOWN, ERR,
- "Stuck in SoftReset: FSC_SR:0x%08x\n", value);
- if (resetCnt < MAX_RESET_CNT)
- goto issueReset;
- }
- if (max_wait_time == 0) {
- status = -ETIMEDOUT;
- QPRINTK(qdev, IFDOWN, ERR,
"ETIMEOUT!!! errored out of resetting the chip!\n");
+ status = -ETIMEDOUT;
}
return status;
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [net-next PATCH 03/12] qlge: Increase filtering for inbound csum settings.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 01/12] qlge: Move reset logic into asic_reset_worker func Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 02/12] qlge: Remove debug junk from asic reset logic Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 04/12] qlge: Add support for GRO Ron Mercer
` (8 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
Chip does not do UDP checksum when fragmentation occurs.
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge.h | 1 +
drivers/net/qlge/qlge_main.c | 41 ++++++++++++++++++++++++++++-------------
2 files changed, 29 insertions(+), 13 deletions(-)
diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h
index 9918106..fcb159e 100644
--- a/drivers/net/qlge/qlge.h
+++ b/drivers/net/qlge/qlge.h
@@ -977,6 +977,7 @@ struct ib_mac_iocb_rsp {
u8 flags1;
#define IB_MAC_IOCB_RSP_OI 0x01 /* Overide intr delay */
#define IB_MAC_IOCB_RSP_I 0x02 /* Disble Intr Generation */
+#define IB_MAC_CSUM_ERR_MASK 0x1c /* A mask to use for csum errs */
#define IB_MAC_IOCB_RSP_TE 0x04 /* Checksum error */
#define IB_MAC_IOCB_RSP_NU 0x08 /* No checksum rcvd */
#define IB_MAC_IOCB_RSP_IE 0x10 /* IPv4 checksum error */
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index bc04aeb..498d4bf 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -1531,22 +1531,37 @@ static void ql_process_mac_rx_intr(struct ql_adapter *qdev,
if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_P) {
QPRINTK(qdev, RX_STATUS, DEBUG, "Promiscuous Packet.\n");
}
- if (ib_mac_rsp->flags1 & (IB_MAC_IOCB_RSP_IE | IB_MAC_IOCB_RSP_TE)) {
- QPRINTK(qdev, RX_STATUS, ERR,
- "Bad checksum for this %s packet.\n",
- ((ib_mac_rsp->
- flags2 & IB_MAC_IOCB_RSP_T) ? "TCP" : "UDP"));
- skb->ip_summed = CHECKSUM_NONE;
- } else if (qdev->rx_csum &&
- ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) ||
- ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_U) &&
- !(ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_NU)))) {
- QPRINTK(qdev, RX_STATUS, DEBUG, "RX checksum done!\n");
- skb->ip_summed = CHECKSUM_UNNECESSARY;
+
+
+ skb->protocol = eth_type_trans(skb, ndev);
+ skb->ip_summed = CHECKSUM_NONE;
+
+ /* If rx checksum is on, and there are no
+ * csum or frame errors.
+ */
+ if (qdev->rx_csum &&
+ !(ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) &&
+ !(ib_mac_rsp->flags1 & IB_MAC_CSUM_ERR_MASK)) {
+ /* TCP frame. */
+ if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) {
+ QPRINTK(qdev, RX_STATUS, DEBUG,
+ "TCP checksum done!\n");
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
+ } else if ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_U) &&
+ (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_V4)) {
+ /* Unfragmented ipv4 UDP frame. */
+ struct iphdr *iph = (struct iphdr *) skb->data;
+ if (!(iph->frag_off &
+ cpu_to_be16(IP_MF|IP_OFFSET))) {
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
+ QPRINTK(qdev, RX_STATUS, DEBUG,
+ "TCP checksum done!\n");
+ }
+ }
}
+
qdev->stats.rx_packets++;
qdev->stats.rx_bytes += skb->len;
- skb->protocol = eth_type_trans(skb, ndev);
skb_record_rx_queue(skb, rx_ring - &qdev->rx_ring[0]);
if (qdev->vlgrp && (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V)) {
QPRINTK(qdev, RX_STATUS, DEBUG,
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [net-next PATCH 04/12] qlge: Add support for GRO.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
` (2 preceding siblings ...)
2009-03-09 20:59 ` [net-next PATCH 03/12] qlge: Increase filtering for inbound csum settings Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 05/12] qlge: Add tx multiqueue support Ron Mercer
` (7 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge_main.c | 30 ++++++++++++++++++++----------
1 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 498d4bf..339e1da 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -1507,6 +1507,8 @@ static void ql_process_mac_rx_intr(struct ql_adapter *qdev,
{
struct net_device *ndev = qdev->ndev;
struct sk_buff *skb = NULL;
+ u16 vlan_id = (le16_to_cpu(ib_mac_rsp->vlan_id) &
+ IB_MAC_IOCB_RSP_VLAN_MASK)
QL_DUMP_IB_MAC_RSP(ib_mac_rsp);
@@ -1562,16 +1564,23 @@ static void ql_process_mac_rx_intr(struct ql_adapter *qdev,
qdev->stats.rx_packets++;
qdev->stats.rx_bytes += skb->len;
- skb_record_rx_queue(skb, rx_ring - &qdev->rx_ring[0]);
- if (qdev->vlgrp && (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V)) {
- QPRINTK(qdev, RX_STATUS, DEBUG,
- "Passing a VLAN packet upstream.\n");
- vlan_hwaccel_receive_skb(skb, qdev->vlgrp,
- le16_to_cpu(ib_mac_rsp->vlan_id));
+ skb_record_rx_queue(skb,
+ rx_ring->cq_id - qdev->rss_ring_first_cq_id);
+ if (skb->ip_summed == CHECKSUM_UNNECESSARY) {
+ if (qdev->vlgrp &&
+ (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V) &&
+ (vlan_id != 0))
+ vlan_gro_receive(&rx_ring->napi, qdev->vlgrp,
+ vlan_id, skb);
+ else
+ napi_gro_receive(&rx_ring->napi, skb);
} else {
- QPRINTK(qdev, RX_STATUS, DEBUG,
- "Passing a normal packet upstream.\n");
- netif_receive_skb(skb);
+ if (qdev->vlgrp &&
+ (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V) &&
+ (vlan_id != 0))
+ vlan_hwaccel_receive_skb(skb, qdev->vlgrp, vlan_id);
+ else
+ netif_receive_skb(skb);
}
}
@@ -1774,7 +1783,7 @@ static int ql_napi_poll_msix(struct napi_struct *napi, int budget)
rx_ring->cq_id);
if (work_done < budget) {
- __napi_complete(napi);
+ napi_complete(napi);
ql_enable_completion_interrupt(qdev, rx_ring->irq);
}
return work_done;
@@ -3840,6 +3849,7 @@ static int __devinit qlge_probe(struct pci_dev *pdev,
| NETIF_F_TSO_ECN
| NETIF_F_HW_VLAN_TX
| NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER);
+ ndev->features |= NETIF_F_GRO;
if (test_bit(QL_DMA64, &qdev->flags))
ndev->features |= NETIF_F_HIGHDMA;
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [net-next PATCH 05/12] qlge: Add tx multiqueue support.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
` (3 preceding siblings ...)
2009-03-09 20:59 ` [net-next PATCH 04/12] qlge: Add support for GRO Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
2009-03-10 11:46 ` [net-next PATCH0/12] qlge: More features and cleanup David Miller
2009-03-09 20:59 ` [net-next PATCH 06/12] qlge: bugfix: Tell hw to strip vlan header Ron Mercer
` (6 subsequent siblings)
11 siblings, 1 reply; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge_main.c | 31 ++++++++++++++-----------------
1 files changed, 14 insertions(+), 17 deletions(-)
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 339e1da..6da8901 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -1627,14 +1627,12 @@ static void ql_process_mac_tx_intr(struct ql_adapter *qdev,
/* Fire up a handler to reset the MPI processor. */
void ql_queue_fw_error(struct ql_adapter *qdev)
{
- netif_stop_queue(qdev->ndev);
netif_carrier_off(qdev->ndev);
queue_delayed_work(qdev->workqueue, &qdev->mpi_reset_work, 0);
}
void ql_queue_asic_error(struct ql_adapter *qdev)
{
- netif_stop_queue(qdev->ndev);
netif_carrier_off(qdev->ndev);
ql_disable_interrupts(qdev);
/* Clear adapter up bit to signal the recovery
@@ -1689,6 +1687,7 @@ static int ql_clean_outbound_rx_ring(struct rx_ring *rx_ring)
struct ob_mac_iocb_rsp *net_rsp = NULL;
int count = 0;
+ struct tx_ring *tx_ring;
/* While there are entries in the completion queue. */
while (prod != rx_ring->cnsmr_idx) {
@@ -1714,15 +1713,16 @@ static int ql_clean_outbound_rx_ring(struct rx_ring *rx_ring)
prod = ql_read_sh_reg(rx_ring->prod_idx_sh_reg);
}
ql_write_cq_idx(rx_ring);
- if (netif_queue_stopped(qdev->ndev) && net_rsp != NULL) {
- struct tx_ring *tx_ring = &qdev->tx_ring[net_rsp->txq_idx];
+ tx_ring = &qdev->tx_ring[net_rsp->txq_idx];
+ if (__netif_subqueue_stopped(qdev->ndev, tx_ring->wq_id) &&
+ net_rsp != NULL) {
if (atomic_read(&tx_ring->queue_stopped) &&
(atomic_read(&tx_ring->tx_count) > (tx_ring->wq_len / 4)))
/*
* The queue got stopped because the tx_ring was full.
* Wake it up, because it's now at least 25% empty.
*/
- netif_wake_queue(qdev->ndev);
+ netif_wake_subqueue(qdev->ndev, tx_ring->wq_id);
}
return count;
@@ -2054,7 +2054,7 @@ static int qlge_send(struct sk_buff *skb, struct net_device *ndev)
struct ql_adapter *qdev = netdev_priv(ndev);
int tso;
struct tx_ring *tx_ring;
- u32 tx_ring_idx = (u32) QL_TXQ_IDX(qdev, skb);
+ u32 tx_ring_idx = (u32) skb->queue_mapping;
tx_ring = &qdev->tx_ring[tx_ring_idx];
@@ -2062,7 +2062,7 @@ static int qlge_send(struct sk_buff *skb, struct net_device *ndev)
QPRINTK(qdev, TX_QUEUED, INFO,
"%s: shutting down tx queue %d du to lack of resources.\n",
__func__, tx_ring_idx);
- netif_stop_queue(ndev);
+ netif_stop_subqueue(ndev, tx_ring->wq_id);
atomic_inc(&tx_ring->queue_stopped);
return NETDEV_TX_BUSY;
}
@@ -3192,12 +3192,10 @@ static void ql_display_dev_info(struct net_device *ndev)
static int ql_adapter_down(struct ql_adapter *qdev)
{
- struct net_device *ndev = qdev->ndev;
int i, status = 0;
struct rx_ring *rx_ring;
- netif_stop_queue(ndev);
- netif_carrier_off(ndev);
+ netif_carrier_off(qdev->ndev);
/* Don't kill the reset worker thread if we
* are in the process of recovery.
@@ -3261,12 +3259,11 @@ static int ql_adapter_up(struct ql_adapter *qdev)
spin_unlock(&qdev->hw_lock);
set_bit(QL_ADAPTER_UP, &qdev->flags);
ql_alloc_rx_buffers(qdev);
+ if ((ql_read32(qdev, STS) & qdev->port_init))
+ netif_carrier_on(qdev->ndev);
ql_enable_interrupts(qdev);
ql_enable_all_completion_interrupts(qdev);
- if ((ql_read32(qdev, STS) & qdev->port_init)) {
- netif_carrier_on(qdev->ndev);
- netif_start_queue(qdev->ndev);
- }
+ netif_tx_start_all_queues(qdev->ndev);
return 0;
err_init:
@@ -3354,6 +3351,7 @@ static int ql_configure_rings(struct ql_adapter *qdev)
* completion handler rx_rings.
*/
qdev->rx_ring_count = qdev->tx_ring_count + qdev->rss_ring_count + 1;
+ netif_set_gso_max_size(qdev->ndev, 65536);
for (i = 0; i < qdev->tx_ring_count; i++) {
tx_ring = &qdev->tx_ring[i];
@@ -3829,7 +3827,8 @@ static int __devinit qlge_probe(struct pci_dev *pdev,
static int cards_found = 0;
int err = 0;
- ndev = alloc_etherdev(sizeof(struct ql_adapter));
+ ndev = alloc_etherdev_mq(sizeof(struct ql_adapter),
+ min(MAX_CPUS, (int)num_online_cpus()));
if (!ndev)
return -ENOMEM;
@@ -3872,7 +3871,6 @@ static int __devinit qlge_probe(struct pci_dev *pdev,
return err;
}
netif_carrier_off(ndev);
- netif_stop_queue(ndev);
ql_display_dev_info(ndev);
cards_found++;
return 0;
@@ -3926,7 +3924,6 @@ static pci_ers_result_t qlge_io_slot_reset(struct pci_dev *pdev)
pci_set_master(pdev);
netif_carrier_off(ndev);
- netif_stop_queue(ndev);
ql_adapter_reset(qdev);
/* Make sure the EEPROM is good */
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [net-next PATCH 06/12] qlge: bugfix: Tell hw to strip vlan header.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
` (4 preceding siblings ...)
2009-03-09 20:59 ` [net-next PATCH 05/12] qlge: Add tx multiqueue support Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 07/12] qlge: Get rid of irqsave/restore in intr disable Ron Mercer
` (5 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge_main.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 6da8901..8b6128e 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -3073,9 +3073,9 @@ static int ql_adapter_initialize(struct ql_adapter *qdev)
mask = value << 16;
ql_write32(qdev, SYS, mask | value);
- /* Set the default queue. */
- value = NIC_RCV_CFG_DFQ;
- mask = NIC_RCV_CFG_DFQ_MASK;
+ /* Set the default queue, and VLAN behavior. */
+ value = NIC_RCV_CFG_DFQ | NIC_RCV_CFG_RV;
+ mask = NIC_RCV_CFG_DFQ_MASK | (NIC_RCV_CFG_RV << 16);
ql_write32(qdev, NIC_RCV_CFG, (mask | value));
/* Set the MPI interrupt to enabled. */
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [net-next PATCH 07/12] qlge: Get rid of irqsave/restore in intr disable.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
` (5 preceding siblings ...)
2009-03-09 20:59 ` [net-next PATCH 06/12] qlge: bugfix: Tell hw to strip vlan header Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 08/12] qlge: Clear shadow registers before use Ron Mercer
` (4 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
The completion interrupt disable routine is only called from the ISR, so
there is no need for irqsave/restore.
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge_main.c | 5 ++---
1 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 8b6128e..45ad4cc 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -587,7 +587,6 @@ u32 ql_enable_completion_interrupt(struct ql_adapter *qdev, u32 intr)
static u32 ql_disable_completion_interrupt(struct ql_adapter *qdev, u32 intr)
{
u32 var = 0;
- unsigned long hw_flags;
struct intr_context *ctx;
/* HW disables for us if we're MSIX multi interrupts and
@@ -597,14 +596,14 @@ static u32 ql_disable_completion_interrupt(struct ql_adapter *qdev, u32 intr)
return 0;
ctx = qdev->intr_context + intr;
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
+ spin_lock(&qdev->hw_lock);
if (!atomic_read(&ctx->irq_cnt)) {
ql_write32(qdev, INTR_EN,
ctx->intr_dis_mask);
var = ql_read32(qdev, STS);
}
atomic_inc(&ctx->irq_cnt);
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
+ spin_unlock(&qdev->hw_lock);
return var;
}
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [net-next PATCH 08/12] qlge: Clear shadow registers before use.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
` (6 preceding siblings ...)
2009-03-09 20:59 ` [net-next PATCH 07/12] qlge: Get rid of irqsave/restore in intr disable Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 09/12] qlge: Remove spinlock from asic init path Ron Mercer
` (3 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge_main.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 45ad4cc..75ad4db 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -2142,6 +2142,7 @@ static int ql_alloc_shadow_space(struct ql_adapter *qdev)
"Allocation of RX shadow space failed.\n");
return -ENOMEM;
}
+ memset(qdev->rx_ring_shadow_reg_area, 0, PAGE_SIZE);
qdev->tx_ring_shadow_reg_area =
pci_alloc_consistent(qdev->pdev, PAGE_SIZE,
&qdev->tx_ring_shadow_reg_dma);
@@ -2150,6 +2151,7 @@ static int ql_alloc_shadow_space(struct ql_adapter *qdev)
"Allocation of TX shadow space failed.\n");
goto err_wqp_sh_area;
}
+ memset(qdev->tx_ring_shadow_reg_area, 0, PAGE_SIZE);
return 0;
err_wqp_sh_area:
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [net-next PATCH 09/12] qlge: Remove spinlock from asic init path.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
` (7 preceding siblings ...)
2009-03-09 20:59 ` [net-next PATCH 08/12] qlge: Clear shadow registers before use Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 10/12] qlge: bugfix: Move netif_napi_del() to common call point Ron Mercer
` (2 subsequent siblings)
11 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
There is nothing to contend with it.
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge_main.c | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 75ad4db..f7f104a 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -3250,14 +3250,12 @@ static int ql_adapter_up(struct ql_adapter *qdev)
{
int err = 0;
- spin_lock(&qdev->hw_lock);
err = ql_adapter_initialize(qdev);
if (err) {
QPRINTK(qdev, IFUP, INFO, "Unable to initialize adapter.\n");
spin_unlock(&qdev->hw_lock);
goto err_init;
}
- spin_unlock(&qdev->hw_lock);
set_bit(QL_ADAPTER_UP, &qdev->flags);
ql_alloc_rx_buffers(qdev);
if ((ql_read32(qdev, STS) & qdev->port_init))
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [net-next PATCH 10/12] qlge: bugfix: Move netif_napi_del() to common call point.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
` (8 preceding siblings ...)
2009-03-09 20:59 ` [net-next PATCH 09/12] qlge: Remove spinlock from asic init path Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 11/12] qlge: bugfix: Pad outbound frames smaller than 60 bytes Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 12/12] qlge: bugfix: Fix endian issue related to rx buffers Ron Mercer
11 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
Moving netif_napi_del() up the call chain so it will get called from all
exit points.
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge_main.c | 10 ++++++----
1 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index f7f104a..ce826da 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -3236,6 +3236,11 @@ static int ql_adapter_down(struct ql_adapter *qdev)
ql_tx_ring_clean(qdev);
+ /* Call netif_napi_del() from common point.
+ */
+ for (i = qdev->rss_ring_first_cq_id; i < qdev->rx_ring_count; i++)
+ netif_napi_del(&qdev->rx_ring[i].napi);
+
ql_free_rx_buffers(qdev);
spin_lock(&qdev->hw_lock);
status = ql_adapter_reset(qdev);
@@ -3964,7 +3969,7 @@ static int qlge_suspend(struct pci_dev *pdev, pm_message_t state)
{
struct net_device *ndev = pci_get_drvdata(pdev);
struct ql_adapter *qdev = netdev_priv(ndev);
- int err, i;
+ int err;
netif_device_detach(ndev);
@@ -3974,9 +3979,6 @@ static int qlge_suspend(struct pci_dev *pdev, pm_message_t state)
return err;
}
- for (i = qdev->rss_ring_first_cq_id; i < qdev->rx_ring_count; i++)
- netif_napi_del(&qdev->rx_ring[i].napi);
-
err = pci_save_state(pdev);
if (err)
return err;
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [net-next PATCH 11/12] qlge: bugfix: Pad outbound frames smaller than 60 bytes.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
` (9 preceding siblings ...)
2009-03-09 20:59 ` [net-next PATCH 10/12] qlge: bugfix: Move netif_napi_del() to common call point Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 12/12] qlge: bugfix: Fix endian issue related to rx buffers Ron Mercer
11 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
With some asic configurations xmit of frames smaller than 60 bytes may
fail.
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge_main.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index ce826da..1895846 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -2057,6 +2057,9 @@ static int qlge_send(struct sk_buff *skb, struct net_device *ndev)
tx_ring = &qdev->tx_ring[tx_ring_idx];
+ if (skb_padto(skb, ETH_ZLEN))
+ return NETDEV_TX_OK;
+
if (unlikely(atomic_read(&tx_ring->tx_count) < 2)) {
QPRINTK(qdev, TX_QUEUED, INFO,
"%s: shutting down tx queue %d du to lack of resources.\n",
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [net-next PATCH 12/12] qlge: bugfix: Fix endian issue related to rx buffers.
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
` (10 preceding siblings ...)
2009-03-09 20:59 ` [net-next PATCH 11/12] qlge: bugfix: Pad outbound frames smaller than 60 bytes Ron Mercer
@ 2009-03-09 20:59 ` Ron Mercer
11 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-09 20:59 UTC (permalink / raw)
To: davem; +Cc: netdev, linux-driver, ron.mercer
This was introduced in an earlier net-next patch.
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qlge/qlge_main.c | 9 ++++++---
1 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 1895846..b91b700 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -2526,6 +2526,7 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring)
qdev->doorbell_area + (DB_PAGE_SIZE * (128 + rx_ring->cq_id));
int err = 0;
u16 bq_len;
+ u64 tmp;
/* Set up the shadow registers for this ring. */
rx_ring->prod_idx_sh_reg = shadow_reg;
@@ -2571,7 +2572,8 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring)
FLAGS_LI; /* Load irq delay values */
if (rx_ring->lbq_len) {
cqicb->flags |= FLAGS_LL; /* Load lbq values */
- *((u64 *) rx_ring->lbq_base_indirect) = rx_ring->lbq_base_dma;
+ tmp = (u64)rx_ring->lbq_base_dma;;
+ *((__le64 *) rx_ring->lbq_base_indirect) = cpu_to_le64(tmp);
cqicb->lbq_addr =
cpu_to_le64(rx_ring->lbq_base_indirect_dma);
bq_len = (rx_ring->lbq_buf_size == 65536) ? 0 :
@@ -2587,11 +2589,12 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring)
}
if (rx_ring->sbq_len) {
cqicb->flags |= FLAGS_LS; /* Load sbq values */
- *((u64 *) rx_ring->sbq_base_indirect) = rx_ring->sbq_base_dma;
+ tmp = (u64)rx_ring->sbq_base_dma;;
+ *((__le64 *) rx_ring->sbq_base_indirect) = cpu_to_le64(tmp);
cqicb->sbq_addr =
cpu_to_le64(rx_ring->sbq_base_indirect_dma);
cqicb->sbq_buf_size =
- cpu_to_le16(((rx_ring->sbq_buf_size / 2) + 8) & 0xfffffff8);
+ cpu_to_le16((u16)(rx_ring->sbq_buf_size/2));
bq_len = (rx_ring->sbq_len == 65536) ? 0 :
(u16) rx_ring->sbq_len;
cqicb->sbq_len = cpu_to_le16(bq_len);
--
1.6.0.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [net-next PATCH0/12] qlge: More features and cleanup.
2009-03-09 20:59 ` [net-next PATCH 05/12] qlge: Add tx multiqueue support Ron Mercer
@ 2009-03-10 11:46 ` David Miller
0 siblings, 0 replies; 15+ messages in thread
From: David Miller @ 2009-03-10 11:46 UTC (permalink / raw)
To: ron.mercer; +Cc: netdev, linux-driver
From: Ron Mercer <ron.mercer@qlogic.com>
Date: Mon, 9 Mar 2009 13:59:16 -0700
> Attached are more qlge patches for adding features such as multi TXQ and
> LRO.
> I've also included 4 bug fixes, 3 of which I will also post to net-2.6
> in a separate series tomorrow.
All applied, thanks Ron, although one thing I think you should
get rid of:
> @@ -3354,6 +3351,7 @@ static int ql_configure_rings(struct ql_adapter *qdev)
> * completion handler rx_rings.
> */
> qdev->rx_ring_count = qdev->tx_ring_count + qdev->rss_ring_count + 1;
> + netif_set_gso_max_size(qdev->ndev, 65536);
>
> for (i = 0; i < qdev->tx_ring_count; i++) {
> tx_ring = &qdev->tx_ring[i];
65536 (defined by GSO_MAX_SIZE) is the default and it's really a good
idea to only use this override interface on chips that actaully have
restrictions and can't use the default.
I also don't see what this change had to do with adding TX
multiqueue support :-) It wasn't mentioned in the commit log
message in any way either. Please don't slip small things in
like this.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [net-next PATCH0/12] qlge: More features and cleanup.
@ 2009-03-10 20:28 Ron Mercer
0 siblings, 0 replies; 15+ messages in thread
From: Ron Mercer @ 2009-03-10 20:28 UTC (permalink / raw)
To: davem; +Cc: netdev, ron.mercer
>> tatic int ql_configure_rings(struct ql_adapter *qdev)
>> * completion handler rx_rings.
>> */
>> qdev->rx_ring_count = qdev->tx_ring_count + qdev->rss_ring_count
>> + 1;
>> + netif_set_gso_max_size(qdev->ndev, 65536);
>>
>> for (i = 0; i < qdev->tx_ring_count; i++) {
>> tx_ring = &qdev->tx_ring[i];
>
>65536 (defined by GSO_MAX_SIZE) is the default and it's really a good
>idea to only use this override interface on chips that actaully have
>restrictions and can't use the default.
>
>I also don't see what this change had to do with adding TX
>multiqueue support :-) It wasn't mentioned in the commit log
>message in any way either. Please don't slip small things in
>like this.
Dave,
Thanks for clarifying this for me. I'll drop this line in my next
series. I should have sent it as a separate (rejectable) patch.
I'll be more careful about that.
Ron
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2009-03-10 20:31 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-09 20:59 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 01/12] qlge: Move reset logic into asic_reset_worker func Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 02/12] qlge: Remove debug junk from asic reset logic Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 03/12] qlge: Increase filtering for inbound csum settings Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 04/12] qlge: Add support for GRO Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 05/12] qlge: Add tx multiqueue support Ron Mercer
2009-03-10 11:46 ` [net-next PATCH0/12] qlge: More features and cleanup David Miller
2009-03-09 20:59 ` [net-next PATCH 06/12] qlge: bugfix: Tell hw to strip vlan header Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 07/12] qlge: Get rid of irqsave/restore in intr disable Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 08/12] qlge: Clear shadow registers before use Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 09/12] qlge: Remove spinlock from asic init path Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 10/12] qlge: bugfix: Move netif_napi_del() to common call point Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 11/12] qlge: bugfix: Pad outbound frames smaller than 60 bytes Ron Mercer
2009-03-09 20:59 ` [net-next PATCH 12/12] qlge: bugfix: Fix endian issue related to rx buffers Ron Mercer
-- strict thread matches above, loose matches on Subject: below --
2009-03-10 20:28 [net-next PATCH0/12] qlge: More features and cleanup Ron Mercer
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).