* [PATCH 0/5] qlge: Fixes from PPC bringup. @ 2008-12-30 21:11 Ron Mercer 2008-12-30 21:12 ` [PATCH 1/5] qlge: bugfix: Add missing pci_mapping_err checking Ron Mercer ` (4 more replies) 0 siblings, 5 replies; 12+ messages in thread From: Ron Mercer @ 2008-12-30 21:11 UTC (permalink / raw) To: davem, jeff; +Cc: bhutchings, hch, "ron.mercer, "netdev Dave/Jeff, The attached patch series replaces those I sent on 12/24. Patch 3/5 is cleaned up per Ben and Christoph. The rest have the file mode changed removed per Dave. Christoph also asked me to verify the entire driver for endianess with sparse which I am now working on. In the meantime I would like to get these changes dropped in if possible. Regards, Ron ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 1/5] qlge: bugfix: Add missing pci_mapping_err checking. 2008-12-30 21:11 [PATCH 0/5] qlge: Fixes from PPC bringup Ron Mercer @ 2008-12-30 21:12 ` Ron Mercer 2009-01-05 1:08 ` David Miller 2008-12-30 21:12 ` [PATCH 2/5] qlge: bugfix: Add missing pci_unmap_page call in receive path Ron Mercer ` (3 subsequent siblings) 4 siblings, 1 reply; 12+ messages in thread From: Ron Mercer @ 2008-12-30 21:12 UTC (permalink / raw) To: davem, jeff; +Cc: netdev, linux-driver, ron.mercer, bhutchings, hch Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> --- drivers/net/qlge/qlge_main.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 718a7bd..c6ab6a4 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c @@ -963,6 +963,11 @@ static void ql_update_sbq(struct ql_adapter *qdev, struct rx_ring *rx_ring) sbq_desc->p.skb->data, rx_ring->sbq_buf_size / 2, PCI_DMA_FROMDEVICE); + if (pci_dma_mapping_error(qdev->pdev, map)) { + QPRINTK(qdev, IFUP, ERR, "PCI mapping failed.\n"); + rx_ring->sbq_clean_idx = clean_idx; + return; + } pci_unmap_addr_set(sbq_desc, mapaddr, map); pci_unmap_len_set(sbq_desc, maplen, rx_ring->sbq_buf_size / 2); -- 1.6.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 1/5] qlge: bugfix: Add missing pci_mapping_err checking. 2008-12-30 21:12 ` [PATCH 1/5] qlge: bugfix: Add missing pci_mapping_err checking Ron Mercer @ 2009-01-05 1:08 ` David Miller 0 siblings, 0 replies; 12+ messages in thread From: David Miller @ 2009-01-05 1:08 UTC (permalink / raw) To: ron.mercer; +Cc: jeff, netdev, linux-driver, bhutchings, hch From: Ron Mercer <ron.mercer@qlogic.com> Date: Tue, 30 Dec 2008 13:12:21 -0800 > Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> Applied. ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2/5] qlge: bugfix: Add missing pci_unmap_page call in receive path. 2008-12-30 21:11 [PATCH 0/5] qlge: Fixes from PPC bringup Ron Mercer 2008-12-30 21:12 ` [PATCH 1/5] qlge: bugfix: Add missing pci_mapping_err checking Ron Mercer @ 2008-12-30 21:12 ` Ron Mercer 2009-01-05 1:08 ` David Miller 2008-12-30 21:12 ` [PATCH 3/5] qlge: bugfix: Fix shadow register endian issue Ron Mercer ` (2 subsequent siblings) 4 siblings, 1 reply; 12+ messages in thread From: Ron Mercer @ 2008-12-30 21:12 UTC (permalink / raw) To: davem, jeff; +Cc: netdev, linux-driver, ron.mercer, bhutchings, hch Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> --- drivers/net/qlge/qlge_main.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index c6ab6a4..9ceedfc 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c @@ -1308,6 +1308,11 @@ static struct sk_buff *ql_build_rx_skb(struct ql_adapter *qdev, "No skb available, drop the packet.\n"); return NULL; } + pci_unmap_page(qdev->pdev, + pci_unmap_addr(lbq_desc, + mapaddr), + pci_unmap_len(lbq_desc, maplen), + PCI_DMA_FROMDEVICE); skb_reserve(skb, NET_IP_ALIGN); QPRINTK(qdev, RX_STATUS, DEBUG, "%d bytes of headers and data in large. Chain page to new skb and pull tail.\n", length); -- 1.6.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 2/5] qlge: bugfix: Add missing pci_unmap_page call in receive path. 2008-12-30 21:12 ` [PATCH 2/5] qlge: bugfix: Add missing pci_unmap_page call in receive path Ron Mercer @ 2009-01-05 1:08 ` David Miller 0 siblings, 0 replies; 12+ messages in thread From: David Miller @ 2009-01-05 1:08 UTC (permalink / raw) To: ron.mercer; +Cc: jeff, netdev, linux-driver, bhutchings, hch From: Ron Mercer <ron.mercer@qlogic.com> Date: Tue, 30 Dec 2008 13:12:22 -0800 > Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> Applied. ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 3/5] qlge: bugfix: Fix shadow register endian issue. 2008-12-30 21:11 [PATCH 0/5] qlge: Fixes from PPC bringup Ron Mercer 2008-12-30 21:12 ` [PATCH 1/5] qlge: bugfix: Add missing pci_mapping_err checking Ron Mercer 2008-12-30 21:12 ` [PATCH 2/5] qlge: bugfix: Add missing pci_unmap_page call in receive path Ron Mercer @ 2008-12-30 21:12 ` Ron Mercer 2009-01-05 1:09 ` David Miller 2008-12-30 21:12 ` [PATCH 4/5] qlge: bugfix: Fix ring length setting for rx ring, large/small Ron Mercer 2008-12-30 21:12 ` [PATCH 5/5] qlge: bugfix: Fix register access error checking Ron Mercer 4 siblings, 1 reply; 12+ messages in thread From: Ron Mercer @ 2008-12-30 21:12 UTC (permalink / raw) To: davem, jeff; +Cc: netdev, linux-driver, ron.mercer, bhutchings, hch Shadow registers are consistent memory locations to which the chip echos ring indexes in little endian format. These values need to be endian swapped before referencing. Note: The register pointer declaration uses the volatile modifier which causes warnings in checkpatch. Per Documentation/volatile-considered-harmful.txt: - Pointers to data structures in coherent memory which might be modified by I/O devices can, sometimes, legitimately be volatile. A ring buffer used by a network adapter, where that adapter changes pointers to indicate which descriptors have been processed, is an example of this type of situation. Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> --- drivers/net/qlge/qlge.h | 17 +---------------- drivers/net/qlge/qlge_main.c | 12 ++++++------ 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h index ba2e1c5..97321bb 100644 --- a/drivers/net/qlge/qlge.h +++ b/drivers/net/qlge/qlge.h @@ -1189,7 +1189,7 @@ struct rx_ring { u32 cq_size; u32 cq_len; u16 cq_id; - u32 *prod_idx_sh_reg; /* Shadowed producer register. */ + volatile __le32 *prod_idx_sh_reg; /* Shadowed producer register. */ dma_addr_t prod_idx_sh_reg_dma; void __iomem *cnsmr_idx_db_reg; /* PCI doorbell mem area + 0 */ u32 cnsmr_idx; /* current sw idx */ @@ -1467,21 +1467,6 @@ static inline void ql_write_db_reg(u32 val, void __iomem *addr) mmiowb(); } -/* - * Shadow Registers: - * Outbound queues have a consumer index that is maintained by the chip. - * Inbound queues have a producer index that is maintained by the chip. - * For lower overhead, these registers are "shadowed" to host memory - * which allows the device driver to track the queue progress without - * PCI reads. When an entry is placed on an inbound queue, the chip will - * update the relevant index register and then copy the value to the - * shadow register in host memory. - */ -static inline unsigned int ql_read_sh_reg(const volatile void *addr) -{ - return *(volatile unsigned int __force *)addr; -} - extern char qlge_driver_name[]; extern const char qlge_driver_version[]; extern const struct ethtool_ops qlge_ethtool_ops; diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 9ceedfc..c0e43c5 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c @@ -1559,7 +1559,7 @@ static void ql_process_chip_ae_intr(struct ql_adapter *qdev, static int ql_clean_outbound_rx_ring(struct rx_ring *rx_ring) { struct ql_adapter *qdev = rx_ring->qdev; - u32 prod = ql_read_sh_reg(rx_ring->prod_idx_sh_reg); + u32 prod = le32_to_cpu(*rx_ring->prod_idx_sh_reg); struct ob_mac_iocb_rsp *net_rsp = NULL; int count = 0; @@ -1585,7 +1585,7 @@ static int ql_clean_outbound_rx_ring(struct rx_ring *rx_ring) } count++; ql_update_cq(rx_ring); - prod = ql_read_sh_reg(rx_ring->prod_idx_sh_reg); + prod = le32_to_cpu(*rx_ring->prod_idx_sh_reg); } ql_write_cq_idx(rx_ring); if (netif_queue_stopped(qdev->ndev) && net_rsp != NULL) { @@ -1605,7 +1605,7 @@ static int ql_clean_outbound_rx_ring(struct rx_ring *rx_ring) static int ql_clean_inbound_rx_ring(struct rx_ring *rx_ring, int budget) { struct ql_adapter *qdev = rx_ring->qdev; - u32 prod = ql_read_sh_reg(rx_ring->prod_idx_sh_reg); + u32 prod = le32_to_cpu(*rx_ring->prod_idx_sh_reg); struct ql_net_rsp_iocb *net_rsp; int count = 0; @@ -1638,7 +1638,7 @@ static int ql_clean_inbound_rx_ring(struct rx_ring *rx_ring, int budget) } count++; ql_update_cq(rx_ring); - prod = ql_read_sh_reg(rx_ring->prod_idx_sh_reg); + prod = le32_to_cpu(*rx_ring->prod_idx_sh_reg); if (count == budget) break; } @@ -1801,7 +1801,7 @@ static irqreturn_t qlge_isr(int irq, void *dev_id) * Check the default queue and wake handler if active. */ rx_ring = &qdev->rx_ring[0]; - if (ql_read_sh_reg(rx_ring->prod_idx_sh_reg) != rx_ring->cnsmr_idx) { + if (le32_to_cpu(*rx_ring->prod_idx_sh_reg) != rx_ring->cnsmr_idx) { QPRINTK(qdev, INTR, INFO, "Waking handler for rx_ring[0].\n"); ql_disable_completion_interrupt(qdev, intr_context->intr); queue_delayed_work_on(smp_processor_id(), qdev->q_workqueue, @@ -1815,7 +1815,7 @@ static irqreturn_t qlge_isr(int irq, void *dev_id) */ for (i = 1; i < qdev->rx_ring_count; i++) { rx_ring = &qdev->rx_ring[i]; - if (ql_read_sh_reg(rx_ring->prod_idx_sh_reg) != + if (le32_to_cpu(*rx_ring->prod_idx_sh_reg) != rx_ring->cnsmr_idx) { QPRINTK(qdev, INTR, INFO, "Waking handler for rx_ring[%d].\n", i); -- 1.6.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 3/5] qlge: bugfix: Fix shadow register endian issue. 2008-12-30 21:12 ` [PATCH 3/5] qlge: bugfix: Fix shadow register endian issue Ron Mercer @ 2009-01-05 1:09 ` David Miller 0 siblings, 0 replies; 12+ messages in thread From: David Miller @ 2009-01-05 1:09 UTC (permalink / raw) To: ron.mercer; +Cc: jeff, netdev, linux-driver, bhutchings, hch From: Ron Mercer <ron.mercer@qlogic.com> Date: Tue, 30 Dec 2008 13:12:23 -0800 > Shadow registers are consistent memory locations to which the chip > echos ring indexes in little endian format. These values need to > be endian swapped before referencing. > > Note: > The register pointer declaration uses the volatile modifier which > causes warnings in checkpatch. > Per Documentation/volatile-considered-harmful.txt: > - Pointers to data structures in coherent memory which might be modified > by I/O devices can, sometimes, legitimately be volatile. A ring buffer > used by a network adapter, where that adapter changes pointers to > indicate which descriptors have been processed, is an example of this > type of situation. > > Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> Applied, but still kill the volatile and use proper memory barriers around accesses to this value instead. Many other drivers handle exactly this situation without having to resort to volatile. ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/5] qlge: bugfix: Fix ring length setting for rx ring, large/small 2008-12-30 21:11 [PATCH 0/5] qlge: Fixes from PPC bringup Ron Mercer ` (2 preceding siblings ...) 2008-12-30 21:12 ` [PATCH 3/5] qlge: bugfix: Fix shadow register endian issue Ron Mercer @ 2008-12-30 21:12 ` Ron Mercer 2009-01-05 1:09 ` David Miller 2008-12-30 21:12 ` [PATCH 5/5] qlge: bugfix: Fix register access error checking Ron Mercer 4 siblings, 1 reply; 12+ messages in thread From: Ron Mercer @ 2008-12-30 21:12 UTC (permalink / raw) To: davem, jeff; +Cc: netdev, linux-driver, ron.mercer, bhutchings, hch The length field for these rings is 16-bits. If the length is the max supported 65536 then the setting should be zero. Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> --- drivers/net/qlge/qlge_main.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index c0e43c5..ffa2100 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c @@ -2491,7 +2491,8 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring) memset((void *)cqicb, 0, sizeof(struct cqicb)); cqicb->msix_vect = rx_ring->irq; - cqicb->len = cpu_to_le16(rx_ring->cq_len | LEN_V | LEN_CPP_CONT); + bq_len = (rx_ring->cq_len == 65536) ? 0 : (u16) rx_ring->cq_len; + cqicb->len = cpu_to_le16(bq_len | LEN_V | LEN_CPP_CONT); cqicb->addr_lo = cpu_to_le32(rx_ring->cq_base_dma); cqicb->addr_hi = cpu_to_le32((u64) rx_ring->cq_base_dma >> 32); @@ -2513,8 +2514,11 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring) cpu_to_le32(rx_ring->lbq_base_indirect_dma); cqicb->lbq_addr_hi = cpu_to_le32((u64) rx_ring->lbq_base_indirect_dma >> 32); - cqicb->lbq_buf_size = cpu_to_le32(rx_ring->lbq_buf_size); - bq_len = (u16) rx_ring->lbq_len; + bq_len = (rx_ring->lbq_buf_size == 65536) ? 0 : + (u16) rx_ring->lbq_buf_size; + cqicb->lbq_buf_size = cpu_to_le16(bq_len); + bq_len = (rx_ring->lbq_len == 65536) ? 0 : + (u16) rx_ring->lbq_len; cqicb->lbq_len = cpu_to_le16(bq_len); rx_ring->lbq_prod_idx = rx_ring->lbq_len - 16; rx_ring->lbq_curr_idx = 0; @@ -2530,7 +2534,8 @@ static int ql_start_rx_ring(struct ql_adapter *qdev, struct rx_ring *rx_ring) cpu_to_le32((u64) rx_ring->sbq_base_indirect_dma >> 32); cqicb->sbq_buf_size = cpu_to_le16(((rx_ring->sbq_buf_size / 2) + 8) & 0xfffffff8); - bq_len = (u16) rx_ring->sbq_len; + bq_len = (rx_ring->sbq_len == 65536) ? 0 : + (u16) rx_ring->sbq_len; cqicb->sbq_len = cpu_to_le16(bq_len); rx_ring->sbq_prod_idx = rx_ring->sbq_len - 16; rx_ring->sbq_curr_idx = 0; -- 1.6.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 4/5] qlge: bugfix: Fix ring length setting for rx ring, large/small 2008-12-30 21:12 ` [PATCH 4/5] qlge: bugfix: Fix ring length setting for rx ring, large/small Ron Mercer @ 2009-01-05 1:09 ` David Miller 0 siblings, 0 replies; 12+ messages in thread From: David Miller @ 2009-01-05 1:09 UTC (permalink / raw) To: ron.mercer; +Cc: jeff, netdev, linux-driver, bhutchings, hch From: Ron Mercer <ron.mercer@qlogic.com> Date: Tue, 30 Dec 2008 13:12:24 -0800 > The length field for these rings is 16-bits. If the length is > the max supported 65536 then the setting should be zero. > > Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> Applied. ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 5/5] qlge: bugfix: Fix register access error checking. 2008-12-30 21:11 [PATCH 0/5] qlge: Fixes from PPC bringup Ron Mercer ` (3 preceding siblings ...) 2008-12-30 21:12 ` [PATCH 4/5] qlge: bugfix: Fix ring length setting for rx ring, large/small Ron Mercer @ 2008-12-30 21:12 ` Ron Mercer 2009-01-05 1:09 ` David Miller 4 siblings, 1 reply; 12+ messages in thread From: Ron Mercer @ 2008-12-30 21:12 UTC (permalink / raw) To: davem, jeff; +Cc: netdev, linux-driver, ron.mercer, bhutchings, hch Some indexed registers do not have error bits. In these cases a value of zero should be used for error checking. Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> --- drivers/net/qlge/qlge_main.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index ffa2100..837be72 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c @@ -257,7 +257,7 @@ int ql_get_mac_addr_reg(struct ql_adapter *qdev, u32 type, u16 index, { status = ql_wait_reg_rdy(qdev, - MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E); + MAC_ADDR_IDX, MAC_ADDR_MW, 0); if (status) goto exit; ql_write32(qdev, MAC_ADDR_IDX, (offset++) | /* offset */ @@ -265,13 +265,13 @@ int ql_get_mac_addr_reg(struct ql_adapter *qdev, u32 type, u16 index, MAC_ADDR_ADR | MAC_ADDR_RS | type); /* type */ status = ql_wait_reg_rdy(qdev, - MAC_ADDR_IDX, MAC_ADDR_MR, MAC_ADDR_E); + MAC_ADDR_IDX, MAC_ADDR_MR, 0); if (status) goto exit; *value++ = ql_read32(qdev, MAC_ADDR_DATA); status = ql_wait_reg_rdy(qdev, - MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E); + MAC_ADDR_IDX, MAC_ADDR_MW, 0); if (status) goto exit; ql_write32(qdev, MAC_ADDR_IDX, (offset++) | /* offset */ @@ -279,14 +279,14 @@ int ql_get_mac_addr_reg(struct ql_adapter *qdev, u32 type, u16 index, MAC_ADDR_ADR | MAC_ADDR_RS | type); /* type */ status = ql_wait_reg_rdy(qdev, - MAC_ADDR_IDX, MAC_ADDR_MR, MAC_ADDR_E); + MAC_ADDR_IDX, MAC_ADDR_MR, 0); if (status) goto exit; *value++ = ql_read32(qdev, MAC_ADDR_DATA); if (type == MAC_ADDR_TYPE_CAM_MAC) { status = ql_wait_reg_rdy(qdev, - MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E); + MAC_ADDR_IDX, MAC_ADDR_MW, 0); if (status) goto exit; ql_write32(qdev, MAC_ADDR_IDX, (offset++) | /* offset */ @@ -294,7 +294,7 @@ int ql_get_mac_addr_reg(struct ql_adapter *qdev, u32 type, u16 index, MAC_ADDR_ADR | MAC_ADDR_RS | type); /* type */ status = ql_wait_reg_rdy(qdev, MAC_ADDR_IDX, - MAC_ADDR_MR, MAC_ADDR_E); + MAC_ADDR_MR, 0); if (status) goto exit; *value++ = ql_read32(qdev, MAC_ADDR_DATA); @@ -344,7 +344,7 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type, status = ql_wait_reg_rdy(qdev, - MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E); + MAC_ADDR_IDX, MAC_ADDR_MW, 0); if (status) goto exit; ql_write32(qdev, MAC_ADDR_IDX, (offset++) | /* offset */ @@ -353,7 +353,7 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type, ql_write32(qdev, MAC_ADDR_DATA, lower); status = ql_wait_reg_rdy(qdev, - MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E); + MAC_ADDR_IDX, MAC_ADDR_MW, 0); if (status) goto exit; ql_write32(qdev, MAC_ADDR_IDX, (offset++) | /* offset */ @@ -362,7 +362,7 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type, ql_write32(qdev, MAC_ADDR_DATA, upper); status = ql_wait_reg_rdy(qdev, - MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E); + MAC_ADDR_IDX, MAC_ADDR_MW, 0); if (status) goto exit; ql_write32(qdev, MAC_ADDR_IDX, (offset) | /* offset */ @@ -400,7 +400,7 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type, status = ql_wait_reg_rdy(qdev, - MAC_ADDR_IDX, MAC_ADDR_MW, MAC_ADDR_E); + MAC_ADDR_IDX, MAC_ADDR_MW, 0); if (status) goto exit; ql_write32(qdev, MAC_ADDR_IDX, offset | /* offset */ @@ -431,13 +431,13 @@ int ql_get_routing_reg(struct ql_adapter *qdev, u32 index, u32 *value) if (status) goto exit; - status = ql_wait_reg_rdy(qdev, RT_IDX, RT_IDX_MW, RT_IDX_E); + status = ql_wait_reg_rdy(qdev, RT_IDX, RT_IDX_MW, 0); if (status) goto exit; ql_write32(qdev, RT_IDX, RT_IDX_TYPE_NICQ | RT_IDX_RS | (index << RT_IDX_IDX_SHIFT)); - status = ql_wait_reg_rdy(qdev, RT_IDX, RT_IDX_MR, RT_IDX_E); + status = ql_wait_reg_rdy(qdev, RT_IDX, RT_IDX_MR, 0); if (status) goto exit; *value = ql_read32(qdev, RT_DATA); -- 1.6.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 5/5] qlge: bugfix: Fix register access error checking. 2008-12-30 21:12 ` [PATCH 5/5] qlge: bugfix: Fix register access error checking Ron Mercer @ 2009-01-05 1:09 ` David Miller 0 siblings, 0 replies; 12+ messages in thread From: David Miller @ 2009-01-05 1:09 UTC (permalink / raw) To: ron.mercer; +Cc: jeff, netdev, linux-driver, bhutchings, hch From: Ron Mercer <ron.mercer@qlogic.com> Date: Tue, 30 Dec 2008 13:12:25 -0800 > Some indexed registers do not have error bits. In these cases a > value of zero should be used for error checking. > > Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> Also applied, thanks Ron. ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 0/5] qlge: Fixes for powerpc platform. @ 2008-12-24 18:18 Ron Mercer 2008-12-24 18:21 ` [PATCH 2/5] qlge: bugfix: Add missing pci_unmap_page call in receive path Ron Mercer 0 siblings, 1 reply; 12+ messages in thread From: Ron Mercer @ 2008-12-24 18:18 UTC (permalink / raw) To: netdev; +Cc: "ron.mercer The following 5 patches fix bugs found during bringup on PPC platform. ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2/5] qlge: bugfix: Add missing pci_unmap_page call in receive path. 2008-12-24 18:18 [PATCH 0/5] qlge: Fixes for powerpc platform Ron Mercer @ 2008-12-24 18:21 ` Ron Mercer 0 siblings, 0 replies; 12+ messages in thread From: Ron Mercer @ 2008-12-24 18:21 UTC (permalink / raw) To: netdev; +Cc: ron.mercer Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> --- drivers/net/qlge/qlge_main.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 56c7531..92dc3f7 100755 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c @@ -1308,6 +1308,11 @@ static struct sk_buff *ql_build_rx_skb(struct ql_adapter *qdev, "No skb available, drop the packet.\n"); return NULL; } + pci_unmap_page(qdev->pdev, + pci_unmap_addr(lbq_desc, + mapaddr), + pci_unmap_len(lbq_desc, maplen), + PCI_DMA_FROMDEVICE); skb_reserve(skb, NET_IP_ALIGN); QPRINTK(qdev, RX_STATUS, DEBUG, "%d bytes of headers and data in large. Chain page to new skb and pull tail.\n", length); -- 1.6.0 ^ permalink raw reply related [flat|nested] 12+ messages in thread
end of thread, other threads:[~2009-01-05 1:09 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-12-30 21:11 [PATCH 0/5] qlge: Fixes from PPC bringup Ron Mercer 2008-12-30 21:12 ` [PATCH 1/5] qlge: bugfix: Add missing pci_mapping_err checking Ron Mercer 2009-01-05 1:08 ` David Miller 2008-12-30 21:12 ` [PATCH 2/5] qlge: bugfix: Add missing pci_unmap_page call in receive path Ron Mercer 2009-01-05 1:08 ` David Miller 2008-12-30 21:12 ` [PATCH 3/5] qlge: bugfix: Fix shadow register endian issue Ron Mercer 2009-01-05 1:09 ` David Miller 2008-12-30 21:12 ` [PATCH 4/5] qlge: bugfix: Fix ring length setting for rx ring, large/small Ron Mercer 2009-01-05 1:09 ` David Miller 2008-12-30 21:12 ` [PATCH 5/5] qlge: bugfix: Fix register access error checking Ron Mercer 2009-01-05 1:09 ` David Miller -- strict thread matches above, loose matches on Subject: below -- 2008-12-24 18:18 [PATCH 0/5] qlge: Fixes for powerpc platform Ron Mercer 2008-12-24 18:21 ` [PATCH 2/5] qlge: bugfix: Add missing pci_unmap_page call in receive path 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).