On Wed, 17 Aug 2005 14:30:31 -0400 Jeff Garzik <[EMAIL PROTECTED]> wrote:
> Stephen Hemminger wrote: > > | > > | Applied to 'sky2' branch of netdev-2.6.git. Let me know when the RX > > | hangs are fixed, and we can push upstream. > > > > Okay. Most all of your comments are straightforward > > and fixes will be in the next version, but some need > > a little more discussion... > > > > | > > | > +static void gm_phy_write(struct sky2_hw *hw, unsigned port, u16 reg, > > u16 val) > > | > +{ > > | > + int i; > > | > + > > | > + gma_write16(hw, port, GM_SMI_DATA, val); > > | > + gma_write16(hw, port, GM_SMI_CTRL, > > | > + GM_SMI_CT_PHY_AD(PHY_ADDR_MARV) | > > GM_SMI_CT_REG_AD(reg)); > > | > + > > | > + for (i = 0; i < PHY_RETRIES; i++) { > > | > + udelay(1); > > | > > | PCI posting bug... do we care? > > > > We always end up doing a read of the control register > > so how is that a problem? > > The first udelay() is superfluous due to PCI posting. If you -need- > such a delay before the first read, then the code is buggy. If there is > no such need, things are OK as-is. No read and udelay can swap. > > > | > +static inline void sky2_rx_add(struct sky2_port *sky2, dma_addr_t map, > > u16 len) > > | > +{ > > | > + struct sky2_rx_le *le; > > | > + > > | > + if (sizeof(map) > sizeof(u32)) { > > | > + le = sky2_next_rx(sky2); > > | > + le->rx.addr = cpu_to_le32((u64) map >> 32); > > | > > | use (map >> 16) >> 16 > > > > Does it matter? because the map will be a 64 bit value > > if we ever get to that part of the code anyway. On 32bit > > address systems this code disappears. > > On systems where the code will get optimized out, 'map >> 32' is an > undefined operation. Sure the optimizer will snip the code, but > sometime in the future the compiler may decide to error out, rather than > ignore the undefined operation. > > Gotta get the code correct, before handing it to the optimizer. Reworking that stuff anyway to avoid wasting slots. Saving ring slots is worth it. > > | > + > > | > + paddr = pci_map_single(sky2->hw->pdev, re->skb->data, > > | > + rx_buf_size, PCI_DMA_FROMDEVICE); > > | > + > > | > + pci_unmap_len_set(re, maplen, rx_buf_size); > > | > + pci_unmap_addr_set(re, mapaddr, paddr); > > | > > | pci_unmap??? > > > > This is book keeping for iommu systems. see other drivers. > > It's just highly irregular to use pci_unmap_xxx functions immediately > after calling a pci_map_xxx function. Did you know that pci_unmap_addr_set() is a macro that hides the fact that some arch need iommu but for many it is a no-op. This is the expected usage. #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ (((PTR)->ADDR_NAME) = (VAL)) > > | > + goto err_out_free_hw; > > | > + } > > | > + > > | > + err = request_irq(pdev->irq, sky2_intr, SA_SHIRQ, DRV_NAME, hw); > > | > + if (err) { > > | > + printk(KERN_ERR PFX "%s: cannot assign irq %d\n", > > | > + pci_name(pdev), pdev->irq); > > | > + goto err_out_iounmap; > > | > + } > > | > > | don't do this in probe, do it in dev->open(). reading your interrupt > > | handling code you are OBVIOUSLY not ready to handle interrupts at this > > | point. > > > > Since this driver has to support dual port boards, it > > gets wierd. I would rather just change to mask of irq's in HW > > then get it at probe. > > Your interrupt handler will still get called, for cases such as e.g. > shared interrupts. You have to make sure ALL your data structures are > capable of handling interrupts, at the point you call request_irq(). Calling sky2_reset first is enough, it makes sure that all the hardware and data structures are ready. - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html