File indexing completed on 2025-05-11 08:24:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #include <rtems.h>
0031 #include <rtems/libio.h>
0032 #include <rtems/bspIo.h>
0033 #include <stdio.h>
0034 #include <bsp.h>
0035
0036 #include <drvmgr/drvmgr.h>
0037 #include <grlib/ambapp_bus.h>
0038 #include <grlib/grspw_router.h>
0039
0040 #include <grlib/grlib_impl.h>
0041
0042
0043 #define STATIC static
0044
0045 #define UNUSED __attribute__((unused))
0046
0047
0048
0049 #ifdef DEBUG
0050 #define DBG(x...) printf(x)
0051 #else
0052 #define DBG(x...)
0053 #endif
0054
0055 #define THREAD_SAFE 1
0056
0057 #define REG_WRITE(addr, val) (*(volatile unsigned int *)(addr) = (unsigned int)(val))
0058 #define REG_READ(addr) (*(volatile unsigned int *)(addr))
0059
0060
0061
0062
0063
0064 #define RTPMAP_PE (0x7fffffff << RTPMAP_PE_BIT)
0065 #define RTPMAP_PD (0x1 << RTPMAP_PD_BIT)
0066
0067 #define RTPMAP_PE_BIT 1
0068 #define RTPMAP_PD_BIT 0
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093 #define PTIMER_RL (0xffff << PTIMER_RL_BIT)
0094
0095 #define PTIMER_RL_BIT 0
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105 #define RTRCFG_SP (0x1f << RTRCFG_SP_BIT)
0106 #define RTRCFG_AP (0x1f << RTRCFG_AP_BIT)
0107 #define RTRCFG_FP (0x1f << RTRCFG_FP_BIT)
0108 #define RTRCFG_SR (0x1 << RTRCFG_SR_BIT)
0109 #define RTRCFG_PE (0x1 << RTRCFG_PE_BIT)
0110 #define RTRCFG_IC (0x1 << RTRCFG_IC_BIT)
0111 #define RTRCFG_IS (0x1 << RTRCFG_IS_BIT)
0112 #define RTRCFG_IP (0x1 << RTRCFG_IP_BIT)
0113 #define RTRCFG_AI (0x1 << RTRCFG_AI_BIT)
0114 #define RTRCFG_AT (0x1 << RTRCFG_AT_BIT)
0115 #define RTRCFG_IE (0x1 << RTRCFG_IE_BIT)
0116 #define RTRCFG_RE (0x1 << RTRCFG_RE_BIT)
0117 #define RTRCFG_EE (0x1 << RTRCFG_EE_BIT)
0118 #define RTRCFG_LS (0x1 << RTRCFG_LS_BIT)
0119 #define RTRCFG_SA (0x1 << RTRCFG_SA_BIT)
0120 #define RTRCFG_TF (0x1 << RTRCFG_TF_BIT)
0121 #define RTRCFG_ME (0x1 << RTRCFG_ME_BIT)
0122 #define RTRCFG_TA (0x1 << RTRCFG_TA_BIT)
0123 #define RTRCFG_PP (0x1 << RTRCFG_PP_BIT)
0124 #define RTRCFG_WCLEAR (RTRCFG_ME)
0125
0126 #define RTRCFG_SP_BIT 27
0127 #define RTRCFG_AP_BIT 22
0128 #define RTRCFG_FP_BIT 17
0129 #define RTRCFG_SR_BIT 15
0130 #define RTRCFG_PE_BIT 14
0131 #define RTRCFG_IC_BIT 13
0132 #define RTRCFG_IS_BIT 12
0133 #define RTRCFG_IP_BIT 11
0134 #define RTRCFG_AI_BIT 10
0135 #define RTRCFG_AT_BIT 9
0136 #define RTRCFG_IE_BIT 8
0137 #define RTRCFG_RE_BIT 7
0138 #define RTRCFG_EE_BIT 6
0139 #define RTRCFG_LS_BIT 5
0140 #define RTRCFG_SA_BIT 4
0141 #define RTRCFG_TF_BIT 3
0142 #define RTRCFG_ME_BIT 2
0143 #define RTRCFG_TA_BIT 1
0144 #define RTRCFG_PP_BIT 0
0145
0146
0147
0148
0149 #define TC_RE (0x3f << TC_RE_BIT)
0150 #define TC_EN (0x3f << TC_EN_BIT)
0151 #define TC_CF (0x3f << TC_CF_BIT)
0152 #define TC_TC (0x3f << TC_TC_BIT)
0153
0154 #define TC_RE_BIT 9
0155 #define TC_EN_BIT 8
0156 #define TC_CF_BIT 6
0157 #define TC_TC_BIT 0
0158
0159
0160
0161
0162 #define VER_MA (0xff << VER_MA_BIT)
0163 #define VER_MI (0xff << VER_MI_BIT)
0164 #define VER_PA (0xff << VER_PA_BIT)
0165 #define VER_ID (0xff << VER_ID_BIT)
0166
0167 #define VER_MA_BIT 24
0168 #define VER_MI_BIT 16
0169 #define VER_PA_BIT 8
0170 #define VER_ID_BIT 0
0171
0172
0173
0174
0175 #define IDIV_ID (0xff << IDIV_ID_BIT)
0176
0177 #define IDIV_ID_BIT 0
0178
0179
0180
0181
0182 #define CFGWE_WE (0x1 << CFGWE_WE_BIT)
0183
0184 #define CFGWE_WE_BIT 0
0185
0186
0187
0188
0189 #define PRESCALER_RL (0xffff << PRESCALER_RL_BIT)
0190
0191 #define PRESCALER_RL_BIT 0
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206 #define ISRTIMER_RL (0xffff << ISRTIMER_RL_BIT)
0207
0208 #define ISRTIMER_RL_BIT 0
0209
0210
0211
0212
0213 #define AITIMER_RL (0xffff << AITIMER_RL_BIT)
0214
0215 #define AITIMER_RL_BIT 0
0216
0217
0218
0219
0220 #define ISRCTIMER_RL (0x1f << ISRCTIMER_RL_BIT)
0221
0222 #define ISRCTIMER_RL_BIT 0
0223
0224
0225
0226
0227 #define CAP_AF (0x3 << CAP_AF_BIT)
0228 #define CAP_PF (0x7 << CAP_PF_BIT)
0229 #define CAP_RM (0x7 << CAP_RM_BIT)
0230 #define CAP_AS (0x1 << CAP_AS_BIT)
0231 #define CAP_AX (0x1 << CAP_AX_BIT)
0232 #define CAP_DP (0x1 << CAP_DP_BIT)
0233 #define CAP_ID (0x1 << CAP_ID_BIT)
0234 #define CAP_SD (0x1 << CAP_SD_BIT)
0235 #define CAP_PC (0x1f << CAP_PC_BIT)
0236 #define CAP_CC (0x1f << CAP_CC_BIT)
0237
0238 #define CAP_AF_BIT 24
0239 #define CAP_PF_BIT 29
0240 #define CAP_RM_BIT 16
0241 #define CAP_AS_BIT 14
0242 #define CAP_AX_BIT 13
0243 #define CAP_DP_BIT 12
0244 #define CAP_ID_BIT 11
0245 #define CAP_SD_BIT 10
0246 #define CAP_PC_BIT 4
0247 #define CAP_CC_BIT 0
0248
0249
0250
0251
0252 #define PNPVEND_VI (0xffff << PNPVEND_VI_BIT)
0253 #define PNPVEND_PI (0xffff << PNPVEND_PI_BIT)
0254
0255 #define PNPVEND_VI_BIT 16
0256 #define PNPVEND_PI_BIT 0
0257
0258
0259
0260
0261 #define PNPUVEND_VI (0xffff << PNPUVEND_VI_BIT)
0262 #define PNPUVEND_PI (0xffff << PNPUVEND_PI_BIT)
0263
0264 #define PNPUVEND_VI_BIT 16
0265 #define PNPUVEND_PI_BIT 0
0266
0267
0268
0269
0270 #define MAXPLEN_ML (0xffffff << MAXPLEN_ML_BIT)
0271
0272 #define MAXPLEN_ML_BIT 0
0273
0274
0275
0276
0277 #define CHARO_OR (0x1 << CHARO_OR_BIT)
0278 #define CHARO_CC (0x7fffffff << CHARO_CC_BIT)
0279
0280 #define CHARO_OR_BIT 31
0281 #define CHARO_CC_BIT 0
0282
0283
0284
0285
0286 #define CHARI_OR (0x1 << CHARI_OR_BIT)
0287 #define CHARI_CC (0x7fffffff << CHARI_CC_BIT)
0288
0289 #define CHARI_OR_BIT 31
0290 #define CHARI_CC_BIT 0
0291
0292
0293
0294
0295 #define PKTO_OR (0x1 << PKTO_OR_BIT)
0296 #define PKTO_CC (0x7fffffff << PKTO_CC_BIT)
0297
0298 #define PKTO_OR_BIT 31
0299 #define PKTO_CC_BIT 0
0300
0301
0302
0303
0304 #define PKTI_OR (0x1 << PKTI_OR_BIT)
0305 #define PKTI_CC (0x7fffffff << PKTI_CC_BIT)
0306
0307 #define PKTI_OR_BIT 31
0308 #define PKTI_CC_BIT 0
0309
0310
0311
0312
0313 #define CRED_OC (0x3f << CRED_OC_BIT)
0314 #define CRED_IC (0x3f << CRED_IC_BIT)
0315
0316 #define CRED_OC_BIT 6
0317 #define CRED_IC_BIT 0
0318
0319
0320
0321
0322 #define RTRCOMB_SR (0x1 << RTRCOMB_SR_BIT)
0323 #define RTRCOMB_EN (0x1 << RTRCOMB_EN_BIT)
0324 #define RTRCOMB_PR (0x1 << RTRCOMB_PR_BIT)
0325 #define RTRCOMB_HD (0x1 << RTRCOMB_HD_BIT)
0326 #define RTRCOMB_PE (0x7ffff << RTRCOMB_PE_BIT)
0327 #define RTRCOMB_PD (0x1 << RTRCOMB_PD_BIT)
0328
0329 #define RTRCOMB_SR_BIT 31
0330 #define RTRCOMB_EN_BIT 30
0331 #define RTRCOMB_PR_BIT 29
0332 #define RTRCOMB_HD_BIT 28
0333 #define RTRCOMB_PE_BIT 1
0334 #define RTRCOMB_PD_BIT 0
0335
0336 struct router_regs {
0337 unsigned int resv1;
0338 unsigned int psetup[255];
0339 unsigned int resv2;
0340 unsigned int routes[255];
0341 unsigned int pctrl[32];
0342 unsigned int psts[32];
0343 unsigned int treload[32];
0344 unsigned int pctrl2[32];
0345 unsigned int cfgsts;
0346 unsigned int timecode;
0347 unsigned int ver;
0348 unsigned int idiv;
0349 unsigned int cfgwe;
0350 unsigned int tprescaler;
0351 unsigned int imask;
0352 unsigned int ipmask;
0353 unsigned int pip;
0354 unsigned int icodegen;
0355 unsigned int isr0;
0356 unsigned int isr1;
0357 unsigned int isrtimer;
0358 unsigned int aitimer;
0359 unsigned int isrctimer;
0360 unsigned int resv4;
0361 unsigned int lrunsts;
0362 unsigned int cap;
0363 unsigned int resv5[111];
0364 unsigned int charo[31];
0365 unsigned int resv6;
0366 unsigned int chari[31];
0367 unsigned int resv7;
0368 unsigned int pkto[31];
0369 unsigned int resv8;
0370 unsigned int pkti[31];
0371 unsigned int maxplen[32];
0372 unsigned int resv9;
0373 unsigned int credcnt[31];
0374 unsigned int resv10[64];
0375 unsigned int resv11;
0376 unsigned int rtcomb[255];
0377 };
0378
0379 struct router_priv {
0380 struct drvmgr_dev *dev;
0381
0382
0383 struct router_regs *regs;
0384
0385 #ifdef THREAD_SAFE
0386
0387 rtems_id sem;
0388 #endif
0389
0390
0391 char devname[9];
0392 int index;
0393
0394 int minor;
0395 int open;
0396 struct router_hw_info hwinfo;
0397 int nports;
0398 int irq_init;
0399
0400 SPIN_DECLARE(plock[32])
0401
0402 };
0403
0404 int router_count = 0;
0405 static struct router_priv *priv_tab[ROUTER_MAX];
0406
0407
0408
0409 STATIC int router_init(struct router_priv *priv);
0410 STATIC void router_hwinfo(struct router_priv *priv,
0411 struct router_hw_info *hwinfo);
0412 STATIC int router_acontrol_set(struct router_priv *priv,
0413 struct router_route_acontrol *control);
0414 STATIC int router_acontrol_get(struct router_priv *priv,
0415 struct router_route_acontrol *control);
0416 STATIC int router_portmap_set(struct router_priv *priv,
0417 struct router_route_portmap *pmap);
0418 STATIC int router_portmap_get(struct router_priv *priv,
0419 struct router_route_portmap *pmap);
0420
0421
0422 void router_isr(void *arg);
0423
0424 int router_init2(struct drvmgr_dev *dev);
0425
0426 struct drvmgr_drv_ops router_ops =
0427 {
0428 .init = {NULL, router_init2, NULL, NULL},
0429 .remove = NULL,
0430 .info = NULL
0431 };
0432
0433 struct amba_dev_id router_ids[] =
0434 {
0435 {VENDOR_GAISLER, GAISLER_SPW_ROUTER},
0436 {0, 0}
0437 };
0438
0439 struct amba_drv_info router_drv_info =
0440 {
0441 {
0442 DRVMGR_OBJ_DRV,
0443 NULL,
0444 NULL,
0445 DRIVER_AMBAPP_GAISLER_SPW_ROUTER_ID,
0446 "ROUTER_DRV",
0447 DRVMGR_BUS_TYPE_AMBAPP,
0448 &router_ops,
0449 NULL,
0450 0,
0451 sizeof(struct router_priv),
0452 },
0453 &router_ids[0],
0454 };
0455
0456 void router_register_drv (void)
0457 {
0458 DBG("Registering SPW ROUTER driver\n");
0459 drvmgr_drv_register(&router_drv_info.general);
0460 }
0461
0462 STATIC void router_hwinfo(struct router_priv *priv,
0463 struct router_hw_info *hwinfo)
0464 {
0465 unsigned int tmp;
0466
0467
0468 tmp = REG_READ(&priv->regs->cfgsts);
0469 hwinfo->nports_spw = (tmp & RTRCFG_SP) >> RTRCFG_SP_BIT;
0470 hwinfo->nports_amba = (tmp & RTRCFG_AP) >> RTRCFG_AP_BIT;
0471 hwinfo->nports_fifo = (tmp & RTRCFG_FP) >> RTRCFG_FP_BIT;
0472 hwinfo->srouting = (tmp & RTRCFG_SR) >> RTRCFG_SR_BIT;
0473 hwinfo->pnp_enable = (tmp & RTRCFG_PE) >> RTRCFG_PE_BIT;
0474 hwinfo->timers_avail = (tmp & RTRCFG_TA) >> RTRCFG_TA_BIT;
0475 hwinfo->pnp_avail = (tmp & RTRCFG_PP) >> RTRCFG_PP_BIT;
0476
0477 tmp = REG_READ(&priv->regs->ver);
0478 hwinfo->ver_major = (tmp & VER_MA) >> VER_MA_BIT;
0479 hwinfo->ver_minor = (tmp & VER_MI) >> VER_MI_BIT;
0480 hwinfo->ver_patch = (tmp & VER_PA) >> VER_PA_BIT;
0481 hwinfo->iid = (tmp & VER_ID) >> VER_ID_BIT;
0482
0483
0484 tmp = REG_READ(&priv->regs->cap);
0485 hwinfo->amba_port_fifo_size = 4 << ((tmp & CAP_AF) >> CAP_AF_BIT);
0486 hwinfo->spw_port_fifo_size = 16 << ((tmp & CAP_PF) >> CAP_PF_BIT);
0487 hwinfo->rmap_maxdlen = 4 << ((tmp & CAP_RM) >> CAP_RM_BIT);
0488 hwinfo->aux_async = (tmp & CAP_AS) >> CAP_AS_BIT;
0489 hwinfo->aux_dist_int_support = (tmp & CAP_AX) >> CAP_AX_BIT;
0490 hwinfo->dual_port_support = (tmp & CAP_ID) >> CAP_ID_BIT;
0491 hwinfo->dist_int_support = (tmp & CAP_DP) >> CAP_DP_BIT;
0492 hwinfo->spwd_support = (tmp & CAP_SD) >> CAP_SD_BIT;
0493 hwinfo->pktcnt_support = (tmp & CAP_PC) >> CAP_PC_BIT;
0494 hwinfo->charcnt_support = (tmp & CAP_CC) >> CAP_CC_BIT;
0495 }
0496
0497 STATIC void router_hwinfo_print(struct router_hw_info *hwinfo)
0498 {
0499 DBG(" -PORTS= SPW: %d, AMBA: %d, FIFO: %d\n", hwinfo->nports_spw,
0500 hwinfo->nports_amba, hwinfo->nports_fifo);
0501 DBG(" -Static routing: %s, Timers: %s\n",
0502 (hwinfo->srouting?"Enabled":"Disabled"),
0503 (hwinfo->timers_avail?"Available":"N/A"));
0504 DBG(" -PnP: %s, %s\n",
0505 (hwinfo->pnp_avail?"Available":"N/A"),
0506 (hwinfo->pnp_enable?"Enabled":"Disabled"));
0507 DBG(" -Version= Major: 0x%02x, Minor: 0x%02x, Patch: 0x%02x, ID: 0x%02x\n",
0508 hwinfo->ver_major, hwinfo->ver_minor,
0509 hwinfo->ver_patch, hwinfo->iid);
0510 DBG(" -Aux: %s, AuxDistInt: %s, DistInt: %s, SPWD: %s, PKTCNT: %s, "
0511 "CHARCNT: %s\n",
0512 (hwinfo->aux_async?"Async":"Sync"),
0513 (hwinfo->aux_dist_int_support?"Supported":"N/A"),
0514 (hwinfo->dist_int_support?"Supported":"N/A"),
0515 (hwinfo->spwd_support?"Supported":"N/A"),
0516 (hwinfo->pktcnt_support?"Supported":"N/A"),
0517 (hwinfo->charcnt_support?"Supported":"N/A"));
0518 }
0519
0520 STATIC int router_acontrol_set(struct router_priv *priv,
0521 struct router_route_acontrol *control)
0522 {
0523 int i;
0524 for (i=0; i<31; i++) {
0525 REG_WRITE(&priv->regs->routes[i], control->control[i]);
0526 }
0527 for (i=0; i<224; i++) {
0528 REG_WRITE(&priv->regs->routes[i+31], control->control_logical[i]);
0529 }
0530 return ROUTER_ERR_OK;
0531 }
0532
0533 STATIC int router_acontrol_get(struct router_priv *priv,
0534 struct router_route_acontrol *control)
0535 {
0536 int i;
0537 for (i=0; i<31; i++) {
0538 control->control[i] = REG_READ(&priv->regs->routes[i]);
0539 }
0540 for (i=0; i<224; i++) {
0541 control->control_logical[i] = REG_READ(&priv->regs->routes[i+31]);
0542 }
0543 return ROUTER_ERR_OK;
0544 }
0545
0546 STATIC int router_portmap_set(struct router_priv *priv,
0547 struct router_route_portmap *pmap)
0548 {
0549 int i;
0550 for (i=0; i<31; i++) {
0551 REG_WRITE(&priv->regs->psetup[i], pmap->pmap[i]);
0552 }
0553 for (i=0; i<224; i++) {
0554 REG_WRITE(&priv->regs->psetup[i+31], pmap->pmap_logical[i]);
0555 }
0556 return ROUTER_ERR_OK;
0557 }
0558
0559 STATIC int router_portmap_get(struct router_priv *priv,
0560 struct router_route_portmap *pmap)
0561 {
0562 int i;
0563 for (i=0; i<31; i++) {
0564 pmap->pmap[i] = REG_READ(&priv->regs->psetup[i]);
0565 }
0566 for (i=0; i<224; i++) {
0567 pmap->pmap_logical[i] = REG_READ(&priv->regs->psetup[i+31]);
0568 }
0569 return ROUTER_ERR_OK;
0570 }
0571
0572 STATIC int router_init(struct router_priv *priv)
0573 {
0574 #ifdef THREAD_SAFE
0575 int i;
0576
0577
0578 if (rtems_semaphore_create(
0579 rtems_build_name('S', 'R', 'O', '0' + priv->index), 1,
0580 RTEMS_FIFO | RTEMS_SIMPLE_BINARY_SEMAPHORE | \
0581 RTEMS_NO_INHERIT_PRIORITY | RTEMS_LOCAL | \
0582 RTEMS_NO_PRIORITY_CEILING, 0, &priv->sem) != RTEMS_SUCCESSFUL) {
0583 return DRVMGR_FAIL;
0584 }
0585 #endif
0586
0587
0588 router_hwinfo(priv, &priv->hwinfo);
0589
0590 priv->open = 0;
0591
0592 priv->nports = 1 + priv->hwinfo.nports_spw + priv->hwinfo.nports_amba +
0593 priv->hwinfo.nports_fifo;
0594 if ((priv->nports < 2) || (priv->nports > 32)) {
0595 return DRVMGR_EIO;
0596 }
0597
0598 #ifdef THREAD_SAFE
0599
0600 for (i=0; i<priv->nports; i++) {
0601 SPIN_INIT(&priv->plock[i],"portlock");
0602 }
0603 #endif
0604
0605
0606 DBG("SPW ROUTER[%d] with following capabilities:\n", priv->index);
0607 router_hwinfo_print(&priv->hwinfo);
0608
0609 return DRVMGR_OK;
0610 }
0611
0612 int router_init2(struct drvmgr_dev *dev)
0613 {
0614 struct router_priv *priv = dev->priv;
0615 struct amba_dev_info *ambadev;
0616 struct ambapp_core *pnpinfo;
0617 unsigned int tmp;
0618 int i;
0619 int status;
0620
0621 DBG("SPW ROUTER[%d] on bus %s\n", dev->minor_drv, dev->parent->dev->name);
0622
0623 if (router_count >= ROUTER_MAX) {
0624 return DRVMGR_ENORES;
0625 }
0626
0627 if (priv == NULL) {
0628 return DRVMGR_NOMEM;
0629 }
0630 priv->dev = dev;
0631
0632
0633 ambadev = (struct amba_dev_info *)priv->dev->businfo;
0634 if (ambadev == NULL) {
0635 return DRVMGR_FAIL;
0636 }
0637 pnpinfo = &ambadev->info;
0638 priv->regs = (struct router_regs *)pnpinfo->ahb_slv->start[0];
0639 priv->minor = dev->minor_drv;
0640
0641
0642 status = router_init(priv);
0643 if (status != DRVMGR_OK) {
0644 return status;
0645 }
0646
0647
0648
0649
0650
0651
0652
0653 REG_WRITE(&priv->regs->imask,0);
0654 REG_WRITE(&priv->regs->ipmask,0);
0655
0656
0657 REG_WRITE(&priv->regs->pip,0xffffffff);
0658
0659
0660 tmp = REG_READ(&priv->regs->cfgsts);
0661 REG_WRITE(&priv->regs->cfgsts, tmp | RTRCFG_WCLEAR);
0662 tmp = REG_READ(&priv->regs->psts[0]);
0663 REG_WRITE(&priv->regs->psts[0], (tmp & PSTSCFG_WCLEAR) | PSTSCFG_WCLEAR2);
0664 for (i=1; i<priv->nports; i++) {
0665 tmp = REG_READ(&priv->regs->psts[i]);
0666 REG_WRITE(&priv->regs->psts[i], tmp & PSTS_WCLEAR);
0667 }
0668
0669
0670 priv->index = router_count;
0671 priv_tab[priv->index] = priv;
0672 router_count++;
0673
0674
0675 sprintf(priv->devname, "router%d", priv->index);
0676
0677 return DRVMGR_OK;
0678 }
0679
0680 void *router_open(unsigned int dev_no)
0681 {
0682 struct router_priv *priv, *ret;
0683
0684 if (dev_no >= router_count) {
0685 DBG("ROUTER Wrong index %u\n", dev_no);
0686 return NULL;
0687 }
0688
0689 priv = priv_tab[dev_no];
0690
0691 if (priv == NULL) {
0692 DBG("ROUTER Device not initialized\n");
0693 return NULL;
0694 }
0695
0696 #ifdef THREAD_SAFE
0697
0698 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
0699 != RTEMS_SUCCESSFUL) {
0700 DBG("ROUTER Sempahore failed\n");
0701 return NULL;
0702 }
0703 #endif
0704
0705 if (priv->open) {
0706 DBG("ROUTER Device already opened\n");
0707 ret = NULL;
0708 } else {
0709
0710 priv->open = 1;
0711 ret = priv;
0712 }
0713 #ifdef THREAD_SAFE
0714
0715 rtems_semaphore_release(priv->sem);
0716 #endif
0717
0718 return ret;
0719 }
0720
0721 int router_close(void *d)
0722 {
0723 struct router_priv *priv = d;
0724 int ret;
0725
0726 if (priv == NULL) {
0727 DBG("ROUTER Device not initialized\n");
0728 return ROUTER_ERR_EINVAL;
0729 }
0730
0731 #ifdef THREAD_SAFE
0732
0733 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
0734 != RTEMS_SUCCESSFUL) {
0735 DBG("ROUTER Sempahore failed\n");
0736 return ROUTER_ERR_ERROR;
0737 }
0738 #endif
0739
0740 if (priv->open == 0) {
0741 DBG("ROUTER Device already closed\n");
0742 ret = ROUTER_ERR_ERROR;
0743 } else {
0744
0745 priv->open = 0;
0746 ret = ROUTER_ERR_OK;
0747 }
0748
0749 #ifdef THREAD_SAFE
0750
0751 rtems_semaphore_release(priv->sem);
0752 #endif
0753
0754 return ret;
0755 }
0756
0757 STATIC int router_check_open(void *d)
0758 {
0759 struct router_priv *priv = d;
0760
0761 if (priv == NULL) {
0762 DBG("ROUTER Device not initialized\n");
0763 return ROUTER_ERR_EINVAL;
0764 }
0765
0766 if (priv->open == 0) {
0767 DBG("ROUTER Device closed\n");
0768 return ROUTER_ERR_ERROR;
0769 }
0770
0771 return 0;
0772 }
0773
0774 STATIC int router_check_port(void *d, int port)
0775 {
0776 int ret = router_check_open(d);
0777
0778 if (ret == 0) {
0779 struct router_priv *priv = d;
0780 if((port < 0) || (port >= priv->nports)) {
0781 DBG("ROUTER wrong port\n");
0782 ret = ROUTER_ERR_EINVAL;
0783 }
0784 }
0785
0786 return ret;
0787 }
0788
0789 STATIC int router_check_distint_support(void *d)
0790 {
0791 int ret = router_check_open(d);
0792
0793 if (ret == 0) {
0794 struct router_priv *priv = d;
0795 if (priv->hwinfo.dist_int_support == 0) {
0796 DBG("ROUTER Dist interrupts not supported\n");
0797 ret = ROUTER_ERR_IMPLEMENTED;
0798 }
0799 }
0800
0801 return ret;
0802 }
0803
0804 int router_hwinfo_get(void *d, struct router_hw_info *hwinfo)
0805 {
0806 struct router_priv *priv = d;
0807 int error = router_check_open(d);
0808
0809 if (error)
0810 return error;
0811
0812 if (hwinfo == NULL) {
0813 DBG("ROUTER Wrong pointer\n");
0814 return ROUTER_ERR_EINVAL;
0815 }
0816
0817
0818 router_hwinfo(priv, hwinfo);
0819
0820 return ROUTER_ERR_OK;
0821 }
0822
0823 int router_print(void *d)
0824 {
0825 struct router_priv *priv = d;
0826 int error = router_check_open(d);
0827
0828 if (error)
0829 return error;
0830
0831
0832 DBG("Number of routers: %d\n", router_count);
0833 DBG("SPW ROUTER[%d] with following capabilities:\n", priv->index);
0834 router_hwinfo_print(&priv->hwinfo);
0835
0836 return ROUTER_ERR_OK;
0837 }
0838
0839
0840
0841 int router_config_set(void *d, struct router_config *cfg)
0842 {
0843 struct router_priv *priv = d;
0844 int error = router_check_open(d);
0845
0846 if (error)
0847 return error;
0848
0849 if (cfg == NULL) {
0850 DBG("ROUTER CFG wrong\n");
0851 return ROUTER_ERR_EINVAL;
0852 }
0853
0854 if ((cfg->flags & (ROUTER_FLG_TPRES|ROUTER_FLG_TRLD)) &&
0855 !priv->hwinfo.timers_avail) {
0856 return ROUTER_ERR_IMPLEMENTED;
0857 }
0858
0859 #ifdef THREAD_SAFE
0860
0861 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
0862 != RTEMS_SUCCESSFUL) {
0863 DBG("ROUTER Sempahore failed\n");
0864 return ROUTER_ERR_ERROR;
0865 }
0866 #endif
0867
0868
0869 if (cfg->flags & ROUTER_FLG_CFG) {
0870 REG_WRITE(&priv->regs->cfgsts, cfg->config & ~(RTRCFG_WCLEAR));
0871 }
0872
0873
0874 if (cfg->flags & ROUTER_FLG_IID) {
0875 REG_WRITE(&priv->regs->ver, (cfg->iid << VER_ID_BIT) & VER_ID);
0876 }
0877
0878
0879 if (cfg->flags & ROUTER_FLG_IDIV) {
0880 REG_WRITE(&priv->regs->idiv, (cfg->idiv << IDIV_ID_BIT) & IDIV_ID);
0881 }
0882
0883
0884 if (cfg->flags & ROUTER_FLG_TPRES) {
0885 REG_WRITE(&priv->regs->tprescaler,
0886 (cfg->timer_prescaler << PRESCALER_RL_BIT) & PRESCALER_RL);
0887 }
0888
0889 #ifdef THREAD_SAFE
0890
0891 rtems_semaphore_release(priv->sem);
0892 #endif
0893
0894 return ROUTER_ERR_OK;
0895 }
0896
0897 int router_config_get(void *d, struct router_config *cfg)
0898 {
0899 struct router_priv *priv = d;
0900 int error = router_check_open(d);
0901
0902 if (error)
0903 return error;
0904
0905 if (cfg == NULL) {
0906 DBG("ROUTER CFG wrong\n");
0907 return ROUTER_ERR_EINVAL;
0908 }
0909
0910 #ifdef THREAD_SAFE
0911
0912 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
0913 != RTEMS_SUCCESSFUL) {
0914 DBG("ROUTER Sempahore failed\n");
0915 return ROUTER_ERR_ERROR;
0916 }
0917 #endif
0918
0919 cfg->config = REG_READ(&priv->regs->cfgsts) &
0920 ~(RTRCFG_SP|RTRCFG_AP|RTRCFG_FP|RTRCFG_SR|RTRCFG_PE|RTRCFG_ME|
0921 RTRCFG_TA|RTRCFG_PP);
0922 cfg->iid = (REG_READ(&priv->regs->ver) & VER_ID) >> VER_ID_BIT;
0923 cfg->idiv = (REG_READ(&priv->regs->idiv) & IDIV_ID) >> IDIV_ID_BIT;
0924 cfg->timer_prescaler =
0925 (REG_READ(&priv->regs->tprescaler) & PRESCALER_RL) >> PRESCALER_RL_BIT;
0926
0927 #ifdef THREAD_SAFE
0928
0929 rtems_semaphore_release(priv->sem);
0930 #endif
0931
0932 return ROUTER_ERR_OK;
0933 }
0934
0935
0936
0937
0938 int router_routing_table_set(void *d, struct router_routing_table *cfg)
0939 {
0940 struct router_priv *priv = d;
0941 int error = router_check_open(d);
0942
0943 if (error)
0944 return error;
0945
0946 if (cfg == NULL) {
0947 DBG("ROUTER CFG wrong\n");
0948 return ROUTER_ERR_EINVAL;
0949 }
0950
0951 #ifdef THREAD_SAFE
0952
0953 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
0954 != RTEMS_SUCCESSFUL) {
0955 DBG("ROUTER Sempahore failed\n");
0956 return ROUTER_ERR_ERROR;
0957 }
0958 #endif
0959
0960
0961 if (cfg->flags & ROUTER_ROUTE_FLG_CTRL) {
0962 router_acontrol_set(priv,&cfg->acontrol);
0963 }
0964
0965
0966 if (cfg->flags & ROUTER_ROUTE_FLG_MAP) {
0967 router_portmap_set(priv,&cfg->portmap);
0968 }
0969
0970 #ifdef THREAD_SAFE
0971
0972 rtems_semaphore_release(priv->sem);
0973 #endif
0974
0975 return ROUTER_ERR_OK;
0976 }
0977
0978 int router_routing_table_get(void *d, struct router_routing_table *cfg)
0979 {
0980 struct router_priv *priv = d;
0981 int error = router_check_open(d);
0982
0983 if (error)
0984 return error;
0985
0986 if (cfg == NULL) {
0987 DBG("ROUTER CFG wrong\n");
0988 return ROUTER_ERR_EINVAL;
0989 }
0990
0991 #ifdef THREAD_SAFE
0992
0993 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
0994 != RTEMS_SUCCESSFUL) {
0995 DBG("ROUTER Sempahore failed\n");
0996 return ROUTER_ERR_ERROR;
0997 }
0998 #endif
0999
1000
1001 router_acontrol_get(priv,&cfg->acontrol);
1002
1003
1004 router_portmap_get(priv,&cfg->portmap);
1005
1006 #ifdef THREAD_SAFE
1007
1008 rtems_semaphore_release(priv->sem);
1009 #endif
1010
1011 return ROUTER_ERR_OK;
1012 }
1013
1014 int router_route_set(void *d, struct router_route *route)
1015 {
1016 struct router_priv *priv = d;
1017 int i;
1018 unsigned int mask;
1019 int error = router_check_open(d);
1020
1021 if (error)
1022 return error;
1023
1024 if (route == NULL) {
1025 DBG("ROUTER route wrong\n");
1026 return ROUTER_ERR_EINVAL;
1027 }
1028
1029 if (route->from_address < 32) {
1030
1031 if ((route->from_address == 0) ||
1032 (route->from_address >= priv->nports)) {
1033 DBG("ROUTER wrong physical address\n");
1034 return ROUTER_ERR_TOOMANY;
1035 }
1036 }
1037
1038
1039 mask=0;
1040 for (i=0; i < route->count; i++) {
1041 if ((route->to_port[i] == 0) || (route->to_port[i] >= priv->nports)) {
1042 DBG("ROUTER route wrong destiny port\n");
1043 return ROUTER_ERR_EINVAL;
1044 }
1045 mask |= (0x1 << route->to_port[i]);
1046 }
1047 if (route->options & ROUTER_ROUTE_PACKETDISTRIBUTION_ENABLE) {
1048 mask |= RTPMAP_PD;
1049 }
1050
1051 #ifdef THREAD_SAFE
1052
1053 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
1054 != RTEMS_SUCCESSFUL) {
1055 DBG("ROUTER Sempahore failed\n");
1056 return ROUTER_ERR_ERROR;
1057 }
1058 #endif
1059
1060
1061 REG_WRITE(&priv->regs->psetup[route->from_address-1], mask);
1062
1063
1064 REG_WRITE(&priv->regs->routes[route->from_address-1],
1065 route->options & (0xf));
1066
1067 #ifdef THREAD_SAFE
1068
1069 rtems_semaphore_release(priv->sem);
1070 #endif
1071
1072 return ROUTER_ERR_OK;
1073 }
1074
1075 int router_route_get(void *d, struct router_route *route)
1076 {
1077 struct router_priv *priv = d;
1078 int i,count;
1079 unsigned int mask;
1080 int error = router_check_open(d);
1081
1082 if (error)
1083 return error;
1084
1085 if (route == NULL) {
1086 DBG("ROUTER route wrong\n");
1087 return ROUTER_ERR_EINVAL;
1088 }
1089
1090 if (route->from_address < 32) {
1091
1092 if ((route->from_address == 0) ||
1093 (route->from_address >= priv->nports)) {
1094 DBG("ROUTER wrong physical address\n");
1095 return ROUTER_ERR_TOOMANY;
1096 }
1097 }
1098
1099 #ifdef THREAD_SAFE
1100
1101 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
1102 != RTEMS_SUCCESSFUL) {
1103 DBG("ROUTER Sempahore failed\n");
1104 return ROUTER_ERR_ERROR;
1105 }
1106 #endif
1107
1108
1109 route->options =
1110 REG_READ(&priv->regs->routes[route->from_address-1]) & (0xf);
1111
1112
1113 mask=REG_READ(&priv->regs->psetup[route->from_address-1]);
1114
1115 #ifdef THREAD_SAFE
1116
1117 rtems_semaphore_release(priv->sem);
1118 #endif
1119
1120 if (mask & RTPMAP_PD) {
1121 route->options |= ROUTER_ROUTE_PACKETDISTRIBUTION_ENABLE;
1122 }
1123
1124
1125
1126
1127
1128 i=0;
1129 count=0;
1130 mask &= (RTPMAP_PE);
1131 while (mask != 0) {
1132 if (mask & 0x1) {
1133 route->to_port[count] = i;
1134 count++;
1135 }
1136 mask >>= 1;
1137 i++;
1138 }
1139 route->count=count;
1140
1141 return ROUTER_ERR_OK;
1142 }
1143
1144 int router_write_enable(void *d)
1145 {
1146 struct router_priv *priv = d;
1147 int error = router_check_open(d);
1148
1149 if (error)
1150 return error;
1151
1152 REG_WRITE(&priv->regs->cfgwe, 0x1);
1153
1154 return ROUTER_ERR_OK;
1155 }
1156
1157 int router_write_disable(void *d)
1158 {
1159 struct router_priv *priv = d;
1160 int error = router_check_open(d);
1161
1162 if (error)
1163 return error;
1164
1165 REG_WRITE(&priv->regs->cfgwe, 0x0);
1166
1167 return ROUTER_ERR_OK;
1168 }
1169
1170 int router_port_ioc(void *d, int port, struct router_port *cfg)
1171 {
1172 struct router_priv *priv = d;
1173 unsigned int ctrl, ctrl2, sts, timer, pktl;
1174 SPIN_IRQFLAGS(irqflags);
1175 int error = router_check_port(d, port);
1176
1177 if (error)
1178 return error;
1179
1180 if (cfg == NULL) {
1181 DBG("ROUTER Wrong cfg\n");
1182 return ROUTER_ERR_EINVAL;
1183 }
1184
1185 SPIN_LOCK_IRQ(&priv->plock[port], irqflags);
1186
1187 ctrl = cfg->ctrl;
1188 if (cfg->flag & ROUTER_PORT_FLG_GET_CTRL) {
1189 ctrl = REG_READ(&priv->regs->pctrl[port]);
1190 }
1191 ctrl2 = cfg->ctrl;
1192 if (cfg->flag & ROUTER_PORT_FLG_GET_CTRL2) {
1193 ctrl2 = REG_READ(&priv->regs->pctrl2[port]);
1194 }
1195 sts = cfg->sts;
1196 if (cfg->flag & ROUTER_PORT_FLG_GET_STS) {
1197 sts = REG_READ(&priv->regs->psts[port]);
1198 }
1199 timer = cfg->timer_reload;
1200 if (cfg->flag & ROUTER_PORT_FLG_GET_TIMER) {
1201 REG_READ(&priv->regs->treload[port]);
1202 }
1203 pktl = cfg->packet_length;
1204 if (cfg->flag & ROUTER_PORT_FLG_GET_PKTLEN) {
1205 REG_READ(&priv->regs->maxplen[port]);
1206 }
1207
1208 if (cfg->flag & ROUTER_PORT_FLG_SET_CTRL) {
1209 REG_WRITE(&priv->regs->pctrl[port], cfg->ctrl);
1210 }
1211 if (cfg->flag & ROUTER_PORT_FLG_SET_CTRL2) {
1212 REG_WRITE(&priv->regs->pctrl2[port], cfg->ctrl2);
1213 }
1214 if (cfg->flag & ROUTER_PORT_FLG_SET_STS) {
1215 REG_WRITE(&priv->regs->psts[port], cfg->sts);
1216 }
1217 if (cfg->flag & ROUTER_PORT_FLG_SET_TIMER) {
1218 REG_WRITE(&priv->regs->treload[port], cfg->timer_reload & PTIMER_RL);
1219 }
1220 if (cfg->flag & ROUTER_PORT_FLG_SET_PKTLEN) {
1221 REG_WRITE(&priv->regs->maxplen[port], cfg->packet_length & MAXPLEN_ML);
1222 }
1223
1224 SPIN_UNLOCK_IRQ(&priv->plock[port], irqflags);
1225
1226 cfg->ctrl = ctrl;
1227 cfg->ctrl2 = ctrl2;
1228 cfg->sts = sts;
1229 cfg->timer_reload = timer;
1230 cfg->packet_length = pktl;
1231
1232 return ROUTER_ERR_OK;
1233 }
1234
1235 int router_port_ctrl_rmw(void *d, int port, uint32_t *oldvalue, uint32_t bitmask, uint32_t value)
1236 {
1237 struct router_priv *priv = d;
1238 int error = router_check_port(d, port);
1239 unsigned int oldctrl, ctrl;
1240 SPIN_IRQFLAGS(irqflags);
1241
1242 if (error)
1243 return error;
1244
1245 SPIN_LOCK_IRQ(&priv->plock[port], irqflags);
1246
1247 oldctrl = REG_READ(&priv->regs->pctrl[port]);
1248 ctrl = ((oldctrl & ~(bitmask)) | (value & bitmask));
1249 REG_WRITE(&priv->regs->pctrl[port], ctrl);
1250
1251 SPIN_UNLOCK_IRQ(&priv->plock[port], irqflags);
1252
1253 if (oldvalue != NULL) {
1254 *oldvalue = oldctrl;
1255 }
1256
1257 return ROUTER_ERR_OK;
1258 }
1259
1260 int router_port_ctrl2_rmw(void *d, int port, uint32_t *oldvalue, uint32_t bitmask, uint32_t value)
1261 {
1262 struct router_priv *priv = d;
1263 int error = router_check_port(d, port);
1264 unsigned int oldctrl, ctrl;
1265 SPIN_IRQFLAGS(irqflags);
1266
1267 if (error)
1268 return error;
1269
1270 SPIN_LOCK_IRQ(&priv->plock[port], irqflags);
1271
1272 oldctrl = REG_READ(&priv->regs->pctrl2[port]);
1273 ctrl = ((oldctrl & ~(bitmask)) | (value & bitmask));
1274 REG_WRITE(&priv->regs->pctrl2[port], ctrl);
1275
1276 SPIN_UNLOCK_IRQ(&priv->plock[port], irqflags);
1277
1278 if (oldvalue != NULL) {
1279 *oldvalue = oldctrl;
1280 }
1281
1282 return ROUTER_ERR_OK;
1283 }
1284
1285
1286 int router_port_ctrl_get(void *d, int port, uint32_t *ctrl)
1287 {
1288 struct router_priv *priv = d;
1289 int error = router_check_port(d, port);
1290
1291 if (error)
1292 return error;
1293
1294 if (ctrl == NULL) {
1295 DBG("ROUTER Wrong ctrl\n");
1296 return ROUTER_ERR_EINVAL;
1297 }
1298
1299 *ctrl = REG_READ(&priv->regs->pctrl[port]);
1300 return ROUTER_ERR_OK;
1301 }
1302
1303
1304 int router_port_status(void *d, int port, uint32_t *sts, uint32_t clrmsk)
1305 {
1306 struct router_priv *priv = d;
1307 int error = router_check_port(d, port);
1308 SPIN_IRQFLAGS(irqflags);
1309
1310 if (error)
1311 return error;
1312
1313 if (sts == NULL) {
1314 DBG("ROUTER Wrong sts\n");
1315 return ROUTER_ERR_EINVAL;
1316 }
1317
1318 SPIN_LOCK_IRQ(&priv->plock[port], irqflags);
1319 *sts = REG_READ(&priv->regs->psts[port]);
1320 if (port == 0) {
1321 REG_WRITE(&priv->regs->psts[port], ((*sts) & (PSTSCFG_WCLEAR & clrmsk)) | (PSTSCFG_WCLEAR2 & clrmsk));
1322 }else{
1323 REG_WRITE(&priv->regs->psts[port], (*sts) & (PSTS_WCLEAR & clrmsk));
1324 }
1325 SPIN_UNLOCK_IRQ(&priv->plock[port], irqflags);
1326 return ROUTER_ERR_OK;
1327 }
1328
1329
1330 int router_port_ctrl2_get(void *d, int port, uint32_t *ctrl2)
1331 {
1332 struct router_priv *priv = d;
1333 int error = router_check_port(d, port);
1334
1335 if (error)
1336 return error;
1337
1338 if (ctrl2 == NULL) {
1339 DBG("ROUTER Wrong ctrl2\n");
1340 return ROUTER_ERR_EINVAL;
1341 }
1342
1343 *ctrl2 = REG_READ(&priv->regs->pctrl2[port]);
1344 return ROUTER_ERR_OK;
1345 }
1346
1347
1348 int router_port_ctrl_set(void *d, int port, uint32_t mask, uint32_t ctrl)
1349 {
1350 return router_port_ctrl_rmw(d, port, NULL, mask, ctrl);
1351 }
1352
1353
1354 int router_port_ctrl2_set(void *d, int port, uint32_t mask, uint32_t ctrl2)
1355 {
1356 return router_port_ctrl_rmw(d, port, NULL, mask, ctrl2);
1357 }
1358
1359 int router_port_treload_set(void *d, int port, uint32_t reload)
1360 {
1361 struct router_priv *priv = d;
1362 int error = router_check_port(d, port);
1363
1364 if (error)
1365 return error;
1366
1367 REG_WRITE(&priv->regs->treload[port], reload & PTIMER_RL);
1368
1369 return ROUTER_ERR_OK;
1370 }
1371
1372 int router_port_treload_get(void *d, int port, uint32_t *reload)
1373 {
1374 struct router_priv *priv = d;
1375 int error = router_check_port(d, port);
1376
1377 if (error)
1378 return error;
1379
1380 if (reload == NULL) {
1381 DBG("ROUTER Wrong reload pointer\n");
1382 return ROUTER_ERR_EINVAL;
1383 }
1384
1385 *reload = REG_READ(&priv->regs->treload[port]) & PTIMER_RL;
1386
1387 return ROUTER_ERR_OK;
1388 }
1389
1390 int router_port_maxplen_set(void *d, int port, uint32_t length)
1391 {
1392 struct router_priv *priv = d;
1393 int error = router_check_port(d, port);
1394
1395 if (error)
1396 return error;
1397
1398 REG_WRITE(&priv->regs->maxplen[port], length & MAXPLEN_ML);
1399
1400 return ROUTER_ERR_OK;
1401 }
1402
1403 int router_port_maxplen_get(void *d, int port, uint32_t *length)
1404 {
1405 struct router_priv *priv = d;
1406 int error = router_check_port(d, port);
1407
1408 if (error)
1409 return error;
1410
1411 if (length == NULL) {
1412 DBG("ROUTER Wrong length pointer\n");
1413 return ROUTER_ERR_EINVAL;
1414 }
1415
1416 *length = REG_READ(&priv->regs->maxplen[port]);
1417
1418 return ROUTER_ERR_OK;
1419 }
1420
1421
1422 int router_port_link_status(void *d, int port)
1423 {
1424 struct router_priv *priv = d;
1425 int error = router_check_port(d, port);
1426
1427 if (error)
1428 return error;
1429
1430 return ((REG_READ(&priv->regs->psts[port]) & PSTS_LS) >> PSTS_LS_BIT);
1431 }
1432
1433 int router_port_disable(void *d, int port)
1434 {
1435 return router_port_ctrl_rmw(d, port, NULL, PCTRL_DI, PCTRL_DI);
1436 }
1437
1438 int router_port_enable(void *d, int port)
1439 {
1440 return router_port_ctrl_rmw(d, port, NULL, PCTRL_DI, 0);
1441 }
1442
1443 int router_port_link_stop(void *d, int port)
1444 {
1445 return router_port_ctrl_rmw(d, port, NULL, PCTRL_LD | PCTRL_LS, PCTRL_LD);
1446 }
1447
1448 int router_port_link_start(void *d, int port)
1449 {
1450 return router_port_ctrl_rmw(d, port, NULL, PCTRL_LD | PCTRL_LS, PCTRL_LS);
1451 }
1452
1453 int router_port_link_div(void *d, int port, int rundiv)
1454 {
1455 return router_port_ctrl_rmw(d, port, NULL, PCTRL_RD, (rundiv << PCTRL_RD_BIT) & PCTRL_RD);
1456 }
1457
1458 int router_port_link_receive_spill(void *d, int port)
1459 {
1460 struct router_priv *priv = d;
1461 unsigned int ctrl;
1462 SPIN_IRQFLAGS(irqflags);
1463 int error = router_check_port(d, port);
1464
1465 if (error)
1466 return error;
1467
1468 SPIN_LOCK_IRQ(&priv->plock[port], irqflags);
1469
1470 ctrl = REG_READ(&priv->regs->pctrl[port]);
1471 REG_WRITE(&priv->regs->pctrl[port], (ctrl| (PCTRL_RS)));
1472
1473
1474 while(REG_READ(&priv->regs->pctrl[port]) & PCTRL_RS) {};
1475
1476 SPIN_UNLOCK_IRQ(&priv->plock[port], irqflags);
1477
1478 return ROUTER_ERR_OK;
1479 }
1480
1481 int router_port_link_transmit_reset(void *d, int port)
1482 {
1483 struct router_priv *priv = d;
1484 unsigned int ctrl;
1485 SPIN_IRQFLAGS(irqflags);
1486 int error = router_check_port(d, port);
1487
1488 if (error)
1489 return error;
1490
1491 SPIN_LOCK_IRQ(&priv->plock[port], irqflags);
1492
1493 ctrl = REG_READ(&priv->regs->pctrl[port]);
1494 REG_WRITE(&priv->regs->pctrl[port], (ctrl| (PCTRL_TF)));
1495
1496
1497 while(REG_READ(&priv->regs->pctrl[port]) & PCTRL_TF) {};
1498
1499 SPIN_UNLOCK_IRQ(&priv->plock[port], irqflags);
1500
1501 return ROUTER_ERR_OK;
1502 }
1503
1504 int router_port_cred_get(void *d, int port, uint32_t *cred)
1505 {
1506 struct router_priv *priv = d;
1507 int error = router_check_port(d, port);
1508
1509 if (error)
1510 return error;
1511
1512 if (cred == NULL) {
1513 DBG("ROUTER Wrong cred pointer\n");
1514 return ROUTER_ERR_EINVAL;
1515 }
1516
1517 *cred = REG_READ(&priv->regs->credcnt[port]);
1518 return ROUTER_ERR_OK;
1519 }
1520
1521 int router_instance_set(void *d, uint8_t instance)
1522 {
1523 struct router_priv *priv = d;
1524 int error = router_check_open(d);
1525
1526 if (error)
1527 return error;
1528
1529 REG_WRITE(&priv->regs->ver, (instance << VER_ID_BIT) & VER_ID);
1530 return ROUTER_ERR_OK;
1531 }
1532
1533 int router_idiv_set(void *d, uint8_t idiv)
1534 {
1535 struct router_priv *priv = d;
1536 int error = router_check_open(d);
1537
1538 if (error)
1539 return error;
1540
1541 REG_WRITE(&priv->regs->idiv, (idiv << IDIV_ID_BIT) & IDIV_ID);
1542 return ROUTER_ERR_OK;
1543 }
1544
1545 int router_tpresc_set(void *d, uint32_t prescaler)
1546 {
1547 struct router_priv *priv = d;
1548 int error = router_check_open(d);
1549
1550 if (error)
1551 return error;
1552
1553 REG_WRITE(&priv->regs->tprescaler,
1554 (prescaler << PRESCALER_RL_BIT) & PRESCALER_RL);
1555 return ROUTER_ERR_OK;
1556 }
1557
1558 int router_instance_get(void *d, uint8_t *instance)
1559 {
1560 struct router_priv *priv = d;
1561 int error = router_check_open(d);
1562
1563 if (error)
1564 return error;
1565
1566 if (instance == NULL) {
1567 DBG("ROUTER Wrong instance pointer\n");
1568 return ROUTER_ERR_EINVAL;
1569 }
1570
1571 *instance = REG_READ(&priv->regs->ver);
1572
1573 return ROUTER_ERR_OK;
1574 }
1575
1576 int router_idiv_get(void *d, uint8_t *idiv)
1577 {
1578 struct router_priv *priv = d;
1579 int error = router_check_open(d);
1580
1581 if (error)
1582 return error;
1583
1584 if (idiv == NULL) {
1585 DBG("ROUTER Wrong idiv pointer\n");
1586 return ROUTER_ERR_EINVAL;
1587 }
1588
1589 *idiv = REG_READ(&priv->regs->idiv);
1590
1591 return ROUTER_ERR_OK;
1592 }
1593
1594 int router_tpresc_get(void *d, uint32_t *prescaler)
1595 {
1596 struct router_priv *priv = d;
1597 int error = router_check_open(d);
1598
1599 if (error)
1600 return error;
1601
1602 if (prescaler == NULL) {
1603 DBG("ROUTER Wrong prescaler pointer\n");
1604 return ROUTER_ERR_EINVAL;
1605 }
1606
1607 *prescaler = REG_READ(&priv->regs->tprescaler);
1608
1609 return ROUTER_ERR_OK;
1610 }
1611
1612 int router_cfgsts_set(void *d, uint32_t cfgsts)
1613 {
1614 struct router_priv *priv = d;
1615 int error = router_check_open(d);
1616
1617 if (error)
1618 return error;
1619
1620 REG_WRITE(&priv->regs->cfgsts, cfgsts);
1621
1622 return ROUTER_ERR_OK;
1623 }
1624
1625 int router_cfgsts_get(void *d, uint32_t *cfgsts)
1626 {
1627 struct router_priv *priv = d;
1628 int error = router_check_open(d);
1629
1630 if (error)
1631 return error;
1632
1633 if (cfgsts == NULL) {
1634 DBG("ROUTER Wrong cfgsts pointer\n");
1635 return ROUTER_ERR_EINVAL;
1636 }
1637
1638 *cfgsts = REG_READ(&priv->regs->cfgsts);
1639
1640 return ROUTER_ERR_OK;
1641 }
1642
1643 int router_tc_enable(void *d)
1644 {
1645 struct router_priv *priv = d;
1646 int error = router_check_open(d);
1647
1648 if (error)
1649 return error;
1650
1651 REG_WRITE(&priv->regs->timecode, TC_EN);
1652
1653 return ROUTER_ERR_OK;
1654 }
1655
1656 int router_tc_disable(void *d)
1657 {
1658 struct router_priv *priv = d;
1659 int error = router_check_open(d);
1660
1661 if (error)
1662 return error;
1663
1664 REG_WRITE(&priv->regs->timecode, 0);
1665
1666 return ROUTER_ERR_OK;
1667 }
1668
1669 int router_tc_reset(void *d)
1670 {
1671 struct router_priv *priv = d;
1672 unsigned int tc;
1673 int error = router_check_open(d);
1674
1675 if (error)
1676 return error;
1677
1678 tc = REG_READ(&priv->regs->timecode);
1679 REG_WRITE(&priv->regs->timecode, tc | TC_RE);
1680
1681 return ROUTER_ERR_OK;
1682 }
1683
1684 int router_tc_get(void *d)
1685 {
1686 struct router_priv *priv = d;
1687 int error = router_check_open(d);
1688
1689 if (error)
1690 return error;
1691
1692 return (REG_READ(&priv->regs->timecode) & (TC_CF | TC_TC)) >> TC_TC_BIT;
1693 }
1694
1695 int router_interrupt_unmask(void *d, int options)
1696 {
1697 struct router_priv *priv = d;
1698 unsigned int mask;
1699 int error = router_check_open(d);
1700
1701 if (error)
1702 return error;
1703
1704 #ifdef THREAD_SAFE
1705
1706 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
1707 != RTEMS_SUCCESSFUL) {
1708 DBG("ROUTER Sempahore failed\n");
1709 return ROUTER_ERR_ERROR;
1710 }
1711 #endif
1712
1713
1714
1715 mask = REG_READ(&priv->regs->imask);
1716
1717
1718 REG_WRITE(&priv->regs->pip, 0xffffffff);
1719
1720
1721 REG_WRITE(&priv->regs->imask, mask | options);
1722
1723 #ifdef THREAD_SAFE
1724
1725 rtems_semaphore_release(priv->sem);
1726 #endif
1727
1728 return ROUTER_ERR_OK;
1729 }
1730
1731 int router_interrupt_mask(void *d, int options)
1732 {
1733 struct router_priv *priv = d;
1734 unsigned int mask;
1735 int error = router_check_open(d);
1736
1737 if (error)
1738 return error;
1739
1740 #ifdef THREAD_SAFE
1741
1742 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
1743 != RTEMS_SUCCESSFUL) {
1744 DBG("ROUTER Sempahore failed\n");
1745 return ROUTER_ERR_ERROR;
1746 }
1747 #endif
1748
1749
1750
1751 mask = REG_READ(&priv->regs->imask);
1752
1753
1754 REG_WRITE(&priv->regs->pip, 0xffffffff);
1755
1756
1757 REG_WRITE(&priv->regs->imask, mask & ~(options));
1758
1759 #ifdef THREAD_SAFE
1760
1761 rtems_semaphore_release(priv->sem);
1762 #endif
1763
1764 return ROUTER_ERR_OK;
1765 }
1766
1767 int router_port_interrupt_unmask(void *d, int port)
1768 {
1769 struct router_priv *priv = d;
1770 unsigned int mask;
1771 int error = router_check_port(d, port);
1772
1773 if (error)
1774 return error;
1775
1776 #ifdef THREAD_SAFE
1777
1778 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
1779 != RTEMS_SUCCESSFUL) {
1780 DBG("ROUTER Sempahore failed\n");
1781 return ROUTER_ERR_ERROR;
1782 }
1783 #endif
1784
1785
1786
1787 mask = REG_READ(&priv->regs->ipmask);
1788
1789
1790 REG_WRITE(&priv->regs->pip, (0x1 << port));
1791
1792
1793 REG_WRITE(&priv->regs->ipmask, mask | (0x1 << port));
1794
1795 #ifdef THREAD_SAFE
1796
1797 rtems_semaphore_release(priv->sem);
1798 #endif
1799
1800 return ROUTER_ERR_OK;
1801 }
1802
1803 int router_port_interrupt_mask(void *d, int port)
1804 {
1805 struct router_priv *priv = d;
1806 unsigned int mask;
1807 int error = router_check_port(d, port);
1808
1809 if (error)
1810 return error;
1811
1812 #ifdef THREAD_SAFE
1813
1814 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
1815 != RTEMS_SUCCESSFUL) {
1816 DBG("ROUTER Sempahore failed\n");
1817 return ROUTER_ERR_ERROR;
1818 }
1819 #endif
1820
1821
1822
1823 mask = REG_READ(&priv->regs->ipmask);
1824
1825
1826 REG_WRITE(&priv->regs->pip, (0x1 << port));
1827
1828
1829 REG_WRITE(&priv->regs->ipmask, mask & ~(0x1 << port));
1830
1831 #ifdef THREAD_SAFE
1832
1833 rtems_semaphore_release(priv->sem);
1834 #endif
1835
1836 return ROUTER_ERR_OK;
1837 }
1838
1839 int router_reset(void *d)
1840 {
1841 struct router_priv *priv = d;
1842 int error = router_check_open(d);
1843
1844 if (error)
1845 return error;
1846
1847
1848 REG_WRITE(&priv->regs->cfgsts, RTRCFG_RE);
1849
1850 return ROUTER_ERR_OK;
1851 }
1852
1853 int router_icodegen_enable(void *d, uint8_t intn, uint32_t aitimer,
1854 int options)
1855 {
1856 struct router_priv *priv = d;
1857 int error = router_check_distint_support(d);
1858
1859 if (error)
1860 return error;
1861
1862 #ifdef THREAD_SAFE
1863
1864 if (rtems_semaphore_obtain(priv->sem, RTEMS_WAIT, RTEMS_NO_TIMEOUT)
1865 != RTEMS_SUCCESSFUL) {
1866 DBG("ROUTER Sempahore failed\n");
1867 return ROUTER_ERR_ERROR;
1868 }
1869 #endif
1870
1871 REG_WRITE(&priv->regs->icodegen, (options & ~(ICODEGEN_IN)) |
1872 ICODEGEN_EN | (intn & ICODEGEN_IN));
1873
1874 if (options & ICODEGEN_TE) {
1875 REG_WRITE(&priv->regs->aitimer, (aitimer & AITIMER_RL));
1876 }
1877
1878 #ifdef THREAD_SAFE
1879
1880 rtems_semaphore_release(priv->sem);
1881 #endif
1882
1883 return ROUTER_ERR_OK;
1884 }
1885
1886 int router_icodegen_disable(void *d)
1887 {
1888 struct router_priv *priv = d;
1889 int error = router_check_distint_support(d);
1890
1891 if (error)
1892 return error;
1893
1894 REG_WRITE(&priv->regs->icodegen, ICODEGEN_TE);
1895
1896 return ROUTER_ERR_OK;
1897 }
1898
1899 int router_isrctimer_set(void *d, uint32_t reloadvalue)
1900 {
1901 struct router_priv *priv = d;
1902 int error = router_check_distint_support(d);
1903
1904 if (error)
1905 return error;
1906
1907
1908 REG_WRITE(&priv->regs->isrctimer, (reloadvalue & (ISRCTIMER_RL)));
1909
1910 return ROUTER_ERR_OK;
1911 }
1912
1913 int router_isrtimer_set(void *d, uint32_t reloadvalue)
1914 {
1915 struct router_priv *priv = d;
1916 int error = router_check_distint_support(d);
1917
1918 if (error)
1919 return error;
1920
1921
1922 REG_WRITE(&priv->regs->isrtimer, (reloadvalue & (ISRTIMER_RL)));
1923
1924 return ROUTER_ERR_OK;
1925 }
1926
1927 int router_isrctimer_get(void *d, uint32_t *reloadvalue)
1928 {
1929 struct router_priv *priv = d;
1930 int error = router_check_distint_support(d);
1931
1932 if (error)
1933 return error;
1934
1935 if (reloadvalue == NULL) {
1936 DBG("ROUTER Wrong reloadvalue pointer\n");
1937 return ROUTER_ERR_EINVAL;
1938 }
1939
1940
1941 *reloadvalue = REG_READ(&priv->regs->isrctimer) & (ISRCTIMER_RL);
1942
1943 return ROUTER_ERR_OK;
1944 }
1945
1946 int router_isrtimer_get(void *d, uint32_t *reloadvalue)
1947 {
1948 struct router_priv *priv = d;
1949 int error = router_check_distint_support(d);
1950
1951 if (error)
1952 return error;
1953
1954 if (reloadvalue == NULL) {
1955 DBG("ROUTER Wrong reloadvalue pointer\n");
1956 return ROUTER_ERR_EINVAL;
1957 }
1958
1959
1960 *reloadvalue = REG_READ(&priv->regs->isrtimer) & (ISRTIMER_RL);
1961
1962 return ROUTER_ERR_OK;
1963 }