static rtems_device_driver grtm_close(rtems_device_major_number major, rtems_device_minor_number minor, void *arg) { struct grtm_priv *pDev; struct drvmgr_dev *dev; FUNCDBG(); if ( drvmgr_get_dev(&grtm_rmap_drv_info.general, minor, &dev) ) { return RTEMS_INVALID_NUMBER; } pDev = (struct grtm_priv *)dev->priv; if ( pDev->running ){ grtm_stop(pDev); pDev->running = 0; } /* Reset core */ grtm_hw_reset(pDev); /* Clear descriptor area just for sure */ MEMSET(pDev, pDev->bds, 0, 0x400); /* Mark not open */ pDev->open = 0; return RTEMS_SUCCESSFUL; }
static int grtm_device_init(struct grtm_priv *pDev) { struct amba_dev_info *ambadev; struct ambapp_core *pnpinfo; union drvmgr_key_value *value; /* Get device information from AMBA PnP information */ ambadev = (struct amba_dev_info *)pDev->dev->businfo; if ( ambadev == NULL ) { return -1; } pnpinfo = &ambadev->info; pDev->irq = pnpinfo->irq; pDev->regs = (struct grtm_regs *)pnpinfo->apb_slv->start; pDev->minor = pDev->dev->minor_drv; pDev->open = 0; pDev->running = 0; /* Create Binary RX Semaphore with count = 0 */ if ( rtems_semaphore_create(rtems_build_name('G', 'R', 'M', '0' + pDev->minor), 0, RTEMS_FIFO|RTEMS_SIMPLE_BINARY_SEMAPHORE|RTEMS_NO_INHERIT_PRIORITY|\ RTEMS_LOCAL|RTEMS_NO_PRIORITY_CEILING, 0, &pDev->sem_tx) != RTEMS_SUCCESSFUL ) { return -1; } /* Allocate Memory for Buffer Descriptor Table, or let user provide a custom * address. */ value = drvmgr_dev_key_get(pDev->dev, "bdTabAdr", DRVMGR_KT_POINTER); if ( value ) { pDev->bds = (struct grtm_bd *)value->ptr; pDev->_bds = (void *)value->ptr; } else { pDev->bds = (struct grtm_bd *)grtm_memalign(0x400, 0x400, &pDev->_bds); } if ( !pDev->bds ) { DBG("GRTM: Failed to allocate descriptor table\n"); return -1; } memset(pDev->bds, 0, 0x400); pDev->_ring = malloc(sizeof(struct grtm_ring) * 128); if ( !pDev->_ring ) { return -1; } /* Reset Hardware before attaching IRQ handler */ grtm_hw_reset(pDev); /* Read SUB revision number, ignore */ pDev->subrev = (READ_REG(&pDev->regs->revision) & GRTM_REV1_REV_SREV) >> GRTM_REV1_REV_SREV_BIT; return 0; }
static int grtm_device_init(struct grtm_priv *pDev) { struct amba_dev_info *ambadev; struct ambapp_core *pnpinfo; union drvmgr_key_value *value; /* Get device information from AMBA PnP information */ ambadev = (struct amba_dev_info *)pDev->dev->businfo; if ( ambadev == NULL ) { return -1; } pnpinfo = &ambadev->info; pDev->irq = pnpinfo->irq; pDev->regs = (struct grtm_regs *)pnpinfo->apb_slv->start; pDev->minor = pDev->dev->minor_drv; pDev->open = 0; pDev->running = 0; /* Create Binary RX Semaphore with count = 0 */ if ( rtems_semaphore_create(rtems_build_name('G', 'R', 'M', '0' + pDev->minor), 0, RTEMS_FIFO|RTEMS_SIMPLE_BINARY_SEMAPHORE|RTEMS_NO_INHERIT_PRIORITY|\ RTEMS_LOCAL|RTEMS_NO_PRIORITY_CEILING, 0, &pDev->sem_tx) != RTEMS_SUCCESSFUL ) { return -1; } /* Create ISR protection Counting Semaphore with count = 1 */ if ( rtems_semaphore_create(rtems_build_name('G', 'T', 'M', '0' + pDev->minor), 1, RTEMS_FIFO | RTEMS_COUNTING_SEMAPHORE | RTEMS_PRIORITY | \ RTEMS_LOCAL | RTEMS_NO_PRIORITY_CEILING, 0, &pDev->handling_transmission) != RTEMS_SUCCESSFUL ) { return -1; } /* Override default 2k MAX FRAME length if available from bus resource */ pDev->frame_length_max = 2*1024; value = drvmgr_dev_key_get(pDev->dev, "maxFrameLength", KEY_TYPE_INT); if ( value ) pDev->frame_length_max = value->i; /* Default to allocate from partition 0 */ pDev->alloc_part_bd = 0; pDev->alloc_part_frm = 0; value = drvmgr_dev_key_get(pDev->dev, "bdAllocPartition", KEY_TYPE_INT); if ( value ) pDev->alloc_part_bd = value->i; value = drvmgr_dev_key_get(pDev->dev, "frameAllocPartition", KEY_TYPE_INT); if ( value ) pDev->alloc_part_frm = value->i; /* Allocate Memory for Descriptors */ #ifdef REMOTE_DESCRIPTORS pDev->bds = 0xA0000000; pDev->_bds = 0xA0000000; #else pDev->_bds = pDev->bds = (struct grtm_bd *) ambapp_rmap_partition_memalign(pDev->dev, pDev->alloc_part_bd, 0x400, 0x400); #endif if ( !pDev->bds ) { DBG("GRTM: Failed to allocate descriptor table\n"); return -1; } MEMSET(pDev, pDev->bds, 0, 0x400); pDev->_ring = malloc(sizeof(struct grtm_ring) * 128); if ( !pDev->_ring ) { return -1; } pDev->_frame_buffers = (unsigned char *) ambapp_rmap_partition_memalign( pDev->dev, pDev->alloc_part_frm, 0x4, DESCRIPTOR_MAX * pDev->frame_length_max); if ( !pDev->_frame_buffers ) { return -1; } /* Reset Hardware before attaching IRQ handler */ grtm_hw_reset(pDev); /* Read SUB revision number, ignore */ pDev->subrev = (READ_REG(pDev, &pDev->regs->revision) & GRTM_REV1_REV_SREV) >> GRTM_REV1_REV_SREV_BIT; return 0; }