Re: [git patches] net driver fixes

From: Dan Williams
Date: Fri Sep 14 2007 - 14:14:57 EST


On Thu, 2007-09-13 at 01:30 -0400, Jeff Garzik wrote:
> Please pull from 'upstream-linus' branch of
> master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git upstream-linus
>
> to receive the following updates:
>
> drivers/net/atl1/atl1_main.c | 19 +++++++------------
> drivers/net/ehea/ehea.h | 5 ++++-
> drivers/net/ehea/ehea_main.c | 16 ++++++++++++++--
> drivers/net/phy/phy.c | 4 ++--
> drivers/net/phy/phy_device.c | 4 ++--
> drivers/net/sky2.c | 9 ++++++++-
> drivers/net/spider_net.c | 12 ++++--------
> 7 files changed, 41 insertions(+), 28 deletions(-)
>
> Hans-JÃrgen Koch (1):
> Fix a lock problem in generic phy code
>
> Ishizaki Kou (1):
> spidernet: fix interrupt reason recognition
>
> Jan-Bernd Themann (2):
> ehea: propagate physical port state
> ehea: fix last_rx update
>
> Luca Tettamanti (1):
> atl1: disable broken 64-bit DMA
>
> Stephen Hemminger (1):
> sky2: restore multicast list on resume and other ops
>
> diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c
> index 3c1984e..f23e13c 100644
> --- a/drivers/net/atl1/atl1_main.c
> +++ b/drivers/net/atl1/atl1_main.c
> @@ -2203,21 +2203,20 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
> struct net_device *netdev;
> struct atl1_adapter *adapter;
> static int cards_found = 0;
> - bool pci_using_64 = true;
> int err;
>
> err = pci_enable_device(pdev);
> if (err)
> return err;
>
> - err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
> + /*
> + * 64-bit DMA currently has data corruption problems, so let's just
> + * use 32-bit DMA for now. This is a big hack that is probably wrong.
> + */
> + err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
> if (err) {
> - err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
> - if (err) {
> - dev_err(&pdev->dev, "no usable DMA configuration\n");
> - goto err_dma;
> - }
> - pci_using_64 = false;
> + dev_err(&pdev->dev, "no usable DMA configuration\n");
> + goto err_dma;
> }
> /* Mark all PCI regions associated with PCI device
> * pdev as being reserved by owner atl1_driver_name
> @@ -2282,7 +2281,6 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
>
> netdev->ethtool_ops = &atl1_ethtool_ops;
> adapter->bd_number = cards_found;
> - adapter->pci_using_64 = pci_using_64;
>
> /* setup the private structure */
> err = atl1_sw_init(adapter);
> @@ -2299,9 +2297,6 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
> */
> /* netdev->features |= NETIF_F_TSO; */
>
> - if (pci_using_64)
> - netdev->features |= NETIF_F_HIGHDMA;
> -
> netdev->features |= NETIF_F_LLTX;
>
> /*
> diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h
> index d67f97b..8d58be5 100644
> --- a/drivers/net/ehea/ehea.h
> +++ b/drivers/net/ehea/ehea.h
> @@ -39,7 +39,7 @@
> #include <asm/io.h>
>
> #define DRV_NAME "ehea"
> -#define DRV_VERSION "EHEA_0073"
> +#define DRV_VERSION "EHEA_0074"
>
> /* eHEA capability flags */
> #define DLPAR_PORT_ADD_REM 1
> @@ -402,6 +402,8 @@ struct ehea_mc_list {
>
> #define EHEA_PORT_UP 1
> #define EHEA_PORT_DOWN 0
> +#define EHEA_PHY_LINK_UP 1
> +#define EHEA_PHY_LINK_DOWN 0
> #define EHEA_MAX_PORT_RES 16
> struct ehea_port {
> struct ehea_adapter *adapter; /* adapter that owns this port */
> @@ -427,6 +429,7 @@ struct ehea_port {
> u32 msg_enable;
> u32 sig_comp_iv;
> u32 state;
> + u8 phy_link;
> u8 full_duplex;
> u8 autoneg;
> u8 num_def_qps;
> diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c
> index db57474..717b129 100644
> --- a/drivers/net/ehea/ehea_main.c
> +++ b/drivers/net/ehea/ehea_main.c
> @@ -53,17 +53,21 @@ static int rq3_entries = EHEA_DEF_ENTRIES_RQ3;
> static int sq_entries = EHEA_DEF_ENTRIES_SQ;
> static int use_mcs = 0;
> static int num_tx_qps = EHEA_NUM_TX_QP;
> +static int prop_carrier_state = 0;
>
> module_param(msg_level, int, 0);
> module_param(rq1_entries, int, 0);
> module_param(rq2_entries, int, 0);
> module_param(rq3_entries, int, 0);
> module_param(sq_entries, int, 0);
> +module_param(prop_carrier_state, int, 0);
> module_param(use_mcs, int, 0);
> module_param(num_tx_qps, int, 0);
>
> MODULE_PARM_DESC(num_tx_qps, "Number of TX-QPS");
> MODULE_PARM_DESC(msg_level, "msg_level");
> +MODULE_PARM_DESC(prop_carrier_state, "Propagate carrier state of physical "
> + "port to stack. 1:yes, 0:no. Default = 0 ");

WTF? why would the default be to _not_ propagate carrier state? Are
there some mitigating circumstances that require this driver to not
notify the stack of carrier on/off? Userspace stuff really should know
about the carrier state, and this disables it by default.

Dan

> MODULE_PARM_DESC(rq3_entries, "Number of entries for Receive Queue 3 "
> "[2^x - 1], x = [6..14]. Default = "
> __MODULE_STRING(EHEA_DEF_ENTRIES_RQ3) ")");
> @@ -467,7 +471,7 @@ static struct ehea_cqe *ehea_proc_rwqes(struct net_device *dev,
> else
> netif_receive_skb(skb);
>
> - dev->last_rx = jiffies;
> + port->netdev->last_rx = jiffies;
> } else {
> pr->p_stats.poll_receive_errors++;
> port_reset = ehea_treat_poll_error(pr, rq, cqe,
> @@ -814,7 +818,9 @@ int ehea_set_portspeed(struct ehea_port *port, u32 port_speed)
> ehea_error("Failed setting port speed");
> }
> }
> - netif_carrier_on(port->netdev);
> + if (!prop_carrier_state || (port->phy_link == EHEA_PHY_LINK_UP))
> + netif_carrier_on(port->netdev);
> +
> kfree(cb4);
> out:
> return ret;
> @@ -869,13 +875,19 @@ static void ehea_parse_eqe(struct ehea_adapter *adapter, u64 eqe)
> }
>
> if (EHEA_BMASK_GET(NEQE_EXTSWITCH_PORT_UP, eqe)) {
> + port->phy_link = EHEA_PHY_LINK_UP;
> if (netif_msg_link(port))
> ehea_info("%s: Physical port up",
> port->netdev->name);
> + if (prop_carrier_state)
> + netif_carrier_on(port->netdev);
> } else {
> + port->phy_link = EHEA_PHY_LINK_DOWN;
> if (netif_msg_link(port))
> ehea_info("%s: Physical port down",
> port->netdev->name);
> + if (prop_carrier_state)
> + netif_carrier_off(port->netdev);
> }
>
> if (EHEA_BMASK_GET(NEQE_EXTSWITCH_PRIMARY, eqe))
> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
> index e323efd..0cc4369 100644
> --- a/drivers/net/phy/phy.c
> +++ b/drivers/net/phy/phy.c
> @@ -755,7 +755,7 @@ out_unlock:
> */
> void phy_start(struct phy_device *phydev)
> {
> - spin_lock(&phydev->lock);
> + spin_lock_bh(&phydev->lock);
>
> switch (phydev->state) {
> case PHY_STARTING:
> @@ -769,7 +769,7 @@ void phy_start(struct phy_device *phydev)
> default:
> break;
> }
> - spin_unlock(&phydev->lock);
> + spin_unlock_bh(&phydev->lock);
> }
> EXPORT_SYMBOL(phy_stop);
> EXPORT_SYMBOL(phy_start);
> diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
> index e275df8..49328e0 100644
> --- a/drivers/net/phy/phy_device.c
> +++ b/drivers/net/phy/phy_device.c
> @@ -644,7 +644,7 @@ static int phy_probe(struct device *dev)
> if (!(phydrv->flags & PHY_HAS_INTERRUPT))
> phydev->irq = PHY_POLL;
>
> - spin_lock(&phydev->lock);
> + spin_lock_bh(&phydev->lock);
>
> /* Start out supporting everything. Eventually,
> * a controller will attach, and may modify one
> @@ -658,7 +658,7 @@ static int phy_probe(struct device *dev)
> if (phydev->drv->probe)
> err = phydev->drv->probe(phydev);
>
> - spin_unlock(&phydev->lock);
> + spin_unlock_bh(&phydev->lock);
>
> return err;
>
> diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
> index e6d937e..5d812de 100644
> --- a/drivers/net/sky2.c
> +++ b/drivers/net/sky2.c
> @@ -149,6 +149,8 @@ static const char *yukon2_name[] = {
> "FE", /* 0xb7 */
> };
>
> +static void sky2_set_multicast(struct net_device *dev);
> +
> /* Access to external PHY */
> static int gm_phy_write(struct sky2_hw *hw, unsigned port, u16 reg, u16 val)
> {
> @@ -2900,8 +2902,10 @@ static int sky2_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
> sky2->autoneg = ecmd->autoneg;
> sky2->advertising = ecmd->advertising;
>
> - if (netif_running(dev))
> + if (netif_running(dev)) {
> sky2_phy_reinit(sky2);
> + sky2_set_multicast(dev);
> + }
>
> return 0;
> }
> @@ -2994,6 +2998,7 @@ static int sky2_nway_reset(struct net_device *dev)
> return -EINVAL;
>
> sky2_phy_reinit(sky2);
> + sky2_set_multicast(dev);
>
> return 0;
> }
> @@ -4171,6 +4176,8 @@ static int sky2_resume(struct pci_dev *pdev)
> dev_close(dev);
> goto out;
> }
> +
> + sky2_set_multicast(dev);
> }
> }
>
> diff --git a/drivers/net/spider_net.c b/drivers/net/spider_net.c
> index 590b12c..82d837a 100644
> --- a/drivers/net/spider_net.c
> +++ b/drivers/net/spider_net.c
> @@ -1441,17 +1441,14 @@ static void
> spider_net_handle_error_irq(struct spider_net_card *card, u32 status_reg)
> {
> u32 error_reg1, error_reg2;
> - u32 mask_reg1, mask_reg2;
> u32 i;
> int show_error = 1;
>
> error_reg1 = spider_net_read_reg(card, SPIDER_NET_GHIINT1STS);
> error_reg2 = spider_net_read_reg(card, SPIDER_NET_GHIINT2STS);
> - mask_reg1 = spider_net_read_reg(card, SPIDER_NET_GHIINT1MSK);
> - mask_reg2 = spider_net_read_reg(card,SPIDER_NET_GHIINT2MSK);
>
> - error_reg1 &= mask_reg1;
> - error_reg2 &= mask_reg2;
> + error_reg1 &= SPIDER_NET_INT1_MASK_VALUE;
> + error_reg2 &= SPIDER_NET_INT2_MASK_VALUE;
>
> /* check GHIINT0STS ************************************/
> if (status_reg)
> @@ -1679,11 +1676,10 @@ spider_net_interrupt(int irq, void *ptr)
> {
> struct net_device *netdev = ptr;
> struct spider_net_card *card = netdev_priv(netdev);
> - u32 status_reg, mask_reg;
> + u32 status_reg;
>
> status_reg = spider_net_read_reg(card, SPIDER_NET_GHIINT0STS);
> - mask_reg = spider_net_read_reg(card, SPIDER_NET_GHIINT0MSK);
> - status_reg &= mask_reg;
> + status_reg &= SPIDER_NET_INT0_MASK_VALUE;
>
> if (!status_reg)
> return IRQ_NONE;
> -
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/