qla3xxx: Ensure request/response queue addr writes to the registers
Subsystems (3)
PATCH 1/1 qla3xxx: Ensure request/response queue addr writes to the registers
Before use the request and response queue addr, make sure it has wrote to the registers.
--- drivers/net/ethernet/qlogic/qla3xxx.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/ethernet/qlogic/qla3xxx.c +6 -0
@@ -2525,6 +2525,12 @@ static int ql_alloc_net_req_rsp_queues(struct ql3_adapter *qdev) qdev->req_q_size = (u32) (NUM_REQ_Q_ENTRIES *sizeof (struct ob_mac_iocb_req )); +/* +* The barrier is required to ensure request and response queue +* addr writes to the registers. +*/ +wmb (); + qdev->req_q_virt_addr = pci_alloc_consistent(qdev->pdev, (size_t) qdev->req_q_size,
Signature · 1 line
1.7.11.7
Quoted 25 lines
From: Joe Jin [mailto:[email protected]]
Sent: Thursday, October 18, 2012 6:25 PM
To: Ron Mercer; Dept-Eng Linux Driver; Jitendra Kalsaria; Joe Jin
Cc: netdev; linux-kernel; Greg Marsden
Subject: [PATCH] qla3xxx: Ensure request/response queue addr writes to the registersBefore use the request and response queue addr, make sure it has wrote to the registers.
Signed-off-by Joe Jin <[email protected]>Cc Jitendra Kalsaria <[email protected]>Cc Ron Mercer <[email protected]>---
drivers/net/ethernet/qlogic/qla3xxx.c| 6 ++++++1 file changed, 6 insertions(+)drivers/net/ethernet/qlogic/qla3xxx.c +0
-0@@ -2525,6 +2525,12 @@ static int ql_alloc_net_req_rsp_queues(struct ql3_adapter *qdev) qdev->req_q_size = (u32) (NUM_REQ_Q_ENTRIES *sizeof (struct ob_mac_iocb_req ));
drivers/net/ethernet/qlogic/qla3xxx.c static int ql_alloc_net_req_rsp_queues(struct ql3_adapter *qdev) · line 2536
Quoted 10 lines
drivers/net/ethernet/qlogic/qla3xxx.c +6
-0+/* +* The barrier is required to ensure request and response queue +* addr writes to the registers. +*/ +wmb (); + qdev->req_q_virt_addr = pci_alloc_consistent(qdev->pdev, (size_t) qdev->req_q_size,
Joe,
You need to move below line above the write memory barrier to get response queue address write to register
qdev->rsp_q_size = NUM_RSP_Q_ENTRIES * sizeof(struct net_rsp_iocb);
Your patch will be like below:
<snip>
qdev->req_q_size = (u32) (NUM_REQ_Q_ENTRIES * sizeof(struct ob_mac_iocb_req));
+ qdev->rsp_q_size = NUM_RSP_Q_ENTRIES * sizeof(struct net_rsp_iocb);
+
+ /*
+ * The barrier is required to ensure request and response queue
+ * addr writes to the registers.
+ */
+ wmb();
+
<\snip>
thanks,
Jiten
Signature · 1 line
1.7.11.7