From: Martin D. <li...@md...> - 2003-08-23 10:02:47
|
ChangeLog: * fix error path for ring entry alloc in case pci_map failed * get rid of BUG() - it's mostly in interrupt and there's no need to kill the box on such issues * correct endianess for the hardware view of ring descriptors Martin -------------------- --- v2.6.0-test4-md/include/net/irda/vlsi_ir.h.p2 Sat Aug 23 08:59:26 2003 +++ v2.6.0-test4-md/include/net/irda/vlsi_ir.h Sat Aug 23 09:03:19 2003 @@ -669,21 +669,22 @@ static inline void rd_set_addr_status(st */ if ((a & ~DMA_MASK_MSTRPAGE)>>24 != MSTRPAGE_VALUE) { - BUG(); + ERROR("%s: pci busaddr inconsistency!\n", __FUNCTION__); + dump_stack(); return; } a &= DMA_MASK_MSTRPAGE; /* clear highbyte to make sure we won't write * to status - just in case MSTRPAGE_VALUE!=0 */ - rd->hw->rd_addr = a; + rd->hw->rd_addr = cpu_to_le32(a); wmb(); rd_set_status(rd, s); /* may pass ownership to the hardware */ } static inline void rd_set_count(struct ring_descr *rd, u16 c) { - rd->hw->rd_count = c; + rd->hw->rd_count = cpu_to_le16(c); } static inline u8 rd_get_status(struct ring_descr *rd) @@ -695,13 +696,13 @@ static inline dma_addr_t rd_get_addr(str { dma_addr_t a; - a = (rd->hw->rd_addr & DMA_MASK_MSTRPAGE) | (MSTRPAGE_VALUE << 24); - return a; + a = le32_to_cpu(rd->hw->rd_addr); + return (a & DMA_MASK_MSTRPAGE) | (MSTRPAGE_VALUE << 24); } static inline u16 rd_get_count(struct ring_descr *rd) { - return rd->hw->rd_count; + return le16_to_cpu(rd->hw->rd_count); } /******************************************************************/ --- v2.6.0-test4-md/drivers/net/irda/vlsi_ir.c.p2 Sat Aug 23 08:59:06 2003 +++ v2.6.0-test4-md/drivers/net/irda/vlsi_ir.c Sat Aug 23 09:08:37 2003 @@ -44,6 +44,7 @@ MODULE_LICENSE("GPL"); #include <linux/proc_fs.h> #include <linux/smp_lock.h> #include <asm/uaccess.h> +#include <asm/byteorder.h> #include <net/irda/irda.h> #include <net/irda/irda_device.h> @@ -541,7 +542,14 @@ static struct vlsi_ring *vlsi_alloc_ring memset(rd, 0, sizeof(*rd)); rd->hw = hwmap + i; rd->buf = kmalloc(len, GFP_KERNEL|GFP_DMA); - if (rd->buf == NULL) { + if (rd->buf == NULL + || !(busaddr = pci_map_single(pdev, rd->buf, len, dir))) { + if (rd->buf) { + ERROR("%s: failed to create PCI-MAP for %p", + __FUNCTION__, rd->buf); + kfree(rd->buf); + rd->buf = NULL; + } for (j = 0; j < i; j++) { rd = r->rd + j; busaddr = rd_get_addr(rd); @@ -554,12 +562,6 @@ static struct vlsi_ring *vlsi_alloc_ring kfree(r); return NULL; } - busaddr = pci_map_single(pdev, rd->buf, len, dir); - if (!busaddr) { - ERROR("%s: failed to create PCI-MAP for %p", - __FUNCTION__, rd->buf); - BUG(); - } rd_set_addr_status(rd, busaddr, 0); pci_dma_sync_single(pdev, busaddr, len, dir); /* initially, the dma buffer is owned by the CPU */ @@ -706,7 +708,9 @@ static void vlsi_fill_rx(struct vlsi_rin for (rd = ring_last(r); rd != NULL; rd = ring_put(r)) { if (rd_is_active(rd)) { - BUG(); + WARNING("%s: driver bug: rx descr race with hw\n", + __FUNCTION__); + vlsi_ring_debug(r); break; } if (!rd->skb) { @@ -1043,28 +1047,26 @@ static int vlsi_hard_start_xmit(struct s goto drop; } - /* sanity checks - should never happen! - * simply BUGging the violation and dropping the packet - */ + /* sanity checks - simply drop the packet */ rd = ring_last(r); - if (!rd) { /* ring full - queue should have been stopped! */ - BUG(); + if (!rd) { + ERROR("%s - ring full but queue wasn't stopped", __FUNCTION__); goto drop; } - if (rd_is_active(rd)) { /* entry still owned by hw! */ - BUG(); + if (rd_is_active(rd)) { + ERROR("%s - entry still owned by hw!", __FUNCTION__); goto drop; } - if (!rd->buf) { /* no memory for this tx entry - weird! */ - BUG(); + if (!rd->buf) { + ERROR("%s - tx ring entry without pci buffer", __FUNCTION__); goto drop; } - if (rd->skb) { /* hm, associated old skb still there */ - BUG(); + if (rd->skb) { + ERROR("%s - ring entry with old skb still attached", __FUNCTION__); goto drop; } |