* [PATCH 0/2] qla3xxx: bugfixes to link management.
@ 2007-11-07 21:56 Ron Mercer
2007-11-07 21:59 ` [PATCH 1/2] qla3xxx: bugfix: Move link state machine into a worker thread Ron Mercer
2007-11-07 21:59 ` [PATCH 2/2] qla3xxx: bugfix: Fix bad logical operation in link state machine Ron Mercer
0 siblings, 2 replies; 4+ messages in thread
From: Ron Mercer @ 2007-11-07 21:56 UTC (permalink / raw)
To: jeff; +Cc: netdev
Hi Jeff,
The attached two patches fix a couple of problems in the link management.
Built and tested on today's netdev/upstream.
Regards,
Ron Mercer
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] qla3xxx: bugfix: Move link state machine into a worker thread
2007-11-07 21:56 [PATCH 0/2] qla3xxx: bugfixes to link management Ron Mercer
@ 2007-11-07 21:59 ` Ron Mercer
2007-11-08 17:47 ` Jeff Garzik
2007-11-07 21:59 ` [PATCH 2/2] qla3xxx: bugfix: Fix bad logical operation in link state machine Ron Mercer
1 sibling, 1 reply; 4+ messages in thread
From: Ron Mercer @ 2007-11-07 21:59 UTC (permalink / raw)
To: jeff; +Cc: netdev, Ron Mercer
The link state machine requires access to some resources that
are shared with the iSCSI function on the chip. (See iSCSI
driver at drivers/scsi/qla4xxx) If the interface is being
up/downed at a rapid pace this driver may need to sleep
waiting to get access to the common resources. For this we
are moving the state machine to run as a work thread.
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qla3xxx.c | 27 +++++++++++++--------------
drivers/net/qla3xxx.h | 1 +
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c
index 30adf72..4f0fd41 100644
--- a/drivers/net/qla3xxx.c
+++ b/drivers/net/qla3xxx.c
@@ -1645,8 +1645,11 @@ static int ql_finish_auto_neg(struct ql3_adapter *qdev)
return 0;
}
-static void ql_link_state_machine(struct ql3_adapter *qdev)
+static void ql_link_state_machine_work(struct work_struct *work)
{
+ struct ql3_adapter *qdev =
+ container_of(work, struct ql3_adapter, link_state_work.work);
+
u32 curr_link_state;
unsigned long hw_flags;
@@ -1661,6 +1664,10 @@ static void ql_link_state_machine(struct ql3_adapter *qdev)
"state.\n", qdev->ndev->name);
spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
+
+ /* Restart timer on 2 second interval. */
+ mod_timer(&qdev->adapter_timer, jiffies + HZ * 1);\
+
return;
}
@@ -1705,6 +1712,9 @@ static void ql_link_state_machine(struct ql3_adapter *qdev)
break;
}
spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
+
+ /* Restart timer on 2 second interval. */
+ mod_timer(&qdev->adapter_timer, jiffies + HZ * 1);
}
/*
@@ -3941,19 +3951,7 @@ static void ql_get_board_info(struct ql3_adapter *qdev)
static void ql3xxx_timer(unsigned long ptr)
{
struct ql3_adapter *qdev = (struct ql3_adapter *)ptr;
-
- if (test_bit(QL_RESET_ACTIVE,&qdev->flags)) {
- printk(KERN_DEBUG PFX
- "%s: Reset in progress.\n",
- qdev->ndev->name);
- goto end;
- }
-
- ql_link_state_machine(qdev);
-
- /* Restart timer on 2 second interval. */
-end:
- mod_timer(&qdev->adapter_timer, jiffies + HZ * 1);
+ queue_delayed_work(qdev->workqueue, &qdev->link_state_work, 0);
}
static int __devinit ql3xxx_probe(struct pci_dev *pdev,
@@ -4103,6 +4101,7 @@ static int __devinit ql3xxx_probe(struct pci_dev *pdev,
qdev->workqueue = create_singlethread_workqueue(ndev->name);
INIT_DELAYED_WORK(&qdev->reset_work, ql_reset_work);
INIT_DELAYED_WORK(&qdev->tx_timeout_work, ql_tx_timeout_work);
+ INIT_DELAYED_WORK(&qdev->link_state_work, ql_link_state_machine_work);
init_timer(&qdev->adapter_timer);
qdev->adapter_timer.function = ql3xxx_timer;
diff --git a/drivers/net/qla3xxx.h b/drivers/net/qla3xxx.h
index fbcb0b9..d0ffb30 100644
--- a/drivers/net/qla3xxx.h
+++ b/drivers/net/qla3xxx.h
@@ -1286,6 +1286,7 @@ struct ql3_adapter {
struct workqueue_struct *workqueue;
struct delayed_work reset_work;
struct delayed_work tx_timeout_work;
+ struct delayed_work link_state_work;
u32 max_frame_size;
u32 device_id;
u16 phyType;
--
1.5.0.rc4.16.g9e258
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] qla3xxx: bugfix: Fix bad logical operation in link state machine.
2007-11-07 21:56 [PATCH 0/2] qla3xxx: bugfixes to link management Ron Mercer
2007-11-07 21:59 ` [PATCH 1/2] qla3xxx: bugfix: Move link state machine into a worker thread Ron Mercer
@ 2007-11-07 21:59 ` Ron Mercer
1 sibling, 0 replies; 4+ messages in thread
From: Ron Mercer @ 2007-11-07 21:59 UTC (permalink / raw)
To: jeff; +Cc: netdev, Ron Mercer
Luckily, this wasn't reported or reproduced. The logical operation for
setting duplex had wrong grouping.
Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
---
drivers/net/qla3xxx.c | 15 +++++----------
1 files changed, 5 insertions(+), 10 deletions(-)
diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c
index 4f0fd41..a579111 100644
--- a/drivers/net/qla3xxx.c
+++ b/drivers/net/qla3xxx.c
@@ -1456,16 +1456,11 @@ static void ql_phy_start_neg_ex(struct ql3_adapter *qdev)
PHYAddr[qdev->mac_index]);
reg &= ~PHY_GIG_ALL_PARAMS;
- if(portConfiguration &
- PORT_CONFIG_FULL_DUPLEX_ENABLED &
- PORT_CONFIG_1000MB_SPEED) {
- reg |= PHY_GIG_ADV_1000F;
- }
-
- if(portConfiguration &
- PORT_CONFIG_HALF_DUPLEX_ENABLED &
- PORT_CONFIG_1000MB_SPEED) {
- reg |= PHY_GIG_ADV_1000H;
+ if(portConfiguration & PORT_CONFIG_1000MB_SPEED) {
+ if(portConfiguration & PORT_CONFIG_FULL_DUPLEX_ENABLED)
+ reg |= PHY_GIG_ADV_1000F;
+ else
+ reg |= PHY_GIG_ADV_1000H;
}
ql_mii_write_reg_ex(qdev, PHY_GIG_CONTROL, reg,
--
1.5.0.rc4.16.g9e258
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] qla3xxx: bugfix: Move link state machine into a worker thread
2007-11-07 21:59 ` [PATCH 1/2] qla3xxx: bugfix: Move link state machine into a worker thread Ron Mercer
@ 2007-11-08 17:47 ` Jeff Garzik
0 siblings, 0 replies; 4+ messages in thread
From: Jeff Garzik @ 2007-11-08 17:47 UTC (permalink / raw)
To: Ron Mercer; +Cc: netdev
On Wed, Nov 07, 2007 at 01:59:06PM -0800, Ron Mercer wrote:
> The link state machine requires access to some resources that
> are shared with the iSCSI function on the chip. (See iSCSI
> driver at drivers/scsi/qla4xxx) If the interface is being
> up/downed at a rapid pace this driver may need to sleep
> waiting to get access to the common resources. For this we
> are moving the state machine to run as a work thread.
>
> Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
> ---
> drivers/net/qla3xxx.c | 27 +++++++++++++--------------
> drivers/net/qla3xxx.h | 1 +
> 2 files changed, 14 insertions(+), 14 deletions(-)
applied 1-2
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2007-11-08 17:47 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-07 21:56 [PATCH 0/2] qla3xxx: bugfixes to link management Ron Mercer
2007-11-07 21:59 ` [PATCH 1/2] qla3xxx: bugfix: Move link state machine into a worker thread Ron Mercer
2007-11-08 17:47 ` Jeff Garzik
2007-11-07 21:59 ` [PATCH 2/2] qla3xxx: bugfix: Fix bad logical operation in link state machine 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).