From: hartkopp Date: Wed, 19 May 2010 16:21:00 +0000 (+0000) Subject: Make protected command register access CONFIG_SMP unconditional. X-Git-Url: https://rtime.felk.cvut.cz/gitweb/socketcan-devel.git/commitdiff_plain/37168324d75832e25bdb00cec96b383ea537a6be Make protected command register access CONFIG_SMP unconditional. Added missing spin_lock_init() for the defined locking variable. git-svn-id: svn://svn.berlios.de//socketcan/trunk@1181 030b6a49-0b11-0410-94ab-b0dab22257f2 --- diff --git a/kernel/2.6/drivers/net/can/sja1000/sja1000.c b/kernel/2.6/drivers/net/can/sja1000/sja1000.c index 5ba308d..59183cb 100644 --- a/kernel/2.6/drivers/net/can/sja1000/sja1000.c +++ b/kernel/2.6/drivers/net/can/sja1000/sja1000.c @@ -90,23 +90,16 @@ static struct can_bittiming_const sja1000_bittiming_const = { static void sja1000_write_cmdreg(struct sja1000_priv *priv, u8 val) { - /* the command register needs some locking on SMP systems */ - -#ifdef CONFIG_SMP - unsigned long flags; + /* + * The command register needs some locking and time to settle + * the write_reg() operation - especially on SMP systems. + */ spin_lock_irqsave(&priv->cmdreg_lock, flags); priv->write_reg(priv, REG_CMR, val); priv->read_reg(priv, REG_SR); spin_unlock_irqrestore(&priv->cmdreg_lock, flags); - -#else - - /* write to the command register without locking */ - priv->write_reg(priv, REG_CMR, val); - -#endif } static int sja1000_probe_chip(struct net_device *dev) @@ -644,6 +637,8 @@ struct net_device *alloc_sja1000dev(int sizeof_priv) priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_BERR_REPORTING; + spin_lock_init(&priv->cmdreg_lock); + if (sizeof_priv) priv->priv = (void *)priv + sizeof(struct sja1000_priv); diff --git a/kernel/2.6/drivers/net/can/sja1000/sja1000.h b/kernel/2.6/drivers/net/can/sja1000/sja1000.h index 6720b37..b9dfcb8 100644 --- a/kernel/2.6/drivers/net/can/sja1000/sja1000.h +++ b/kernel/2.6/drivers/net/can/sja1000/sja1000.h @@ -167,10 +167,8 @@ struct sja1000_priv { void __iomem *reg_base; /* ioremap'ed address to registers */ unsigned long irq_flags; /* for request_irq() */ + spinlock_t cmdreg_lock; /* lock for concurrent cmd register writes */ -#ifdef CONFIG_SMP - spinlock_t cmdreg_lock; /* lock for concurrent cmd register writes */ -#endif u16 flags; /* custom mode flags */ u8 ocr; /* output control register */