Commit 284fb68d00c56e971ed01e0b4bac5ddd4d1b74ab

Authored by Alexandre Bounine
Committed by Linus Torvalds
1 parent 439423f689

rapidio: fix use of non-compatible registers

Replace/remove use of RIO v.1.2 registers/bits that are not
forward-compatible with newer versions of RapidIO specification.

RapidIO specification v.1.3 removed Write Port CSR, Doorbell CSR,
Mailbox CSR and Mailbox and Doorbell bits of the PEF CAR.

Use of removed (since RIO v.1.3) register bits affects users of
currently available 1.3 and 2.x compliant devices who may use not so
recent kernel versions.

Removing checks for unsupported bits makes corresponding routines
compatible with all versions of RapidIO specification.  Therefore,
backporting makes stable kernel versions compliant with RIO v.1.3 and
later as well.

Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com>
Cc: Kumar Gala <galak@kernel.crashing.org>
Cc: Matt Porter <mporter@kernel.crashing.org>
Cc: Li Yang <leoli@freescale.com>
Cc: Thomas Moll <thomas.moll@sysgo.com>
Cc: Chul Kim <chul.kim@idt.com>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 3 changed files with 18 additions and 26 deletions Side-by-side Diff

drivers/net/rionet.c
... ... @@ -80,13 +80,13 @@
80 80 */
81 81 static struct rio_dev **rionet_active;
82 82  
83   -#define is_rionet_capable(pef, src_ops, dst_ops) \
84   - ((pef & RIO_PEF_INB_MBOX) && \
85   - (pef & RIO_PEF_INB_DOORBELL) && \
  83 +#define is_rionet_capable(src_ops, dst_ops) \
  84 + ((src_ops & RIO_SRC_OPS_DATA_MSG) && \
  85 + (dst_ops & RIO_DST_OPS_DATA_MSG) && \
86 86 (src_ops & RIO_SRC_OPS_DOORBELL) && \
87 87 (dst_ops & RIO_DST_OPS_DOORBELL))
88 88 #define dev_rionet_capable(dev) \
89   - is_rionet_capable(dev->pef, dev->src_ops, dev->dst_ops)
  89 + is_rionet_capable(dev->src_ops, dev->dst_ops)
90 90  
91 91 #define RIONET_MAC_MATCH(x) (*(u32 *)x == 0x00010001)
92 92 #define RIONET_GET_DESTID(x) (*(u16 *)(x + 4))
... ... @@ -282,7 +282,6 @@
282 282 {
283 283 int i, rc = 0;
284 284 struct rionet_peer *peer, *tmp;
285   - u32 pwdcsr;
286 285 struct rionet_private *rnet = netdev_priv(ndev);
287 286  
288 287 if (netif_msg_ifup(rnet))
... ... @@ -332,13 +331,8 @@
332 331 continue;
333 332 }
334 333  
335   - /*
336   - * If device has initialized inbound doorbells,
337   - * send a join message
338   - */
339   - rio_read_config_32(peer->rdev, RIO_WRITE_PORT_CSR, &pwdcsr);
340   - if (pwdcsr & RIO_DOORBELL_AVAIL)
341   - rio_send_doorbell(peer->rdev, RIONET_DOORBELL_JOIN);
  334 + /* Send a join message */
  335 + rio_send_doorbell(peer->rdev, RIONET_DOORBELL_JOIN);
342 336 }
343 337  
344 338 out:
... ... @@ -492,7 +486,7 @@
492 486 static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id)
493 487 {
494 488 int rc = -ENODEV;
495   - u32 lpef, lsrc_ops, ldst_ops;
  489 + u32 lsrc_ops, ldst_ops;
496 490 struct rionet_peer *peer;
497 491 struct net_device *ndev = NULL;
498 492  
499 493  
... ... @@ -515,12 +509,11 @@
515 509 * on later probes
516 510 */
517 511 if (!rionet_check) {
518   - rio_local_read_config_32(rdev->net->hport, RIO_PEF_CAR, &lpef);
519 512 rio_local_read_config_32(rdev->net->hport, RIO_SRC_OPS_CAR,
520 513 &lsrc_ops);
521 514 rio_local_read_config_32(rdev->net->hport, RIO_DST_OPS_CAR,
522 515 &ldst_ops);
523   - if (!is_rionet_capable(lpef, lsrc_ops, ldst_ops)) {
  516 + if (!is_rionet_capable(lsrc_ops, ldst_ops)) {
524 517 printk(KERN_ERR
525 518 "%s: local device is not network capable\n",
526 519 DRV_NAME);
drivers/rapidio/rio-scan.c
... ... @@ -505,8 +505,7 @@
505 505 rdev->dev.dma_mask = &rdev->dma_mask;
506 506 rdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
507 507  
508   - if ((rdev->pef & RIO_PEF_INB_DOORBELL) &&
509   - (rdev->dst_ops & RIO_DST_OPS_DOORBELL))
  508 + if (rdev->dst_ops & RIO_DST_OPS_DOORBELL)
510 509 rio_init_dbell_res(&rdev->riores[RIO_DOORBELL_RESOURCE],
511 510 0, 0xffff);
512 511  
include/linux/rio_regs.h
... ... @@ -36,12 +36,12 @@
36 36 #define RIO_PEF_PROCESSOR 0x20000000 /* [I] Processor */
37 37 #define RIO_PEF_SWITCH 0x10000000 /* [I] Switch */
38 38 #define RIO_PEF_MULTIPORT 0x08000000 /* [VI, 2.1] Multiport */
39   -#define RIO_PEF_INB_MBOX 0x00f00000 /* [II] Mailboxes */
40   -#define RIO_PEF_INB_MBOX0 0x00800000 /* [II] Mailbox 0 */
41   -#define RIO_PEF_INB_MBOX1 0x00400000 /* [II] Mailbox 1 */
42   -#define RIO_PEF_INB_MBOX2 0x00200000 /* [II] Mailbox 2 */
43   -#define RIO_PEF_INB_MBOX3 0x00100000 /* [II] Mailbox 3 */
44   -#define RIO_PEF_INB_DOORBELL 0x00080000 /* [II] Doorbells */
  39 +#define RIO_PEF_INB_MBOX 0x00f00000 /* [II, <= 1.2] Mailboxes */
  40 +#define RIO_PEF_INB_MBOX0 0x00800000 /* [II, <= 1.2] Mailbox 0 */
  41 +#define RIO_PEF_INB_MBOX1 0x00400000 /* [II, <= 1.2] Mailbox 1 */
  42 +#define RIO_PEF_INB_MBOX2 0x00200000 /* [II, <= 1.2] Mailbox 2 */
  43 +#define RIO_PEF_INB_MBOX3 0x00100000 /* [II, <= 1.2] Mailbox 3 */
  44 +#define RIO_PEF_INB_DOORBELL 0x00080000 /* [II, <= 1.2] Doorbells */
45 45 #define RIO_PEF_EXT_RT 0x00000200 /* [III, 1.3] Extended route table support */
46 46 #define RIO_PEF_STD_RT 0x00000100 /* [III, 1.3] Standard route table support */
47 47 #define RIO_PEF_CTLS 0x00000010 /* [III] CTLS */
... ... @@ -102,7 +102,7 @@
102 102 #define RIO_SWITCH_RT_LIMIT 0x34 /* [III, 1.3] Switch Route Table Destination ID Limit CAR */
103 103 #define RIO_RT_MAX_DESTID 0x0000ffff
104 104  
105   -#define RIO_MBOX_CSR 0x40 /* [II] Mailbox CSR */
  105 +#define RIO_MBOX_CSR 0x40 /* [II, <= 1.2] Mailbox CSR */
106 106 #define RIO_MBOX0_AVAIL 0x80000000 /* [II] Mbox 0 avail */
107 107 #define RIO_MBOX0_FULL 0x40000000 /* [II] Mbox 0 full */
108 108 #define RIO_MBOX0_EMPTY 0x20000000 /* [II] Mbox 0 empty */
... ... @@ -128,8 +128,8 @@
128 128 #define RIO_MBOX3_FAIL 0x00000008 /* [II] Mbox 3 fail */
129 129 #define RIO_MBOX3_ERROR 0x00000004 /* [II] Mbox 3 error */
130 130  
131   -#define RIO_WRITE_PORT_CSR 0x44 /* [I] Write Port CSR */
132   -#define RIO_DOORBELL_CSR 0x44 /* [II] Doorbell CSR */
  131 +#define RIO_WRITE_PORT_CSR 0x44 /* [I, <= 1.2] Write Port CSR */
  132 +#define RIO_DOORBELL_CSR 0x44 /* [II, <= 1.2] Doorbell CSR */
133 133 #define RIO_DOORBELL_AVAIL 0x80000000 /* [II] Doorbell avail */
134 134 #define RIO_DOORBELL_FULL 0x40000000 /* [II] Doorbell full */
135 135 #define RIO_DOORBELL_EMPTY 0x20000000 /* [II] Doorbell empty */