Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Alexandre Bounine and committed by
Linus Torvalds
284fb68d 439423f6

+18 -26
+8 -15
drivers/net/rionet.c
··· 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 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)) ··· 331 332 continue; 332 333 } 333 334 334 - /* 335 - * If device has initialized inbound doorbells, 336 - * send a join message 337 - */ 338 - rio_read_config_32(peer->rdev, RIO_WRITE_PORT_CSR, &pwdcsr); 339 - if (pwdcsr & RIO_DOORBELL_AVAIL) 340 - rio_send_doorbell(peer->rdev, RIONET_DOORBELL_JOIN); 335 + /* Send a join message */ 336 + rio_send_doorbell(peer->rdev, RIONET_DOORBELL_JOIN); 341 337 } 342 338 343 339 out: ··· 486 492 static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id) 487 493 { 488 494 int rc = -ENODEV; 489 - u32 lpef, lsrc_ops, ldst_ops; 495 + u32 lsrc_ops, ldst_ops; 490 496 struct rionet_peer *peer; 491 497 struct net_device *ndev = NULL; 492 498 ··· 509 515 * on later probes 510 516 */ 511 517 if (!rionet_check) { 512 - rio_local_read_config_32(rdev->net->hport, RIO_PEF_CAR, &lpef); 513 518 rio_local_read_config_32(rdev->net->hport, RIO_SRC_OPS_CAR, 514 519 &lsrc_ops); 515 520 rio_local_read_config_32(rdev->net->hport, RIO_DST_OPS_CAR, 516 521 &ldst_ops); 517 - if (!is_rionet_capable(lpef, lsrc_ops, ldst_ops)) { 522 + if (!is_rionet_capable(lsrc_ops, ldst_ops)) { 518 523 printk(KERN_ERR 519 524 "%s: local device is not network capable\n", 520 525 DRV_NAME);
+1 -2
drivers/rapidio/rio-scan.c
··· 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
+9 -9
include/linux/rio_regs.h
··· 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 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 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 */